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