main.c revision 159554
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 159554 2006-06-12 22:39:32Z obrien $"); 1493520Sobrien 1530221Scharnier#include <err.h> 16327Sjkh#include "lib.h" 17327Sjkh#include "create.h" 18327Sjkh 19152210Skrionstatic char Options[] = "EGYNORhjvxyzf:p:P:C:c:d:i:I:k:K:r:t:X:D:m:s:S:o:b:"; 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; 44157808Skrion#if defined(__FreeBSD_version) && __FreeBSD_version >= 500039 45157808Skrionenum zipper Zipper = BZIP2; 46157808Skrion#else 47157808Skrionenum zipper Zipper = GZIP; 48157808Skrion#endif 49327Sjkh 50157808Skrion 5130221Scharnierstatic void usage __P((void)); 5230221Scharnier 53327Sjkhint 54327Sjkhmain(int argc, char **argv) 55327Sjkh{ 56327Sjkh int ch; 5784670Ssobomax char **pkgs, **start, *tmp; 58327Sjkh 59327Sjkh pkgs = start = argv; 6024428Simp while ((ch = getopt(argc, argv, Options)) != -1) 61327Sjkh switch(ch) { 62327Sjkh case 'v': 63159554Sobrien Verbose++; 64327Sjkh break; 65327Sjkh 66152210Skrion case 'x': 67152210Skrion MatchType = MATCH_REGEX; 68152210Skrion break; 69152210Skrion 70152210Skrion case 'E': 71152210Skrion MatchType = MATCH_EREGEX; 72152210Skrion break; 73152210Skrion 74152210Skrion case 'G': 75152210Skrion MatchType = MATCH_EXACT; 76152210Skrion break; 77152210Skrion 781337Sjkh case 'N': 791337Sjkh AutoAnswer = NO; 801337Sjkh break; 811337Sjkh 821337Sjkh case 'Y': 831337Sjkh AutoAnswer = YES; 841337Sjkh break; 851337Sjkh 867986Sjkh case 'O': 8771095Ssobomax PlistOnly = TRUE; 887986Sjkh break; 897986Sjkh 90327Sjkh case 'p': 91327Sjkh Prefix = optarg; 92327Sjkh break; 93327Sjkh 9426473Sjkh case 's': 9526473Sjkh SrcDir = optarg; 9626473Sjkh break; 9726473Sjkh 98131277Seik case 'S': 99131277Seik BaseDir = optarg; 100131277Seik break; 101131277Seik 102327Sjkh case 'f': 103327Sjkh Contents = optarg; 104327Sjkh break; 105327Sjkh 106113594Skris case 'C': 107113594Skris Conflicts = optarg; 108113594Skris break; 109113594Skris 110327Sjkh case 'c': 111327Sjkh Comment = optarg; 112327Sjkh break; 113327Sjkh 114327Sjkh case 'd': 115327Sjkh Desc = optarg; 116327Sjkh break; 117327Sjkh 118327Sjkh case 'i': 119327Sjkh Install = optarg; 120327Sjkh break; 121327Sjkh 12241866Sjkh case 'I': 12341866Sjkh PostInstall = optarg; 12441866Sjkh break; 12541866Sjkh 126327Sjkh case 'k': 127327Sjkh DeInstall = optarg; 128327Sjkh break; 129327Sjkh 13041866Sjkh case 'K': 13141866Sjkh PostDeInstall = optarg; 13241866Sjkh break; 13341866Sjkh 134327Sjkh case 'r': 135327Sjkh Require = optarg; 136327Sjkh break; 137327Sjkh 138383Sjkh case 't': 13985019Ssobomax strlcpy(PlayPen, optarg, sizeof(PlayPen)); 140383Sjkh break; 141383Sjkh 142445Sjkh case 'X': 143445Sjkh ExcludeFrom = optarg; 144445Sjkh break; 145445Sjkh 146327Sjkh case 'h': 14771095Ssobomax Dereference = TRUE; 1481520Salm break; 1491520Salm 1504996Sjkh case 'D': 1514996Sjkh Display = optarg; 1524996Sjkh break; 1534996Sjkh 1544996Sjkh case 'm': 1554996Sjkh Mtree = optarg; 1564996Sjkh break; 1574996Sjkh 1587713Sjkh case 'P': 1597713Sjkh Pkgdeps = optarg; 1607713Sjkh break; 1617713Sjkh 16267454Ssobomax case 'o': 16367454Ssobomax Origin = optarg; 16467454Ssobomax break; 16567454Ssobomax 16671373Ssobomax case 'y': 16795161Sobrien case 'j': 16895161Sobrien Zipper = BZIP2; 16971373Ssobomax break; 17071373Ssobomax 17195161Sobrien case 'z': 17295161Sobrien Zipper = GZIP; 17395161Sobrien break; 17495161Sobrien 17584670Ssobomax case 'b': 17685470Ssobomax InstalledPkg = optarg; 17784670Ssobomax while ((tmp = strrchr(optarg, (int)'/')) != NULL) { 17884670Ssobomax *tmp++ = '\0'; 17984670Ssobomax /* 18084670Ssobomax * If character after the '/' is alphanumeric, then we've 18184670Ssobomax * found the package name. Otherwise we've come across 18284670Ssobomax * a trailing '/' and need to continue our quest. 18384670Ssobomax */ 18484670Ssobomax if (isalpha(*tmp)) { 18584670Ssobomax InstalledPkg = tmp; 18684670Ssobomax break; 18784670Ssobomax } 18884670Ssobomax } 18984670Ssobomax break; 19084670Ssobomax 191147043Ssobomax case 'R': 192147043Ssobomax Recursive = TRUE; 193147043Ssobomax break; 194147043Ssobomax 195327Sjkh case '?': 196327Sjkh default: 19730221Scharnier usage(); 198327Sjkh break; 199327Sjkh } 200327Sjkh 2018857Srgrimes argc -= optind; 202327Sjkh argv += optind; 203327Sjkh 204327Sjkh /* Get all the remaining package names, if any */ 205327Sjkh while (*argv) 206327Sjkh *pkgs++ = *argv++; 207327Sjkh 208327Sjkh /* If no packages, yelp */ 20984670Ssobomax if ((pkgs == start) && (InstalledPkg == NULL)) 21030221Scharnier warnx("missing package name"), usage(); 211327Sjkh *pkgs = NULL; 21284670Ssobomax if ((start[0] != NULL) && (start[1] != NULL)) { 21384670Ssobomax warnx("only one package name allowed ('%s' extraneous)", start[1]); 21430221Scharnier usage(); 21584670Ssobomax } 21684670Ssobomax if (start[0] == NULL) 21784670Ssobomax start[0] = InstalledPkg; 218327Sjkh if (!pkg_perform(start)) { 219327Sjkh if (Verbose) 22030221Scharnier warnx("package creation failed"); 221327Sjkh return 1; 222327Sjkh } 223327Sjkh else 224327Sjkh return 0; 225327Sjkh} 226327Sjkh 22730221Scharnierstatic void 22830221Scharnierusage() 229327Sjkh{ 230131277Seik fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n", 231131277Seik"usage: pkg_create [-YNOhvyz] [-P pkgs] [-C conflicts] [-p prefix] ", 232113594Skris" [-i iscript] [-I piscript] [-k dscript] [-K pdscript] ", 233113594Skris" [-r rscript] [-t template] [-X excludefile] ", 234113594Skris" [-D displayfile] [-m mtreefile] [-o origin] ", 235131277Seik" [-s srcdir] [-S basedir] ", 236113594Skris" -c comment -d description -f packlist pkg-filename", 237152210Skrion" pkg_create [-EGYNhvxyzR] -b pkg-name [pkg-filename]"); 238327Sjkh exit(1); 239327Sjkh} 240