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