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