main.c revision 113594
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 113594 2003-04-17 09:56:05Z kris $"); 1493520Sobrien 1530221Scharnier#include <err.h> 16327Sjkh#include "lib.h" 17327Sjkh#include "create.h" 18327Sjkh 19113594Skrisstatic char Options[] = "YNOhjvyzf:p:P:C:c:d:i:I:k:K:r:t:X:D:m:s:o:b:"; 20327Sjkh 21327Sjkhchar *Prefix = NULL; 22327Sjkhchar *Comment = NULL; 23327Sjkhchar *Desc = NULL; 2426473Sjkhchar *SrcDir = NULL; 254996Sjkhchar *Display = NULL; 26327Sjkhchar *Install = NULL; 2741866Sjkhchar *PostInstall = NULL; 28327Sjkhchar *DeInstall = NULL; 2941866Sjkhchar *PostDeInstall = NULL; 30327Sjkhchar *Contents = NULL; 31327Sjkhchar *Require = NULL; 32445Sjkhchar *ExcludeFrom = NULL; 334996Sjkhchar *Mtree = NULL; 347713Sjkhchar *Pkgdeps = NULL; 35113594Skrischar *Conflicts = NULL; 3667454Ssobomaxchar *Origin = NULL; 3784670Ssobomaxchar *InstalledPkg = NULL; 3826473Sjkhchar PlayPen[FILENAME_MAX]; 3971095Ssobomaxint Dereference = FALSE; 4071095Ssobomaxint PlistOnly = FALSE; 4195161Sobrienenum zipper Zipper = GZIP; 42327Sjkh 4330221Scharnierstatic void usage __P((void)); 4430221Scharnier 45327Sjkhint 46327Sjkhmain(int argc, char **argv) 47327Sjkh{ 48327Sjkh int ch; 4984670Ssobomax char **pkgs, **start, *tmp; 50327Sjkh 51327Sjkh pkgs = start = argv; 5224428Simp while ((ch = getopt(argc, argv, Options)) != -1) 53327Sjkh switch(ch) { 54327Sjkh case 'v': 55327Sjkh Verbose = TRUE; 56327Sjkh break; 57327Sjkh 581337Sjkh case 'N': 591337Sjkh AutoAnswer = NO; 601337Sjkh break; 611337Sjkh 621337Sjkh case 'Y': 631337Sjkh AutoAnswer = YES; 641337Sjkh break; 651337Sjkh 667986Sjkh case 'O': 6771095Ssobomax PlistOnly = TRUE; 687986Sjkh break; 697986Sjkh 70327Sjkh case 'p': 71327Sjkh Prefix = optarg; 72327Sjkh break; 73327Sjkh 7426473Sjkh case 's': 7526473Sjkh SrcDir = optarg; 7626473Sjkh break; 7726473Sjkh 78327Sjkh case 'f': 79327Sjkh Contents = optarg; 80327Sjkh break; 81327Sjkh 82113594Skris case 'C': 83113594Skris Conflicts = optarg; 84113594Skris break; 85113594Skris 86327Sjkh case 'c': 87327Sjkh Comment = optarg; 88327Sjkh break; 89327Sjkh 90327Sjkh case 'd': 91327Sjkh Desc = optarg; 92327Sjkh break; 93327Sjkh 94327Sjkh case 'i': 95327Sjkh Install = optarg; 96327Sjkh break; 97327Sjkh 9841866Sjkh case 'I': 9941866Sjkh PostInstall = optarg; 10041866Sjkh break; 10141866Sjkh 102327Sjkh case 'k': 103327Sjkh DeInstall = optarg; 104327Sjkh break; 105327Sjkh 10641866Sjkh case 'K': 10741866Sjkh PostDeInstall = optarg; 10841866Sjkh break; 10941866Sjkh 110327Sjkh case 'r': 111327Sjkh Require = optarg; 112327Sjkh break; 113327Sjkh 114383Sjkh case 't': 11585019Ssobomax strlcpy(PlayPen, optarg, sizeof(PlayPen)); 116383Sjkh break; 117383Sjkh 118445Sjkh case 'X': 119445Sjkh ExcludeFrom = optarg; 120445Sjkh break; 121445Sjkh 122327Sjkh case 'h': 12371095Ssobomax Dereference = TRUE; 1241520Salm break; 1251520Salm 1264996Sjkh case 'D': 1274996Sjkh Display = optarg; 1284996Sjkh break; 1294996Sjkh 1304996Sjkh case 'm': 1314996Sjkh Mtree = optarg; 1324996Sjkh break; 1334996Sjkh 1347713Sjkh case 'P': 1357713Sjkh Pkgdeps = optarg; 1367713Sjkh break; 1377713Sjkh 13867454Ssobomax case 'o': 13967454Ssobomax Origin = optarg; 14067454Ssobomax break; 14167454Ssobomax 14271373Ssobomax case 'y': 14395161Sobrien case 'j': 14495161Sobrien Zipper = BZIP2; 14571373Ssobomax break; 14671373Ssobomax 14795161Sobrien case 'z': 14895161Sobrien Zipper = GZIP; 14995161Sobrien break; 15095161Sobrien 15184670Ssobomax case 'b': 15285470Ssobomax InstalledPkg = optarg; 15384670Ssobomax while ((tmp = strrchr(optarg, (int)'/')) != NULL) { 15484670Ssobomax *tmp++ = '\0'; 15584670Ssobomax /* 15684670Ssobomax * If character after the '/' is alphanumeric, then we've 15784670Ssobomax * found the package name. Otherwise we've come across 15884670Ssobomax * a trailing '/' and need to continue our quest. 15984670Ssobomax */ 16084670Ssobomax if (isalpha(*tmp)) { 16184670Ssobomax InstalledPkg = tmp; 16284670Ssobomax break; 16384670Ssobomax } 16484670Ssobomax } 16584670Ssobomax break; 16684670Ssobomax 167327Sjkh case '?': 168327Sjkh default: 16930221Scharnier usage(); 170327Sjkh break; 171327Sjkh } 172327Sjkh 1738857Srgrimes argc -= optind; 174327Sjkh argv += optind; 175327Sjkh 176327Sjkh /* Get all the remaining package names, if any */ 177327Sjkh while (*argv) 178327Sjkh *pkgs++ = *argv++; 179327Sjkh 180327Sjkh /* If no packages, yelp */ 18184670Ssobomax if ((pkgs == start) && (InstalledPkg == NULL)) 18230221Scharnier warnx("missing package name"), usage(); 183327Sjkh *pkgs = NULL; 18484670Ssobomax if ((start[0] != NULL) && (start[1] != NULL)) { 18584670Ssobomax warnx("only one package name allowed ('%s' extraneous)", start[1]); 18630221Scharnier usage(); 18784670Ssobomax } 18884670Ssobomax if (start[0] == NULL) 18984670Ssobomax start[0] = InstalledPkg; 190327Sjkh if (!pkg_perform(start)) { 191327Sjkh if (Verbose) 19230221Scharnier warnx("package creation failed"); 193327Sjkh return 1; 194327Sjkh } 195327Sjkh else 196327Sjkh return 0; 197327Sjkh} 198327Sjkh 19930221Scharnierstatic void 20030221Scharnierusage() 201327Sjkh{ 20284670Ssobomax fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n", 203113594Skris"usage: pkg_create [-YNOhvy] [-P pkgs] [-C conflicts] [-p prefix] [-f contents] ", 204113594Skris" [-i iscript] [-I piscript] [-k dscript] [-K pdscript] ", 205113594Skris" [-r rscript] [-t template] [-X excludefile] ", 206113594Skris" [-D displayfile] [-m mtreefile] [-o origin] ", 207113594Skris" -c comment -d description -f packlist pkg-filename", 20884670Ssobomax" pkg_create [-YNhvy] -b pkg-name [pkg-filename]"); 209327Sjkh exit(1); 210327Sjkh} 211