main.c revision 103149
1226645Sattilio/* 2226645Sattilio * 3226645Sattilio * FreeBSD install - a package for the installation and maintainance 4226645Sattilio * of non-core utilities. 5226645Sattilio * 6226645Sattilio * Redistribution and use in source and binary forms, with or without 7226645Sattilio * modification, are permitted provided that the following conditions 8226645Sattilio * are met: 9226645Sattilio * 1. Redistributions of source code must retain the above copyright 10226645Sattilio * notice, this list of conditions and the following disclaimer. 11226645Sattilio * 2. Redistributions in binary form must reproduce the above copyright 12226645Sattilio * notice, this list of conditions and the following disclaimer in the 13226645Sattilio * documentation and/or other materials provided with the distribution. 14226645Sattilio * 15226645Sattilio * Jordan K. Hubbard 16226645Sattilio * 18 July 1993 17226645Sattilio * 18226645Sattilio * This is the info module. 19226645Sattilio * 20226645Sattilio */ 21226645Sattilio 22226645Sattilio#include <sys/cdefs.h> 23226645Sattilio__FBSDID("$FreeBSD: head/usr.sbin/pkg_install/info/main.c 103149 2002-09-09 19:43:30Z sobomax $"); 24226645Sattilio 25226645Sattilio#include "lib.h" 26226645Sattilio#include "info.h" 27226645Sattilio#include <err.h> 28226645Sattilio 29226645Sattiliostatic char Options[] = "acdDe:fgGhiIkl:LmoO:pPqrRst:vVW:x"; 30226645Sattilio 31226645Sattilioint Flags = 0; 32226645Sattiliomatch_t MatchType = MATCH_GLOB; 33226645SattilioBoolean Quiet = FALSE; 34226645Sattiliochar *InfoPrefix = (char *)(uintptr_t)""; 35226645Sattiliochar PlayPen[FILENAME_MAX]; 36226645Sattiliochar *CheckPkg = NULL; 37226645Sattiliochar *LookUpOrigin = NULL; 38226645Sattiliostruct which_head *whead; 39226645Sattilio 40226645Sattiliostatic void usage __P((void)); 41226645Sattilio 42226645Sattilioint 43226645Sattiliomain(int argc, char **argv) 44226645Sattilio{ 45226645Sattilio int ch; 46226645Sattilio char **pkgs, **start; 47226645Sattilio char *pkgs_split; 48226645Sattilio 49226645Sattilio whead = malloc(sizeof(struct which_head)); 50226645Sattilio if (whead == NULL) 51226645Sattilio err(2, NULL); 52226645Sattilio TAILQ_INIT(whead); 53226645Sattilio 54226645Sattilio pkgs = start = argv; 55226645Sattilio if (argc == 1) { 56226645Sattilio MatchType = MATCH_ALL; 57226645Sattilio Flags = SHOW_INDEX; 58226645Sattilio } 59226645Sattilio else while ((ch = getopt(argc, argv, Options)) != -1) { 60226645Sattilio switch(ch) { 61226645Sattilio case 'a': 62226645Sattilio MatchType = MATCH_ALL; 63226645Sattilio break; 64226645Sattilio 65226645Sattilio case 'v': 66226645Sattilio Verbose = TRUE; 67226645Sattilio /* Reasonable definition of 'everything' */ 68226645Sattilio Flags = SHOW_COMMENT | SHOW_DESC | SHOW_PLIST | SHOW_INSTALL | 69226645Sattilio SHOW_DEINSTALL | SHOW_REQUIRE | SHOW_DISPLAY | SHOW_MTREE; 70226645Sattilio break; 71226645Sattilio 72226645Sattilio case 'I': 73226645Sattilio Flags |= SHOW_INDEX; 74226645Sattilio break; 75226645Sattilio 76226645Sattilio case 'p': 77226645Sattilio Flags |= SHOW_PREFIX; 78226645Sattilio break; 79226645Sattilio 80226645Sattilio case 'c': 81226645Sattilio Flags |= SHOW_COMMENT; 82226645Sattilio break; 83226645Sattilio 84226645Sattilio case 'd': 85226645Sattilio Flags |= SHOW_DESC; 86226645Sattilio break; 87226645Sattilio 88226645Sattilio case 'D': 89226645Sattilio Flags |= SHOW_DISPLAY; 90226645Sattilio break; 91226645Sattilio 92226645Sattilio case 'f': 93226645Sattilio Flags |= SHOW_PLIST; 94226645Sattilio break; 95226645Sattilio 96226645Sattilio case 'g': 97226645Sattilio Flags |= SHOW_CKSUM; 98226645Sattilio break; 99226645Sattilio 100226645Sattilio case 'G': 101226645Sattilio MatchType = MATCH_EXACT; 102226645Sattilio break; 103226645Sattilio 104226645Sattilio case 'i': 105226645Sattilio Flags |= SHOW_INSTALL; 106226645Sattilio break; 107226645Sattilio 108226645Sattilio case 'k': 109226645Sattilio Flags |= SHOW_DEINSTALL; 110226645Sattilio break; 111226645Sattilio 112226645Sattilio case 'r': 113226645Sattilio Flags |= SHOW_REQUIRE; 114226645Sattilio break; 115226645Sattilio 116226645Sattilio case 'R': 117226645Sattilio Flags |= SHOW_REQBY; 118226645Sattilio break; 119226645Sattilio 120226645Sattilio case 'L': 121226645Sattilio Flags |= SHOW_FILES; 122226645Sattilio break; 123226645Sattilio 124226645Sattilio case 'm': 125226645Sattilio Flags |= SHOW_MTREE; 126226645Sattilio break; 127226645Sattilio 128226645Sattilio case 's': 129226645Sattilio Flags |= SHOW_SIZE; 130226645Sattilio break; 131226645Sattilio 132226645Sattilio case 'o': 133226645Sattilio Flags |= SHOW_ORIGIN; 134226645Sattilio break; 135226645Sattilio 136226645Sattilio case 'O': 137226645Sattilio LookUpOrigin = strdup(optarg); 138226645Sattilio if (LookUpOrigin == NULL) 139226645Sattilio err(2, NULL); 140226645Sattilio break; 141226645Sattilio 142226645Sattilio case 'V': 143226645Sattilio Flags |= SHOW_FMTREV; 144226645Sattilio break; 145226645Sattilio 146226645Sattilio case 'l': 147226645Sattilio InfoPrefix = optarg; 148226645Sattilio break; 149226645Sattilio 150226645Sattilio case 'q': 151226645Sattilio Quiet = TRUE; 152226645Sattilio break; 153226645Sattilio 154226645Sattilio case 't': 155226645Sattilio strlcpy(PlayPen, optarg, sizeof(PlayPen)); 156226645Sattilio break; 157226645Sattilio 158226645Sattilio case 'x': 159226645Sattilio MatchType = MATCH_REGEX; 160226645Sattilio break; 161226645Sattilio 162226645Sattilio case 'e': 163226645Sattilio CheckPkg = optarg; 164226645Sattilio break; 165226645Sattilio 166226645Sattilio case 'W': 167226645Sattilio { 168226645Sattilio struct which_entry *entp; 169226645Sattilio 170226645Sattilio entp = calloc(1, sizeof(struct which_entry)); 171226645Sattilio if (entp == NULL) 172226645Sattilio err(2, NULL); 173226645Sattilio 174226645Sattilio strlcpy(entp->file, optarg, PATH_MAX); 175226645Sattilio entp->skip = FALSE; 176226645Sattilio TAILQ_INSERT_TAIL(whead, entp, next); 177226645Sattilio break; 178226645Sattilio } 179226645Sattilio 180226645Sattilio case 'P': 181226645Sattilio Flags = SHOW_PTREV; 182226645Sattilio break; 183226645Sattilio 184226645Sattilio case 'h': 185226645Sattilio case '?': 186226645Sattilio default: 187226645Sattilio usage(); 188226645Sattilio break; 189226645Sattilio } 190226645Sattilio } 191226645Sattilio 192226645Sattilio argc -= optind; 193226645Sattilio argv += optind; 194226645Sattilio 195226645Sattilio if (Flags & SHOW_PTREV) { 196226645Sattilio if (!Quiet) 197226645Sattilio printf("Package tools revision: "); 198226645Sattilio printf("%d\n", PKG_INSTALL_VERSION); 199226645Sattilio exit(0); 200226645Sattilio } 201226645Sattilio 202226645Sattilio /* Set some reasonable defaults */ 203226645Sattilio if (!Flags) 204226645Sattilio Flags = SHOW_COMMENT | SHOW_DESC | SHOW_REQBY; 205226645Sattilio 206226645Sattilio /* Get all the remaining package names, if any */ 207226645Sattilio while (*argv) { 208226645Sattilio /* 209226645Sattilio * Don't try to apply heuristics if arguments are regexs or if 210226645Sattilio * the argument refers to an existing file. 211226645Sattilio */ 212226645Sattilio if (MatchType != MATCH_REGEX && !isfile(*argv)) 213226645Sattilio while ((pkgs_split = strrchr(*argv, (int)'/')) != NULL) { 214226645Sattilio *pkgs_split++ = '\0'; 215226645Sattilio /* 216226645Sattilio * If character after the '/' is alphanumeric or shell 217226645Sattilio * metachar, then we've found the package name. Otherwise 218226645Sattilio * we've come across a trailing '/' and need to continue our 219226645Sattilio * quest. 220226645Sattilio */ 221226645Sattilio if (isalpha(*pkgs_split) || ((MatchType == MATCH_GLOB) && \ 222226645Sattilio strpbrk(pkgs_split, "*?[]") != NULL)) { 223226645Sattilio *argv = pkgs_split; 224226645Sattilio break; 225226645Sattilio } 226226645Sattilio } 227226645Sattilio *pkgs++ = *argv++; 228226645Sattilio } 229226645Sattilio 230226645Sattilio /* If no packages, yelp */ 231226645Sattilio if (pkgs == start && MatchType != MATCH_ALL && !CheckPkg && 232226645Sattilio TAILQ_EMPTY(whead) && LookUpOrigin == NULL) 233226645Sattilio warnx("missing package name(s)"), usage(); 234226645Sattilio *pkgs = NULL; 235226645Sattilio return pkg_perform(start); 236226645Sattilio} 237226645Sattilio 238226645Sattiliostatic void 239226645Sattiliousage() 240226645Sattilio{ 241226645Sattilio fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n", 242226645Sattilio "usage: pkg_info [-cdDfGiIkLmopqrRsvVx] [-e package] [-l prefix]", 243226645Sattilio " [-t template] [pkg-name ...]", 244226645Sattilio " pkg_info [-q] -W filename", 245226645Sattilio " pkg_info [-q] -O origin", 246226645Sattilio " pkg_info -a [flags]"); 247226645Sattilio exit(1); 248226645Sattilio} 249226645Sattilio