main.c revision 103149
1226645Sattilio/*
2226645Sattilio *
3226645Sattilio * FreeBSD install - a package for the installation and maintainance
4226645Sattilio * of non-core utilities.
5226645Sattilio *
6226645Sattilio * Redistribution and use in source and binary forms, with or without
7226645Sattilio * modification, are permitted provided that the following conditions
8226645Sattilio * are met:
9226645Sattilio * 1. Redistributions of source code must retain the above copyright
10226645Sattilio *    notice, this list of conditions and the following disclaimer.
11226645Sattilio * 2. Redistributions in binary form must reproduce the above copyright
12226645Sattilio *    notice, this list of conditions and the following disclaimer in the
13226645Sattilio *    documentation and/or other materials provided with the distribution.
14226645Sattilio *
15226645Sattilio * Jordan K. Hubbard
16226645Sattilio * 18 July 1993
17226645Sattilio *
18226645Sattilio * This is the info module.
19226645Sattilio *
20226645Sattilio */
21226645Sattilio
22226645Sattilio#include <sys/cdefs.h>
23226645Sattilio__FBSDID("$FreeBSD: head/usr.sbin/pkg_install/info/main.c 103149 2002-09-09 19:43:30Z sobomax $");
24226645Sattilio
25226645Sattilio#include "lib.h"
26226645Sattilio#include "info.h"
27226645Sattilio#include <err.h>
28226645Sattilio
29226645Sattiliostatic char Options[] = "acdDe:fgGhiIkl:LmoO:pPqrRst:vVW:x";
30226645Sattilio
31226645Sattilioint	Flags		= 0;
32226645Sattiliomatch_t	MatchType	= MATCH_GLOB;
33226645SattilioBoolean Quiet		= FALSE;
34226645Sattiliochar *InfoPrefix	= (char *)(uintptr_t)"";
35226645Sattiliochar PlayPen[FILENAME_MAX];
36226645Sattiliochar *CheckPkg		= NULL;
37226645Sattiliochar *LookUpOrigin	= NULL;
38226645Sattiliostruct which_head *whead;
39226645Sattilio
40226645Sattiliostatic void usage __P((void));
41226645Sattilio
42226645Sattilioint
43226645Sattiliomain(int argc, char **argv)
44226645Sattilio{
45226645Sattilio    int ch;
46226645Sattilio    char **pkgs, **start;
47226645Sattilio    char *pkgs_split;
48226645Sattilio
49226645Sattilio    whead = malloc(sizeof(struct which_head));
50226645Sattilio    if (whead == NULL)
51226645Sattilio	err(2, NULL);
52226645Sattilio    TAILQ_INIT(whead);
53226645Sattilio
54226645Sattilio    pkgs = start = argv;
55226645Sattilio    if (argc == 1) {
56226645Sattilio	MatchType = MATCH_ALL;
57226645Sattilio	Flags = SHOW_INDEX;
58226645Sattilio    }
59226645Sattilio    else while ((ch = getopt(argc, argv, Options)) != -1) {
60226645Sattilio	switch(ch) {
61226645Sattilio	case 'a':
62226645Sattilio	    MatchType = MATCH_ALL;
63226645Sattilio	    break;
64226645Sattilio
65226645Sattilio	case 'v':
66226645Sattilio	    Verbose = TRUE;
67226645Sattilio	    /* Reasonable definition of 'everything' */
68226645Sattilio	    Flags = SHOW_COMMENT | SHOW_DESC | SHOW_PLIST | SHOW_INSTALL |
69226645Sattilio		SHOW_DEINSTALL | SHOW_REQUIRE | SHOW_DISPLAY | SHOW_MTREE;
70226645Sattilio	    break;
71226645Sattilio
72226645Sattilio	case 'I':
73226645Sattilio	    Flags |= SHOW_INDEX;
74226645Sattilio	    break;
75226645Sattilio
76226645Sattilio	case 'p':
77226645Sattilio	    Flags |= SHOW_PREFIX;
78226645Sattilio	    break;
79226645Sattilio
80226645Sattilio	case 'c':
81226645Sattilio	    Flags |= SHOW_COMMENT;
82226645Sattilio	    break;
83226645Sattilio
84226645Sattilio	case 'd':
85226645Sattilio	    Flags |= SHOW_DESC;
86226645Sattilio	    break;
87226645Sattilio
88226645Sattilio	case 'D':
89226645Sattilio	    Flags |= SHOW_DISPLAY;
90226645Sattilio	    break;
91226645Sattilio
92226645Sattilio	case 'f':
93226645Sattilio	    Flags |= SHOW_PLIST;
94226645Sattilio	    break;
95226645Sattilio
96226645Sattilio	case 'g':
97226645Sattilio	    Flags |= SHOW_CKSUM;
98226645Sattilio	    break;
99226645Sattilio
100226645Sattilio	case 'G':
101226645Sattilio	    MatchType = MATCH_EXACT;
102226645Sattilio	    break;
103226645Sattilio
104226645Sattilio	case 'i':
105226645Sattilio	    Flags |= SHOW_INSTALL;
106226645Sattilio	    break;
107226645Sattilio
108226645Sattilio	case 'k':
109226645Sattilio	    Flags |= SHOW_DEINSTALL;
110226645Sattilio	    break;
111226645Sattilio
112226645Sattilio	case 'r':
113226645Sattilio	    Flags |= SHOW_REQUIRE;
114226645Sattilio	    break;
115226645Sattilio
116226645Sattilio	case 'R':
117226645Sattilio	    Flags |= SHOW_REQBY;
118226645Sattilio	    break;
119226645Sattilio
120226645Sattilio	case 'L':
121226645Sattilio	    Flags |= SHOW_FILES;
122226645Sattilio	    break;
123226645Sattilio
124226645Sattilio	case 'm':
125226645Sattilio	    Flags |= SHOW_MTREE;
126226645Sattilio	    break;
127226645Sattilio
128226645Sattilio	case 's':
129226645Sattilio	    Flags |= SHOW_SIZE;
130226645Sattilio	    break;
131226645Sattilio
132226645Sattilio	case 'o':
133226645Sattilio	    Flags |= SHOW_ORIGIN;
134226645Sattilio	    break;
135226645Sattilio
136226645Sattilio	case 'O':
137226645Sattilio	    LookUpOrigin = strdup(optarg);
138226645Sattilio	    if (LookUpOrigin == NULL)
139226645Sattilio		err(2, NULL);
140226645Sattilio	    break;
141226645Sattilio
142226645Sattilio	case 'V':
143226645Sattilio	    Flags |= SHOW_FMTREV;
144226645Sattilio	    break;
145226645Sattilio
146226645Sattilio	case 'l':
147226645Sattilio	    InfoPrefix = optarg;
148226645Sattilio	    break;
149226645Sattilio
150226645Sattilio	case 'q':
151226645Sattilio	    Quiet = TRUE;
152226645Sattilio	    break;
153226645Sattilio
154226645Sattilio	case 't':
155226645Sattilio	    strlcpy(PlayPen, optarg, sizeof(PlayPen));
156226645Sattilio	    break;
157226645Sattilio
158226645Sattilio	case 'x':
159226645Sattilio	    MatchType = MATCH_REGEX;
160226645Sattilio	    break;
161226645Sattilio
162226645Sattilio	case 'e':
163226645Sattilio	    CheckPkg = optarg;
164226645Sattilio	    break;
165226645Sattilio
166226645Sattilio	case 'W':
167226645Sattilio	    {
168226645Sattilio		struct which_entry *entp;
169226645Sattilio
170226645Sattilio		entp = calloc(1, sizeof(struct which_entry));
171226645Sattilio		if (entp == NULL)
172226645Sattilio		    err(2, NULL);
173226645Sattilio
174226645Sattilio		strlcpy(entp->file, optarg, PATH_MAX);
175226645Sattilio		entp->skip = FALSE;
176226645Sattilio		TAILQ_INSERT_TAIL(whead, entp, next);
177226645Sattilio		break;
178226645Sattilio	    }
179226645Sattilio
180226645Sattilio	case 'P':
181226645Sattilio	    Flags = SHOW_PTREV;
182226645Sattilio	    break;
183226645Sattilio
184226645Sattilio	case 'h':
185226645Sattilio	case '?':
186226645Sattilio	default:
187226645Sattilio	    usage();
188226645Sattilio	    break;
189226645Sattilio	}
190226645Sattilio    }
191226645Sattilio
192226645Sattilio    argc -= optind;
193226645Sattilio    argv += optind;
194226645Sattilio
195226645Sattilio    if (Flags & SHOW_PTREV) {
196226645Sattilio	if (!Quiet)
197226645Sattilio	    printf("Package tools revision: ");
198226645Sattilio	printf("%d\n", PKG_INSTALL_VERSION);
199226645Sattilio	exit(0);
200226645Sattilio    }
201226645Sattilio
202226645Sattilio    /* Set some reasonable defaults */
203226645Sattilio    if (!Flags)
204226645Sattilio	Flags = SHOW_COMMENT | SHOW_DESC | SHOW_REQBY;
205226645Sattilio
206226645Sattilio    /* Get all the remaining package names, if any */
207226645Sattilio    while (*argv) {
208226645Sattilio	/*
209226645Sattilio	 * Don't try to apply heuristics if arguments are regexs or if
210226645Sattilio	 * the argument refers to an existing file.
211226645Sattilio	 */
212226645Sattilio	if (MatchType != MATCH_REGEX && !isfile(*argv))
213226645Sattilio	    while ((pkgs_split = strrchr(*argv, (int)'/')) != NULL) {
214226645Sattilio		*pkgs_split++ = '\0';
215226645Sattilio		/*
216226645Sattilio		 * If character after the '/' is alphanumeric or shell
217226645Sattilio		 * metachar, then we've found the package name.  Otherwise
218226645Sattilio		 * we've come across a trailing '/' and need to continue our
219226645Sattilio		 * quest.
220226645Sattilio		 */
221226645Sattilio		if (isalpha(*pkgs_split) || ((MatchType == MATCH_GLOB) && \
222226645Sattilio		    strpbrk(pkgs_split, "*?[]") != NULL)) {
223226645Sattilio		    *argv = pkgs_split;
224226645Sattilio		    break;
225226645Sattilio		}
226226645Sattilio	    }
227226645Sattilio	*pkgs++ = *argv++;
228226645Sattilio    }
229226645Sattilio
230226645Sattilio    /* If no packages, yelp */
231226645Sattilio    if (pkgs == start && MatchType != MATCH_ALL && !CheckPkg &&
232226645Sattilio	TAILQ_EMPTY(whead) && LookUpOrigin == NULL)
233226645Sattilio	warnx("missing package name(s)"), usage();
234226645Sattilio    *pkgs = NULL;
235226645Sattilio    return pkg_perform(start);
236226645Sattilio}
237226645Sattilio
238226645Sattiliostatic void
239226645Sattiliousage()
240226645Sattilio{
241226645Sattilio    fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n",
242226645Sattilio	"usage: pkg_info [-cdDfGiIkLmopqrRsvVx] [-e package] [-l prefix]",
243226645Sattilio	"                [-t template] [pkg-name ...]",
244226645Sattilio	"       pkg_info [-q] -W filename",
245226645Sattilio	"       pkg_info [-q] -O origin",
246226645Sattilio	"       pkg_info -a [flags]");
247226645Sattilio    exit(1);
248226645Sattilio}
249226645Sattilio