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