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: releng/10.2/usr.sbin/pkg_install/create/main.c 241830 2012-10-22 02:12:20Z eadler $"); 14 15#include <getopt.h> 16#include <err.h> 17 18#include "lib.h" 19#include "create.h" 20 21match_t MatchType = MATCH_GLOB; 22char *Prefix = NULL; 23char *Comment = NULL; 24char *Desc = NULL; 25char *SrcDir = NULL; 26char *BaseDir = NULL; 27char *Display = NULL; 28char *Install = NULL; 29char *PostInstall = NULL; 30char *DeInstall = NULL; 31char *PostDeInstall = NULL; 32char *Contents = NULL; 33char *Require = NULL; 34char *ExcludeFrom = NULL; 35char *Mtree = NULL; 36char *Pkgdeps = NULL; 37char *Conflicts = NULL; 38char *Origin = NULL; 39char *InstalledPkg = NULL; 40char PlayPen[FILENAME_MAX]; 41int Dereference = FALSE; 42int PlistOnly = FALSE; 43int Recursive = FALSE; 44int Regenerate = TRUE; 45int Help = FALSE; 46enum zipper Zipper = BZIP2; 47 48 49static void usage(void); 50 51static char opts[] = "EGYNnORhjJvxyzf:p:P:C:c:d:i:I:k:K:r:t:X:D:m:s:S:o:b:"; 52static 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 69int 70main(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 256static void 257usage(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} 269