main.c revision 113594
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 113594 2003-04-17 09:56:05Z kris $");
1493520Sobrien
1530221Scharnier#include <err.h>
16327Sjkh#include "lib.h"
17327Sjkh#include "create.h"
18327Sjkh
19113594Skrisstatic char Options[] = "YNOhjvyzf:p:P:C:c:d:i:I:k:K:r:t:X:D:m:s:o:b:";
20327Sjkh
21327Sjkhchar	*Prefix		= NULL;
22327Sjkhchar	*Comment        = NULL;
23327Sjkhchar	*Desc		= NULL;
2426473Sjkhchar	*SrcDir		= NULL;
254996Sjkhchar	*Display	= NULL;
26327Sjkhchar	*Install	= NULL;
2741866Sjkhchar	*PostInstall	= NULL;
28327Sjkhchar	*DeInstall	= NULL;
2941866Sjkhchar	*PostDeInstall	= NULL;
30327Sjkhchar	*Contents	= NULL;
31327Sjkhchar	*Require	= NULL;
32445Sjkhchar	*ExcludeFrom	= NULL;
334996Sjkhchar	*Mtree		= NULL;
347713Sjkhchar	*Pkgdeps	= NULL;
35113594Skrischar	*Conflicts	= NULL;
3667454Ssobomaxchar	*Origin		= NULL;
3784670Ssobomaxchar	*InstalledPkg	= NULL;
3826473Sjkhchar	PlayPen[FILENAME_MAX];
3971095Ssobomaxint	Dereference	= FALSE;
4071095Ssobomaxint	PlistOnly	= FALSE;
4195161Sobrienenum zipper	Zipper	= GZIP;
42327Sjkh
4330221Scharnierstatic void usage __P((void));
4430221Scharnier
45327Sjkhint
46327Sjkhmain(int argc, char **argv)
47327Sjkh{
48327Sjkh    int ch;
4984670Ssobomax    char **pkgs, **start, *tmp;
50327Sjkh
51327Sjkh    pkgs = start = argv;
5224428Simp    while ((ch = getopt(argc, argv, Options)) != -1)
53327Sjkh	switch(ch) {
54327Sjkh	case 'v':
55327Sjkh	    Verbose = TRUE;
56327Sjkh	    break;
57327Sjkh
581337Sjkh	case 'N':
591337Sjkh	    AutoAnswer = NO;
601337Sjkh	    break;
611337Sjkh
621337Sjkh	case 'Y':
631337Sjkh	    AutoAnswer = YES;
641337Sjkh	    break;
651337Sjkh
667986Sjkh	case 'O':
6771095Ssobomax	    PlistOnly = TRUE;
687986Sjkh	    break;
697986Sjkh
70327Sjkh	case 'p':
71327Sjkh	    Prefix = optarg;
72327Sjkh	    break;
73327Sjkh
7426473Sjkh	case 's':
7526473Sjkh	    SrcDir = optarg;
7626473Sjkh	    break;
7726473Sjkh
78327Sjkh	case 'f':
79327Sjkh	    Contents = optarg;
80327Sjkh	    break;
81327Sjkh
82113594Skris	case 'C':
83113594Skris	    Conflicts = optarg;
84113594Skris	    break;
85113594Skris
86327Sjkh	case 'c':
87327Sjkh	    Comment = optarg;
88327Sjkh	    break;
89327Sjkh
90327Sjkh	case 'd':
91327Sjkh	    Desc = optarg;
92327Sjkh	    break;
93327Sjkh
94327Sjkh	case 'i':
95327Sjkh	    Install = optarg;
96327Sjkh	    break;
97327Sjkh
9841866Sjkh	case 'I':
9941866Sjkh	    PostInstall = optarg;
10041866Sjkh	    break;
10141866Sjkh
102327Sjkh	case 'k':
103327Sjkh	    DeInstall = optarg;
104327Sjkh	    break;
105327Sjkh
10641866Sjkh	case 'K':
10741866Sjkh	    PostDeInstall = optarg;
10841866Sjkh	    break;
10941866Sjkh
110327Sjkh	case 'r':
111327Sjkh	    Require = optarg;
112327Sjkh	    break;
113327Sjkh
114383Sjkh	case 't':
11585019Ssobomax	    strlcpy(PlayPen, optarg, sizeof(PlayPen));
116383Sjkh	    break;
117383Sjkh
118445Sjkh	case 'X':
119445Sjkh	    ExcludeFrom = optarg;
120445Sjkh	    break;
121445Sjkh
122327Sjkh	case 'h':
12371095Ssobomax	    Dereference = TRUE;
1241520Salm	    break;
1251520Salm
1264996Sjkh	case 'D':
1274996Sjkh	    Display = optarg;
1284996Sjkh	    break;
1294996Sjkh
1304996Sjkh	case 'm':
1314996Sjkh	    Mtree = optarg;
1324996Sjkh	    break;
1334996Sjkh
1347713Sjkh	case 'P':
1357713Sjkh	    Pkgdeps = optarg;
1367713Sjkh	    break;
1377713Sjkh
13867454Ssobomax	case 'o':
13967454Ssobomax	    Origin = optarg;
14067454Ssobomax	    break;
14167454Ssobomax
14271373Ssobomax	case 'y':
14395161Sobrien	case 'j':
14495161Sobrien	    Zipper = BZIP2;
14571373Ssobomax	    break;
14671373Ssobomax
14795161Sobrien	case 'z':
14895161Sobrien	    Zipper = GZIP;
14995161Sobrien	    break;
15095161Sobrien
15184670Ssobomax	case 'b':
15285470Ssobomax	    InstalledPkg = optarg;
15384670Ssobomax	    while ((tmp = strrchr(optarg, (int)'/')) != NULL) {
15484670Ssobomax		*tmp++ = '\0';
15584670Ssobomax		/*
15684670Ssobomax		 * If character after the '/' is alphanumeric, then we've
15784670Ssobomax		 * found the package name.  Otherwise we've come across
15884670Ssobomax		 * a trailing '/' and need to continue our quest.
15984670Ssobomax		 */
16084670Ssobomax		if (isalpha(*tmp)) {
16184670Ssobomax		    InstalledPkg = tmp;
16284670Ssobomax		    break;
16384670Ssobomax		}
16484670Ssobomax	    }
16584670Ssobomax	    break;
16684670Ssobomax
167327Sjkh	case '?':
168327Sjkh	default:
16930221Scharnier	    usage();
170327Sjkh	    break;
171327Sjkh	}
172327Sjkh
1738857Srgrimes    argc -= optind;
174327Sjkh    argv += optind;
175327Sjkh
176327Sjkh    /* Get all the remaining package names, if any */
177327Sjkh    while (*argv)
178327Sjkh	*pkgs++ = *argv++;
179327Sjkh
180327Sjkh    /* If no packages, yelp */
18184670Ssobomax    if ((pkgs == start) && (InstalledPkg == NULL))
18230221Scharnier	warnx("missing package name"), usage();
183327Sjkh    *pkgs = NULL;
18484670Ssobomax    if ((start[0] != NULL) && (start[1] != NULL)) {
18584670Ssobomax	warnx("only one package name allowed ('%s' extraneous)", start[1]);
18630221Scharnier	usage();
18784670Ssobomax    }
18884670Ssobomax    if (start[0] == NULL)
18984670Ssobomax	start[0] = InstalledPkg;
190327Sjkh    if (!pkg_perform(start)) {
191327Sjkh	if (Verbose)
19230221Scharnier	    warnx("package creation failed");
193327Sjkh	return 1;
194327Sjkh    }
195327Sjkh    else
196327Sjkh	return 0;
197327Sjkh}
198327Sjkh
19930221Scharnierstatic void
20030221Scharnierusage()
201327Sjkh{
20284670Ssobomax    fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n",
203113594Skris"usage: pkg_create [-YNOhvy] [-P pkgs] [-C conflicts] [-p prefix] [-f contents] ",
204113594Skris"                  [-i iscript] [-I piscript] [-k dscript] [-K pdscript] ",
205113594Skris"                  [-r rscript] [-t template] [-X excludefile] ",
206113594Skris"                  [-D displayfile] [-m mtreefile] [-o origin] ",
207113594Skris"                  -c comment -d description -f packlist pkg-filename",
20884670Ssobomax"       pkg_create [-YNhvy] -b pkg-name [pkg-filename]");
209327Sjkh    exit(1);
210327Sjkh}
211