main.c revision 159554
1327Sjkh/*
2327Sjkh * FreeBSD install - a package for the installation and maintainance
3327Sjkh * of non-core utilities.
4327Sjkh *
5327Sjkh * Jordan K. Hubbard
6327Sjkh * 18 July 1993
7327Sjkh *
8327Sjkh * This is the create module.
9327Sjkh *
10327Sjkh */
11327Sjkh
1293520Sobrien#include <sys/cdefs.h>
1393520Sobrien__FBSDID("$FreeBSD: head/usr.sbin/pkg_install/create/main.c 159554 2006-06-12 22:39:32Z obrien $");
1493520Sobrien
1530221Scharnier#include <err.h>
16327Sjkh#include "lib.h"
17327Sjkh#include "create.h"
18327Sjkh
19152210Skrionstatic char Options[] = "EGYNORhjvxyzf:p:P:C:c:d:i:I:k:K:r:t:X:D:m:s:S:o:b:";
20327Sjkh
21152210Skrionmatch_t	MatchType	= MATCH_GLOB;
22327Sjkhchar	*Prefix		= NULL;
23327Sjkhchar	*Comment        = NULL;
24327Sjkhchar	*Desc		= NULL;
2526473Sjkhchar	*SrcDir		= NULL;
26131277Seikchar	*BaseDir	= NULL;
274996Sjkhchar	*Display	= NULL;
28327Sjkhchar	*Install	= NULL;
2941866Sjkhchar	*PostInstall	= NULL;
30327Sjkhchar	*DeInstall	= NULL;
3141866Sjkhchar	*PostDeInstall	= NULL;
32327Sjkhchar	*Contents	= NULL;
33327Sjkhchar	*Require	= NULL;
34445Sjkhchar	*ExcludeFrom	= NULL;
354996Sjkhchar	*Mtree		= NULL;
367713Sjkhchar	*Pkgdeps	= NULL;
37113594Skrischar	*Conflicts	= NULL;
3867454Ssobomaxchar	*Origin		= NULL;
3984670Ssobomaxchar	*InstalledPkg	= NULL;
4026473Sjkhchar	PlayPen[FILENAME_MAX];
4171095Ssobomaxint	Dereference	= FALSE;
4271095Ssobomaxint	PlistOnly	= FALSE;
43147043Ssobomaxint	Recursive	= FALSE;
44157808Skrion#if defined(__FreeBSD_version) && __FreeBSD_version >= 500039
45157808Skrionenum zipper	Zipper  = BZIP2;
46157808Skrion#else
47157808Skrionenum zipper	Zipper  = GZIP;
48157808Skrion#endif
49327Sjkh
50157808Skrion
5130221Scharnierstatic void usage __P((void));
5230221Scharnier
53327Sjkhint
54327Sjkhmain(int argc, char **argv)
55327Sjkh{
56327Sjkh    int ch;
5784670Ssobomax    char **pkgs, **start, *tmp;
58327Sjkh
59327Sjkh    pkgs = start = argv;
6024428Simp    while ((ch = getopt(argc, argv, Options)) != -1)
61327Sjkh	switch(ch) {
62327Sjkh	case 'v':
63159554Sobrien	    Verbose++;
64327Sjkh	    break;
65327Sjkh
66152210Skrion	case 'x':
67152210Skrion	    MatchType = MATCH_REGEX;
68152210Skrion	    break;
69152210Skrion
70152210Skrion	case 'E':
71152210Skrion	    MatchType = MATCH_EREGEX;
72152210Skrion	    break;
73152210Skrion
74152210Skrion	case 'G':
75152210Skrion	    MatchType = MATCH_EXACT;
76152210Skrion	    break;
77152210Skrion
781337Sjkh	case 'N':
791337Sjkh	    AutoAnswer = NO;
801337Sjkh	    break;
811337Sjkh
821337Sjkh	case 'Y':
831337Sjkh	    AutoAnswer = YES;
841337Sjkh	    break;
851337Sjkh
867986Sjkh	case 'O':
8771095Ssobomax	    PlistOnly = TRUE;
887986Sjkh	    break;
897986Sjkh
90327Sjkh	case 'p':
91327Sjkh	    Prefix = optarg;
92327Sjkh	    break;
93327Sjkh
9426473Sjkh	case 's':
9526473Sjkh	    SrcDir = optarg;
9626473Sjkh	    break;
9726473Sjkh
98131277Seik	case 'S':
99131277Seik	    BaseDir = optarg;
100131277Seik	    break;
101131277Seik
102327Sjkh	case 'f':
103327Sjkh	    Contents = optarg;
104327Sjkh	    break;
105327Sjkh
106113594Skris	case 'C':
107113594Skris	    Conflicts = optarg;
108113594Skris	    break;
109113594Skris
110327Sjkh	case 'c':
111327Sjkh	    Comment = optarg;
112327Sjkh	    break;
113327Sjkh
114327Sjkh	case 'd':
115327Sjkh	    Desc = optarg;
116327Sjkh	    break;
117327Sjkh
118327Sjkh	case 'i':
119327Sjkh	    Install = optarg;
120327Sjkh	    break;
121327Sjkh
12241866Sjkh	case 'I':
12341866Sjkh	    PostInstall = optarg;
12441866Sjkh	    break;
12541866Sjkh
126327Sjkh	case 'k':
127327Sjkh	    DeInstall = optarg;
128327Sjkh	    break;
129327Sjkh
13041866Sjkh	case 'K':
13141866Sjkh	    PostDeInstall = optarg;
13241866Sjkh	    break;
13341866Sjkh
134327Sjkh	case 'r':
135327Sjkh	    Require = optarg;
136327Sjkh	    break;
137327Sjkh
138383Sjkh	case 't':
13985019Ssobomax	    strlcpy(PlayPen, optarg, sizeof(PlayPen));
140383Sjkh	    break;
141383Sjkh
142445Sjkh	case 'X':
143445Sjkh	    ExcludeFrom = optarg;
144445Sjkh	    break;
145445Sjkh
146327Sjkh	case 'h':
14771095Ssobomax	    Dereference = TRUE;
1481520Salm	    break;
1491520Salm
1504996Sjkh	case 'D':
1514996Sjkh	    Display = optarg;
1524996Sjkh	    break;
1534996Sjkh
1544996Sjkh	case 'm':
1554996Sjkh	    Mtree = optarg;
1564996Sjkh	    break;
1574996Sjkh
1587713Sjkh	case 'P':
1597713Sjkh	    Pkgdeps = optarg;
1607713Sjkh	    break;
1617713Sjkh
16267454Ssobomax	case 'o':
16367454Ssobomax	    Origin = optarg;
16467454Ssobomax	    break;
16567454Ssobomax
16671373Ssobomax	case 'y':
16795161Sobrien	case 'j':
16895161Sobrien	    Zipper = BZIP2;
16971373Ssobomax	    break;
17071373Ssobomax
17195161Sobrien	case 'z':
17295161Sobrien	    Zipper = GZIP;
17395161Sobrien	    break;
17495161Sobrien
17584670Ssobomax	case 'b':
17685470Ssobomax	    InstalledPkg = optarg;
17784670Ssobomax	    while ((tmp = strrchr(optarg, (int)'/')) != NULL) {
17884670Ssobomax		*tmp++ = '\0';
17984670Ssobomax		/*
18084670Ssobomax		 * If character after the '/' is alphanumeric, then we've
18184670Ssobomax		 * found the package name.  Otherwise we've come across
18284670Ssobomax		 * a trailing '/' and need to continue our quest.
18384670Ssobomax		 */
18484670Ssobomax		if (isalpha(*tmp)) {
18584670Ssobomax		    InstalledPkg = tmp;
18684670Ssobomax		    break;
18784670Ssobomax		}
18884670Ssobomax	    }
18984670Ssobomax	    break;
19084670Ssobomax
191147043Ssobomax	case 'R':
192147043Ssobomax	    Recursive = TRUE;
193147043Ssobomax	    break;
194147043Ssobomax
195327Sjkh	case '?':
196327Sjkh	default:
19730221Scharnier	    usage();
198327Sjkh	    break;
199327Sjkh	}
200327Sjkh
2018857Srgrimes    argc -= optind;
202327Sjkh    argv += optind;
203327Sjkh
204327Sjkh    /* Get all the remaining package names, if any */
205327Sjkh    while (*argv)
206327Sjkh	*pkgs++ = *argv++;
207327Sjkh
208327Sjkh    /* If no packages, yelp */
20984670Ssobomax    if ((pkgs == start) && (InstalledPkg == NULL))
21030221Scharnier	warnx("missing package name"), usage();
211327Sjkh    *pkgs = NULL;
21284670Ssobomax    if ((start[0] != NULL) && (start[1] != NULL)) {
21384670Ssobomax	warnx("only one package name allowed ('%s' extraneous)", start[1]);
21430221Scharnier	usage();
21584670Ssobomax    }
21684670Ssobomax    if (start[0] == NULL)
21784670Ssobomax	start[0] = InstalledPkg;
218327Sjkh    if (!pkg_perform(start)) {
219327Sjkh	if (Verbose)
22030221Scharnier	    warnx("package creation failed");
221327Sjkh	return 1;
222327Sjkh    }
223327Sjkh    else
224327Sjkh	return 0;
225327Sjkh}
226327Sjkh
22730221Scharnierstatic void
22830221Scharnierusage()
229327Sjkh{
230131277Seik    fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
231131277Seik"usage: pkg_create [-YNOhvyz] [-P pkgs] [-C conflicts] [-p prefix] ",
232113594Skris"                  [-i iscript] [-I piscript] [-k dscript] [-K pdscript] ",
233113594Skris"                  [-r rscript] [-t template] [-X excludefile] ",
234113594Skris"                  [-D displayfile] [-m mtreefile] [-o origin] ",
235131277Seik"                  [-s srcdir] [-S basedir] ",
236113594Skris"                  -c comment -d description -f packlist pkg-filename",
237152210Skrion"       pkg_create [-EGYNhvxyzR] -b pkg-name [pkg-filename]");
238327Sjkh    exit(1);
239327Sjkh}
240