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