main.c revision 222035
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 222035 2011-05-17 19:11:47Z flz $");
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
75327Sjkh    pkgs = start = argv;
76179433Sflz    while ((ch = getopt_long(argc, argv, opts, longopts, NULL)) != -1)
77327Sjkh	switch(ch) {
78327Sjkh	case 'v':
79159554Sobrien	    Verbose++;
80327Sjkh	    break;
81327Sjkh
82152210Skrion	case 'x':
83152210Skrion	    MatchType = MATCH_REGEX;
84152210Skrion	    break;
85152210Skrion
86152210Skrion	case 'E':
87152210Skrion	    MatchType = MATCH_EREGEX;
88152210Skrion	    break;
89152210Skrion
90152210Skrion	case 'G':
91152210Skrion	    MatchType = MATCH_EXACT;
92152210Skrion	    break;
93152210Skrion
941337Sjkh	case 'N':
951337Sjkh	    AutoAnswer = NO;
961337Sjkh	    break;
971337Sjkh
981337Sjkh	case 'Y':
991337Sjkh	    AutoAnswer = YES;
1001337Sjkh	    break;
1011337Sjkh
1027986Sjkh	case 'O':
10371095Ssobomax	    PlistOnly = TRUE;
1047986Sjkh	    break;
1057986Sjkh
106327Sjkh	case 'p':
107327Sjkh	    Prefix = optarg;
108327Sjkh	    break;
109327Sjkh
11026473Sjkh	case 's':
11126473Sjkh	    SrcDir = optarg;
11226473Sjkh	    break;
11326473Sjkh
114131277Seik	case 'S':
115131277Seik	    BaseDir = optarg;
116131277Seik	    break;
117131277Seik
118327Sjkh	case 'f':
119327Sjkh	    Contents = optarg;
120327Sjkh	    break;
121327Sjkh
122113594Skris	case 'C':
123113594Skris	    Conflicts = optarg;
124113594Skris	    break;
125113594Skris
126327Sjkh	case 'c':
127327Sjkh	    Comment = optarg;
128327Sjkh	    break;
129327Sjkh
130327Sjkh	case 'd':
131327Sjkh	    Desc = optarg;
132327Sjkh	    break;
133327Sjkh
134327Sjkh	case 'i':
135327Sjkh	    Install = optarg;
136327Sjkh	    break;
137327Sjkh
13841866Sjkh	case 'I':
13941866Sjkh	    PostInstall = optarg;
14041866Sjkh	    break;
14141866Sjkh
142327Sjkh	case 'k':
143327Sjkh	    DeInstall = optarg;
144327Sjkh	    break;
145327Sjkh
14641866Sjkh	case 'K':
14741866Sjkh	    PostDeInstall = optarg;
14841866Sjkh	    break;
14941866Sjkh
150327Sjkh	case 'r':
151327Sjkh	    Require = optarg;
152327Sjkh	    break;
153327Sjkh
154383Sjkh	case 't':
15585019Ssobomax	    strlcpy(PlayPen, optarg, sizeof(PlayPen));
156383Sjkh	    break;
157383Sjkh
158445Sjkh	case 'X':
159445Sjkh	    ExcludeFrom = optarg;
160445Sjkh	    break;
161445Sjkh
162327Sjkh	case 'h':
16371095Ssobomax	    Dereference = TRUE;
1641520Salm	    break;
1651520Salm
1664996Sjkh	case 'D':
1674996Sjkh	    Display = optarg;
1684996Sjkh	    break;
1694996Sjkh
1704996Sjkh	case 'm':
1714996Sjkh	    Mtree = optarg;
1724996Sjkh	    break;
1734996Sjkh
1747713Sjkh	case 'P':
1757713Sjkh	    Pkgdeps = optarg;
1767713Sjkh	    break;
1777713Sjkh
17867454Ssobomax	case 'o':
17967454Ssobomax	    Origin = optarg;
18067454Ssobomax	    break;
18167454Ssobomax
18271373Ssobomax	case 'y':
18395161Sobrien	case 'j':
18495161Sobrien	    Zipper = BZIP2;
18571373Ssobomax	    break;
18671373Ssobomax
18795161Sobrien	case 'z':
18895161Sobrien	    Zipper = GZIP;
18995161Sobrien	    break;
19095161Sobrien
191213718Sflz	case 'J':
192213718Sflz	    Zipper = XZ;
193213718Sflz	    break;
194213718Sflz
19584670Ssobomax	case 'b':
19685470Ssobomax	    InstalledPkg = optarg;
19784670Ssobomax	    while ((tmp = strrchr(optarg, (int)'/')) != NULL) {
19884670Ssobomax		*tmp++ = '\0';
19984670Ssobomax		/*
20084670Ssobomax		 * If character after the '/' is alphanumeric, then we've
20184670Ssobomax		 * found the package name.  Otherwise we've come across
20284670Ssobomax		 * a trailing '/' and need to continue our quest.
20384670Ssobomax		 */
20484670Ssobomax		if (isalpha(*tmp)) {
20584670Ssobomax		    InstalledPkg = tmp;
20684670Ssobomax		    break;
20784670Ssobomax		}
20884670Ssobomax	    }
20984670Ssobomax	    break;
21084670Ssobomax
211147043Ssobomax	case 'R':
212147043Ssobomax	    Recursive = TRUE;
213147043Ssobomax	    break;
214147043Ssobomax
215180361Skeramida	case 'n':
216180361Skeramida	    Regenerate = FALSE;
217180361Skeramida	    break;
218180361Skeramida
219179433Sflz	case 0:
220179433Sflz	    if (Help)
221179433Sflz		usage();
222179433Sflz	    break;
223179352Skeramida
224327Sjkh	default:
22530221Scharnier	    usage();
226327Sjkh	    break;
227327Sjkh	}
228327Sjkh
2298857Srgrimes    argc -= optind;
230327Sjkh    argv += optind;
231327Sjkh
232327Sjkh    /* Get all the remaining package names, if any */
233327Sjkh    while (*argv)
234327Sjkh	*pkgs++ = *argv++;
235327Sjkh
236327Sjkh    /* If no packages, yelp */
23784670Ssobomax    if ((pkgs == start) && (InstalledPkg == NULL))
23830221Scharnier	warnx("missing package name"), usage();
239327Sjkh    *pkgs = NULL;
24084670Ssobomax    if ((start[0] != NULL) && (start[1] != NULL)) {
24184670Ssobomax	warnx("only one package name allowed ('%s' extraneous)", start[1]);
24230221Scharnier	usage();
24384670Ssobomax    }
24484670Ssobomax    if (start[0] == NULL)
24584670Ssobomax	start[0] = InstalledPkg;
246327Sjkh    if (!pkg_perform(start)) {
247327Sjkh	if (Verbose)
24830221Scharnier	    warnx("package creation failed");
249327Sjkh	return 1;
250327Sjkh    }
251327Sjkh    else
252327Sjkh	return 0;
253327Sjkh}
254327Sjkh
25530221Scharnierstatic void
256201226Sedusage(void)
257327Sjkh{
258131277Seik    fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
259179352Skeramida"usage: pkg_create [-YNOhjnvyz] [-C conflicts] [-P pkgs] [-p prefix]",
260162803Sru"                  [-i iscript] [-I piscript] [-k dscript] [-K pdscript]",
261162803Sru"                  [-r rscript] [-s srcdir] [-S basedir]",
262162803Sru"                  [-t template] [-X excludefile]",
263162803Sru"                  [-D displayfile] [-m mtreefile] [-o originpath]",
264113594Skris"                  -c comment -d description -f packlist pkg-filename",
265179366Skeramida"       pkg_create [-EGYNRhnvxy] -b pkg-name [pkg-filename]");
266327Sjkh    exit(1);
267327Sjkh}
268