xref: /netbsd-src/external/bsd/pkg_install/dist/info/main.c (revision f46918ca2125b9b1e7ca5a22c07d1414c618e467)
1*f46918caSnia /*	$NetBSD: main.c,v 1.4 2021/04/10 19:49:59 nia Exp $	*/
2af21abb5Sjoerg 
3af21abb5Sjoerg #if HAVE_CONFIG_H
4af21abb5Sjoerg #include "config.h"
5af21abb5Sjoerg #endif
6af21abb5Sjoerg #include <nbcompat.h>
7af21abb5Sjoerg #if HAVE_SYS_CDEFS_H
8af21abb5Sjoerg #include <sys/cdefs.h>
9af21abb5Sjoerg #endif
10*f46918caSnia __RCSID("$NetBSD: main.c,v 1.4 2021/04/10 19:49:59 nia Exp $");
11af21abb5Sjoerg 
12af21abb5Sjoerg /*
13af21abb5Sjoerg  *
14af21abb5Sjoerg  * FreeBSD install - a package for the installation and maintainance
15af21abb5Sjoerg  * of non-core utilities.
16af21abb5Sjoerg  *
17af21abb5Sjoerg  * Redistribution and use in source and binary forms, with or without
18af21abb5Sjoerg  * modification, are permitted provided that the following conditions
19af21abb5Sjoerg  * are met:
20af21abb5Sjoerg  * 1. Redistributions of source code must retain the above copyright
21af21abb5Sjoerg  *    notice, this list of conditions and the following disclaimer.
22af21abb5Sjoerg  * 2. Redistributions in binary form must reproduce the above copyright
23af21abb5Sjoerg  *    notice, this list of conditions and the following disclaimer in the
24af21abb5Sjoerg  *    documentation and/or other materials provided with the distribution.
25af21abb5Sjoerg  *
26af21abb5Sjoerg  * Jordan K. Hubbard
27af21abb5Sjoerg  * 18 July 1993
28af21abb5Sjoerg  *
29af21abb5Sjoerg  * This is the add module.
30af21abb5Sjoerg  *
31af21abb5Sjoerg  */
32af21abb5Sjoerg 
33af21abb5Sjoerg #if HAVE_SYS_IOCTL_H
34af21abb5Sjoerg #include <sys/ioctl.h>
35af21abb5Sjoerg #endif
36af21abb5Sjoerg 
37af21abb5Sjoerg #if HAVE_ERR_H
38af21abb5Sjoerg #include <err.h>
39af21abb5Sjoerg #endif
40af21abb5Sjoerg 
41af21abb5Sjoerg #include "lib.h"
42af21abb5Sjoerg #include "info.h"
43af21abb5Sjoerg 
44bae4fdf1Sjoerg static const char Options[] = ".aBbcDde:E:fFhIiK:kLl:mNnpQ:qrRsSuvVX";
45af21abb5Sjoerg 
46af21abb5Sjoerg int     Flags = 0;
47af21abb5Sjoerg enum which Which = WHICH_LIST;
48af21abb5Sjoerg Boolean File2Pkg = FALSE;
49af21abb5Sjoerg Boolean Quiet = FALSE;
500590ec0aSjoerg const char   *InfoPrefix = "";
510590ec0aSjoerg const char   *BuildInfoVariable = "";
52af21abb5Sjoerg lpkg_head_t pkgs;
53af21abb5Sjoerg 
54af21abb5Sjoerg static void
usage(void)55af21abb5Sjoerg usage(void)
56af21abb5Sjoerg {
57af21abb5Sjoerg 	fprintf(stderr, "%s\n%s\n%s\n%s\n",
58ac52c416Swiz 	    "usage: pkg_info [-BbcDdFfhIikLmNnpqRrSsVvX] [-E pkg-name] [-e pkg-name]",
59af21abb5Sjoerg 	    "                [-K pkg_dbdir] [-l prefix] pkg-name ...",
60af21abb5Sjoerg 	    "       pkg_info [-a | -u] [flags]",
61af21abb5Sjoerg 	    "       pkg_info [-Q variable] pkg-name ...");
62af21abb5Sjoerg 	exit(1);
63af21abb5Sjoerg }
64af21abb5Sjoerg 
65af21abb5Sjoerg int
main(int argc,char ** argv)66af21abb5Sjoerg main(int argc, char **argv)
67af21abb5Sjoerg {
68af21abb5Sjoerg 	char *CheckPkg = NULL;
69af21abb5Sjoerg 	char *BestCheckPkg = NULL;
70af21abb5Sjoerg 	lpkg_t *lpp;
71af21abb5Sjoerg 	int     ch;
72af21abb5Sjoerg 	int	rc;
73af21abb5Sjoerg 
74af21abb5Sjoerg 	setprogname(argv[0]);
75af21abb5Sjoerg 	while ((ch = getopt(argc, argv, Options)) != -1)
76af21abb5Sjoerg 		switch (ch) {
77af21abb5Sjoerg 		case '.':	/* for backward compatibility */
78af21abb5Sjoerg 			break;
79af21abb5Sjoerg 
80af21abb5Sjoerg 		case 'a':
81af21abb5Sjoerg 			Which = WHICH_ALL;
82af21abb5Sjoerg 			break;
83af21abb5Sjoerg 
84af21abb5Sjoerg 		case 'B':
85af21abb5Sjoerg 			Flags |= SHOW_BUILD_INFO;
86af21abb5Sjoerg 			break;
87af21abb5Sjoerg 
88af21abb5Sjoerg 		case 'b':
89af21abb5Sjoerg 			Flags |= SHOW_BUILD_VERSION;
90af21abb5Sjoerg 			break;
91af21abb5Sjoerg 
92af21abb5Sjoerg 		case 'c':
93af21abb5Sjoerg 			Flags |= SHOW_COMMENT;
94af21abb5Sjoerg 			break;
95af21abb5Sjoerg 
96af21abb5Sjoerg 		case 'D':
97af21abb5Sjoerg 			Flags |= SHOW_DISPLAY;
98af21abb5Sjoerg 			break;
99af21abb5Sjoerg 
100af21abb5Sjoerg 		case 'd':
101af21abb5Sjoerg 			Flags |= SHOW_DESC;
102af21abb5Sjoerg 			break;
103af21abb5Sjoerg 
104af21abb5Sjoerg 		case 'E':
105af21abb5Sjoerg 			BestCheckPkg = optarg;
106af21abb5Sjoerg 			break;
107af21abb5Sjoerg 
108af21abb5Sjoerg 		case 'e':
109af21abb5Sjoerg 			CheckPkg = optarg;
110af21abb5Sjoerg 			break;
111af21abb5Sjoerg 
112af21abb5Sjoerg 		case 'f':
113af21abb5Sjoerg 			Flags |= SHOW_PLIST;
114af21abb5Sjoerg 			break;
115af21abb5Sjoerg 
116af21abb5Sjoerg 		case 'F':
117af21abb5Sjoerg 			File2Pkg = 1;
118af21abb5Sjoerg 			break;
119af21abb5Sjoerg 
120af21abb5Sjoerg 		case 'I':
121af21abb5Sjoerg 			Flags |= SHOW_INDEX;
122af21abb5Sjoerg 			break;
123af21abb5Sjoerg 
124af21abb5Sjoerg 		case 'i':
125af21abb5Sjoerg 			Flags |= SHOW_INSTALL;
126af21abb5Sjoerg 			break;
127af21abb5Sjoerg 
128af21abb5Sjoerg 		case 'K':
1295ac0fc9cSjoerg 			pkgdb_set_dir(optarg, 3);
130af21abb5Sjoerg 			break;
131af21abb5Sjoerg 
132af21abb5Sjoerg 		case 'k':
133af21abb5Sjoerg 			Flags |= SHOW_DEINSTALL;
134af21abb5Sjoerg 			break;
135af21abb5Sjoerg 
136af21abb5Sjoerg 		case 'L':
137af21abb5Sjoerg 			Flags |= SHOW_FILES;
138af21abb5Sjoerg 			break;
139af21abb5Sjoerg 
140af21abb5Sjoerg 		case 'l':
141af21abb5Sjoerg 			InfoPrefix = optarg;
142af21abb5Sjoerg 			break;
143af21abb5Sjoerg 
144af21abb5Sjoerg 		case 'm':
145af21abb5Sjoerg 			Flags |= SHOW_MTREE;
146af21abb5Sjoerg 			break;
147af21abb5Sjoerg 
148af21abb5Sjoerg 		case 'N':
149af21abb5Sjoerg 			Flags |= SHOW_BLD_DEPENDS;
150af21abb5Sjoerg 			break;
151af21abb5Sjoerg 
152af21abb5Sjoerg 		case 'n':
153af21abb5Sjoerg 			Flags |= SHOW_DEPENDS;
154af21abb5Sjoerg 			break;
155af21abb5Sjoerg 
156af21abb5Sjoerg 		case 'p':
157af21abb5Sjoerg 			Flags |= SHOW_PREFIX;
158af21abb5Sjoerg 			break;
159af21abb5Sjoerg 
160af21abb5Sjoerg 		case 'Q':
161af21abb5Sjoerg 			Flags |= SHOW_BI_VAR;
162af21abb5Sjoerg 			BuildInfoVariable = optarg;
163af21abb5Sjoerg 			break;
164af21abb5Sjoerg 
165af21abb5Sjoerg 		case 'q':
166af21abb5Sjoerg 			Quiet = TRUE;
167af21abb5Sjoerg 			break;
168af21abb5Sjoerg 
169bae4fdf1Sjoerg 		case 'r':
170bae4fdf1Sjoerg 			Flags |= SHOW_FULL_REQBY;
171bae4fdf1Sjoerg 			break;
172bae4fdf1Sjoerg 
173af21abb5Sjoerg 		case 'R':
174af21abb5Sjoerg 			Flags |= SHOW_REQBY;
175af21abb5Sjoerg 			break;
176af21abb5Sjoerg 
177af21abb5Sjoerg 		case 's':
178af21abb5Sjoerg 			Flags |= SHOW_PKG_SIZE;
179af21abb5Sjoerg 			break;
180af21abb5Sjoerg 
181af21abb5Sjoerg 		case 'S':
182af21abb5Sjoerg 			Flags |= SHOW_ALL_SIZE;
183af21abb5Sjoerg 			break;
184af21abb5Sjoerg 
185af21abb5Sjoerg 		case 'u':
186af21abb5Sjoerg 			Which = WHICH_USER;
187af21abb5Sjoerg 			break;
188af21abb5Sjoerg 
189af21abb5Sjoerg 		case 'v':
190af21abb5Sjoerg 			Verbose = TRUE;
191af21abb5Sjoerg 			/* Reasonable definition of 'everything' */
192af21abb5Sjoerg 			Flags = SHOW_COMMENT | SHOW_DESC | SHOW_PLIST | SHOW_INSTALL |
193af21abb5Sjoerg 			    SHOW_DEINSTALL | SHOW_DISPLAY | SHOW_MTREE |
194af21abb5Sjoerg 			    SHOW_REQBY | SHOW_BLD_DEPENDS | SHOW_DEPENDS | SHOW_PKG_SIZE | SHOW_ALL_SIZE;
195af21abb5Sjoerg 			break;
196af21abb5Sjoerg 
197af21abb5Sjoerg 		case 'V':
198af21abb5Sjoerg 			show_version();
199af21abb5Sjoerg 			/* NOTREACHED */
200af21abb5Sjoerg 
201af21abb5Sjoerg 		case 'X':
202af21abb5Sjoerg 			Flags |= SHOW_SUMMARY;
203af21abb5Sjoerg 			break;
204af21abb5Sjoerg 
205af21abb5Sjoerg 		case 'h':
206af21abb5Sjoerg 		case '?':
207af21abb5Sjoerg 		default:
208af21abb5Sjoerg 			usage();
209af21abb5Sjoerg 			/* NOTREACHED */
210af21abb5Sjoerg 		}
211af21abb5Sjoerg 
212af21abb5Sjoerg 	argc -= optind;
213af21abb5Sjoerg 	argv += optind;
214af21abb5Sjoerg 
2155ac0fc9cSjoerg 	pkg_install_config();
2165ac0fc9cSjoerg 
217af21abb5Sjoerg 	if (argc == 0 && !Flags && !CheckPkg) {
218af21abb5Sjoerg 		/* No argument or relevant flags specified - assume -I */
219af21abb5Sjoerg 		Flags = SHOW_INDEX;
220af21abb5Sjoerg 		/* assume -a if neither -u nor -a is given */
221af21abb5Sjoerg 		if (Which == WHICH_LIST)
222af21abb5Sjoerg 			Which = WHICH_ALL;
223af21abb5Sjoerg 	}
224af21abb5Sjoerg 
225af21abb5Sjoerg 	if (CheckPkg != NULL && BestCheckPkg != NULL) {
226af21abb5Sjoerg 		warnx("-E and -e are mutally exlusive");
227af21abb5Sjoerg 		usage();
228af21abb5Sjoerg 	}
229af21abb5Sjoerg 
230af21abb5Sjoerg 	if (argc != 0 && CheckPkg != NULL) {
231af21abb5Sjoerg 		warnx("can't give any additional arguments to -e");
232af21abb5Sjoerg 		usage();
233af21abb5Sjoerg 	}
234af21abb5Sjoerg 
235af21abb5Sjoerg 	if (argc != 0 && BestCheckPkg != NULL) {
236af21abb5Sjoerg 		warnx("can't give any additional arguments to -E");
237af21abb5Sjoerg 		usage();
238af21abb5Sjoerg 	}
239af21abb5Sjoerg 
240af21abb5Sjoerg 	if (argc != 0 && Which != WHICH_LIST) {
241af21abb5Sjoerg 		warnx("can't use both -a/-u and package name");
242af21abb5Sjoerg 		usage();
243af21abb5Sjoerg 	}
244af21abb5Sjoerg 
245af21abb5Sjoerg 	/* Set some reasonable defaults */
246af21abb5Sjoerg 	if (!Flags)
247af21abb5Sjoerg 		Flags = SHOW_COMMENT | SHOW_DESC | SHOW_REQBY
248af21abb5Sjoerg 			| SHOW_DEPENDS | SHOW_DISPLAY;
249af21abb5Sjoerg 
250af21abb5Sjoerg 	/* -Fe /filename -> change CheckPkg to real packagename */
251af21abb5Sjoerg 	if (CheckPkg) {
252af21abb5Sjoerg 		if (File2Pkg) {
253af21abb5Sjoerg 			char   *s;
254af21abb5Sjoerg 
255af21abb5Sjoerg 			if (!pkgdb_open(ReadOnly))
256af21abb5Sjoerg 				err(EXIT_FAILURE, "cannot open pkgdb");
257af21abb5Sjoerg 
258af21abb5Sjoerg 			s = pkgdb_retrieve(CheckPkg);
259af21abb5Sjoerg 
260d66ee6c3Sjoerg 			if (s == NULL)
261af21abb5Sjoerg 				errx(EXIT_FAILURE, "No matching pkg for %s.", CheckPkg);
262d66ee6c3Sjoerg 			CheckPkg = xstrdup(s);
263af21abb5Sjoerg 
264af21abb5Sjoerg 			pkgdb_close();
265af21abb5Sjoerg 		}
266af21abb5Sjoerg 		return CheckForPkg(CheckPkg);
267af21abb5Sjoerg 	}
268af21abb5Sjoerg 
269af21abb5Sjoerg 	if (BestCheckPkg)
270af21abb5Sjoerg 		return CheckForBestPkg(BestCheckPkg);
271af21abb5Sjoerg 
272af21abb5Sjoerg 	TAILQ_INIT(&pkgs);
273af21abb5Sjoerg 
274af21abb5Sjoerg 	/* Get all the remaining package names, if any */
275af21abb5Sjoerg 	if (File2Pkg && Which == WHICH_LIST)
276af21abb5Sjoerg 		if (!pkgdb_open(ReadOnly)) {
277af21abb5Sjoerg 			err(EXIT_FAILURE, "cannot open pkgdb");
278af21abb5Sjoerg 		}
279af21abb5Sjoerg 	while (*argv) {
280af21abb5Sjoerg 		/* pkgdb: if -F flag given, don't add pkgnames to the "pkgs"
281af21abb5Sjoerg 		 * queue but rather resolve the given filenames to pkgnames
282af21abb5Sjoerg 		 * using pkgdb_retrieve, then add them. */
283af21abb5Sjoerg 		if (File2Pkg) {
284af21abb5Sjoerg 			char   *s;
285af21abb5Sjoerg 
286af21abb5Sjoerg 			s = pkgdb_retrieve(*argv);
287af21abb5Sjoerg 
288af21abb5Sjoerg 			if (s) {
289af21abb5Sjoerg 				lpp = alloc_lpkg(s);
290af21abb5Sjoerg 				TAILQ_INSERT_TAIL(&pkgs, lpp, lp_link);
291af21abb5Sjoerg 			} else
292af21abb5Sjoerg 				errx(EXIT_FAILURE, "No matching pkg for %s.", *argv);
293af21abb5Sjoerg 		} else {
294af21abb5Sjoerg 			if (ispkgpattern(*argv)) {
295af21abb5Sjoerg 				switch (add_installed_pkgs_by_pattern(*argv, &pkgs)) {
296af21abb5Sjoerg 				case 0:
297af21abb5Sjoerg 					errx(EXIT_FAILURE, "No matching pkg for %s.", *argv);
298af21abb5Sjoerg 				case -1:
299af21abb5Sjoerg 					errx(EXIT_FAILURE, "Error during search in pkgdb for %s", *argv);
300af21abb5Sjoerg 				}
301af21abb5Sjoerg 			} else {
302af21abb5Sjoerg 				const char *dbdir;
303c7785e72Ssevan 				size_t dbdirlen;
304af21abb5Sjoerg 
3055ac0fc9cSjoerg 				dbdir = pkgdb_get_dir();
306c7785e72Ssevan 				dbdirlen = strlen(dbdir);
307c7785e72Ssevan 				if (**argv == '/' &&
308c7785e72Ssevan 				    strncmp(*argv, dbdir, dbdirlen) == 0 &&
309c7785e72Ssevan 				    (*argv)[dbdirlen] == '/') {
310c7785e72Ssevan 					*argv += dbdirlen + 1;
311c7785e72Ssevan 					if (**argv && (*argv)[strlen(*argv) - 1] == '/') {
312af21abb5Sjoerg 						(*argv)[strlen(*argv) - 1] = 0;
313af21abb5Sjoerg 					}
314af21abb5Sjoerg 				}
315af21abb5Sjoerg 				lpp = alloc_lpkg(*argv);
316af21abb5Sjoerg 				TAILQ_INSERT_TAIL(&pkgs, lpp, lp_link);
317af21abb5Sjoerg 			}
318af21abb5Sjoerg 		}
319af21abb5Sjoerg 		argv++;
320af21abb5Sjoerg 	}
321af21abb5Sjoerg 
322af21abb5Sjoerg 	if (File2Pkg)
323af21abb5Sjoerg 		pkgdb_close();
324af21abb5Sjoerg 
325af21abb5Sjoerg 	/* If no packages, yelp */
326af21abb5Sjoerg 	if (TAILQ_FIRST(&pkgs) == NULL && Which == WHICH_LIST && !CheckPkg)
327af21abb5Sjoerg 		warnx("missing package name(s)"), usage();
328af21abb5Sjoerg 
329af21abb5Sjoerg 	rc = pkg_perform(&pkgs);
330af21abb5Sjoerg 	exit(rc);
331af21abb5Sjoerg 	/* NOTREACHED */
332af21abb5Sjoerg }
333