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