xref: /netbsd-src/external/bsd/pkg_install/dist/add/main.c (revision 1b2611421270f128b12bc59de682905e00d5645e)
1 /*	$NetBSD: main.c,v 1.5 2024/06/11 09:26:57 wiz Exp $	*/
2 
3 #if HAVE_CONFIG_H
4 #include "config.h"
5 #endif
6 #include <nbcompat.h>
7 #if HAVE_SYS_CDEFS_H
8 #include <sys/cdefs.h>
9 #endif
10 __RCSID("$NetBSD: main.c,v 1.5 2024/06/11 09:26:57 wiz Exp $");
11 
12 /*
13  *
14  * FreeBSD install - a package for the installation and maintainance
15  * of non-core utilities.
16  *
17  * Redistribution and use in source and binary forms, with or without
18  * modification, are permitted provided that the following conditions
19  * are met:
20  * 1. Redistributions of source code must retain the above copyright
21  *    notice, this list of conditions and the following disclaimer.
22  * 2. Redistributions in binary form must reproduce the above copyright
23  *    notice, this list of conditions and the following disclaimer in the
24  *    documentation and/or other materials provided with the distribution.
25  *
26  * Jordan K. Hubbard
27  * 18 July 1993
28  *
29  * This is the add module.
30  *
31  */
32 
33 #if HAVE_ERR_H
34 #include <err.h>
35 #endif
36 #include "lib.h"
37 #include "add.h"
38 
39 static char Options[] = "AC:DIK:P:RVfhm:np:t:Uuv";
40 
41 char   *Destdir = NULL;
42 char   *OverrideMachine = NULL;
43 char   *OverrideOpsys = NULL;
44 char   *OverrideOSVersion = NULL;
45 char   *Prefix = NULL;
46 Boolean NoInstall = FALSE;
47 Boolean NoRecord = FALSE;
48 Boolean Automatic = FALSE;
49 Boolean ForceDepends = FALSE;
50 /*
51  * Normally, updating fails if the dependencies of a depending package
52  * are not satisfied by the package to be updated.  ForceDepending
53  * turns that failure into a warning.
54  */
55 Boolean ForceDepending = FALSE;
56 
57 int	LicenseCheck = 0;
58 int     Replace = 0;
59 int	ReplaceSame = 0;
60 
61 static void
usage(void)62 usage(void)
63 {
64 	(void) fprintf(stderr, "%s\n%s\n%s\n",
65 	    "usage: pkg_add [-AfhInRuVv] [-C config] [-P destdir] [-K pkg_dbdir]",
66 	    "               [-m machine] [-p prefix]",
67 	    "               [[ftp|http]://[user[:password]@]host[:port]][/path/]pkg-name ...");
68 	exit(1);
69 }
70 
71 int
main(int argc,char ** argv)72 main(int argc, char **argv)
73 {
74 	int     ch, error=0;
75 	lpkg_head_t pkgs;
76 
77 	setprogname(argv[0]);
78 	while ((ch = getopt(argc, argv, Options)) != -1) {
79 		switch (ch) {
80 		case 'A':
81 			Automatic = TRUE;
82 			break;
83 
84 		case 'C':
85 			config_file = optarg;
86 			break;
87 
88 		case 'D':
89 			ForceDepending = TRUE;
90 			break;
91 
92 		case 'P':
93 			Destdir = optarg;
94 			break;
95 
96 		case 'f':
97 			Force = TRUE;
98 			ForceDepends = TRUE;
99 			ForceDepending = TRUE;
100 			break;
101 
102 		case 'I':
103 			NoInstall = TRUE;
104 			break;
105 
106 		case 'K':
107 			pkgdb_set_dir(optarg, 3);
108 			break;
109 
110 		case 'R':
111 			NoRecord = TRUE;
112 			break;
113 
114 		case 'm':
115 			parse_cross(optarg, &OverrideMachine, &OverrideOpsys,
116 			    &OverrideOSVersion);
117 			break;
118 
119 		case 'n':
120 			Fake = TRUE;
121 			Verbose = TRUE;
122 			break;
123 
124 		case 'p':
125 			Prefix = optarg;
126 			break;
127 
128 		case 'U':
129 			ReplaceSame = 1;
130 			Replace = 1;
131 			break;
132 
133 		case 'u':
134 			Replace = 1;
135 			break;
136 
137 		case 'V':
138 			show_version();
139 			/* NOTREACHED */
140 
141 		case 'v':
142 			Verbose = TRUE;
143 			break;
144 
145 		case 'h':
146 		case '?':
147 		default:
148 			usage();
149 			break;
150 		}
151 	}
152 	argc -= optind;
153 	argv += optind;
154 
155 	pkg_install_config();
156 
157 	if (Destdir != NULL) {
158 		char *pkgdbdir;
159 
160 		pkgdbdir = xasprintf("%s/%s", Destdir, config_pkg_dbdir);
161 		pkgdb_set_dir(pkgdbdir, 4);
162 		free(pkgdbdir);
163 	}
164 
165 #ifndef BOOTSTRAP
166 	process_pkg_path();
167 #endif
168 
169 	TAILQ_INIT(&pkgs);
170 
171 	if (argc == 0) {
172 		/* If no packages, yelp */
173 		warnx("missing package name(s)");
174 		usage();
175 	}
176 
177 #ifndef BOOTSTRAP
178 	if (strcasecmp(do_license_check, "no") == 0)
179 		LicenseCheck = 0;
180 	else if (strcasecmp(do_license_check, "yes") == 0)
181 		LicenseCheck = 1;
182 	else if (strcasecmp(do_license_check, "always") == 0)
183 		LicenseCheck = 2;
184 	else
185 		errx(1, "Unknown value of the configuration variable"
186 		    "CHECK_LICENSE");
187 
188 	if (LicenseCheck)
189 		load_license_lists();
190 #endif
191 
192 	/* Get all the remaining package names, if any */
193 	for (; argc > 0; --argc, ++argv) {
194 		lpkg_t *lpp;
195 
196 		if (IS_STDIN(*argv))
197 			lpp = alloc_lpkg("-");
198 		else
199 			lpp = alloc_lpkg(*argv);
200 
201 		TAILQ_INSERT_TAIL(&pkgs, lpp, lp_link);
202 	}
203 
204 	error += pkg_perform(&pkgs);
205 	if (error != 0) {
206 		warnx("%d package addition%s failed", error, error == 1 ? "" : "s");
207 		exit(1);
208 	}
209 	exit(0);
210 }
211