main.c revision 179433
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 179433 2008-05-30 14:26:09Z flz $");
1493520Sobrien
15179433Sflz#include <getopt.h>
1630221Scharnier#include <err.h>
17179433Sflz
18327Sjkh#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;
46157808Skrion#if defined(__FreeBSD_version) && __FreeBSD_version >= 500039
47157808Skrionenum zipper	Zipper  = BZIP2;
48157808Skrion#else
49157808Skrionenum zipper	Zipper  = GZIP;
50157808Skrion#endif
51327Sjkh
52157808Skrion
53173412Skevlostatic void usage(void);
5430221Scharnier
55179433Sflzstatic char opts[] = "EGYNnORhjvxyzf:p:P:C:c:d:i:I:k:K:r:t:X:D:m:s:S:o:b:";
56179433Sflzstatic struct option longopts[] = {
57179433Sflz	{ "backup",	required_argument,	NULL,		'b' },
58179433Sflz	{ "extended",	no_argument,		NULL,		'E' },
59179433Sflz	{ "help",	no_argument,		&Help,		TRUE },
60179433Sflz	{ "no",		no_argument,		NULL,		'N' },
61179433Sflz	{ "no-glob",	no_argument,		NULL,		'G' },
62179433Sflz	{ "origin",	required_argument,	NULL,		'o' },
63179433Sflz	{ "plist-only",	no_argument,		NULL,		'O' },
64179433Sflz	{ "prefix",	required_argument,	NULL,		'p' },
65179433Sflz	{ "recursive",	no_argument,		NULL,		'R' },
66179433Sflz	{ "regex",	no_argument,		NULL,		'x' },
67179433Sflz	{ "template",	required_argument,	NULL,		't' },
68179433Sflz	{ "verbose",	no_argument,		NULL,		'v' },
69179433Sflz	{ "yes",	no_argument,		NULL,		'Y' },
70179433Sflz	{ NULL,		0,			NULL,		0 },
71179433Sflz};
72179433Sflz
73327Sjkhint
74327Sjkhmain(int argc, char **argv)
75327Sjkh{
76327Sjkh    int ch;
7784670Ssobomax    char **pkgs, **start, *tmp;
78327Sjkh
79327Sjkh    pkgs = start = argv;
80179433Sflz    while ((ch = getopt_long(argc, argv, opts, longopts, NULL)) != -1)
81327Sjkh	switch(ch) {
82327Sjkh	case 'v':
83159554Sobrien	    Verbose++;
84327Sjkh	    break;
85327Sjkh
86152210Skrion	case 'x':
87152210Skrion	    MatchType = MATCH_REGEX;
88152210Skrion	    break;
89152210Skrion
90152210Skrion	case 'E':
91152210Skrion	    MatchType = MATCH_EREGEX;
92152210Skrion	    break;
93152210Skrion
94152210Skrion	case 'G':
95152210Skrion	    MatchType = MATCH_EXACT;
96152210Skrion	    break;
97152210Skrion
981337Sjkh	case 'N':
991337Sjkh	    AutoAnswer = NO;
1001337Sjkh	    break;
1011337Sjkh
1021337Sjkh	case 'Y':
1031337Sjkh	    AutoAnswer = YES;
1041337Sjkh	    break;
1051337Sjkh
1067986Sjkh	case 'O':
10771095Ssobomax	    PlistOnly = TRUE;
1087986Sjkh	    break;
1097986Sjkh
110327Sjkh	case 'p':
111327Sjkh	    Prefix = optarg;
112327Sjkh	    break;
113327Sjkh
11426473Sjkh	case 's':
11526473Sjkh	    SrcDir = optarg;
11626473Sjkh	    break;
11726473Sjkh
118131277Seik	case 'S':
119131277Seik	    BaseDir = optarg;
120131277Seik	    break;
121131277Seik
122327Sjkh	case 'f':
123327Sjkh	    Contents = optarg;
124327Sjkh	    break;
125327Sjkh
126113594Skris	case 'C':
127113594Skris	    Conflicts = optarg;
128113594Skris	    break;
129113594Skris
130327Sjkh	case 'c':
131327Sjkh	    Comment = optarg;
132327Sjkh	    break;
133327Sjkh
134327Sjkh	case 'd':
135327Sjkh	    Desc = optarg;
136327Sjkh	    break;
137327Sjkh
138327Sjkh	case 'i':
139327Sjkh	    Install = optarg;
140327Sjkh	    break;
141327Sjkh
14241866Sjkh	case 'I':
14341866Sjkh	    PostInstall = optarg;
14441866Sjkh	    break;
14541866Sjkh
146327Sjkh	case 'k':
147327Sjkh	    DeInstall = optarg;
148327Sjkh	    break;
149327Sjkh
15041866Sjkh	case 'K':
15141866Sjkh	    PostDeInstall = optarg;
15241866Sjkh	    break;
15341866Sjkh
154327Sjkh	case 'r':
155327Sjkh	    Require = optarg;
156327Sjkh	    break;
157327Sjkh
158383Sjkh	case 't':
15985019Ssobomax	    strlcpy(PlayPen, optarg, sizeof(PlayPen));
160383Sjkh	    break;
161383Sjkh
162445Sjkh	case 'X':
163445Sjkh	    ExcludeFrom = optarg;
164445Sjkh	    break;
165445Sjkh
166327Sjkh	case 'h':
16771095Ssobomax	    Dereference = TRUE;
1681520Salm	    break;
1691520Salm
1704996Sjkh	case 'D':
1714996Sjkh	    Display = optarg;
1724996Sjkh	    break;
1734996Sjkh
1744996Sjkh	case 'm':
1754996Sjkh	    Mtree = optarg;
1764996Sjkh	    break;
1774996Sjkh
1787713Sjkh	case 'P':
1797713Sjkh	    Pkgdeps = optarg;
1807713Sjkh	    break;
1817713Sjkh
18267454Ssobomax	case 'o':
18367454Ssobomax	    Origin = optarg;
18467454Ssobomax	    break;
18567454Ssobomax
18671373Ssobomax	case 'y':
18795161Sobrien	case 'j':
18895161Sobrien	    Zipper = BZIP2;
18971373Ssobomax	    break;
19071373Ssobomax
19195161Sobrien	case 'z':
19295161Sobrien	    Zipper = GZIP;
19395161Sobrien	    break;
19495161Sobrien
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
215179433Sflz	case 0:
216179433Sflz	    if (Help)
217179433Sflz		usage();
218179433Sflz	    break;
219179352Skeramida
220327Sjkh	default:
22130221Scharnier	    usage();
222327Sjkh	    break;
223327Sjkh	}
224327Sjkh
2258857Srgrimes    argc -= optind;
226327Sjkh    argv += optind;
227327Sjkh
228327Sjkh    /* Get all the remaining package names, if any */
229327Sjkh    while (*argv)
230327Sjkh	*pkgs++ = *argv++;
231327Sjkh
232327Sjkh    /* If no packages, yelp */
23384670Ssobomax    if ((pkgs == start) && (InstalledPkg == NULL))
23430221Scharnier	warnx("missing package name"), usage();
235327Sjkh    *pkgs = NULL;
23684670Ssobomax    if ((start[0] != NULL) && (start[1] != NULL)) {
23784670Ssobomax	warnx("only one package name allowed ('%s' extraneous)", start[1]);
23830221Scharnier	usage();
23984670Ssobomax    }
24084670Ssobomax    if (start[0] == NULL)
24184670Ssobomax	start[0] = InstalledPkg;
242327Sjkh    if (!pkg_perform(start)) {
243327Sjkh	if (Verbose)
24430221Scharnier	    warnx("package creation failed");
245327Sjkh	return 1;
246327Sjkh    }
247327Sjkh    else
248327Sjkh	return 0;
249327Sjkh}
250327Sjkh
25130221Scharnierstatic void
25230221Scharnierusage()
253327Sjkh{
254131277Seik    fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
255179352Skeramida"usage: pkg_create [-YNOhjnvyz] [-C conflicts] [-P pkgs] [-p prefix]",
256162803Sru"                  [-i iscript] [-I piscript] [-k dscript] [-K pdscript]",
257162803Sru"                  [-r rscript] [-s srcdir] [-S basedir]",
258162803Sru"                  [-t template] [-X excludefile]",
259162803Sru"                  [-D displayfile] [-m mtreefile] [-o originpath]",
260113594Skris"                  -c comment -d description -f packlist pkg-filename",
261179366Skeramida"       pkg_create [-EGYNRhnvxy] -b pkg-name [pkg-filename]");
262327Sjkh    exit(1);
263327Sjkh}
264