1327Sjkh/*
2228990Suqs * FreeBSD install - a package for the installation and maintenance
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$");
1493520Sobrien
15179433Sflz#include <getopt.h>
1630221Scharnier#include <err.h>
17179433Sflz
18222035Sflz#include "lib.h"
19327Sjkh#include "create.h"
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;
44179352Skeramidaint	Regenerate	= TRUE;
45179433Sflzint	Help		= FALSE;
46157808Skrionenum zipper	Zipper  = BZIP2;
47327Sjkh
48157808Skrion
49173412Skevlostatic void usage(void);
5030221Scharnier
51213718Sflzstatic char opts[] = "EGYNnORhjJvxyzf:p:P:C:c:d:i:I:k:K:r:t:X:D:m:s:S:o:b:";
52179433Sflzstatic struct option longopts[] = {
53179433Sflz	{ "backup",	required_argument,	NULL,		'b' },
54179433Sflz	{ "extended",	no_argument,		NULL,		'E' },
55179433Sflz	{ "help",	no_argument,		&Help,		TRUE },
56179433Sflz	{ "no",		no_argument,		NULL,		'N' },
57179433Sflz	{ "no-glob",	no_argument,		NULL,		'G' },
58179433Sflz	{ "origin",	required_argument,	NULL,		'o' },
59179433Sflz	{ "plist-only",	no_argument,		NULL,		'O' },
60179433Sflz	{ "prefix",	required_argument,	NULL,		'p' },
61179433Sflz	{ "recursive",	no_argument,		NULL,		'R' },
62179433Sflz	{ "regex",	no_argument,		NULL,		'x' },
63179433Sflz	{ "template",	required_argument,	NULL,		't' },
64179433Sflz	{ "verbose",	no_argument,		NULL,		'v' },
65179433Sflz	{ "yes",	no_argument,		NULL,		'Y' },
66179433Sflz	{ NULL,		0,			NULL,		0 },
67179433Sflz};
68179433Sflz
69327Sjkhint
70327Sjkhmain(int argc, char **argv)
71327Sjkh{
72327Sjkh    int ch;
7384670Ssobomax    char **pkgs, **start, *tmp;
74327Sjkh
75241830Seadler    warnpkgng();
76327Sjkh    pkgs = start = argv;
77179433Sflz    while ((ch = getopt_long(argc, argv, opts, longopts, NULL)) != -1)
78327Sjkh	switch(ch) {
79327Sjkh	case 'v':
80159554Sobrien	    Verbose++;
81327Sjkh	    break;
82327Sjkh
83152210Skrion	case 'x':
84152210Skrion	    MatchType = MATCH_REGEX;
85152210Skrion	    break;
86152210Skrion
87152210Skrion	case 'E':
88152210Skrion	    MatchType = MATCH_EREGEX;
89152210Skrion	    break;
90152210Skrion
91152210Skrion	case 'G':
92152210Skrion	    MatchType = MATCH_EXACT;
93152210Skrion	    break;
94152210Skrion
951337Sjkh	case 'N':
961337Sjkh	    AutoAnswer = NO;
971337Sjkh	    break;
981337Sjkh
991337Sjkh	case 'Y':
1001337Sjkh	    AutoAnswer = YES;
1011337Sjkh	    break;
1021337Sjkh
1037986Sjkh	case 'O':
10471095Ssobomax	    PlistOnly = TRUE;
1057986Sjkh	    break;
1067986Sjkh
107327Sjkh	case 'p':
108327Sjkh	    Prefix = optarg;
109327Sjkh	    break;
110327Sjkh
11126473Sjkh	case 's':
11226473Sjkh	    SrcDir = optarg;
11326473Sjkh	    break;
11426473Sjkh
115131277Seik	case 'S':
116131277Seik	    BaseDir = optarg;
117131277Seik	    break;
118131277Seik
119327Sjkh	case 'f':
120327Sjkh	    Contents = optarg;
121327Sjkh	    break;
122327Sjkh
123113594Skris	case 'C':
124113594Skris	    Conflicts = optarg;
125113594Skris	    break;
126113594Skris
127327Sjkh	case 'c':
128327Sjkh	    Comment = optarg;
129327Sjkh	    break;
130327Sjkh
131327Sjkh	case 'd':
132327Sjkh	    Desc = optarg;
133327Sjkh	    break;
134327Sjkh
135327Sjkh	case 'i':
136327Sjkh	    Install = optarg;
137327Sjkh	    break;
138327Sjkh
13941866Sjkh	case 'I':
14041866Sjkh	    PostInstall = optarg;
14141866Sjkh	    break;
14241866Sjkh
143327Sjkh	case 'k':
144327Sjkh	    DeInstall = optarg;
145327Sjkh	    break;
146327Sjkh
14741866Sjkh	case 'K':
14841866Sjkh	    PostDeInstall = optarg;
14941866Sjkh	    break;
15041866Sjkh
151327Sjkh	case 'r':
152327Sjkh	    Require = optarg;
153327Sjkh	    break;
154327Sjkh
155383Sjkh	case 't':
15685019Ssobomax	    strlcpy(PlayPen, optarg, sizeof(PlayPen));
157383Sjkh	    break;
158383Sjkh
159445Sjkh	case 'X':
160445Sjkh	    ExcludeFrom = optarg;
161445Sjkh	    break;
162445Sjkh
163327Sjkh	case 'h':
16471095Ssobomax	    Dereference = TRUE;
1651520Salm	    break;
1661520Salm
1674996Sjkh	case 'D':
1684996Sjkh	    Display = optarg;
1694996Sjkh	    break;
1704996Sjkh
1714996Sjkh	case 'm':
1724996Sjkh	    Mtree = optarg;
1734996Sjkh	    break;
1744996Sjkh
1757713Sjkh	case 'P':
1767713Sjkh	    Pkgdeps = optarg;
1777713Sjkh	    break;
1787713Sjkh
17967454Ssobomax	case 'o':
18067454Ssobomax	    Origin = optarg;
18167454Ssobomax	    break;
18267454Ssobomax
18371373Ssobomax	case 'y':
18495161Sobrien	case 'j':
18595161Sobrien	    Zipper = BZIP2;
18671373Ssobomax	    break;
18771373Ssobomax
18895161Sobrien	case 'z':
18995161Sobrien	    Zipper = GZIP;
19095161Sobrien	    break;
19195161Sobrien
192213718Sflz	case 'J':
193213718Sflz	    Zipper = XZ;
194213718Sflz	    break;
195213718Sflz
19684670Ssobomax	case 'b':
19785470Ssobomax	    InstalledPkg = optarg;
19884670Ssobomax	    while ((tmp = strrchr(optarg, (int)'/')) != NULL) {
19984670Ssobomax		*tmp++ = '\0';
20084670Ssobomax		/*
20184670Ssobomax		 * If character after the '/' is alphanumeric, then we've
20284670Ssobomax		 * found the package name.  Otherwise we've come across
20384670Ssobomax		 * a trailing '/' and need to continue our quest.
20484670Ssobomax		 */
20584670Ssobomax		if (isalpha(*tmp)) {
20684670Ssobomax		    InstalledPkg = tmp;
20784670Ssobomax		    break;
20884670Ssobomax		}
20984670Ssobomax	    }
21084670Ssobomax	    break;
21184670Ssobomax
212147043Ssobomax	case 'R':
213147043Ssobomax	    Recursive = TRUE;
214147043Ssobomax	    break;
215147043Ssobomax
216180361Skeramida	case 'n':
217180361Skeramida	    Regenerate = FALSE;
218180361Skeramida	    break;
219180361Skeramida
220179433Sflz	case 0:
221179433Sflz	    if (Help)
222179433Sflz		usage();
223179433Sflz	    break;
224179352Skeramida
225327Sjkh	default:
22630221Scharnier	    usage();
227327Sjkh	    break;
228327Sjkh	}
229327Sjkh
2308857Srgrimes    argc -= optind;
231327Sjkh    argv += optind;
232327Sjkh
233327Sjkh    /* Get all the remaining package names, if any */
234327Sjkh    while (*argv)
235327Sjkh	*pkgs++ = *argv++;
236327Sjkh
237327Sjkh    /* If no packages, yelp */
23884670Ssobomax    if ((pkgs == start) && (InstalledPkg == NULL))
23930221Scharnier	warnx("missing package name"), usage();
240327Sjkh    *pkgs = NULL;
24184670Ssobomax    if ((start[0] != NULL) && (start[1] != NULL)) {
24284670Ssobomax	warnx("only one package name allowed ('%s' extraneous)", start[1]);
24330221Scharnier	usage();
24484670Ssobomax    }
24584670Ssobomax    if (start[0] == NULL)
24684670Ssobomax	start[0] = InstalledPkg;
247327Sjkh    if (!pkg_perform(start)) {
248327Sjkh	if (Verbose)
24930221Scharnier	    warnx("package creation failed");
250327Sjkh	return 1;
251327Sjkh    }
252327Sjkh    else
253327Sjkh	return 0;
254327Sjkh}
255327Sjkh
25630221Scharnierstatic void
257201226Sedusage(void)
258327Sjkh{
259131277Seik    fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
260179352Skeramida"usage: pkg_create [-YNOhjnvyz] [-C conflicts] [-P pkgs] [-p prefix]",
261162803Sru"                  [-i iscript] [-I piscript] [-k dscript] [-K pdscript]",
262162803Sru"                  [-r rscript] [-s srcdir] [-S basedir]",
263162803Sru"                  [-t template] [-X excludefile]",
264162803Sru"                  [-D displayfile] [-m mtreefile] [-o originpath]",
265113594Skris"                  -c comment -d description -f packlist pkg-filename",
266179366Skeramida"       pkg_create [-EGYNRhnvxy] -b pkg-name [pkg-filename]");
267327Sjkh    exit(1);
268327Sjkh}
269