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