]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - usr.sbin/pkg_install/create/main.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / usr.sbin / pkg_install / create / main.c
1 /*
2  * FreeBSD install - a package for the installation and maintenance
3  * of non-core utilities.
4  *
5  * Jordan K. Hubbard
6  * 18 July 1993
7  *
8  * This is the create module.
9  *
10  */
11
12 #include <sys/cdefs.h>
13 __FBSDID("$FreeBSD$");
14
15 #include <getopt.h>
16 #include <err.h>
17
18 #include "lib.h"
19 #include "create.h"
20
21 match_t MatchType       = MATCH_GLOB;
22 char    *Prefix         = NULL;
23 char    *Comment        = NULL;
24 char    *Desc           = NULL;
25 char    *SrcDir         = NULL;
26 char    *BaseDir        = NULL;
27 char    *Display        = NULL;
28 char    *Install        = NULL;
29 char    *PostInstall    = NULL;
30 char    *DeInstall      = NULL;
31 char    *PostDeInstall  = NULL;
32 char    *Contents       = NULL;
33 char    *Require        = NULL;
34 char    *ExcludeFrom    = NULL;
35 char    *Mtree          = NULL;
36 char    *Pkgdeps        = NULL;
37 char    *Conflicts      = NULL;
38 char    *Origin         = NULL;
39 char    *InstalledPkg   = NULL;
40 char    PlayPen[FILENAME_MAX];
41 int     Dereference     = FALSE;
42 int     PlistOnly       = FALSE;
43 int     Recursive       = FALSE;
44 int     Regenerate      = TRUE;
45 int     Help            = FALSE;
46 enum zipper     Zipper  = BZIP2;
47
48
49 static void usage(void);
50
51 static char opts[] = "EGYNnORhjJvxyzf:p:P:C:c:d:i:I:k:K:r:t:X:D:m:s:S:o:b:";
52 static struct option longopts[] = {
53         { "backup",     required_argument,      NULL,           'b' },
54         { "extended",   no_argument,            NULL,           'E' },
55         { "help",       no_argument,            &Help,          TRUE },
56         { "no",         no_argument,            NULL,           'N' },
57         { "no-glob",    no_argument,            NULL,           'G' },
58         { "origin",     required_argument,      NULL,           'o' },
59         { "plist-only", no_argument,            NULL,           'O' },
60         { "prefix",     required_argument,      NULL,           'p' },
61         { "recursive",  no_argument,            NULL,           'R' },
62         { "regex",      no_argument,            NULL,           'x' },
63         { "template",   required_argument,      NULL,           't' },
64         { "verbose",    no_argument,            NULL,           'v' },
65         { "yes",        no_argument,            NULL,           'Y' },
66         { NULL,         0,                      NULL,           0 },
67 };
68
69 int
70 main(int argc, char **argv)
71 {
72     int ch;
73     char **pkgs, **start, *tmp;
74
75     warnpkgng();
76     pkgs = start = argv;
77     while ((ch = getopt_long(argc, argv, opts, longopts, NULL)) != -1)
78         switch(ch) {
79         case 'v':
80             Verbose++;
81             break;
82
83         case 'x':
84             MatchType = MATCH_REGEX;
85             break;
86
87         case 'E':
88             MatchType = MATCH_EREGEX;
89             break;
90
91         case 'G':
92             MatchType = MATCH_EXACT;
93             break;
94
95         case 'N':
96             AutoAnswer = NO;
97             break;
98
99         case 'Y':
100             AutoAnswer = YES;
101             break;
102
103         case 'O':
104             PlistOnly = TRUE;
105             break;
106
107         case 'p':
108             Prefix = optarg;
109             break;
110
111         case 's':
112             SrcDir = optarg;
113             break;
114
115         case 'S':
116             BaseDir = optarg;
117             break;
118
119         case 'f':
120             Contents = optarg;
121             break;
122
123         case 'C':
124             Conflicts = optarg;
125             break;
126
127         case 'c':
128             Comment = optarg;
129             break;
130
131         case 'd':
132             Desc = optarg;
133             break;
134
135         case 'i':
136             Install = optarg;
137             break;
138
139         case 'I':
140             PostInstall = optarg;
141             break;
142
143         case 'k':
144             DeInstall = optarg;
145             break;
146
147         case 'K':
148             PostDeInstall = optarg;
149             break;
150
151         case 'r':
152             Require = optarg;
153             break;
154
155         case 't':
156             strlcpy(PlayPen, optarg, sizeof(PlayPen));
157             break;
158
159         case 'X':
160             ExcludeFrom = optarg;
161             break;
162
163         case 'h':
164             Dereference = TRUE;
165             break;
166
167         case 'D':
168             Display = optarg;
169             break;
170
171         case 'm':
172             Mtree = optarg;
173             break;
174
175         case 'P':
176             Pkgdeps = optarg;
177             break;
178
179         case 'o':
180             Origin = optarg;
181             break;
182
183         case 'y':
184         case 'j':
185             Zipper = BZIP2;
186             break;
187
188         case 'z':
189             Zipper = GZIP;
190             break;
191
192         case 'J':
193             Zipper = XZ;
194             break;
195
196         case 'b':
197             InstalledPkg = optarg;
198             while ((tmp = strrchr(optarg, (int)'/')) != NULL) {
199                 *tmp++ = '\0';
200                 /*
201                  * If character after the '/' is alphanumeric, then we've
202                  * found the package name.  Otherwise we've come across
203                  * a trailing '/' and need to continue our quest.
204                  */
205                 if (isalpha(*tmp)) {
206                     InstalledPkg = tmp;
207                     break;
208                 }
209             }
210             break;
211
212         case 'R':
213             Recursive = TRUE;
214             break;
215
216         case 'n':
217             Regenerate = FALSE;
218             break;
219
220         case 0:
221             if (Help)
222                 usage();
223             break;
224
225         default:
226             usage();
227             break;
228         }
229
230     argc -= optind;
231     argv += optind;
232
233     /* Get all the remaining package names, if any */
234     while (*argv)
235         *pkgs++ = *argv++;
236
237     /* If no packages, yelp */
238     if ((pkgs == start) && (InstalledPkg == NULL))
239         warnx("missing package name"), usage();
240     *pkgs = NULL;
241     if ((start[0] != NULL) && (start[1] != NULL)) {
242         warnx("only one package name allowed ('%s' extraneous)", start[1]);
243         usage();
244     }
245     if (start[0] == NULL)
246         start[0] = InstalledPkg;
247     if (!pkg_perform(start)) {
248         if (Verbose)
249             warnx("package creation failed");
250         return 1;
251     }
252     else
253         return 0;
254 }
255
256 static void
257 usage(void)
258 {
259     fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
260 "usage: pkg_create [-YNOhjnvyz] [-C conflicts] [-P pkgs] [-p prefix]",
261 "                  [-i iscript] [-I piscript] [-k dscript] [-K pdscript]",
262 "                  [-r rscript] [-s srcdir] [-S basedir]",
263 "                  [-t template] [-X excludefile]",
264 "                  [-D displayfile] [-m mtreefile] [-o originpath]",
265 "                  -c comment -d description -f packlist pkg-filename",
266 "       pkg_create [-EGYNRhnvxy] -b pkg-name [pkg-filename]");
267     exit(1);
268 }