main.c revision 131275
1208926Smjacob/* 2208926Smjacob * 3208926Smjacob * FreeBSD install - a package for the installation and maintainance 4208926Smjacob * of non-core utilities. 5208926Smjacob * 6208926Smjacob * Redistribution and use in source and binary forms, with or without 7208926Smjacob * modification, are permitted provided that the following conditions 8208926Smjacob * are met: 9208926Smjacob * 1. Redistributions of source code must retain the above copyright 10208926Smjacob * notice, this list of conditions and the following disclaimer. 11208926Smjacob * 2. Redistributions in binary form must reproduce the above copyright 12208926Smjacob * notice, this list of conditions and the following disclaimer in the 13208926Smjacob * documentation and/or other materials provided with the distribution. 14208926Smjacob * 15208926Smjacob * Jordan K. Hubbard 16208926Smjacob * 18 July 1993 17208926Smjacob * 18208926Smjacob * This is the info module. 19208926Smjacob * 20208926Smjacob */ 21208926Smjacob 22208926Smjacob#include <sys/cdefs.h> 23208926Smjacob__FBSDID("$FreeBSD: head/usr.sbin/pkg_install/info/main.c 131275 2004-06-29 18:54:47Z eik $"); 24208926Smjacob 25208926Smjacob#include "lib.h" 26208926Smjacob#include "info.h" 27208926Smjacob#include <err.h> 28208926Smjacob 29208926Smjacobstatic char Options[] = "abcdDe:EfgGhiIkl:LmoO:pPqQrRst:vVW:xX"; 30208926Smjacob 31208926Smjacobint Flags = 0; 32208926Smjacobmatch_t MatchType = MATCH_GLOB; 33208926SmjacobBoolean Quiet = FALSE; 34208926SmjacobBoolean QUIET = FALSE; 35208926SmjacobBoolean UseBlkSz = FALSE; 36208926Smjacobchar *InfoPrefix = (char *)(uintptr_t)""; 37208926Smjacobchar PlayPen[FILENAME_MAX]; 38208926Smjacobchar *CheckPkg = NULL; 39208926Smjacobchar *LookUpOrigin = NULL; 40208926Smjacobstruct which_head *whead; 41208926Smjacob 42208926Smjacobstatic void usage __P((void)); 43208926Smjacob 44208926Smjacobint 45208926Smjacobmain(int argc, char **argv) 46208926Smjacob{ 47208926Smjacob int ch; 48208926Smjacob char **pkgs, **start; 49208926Smjacob char *pkgs_split; 50208926Smjacob 51208926Smjacob whead = malloc(sizeof(struct which_head)); 52208926Smjacob if (whead == NULL) 53208926Smjacob err(2, NULL); 54208926Smjacob TAILQ_INIT(whead); 55208926Smjacob 56208926Smjacob pkgs = start = argv; 57208926Smjacob if (argc == 1) { 58208926Smjacob MatchType = MATCH_ALL; 59208926Smjacob Flags = SHOW_INDEX; 60208926Smjacob } 61208926Smjacob else while ((ch = getopt(argc, argv, Options)) != -1) { 62208926Smjacob switch(ch) { 63208926Smjacob case 'a': 64208926Smjacob MatchType = MATCH_ALL; 65208926Smjacob break; 66208926Smjacob 67208926Smjacob case 'b': 68208926Smjacob UseBlkSz = TRUE; 69208926Smjacob break; 70208926Smjacob 71208926Smjacob case 'v': 72208926Smjacob Verbose = TRUE; 73208926Smjacob /* Reasonable definition of 'everything' */ 74208926Smjacob Flags = SHOW_COMMENT | SHOW_DESC | SHOW_PLIST | SHOW_INSTALL | 75208926Smjacob SHOW_DEINSTALL | SHOW_REQUIRE | SHOW_DISPLAY | SHOW_MTREE; 76208926Smjacob break; 77208926Smjacob 78208926Smjacob case 'E': 79208926Smjacob Flags |= SHOW_PKGNAME; 80208926Smjacob break; 81208926Smjacob 82208926Smjacob case 'I': 83208926Smjacob Flags |= SHOW_INDEX; 84208926Smjacob break; 85208926Smjacob 86208926Smjacob case 'p': 87208926Smjacob Flags |= SHOW_PREFIX; 88208926Smjacob break; 89208926Smjacob 90208926Smjacob case 'c': 91208926Smjacob Flags |= SHOW_COMMENT; 92208926Smjacob break; 93208926Smjacob 94208926Smjacob case 'd': 95208926Smjacob Flags |= SHOW_DESC; 96208926Smjacob break; 97208926Smjacob 98208926Smjacob case 'D': 99208926Smjacob Flags |= SHOW_DISPLAY; 100208926Smjacob break; 101208926Smjacob 102208926Smjacob case 'f': 103208926Smjacob Flags |= SHOW_PLIST; 104208926Smjacob break; 105208926Smjacob 106208926Smjacob case 'g': 107208926Smjacob Flags |= SHOW_CKSUM; 108208926Smjacob break; 109211183Smjacob 110208926Smjacob case 'G': 111208926Smjacob MatchType = MATCH_EXACT; 112208926Smjacob break; 113208926Smjacob 114208926Smjacob case 'i': 115208926Smjacob Flags |= SHOW_INSTALL; 116208926Smjacob break; 117208926Smjacob 118208926Smjacob case 'k': 119208926Smjacob Flags |= SHOW_DEINSTALL; 120208926Smjacob break; 121208926Smjacob 122208926Smjacob case 'r': 123208926Smjacob Flags |= SHOW_REQUIRE; 124208926Smjacob break; 125208926Smjacob 126208926Smjacob case 'R': 127208926Smjacob Flags |= SHOW_REQBY; 128208926Smjacob break; 129208926Smjacob 130208926Smjacob case 'L': 131208926Smjacob Flags |= SHOW_FILES; 132208926Smjacob break; 133208926Smjacob 134208926Smjacob case 'm': 135208926Smjacob Flags |= SHOW_MTREE; 136211183Smjacob break; 137208926Smjacob 138208926Smjacob case 's': 139208926Smjacob Flags |= SHOW_SIZE; 140208926Smjacob break; 141208926Smjacob 142208926Smjacob case 'o': 143208926Smjacob Flags |= SHOW_ORIGIN; 144208926Smjacob break; 145208926Smjacob 146208926Smjacob case 'O': 147208926Smjacob LookUpOrigin = strdup(optarg); 148208926Smjacob if (LookUpOrigin == NULL) 149208926Smjacob err(2, NULL); 150208926Smjacob break; 151208926Smjacob 152208926Smjacob case 'V': 153208926Smjacob Flags |= SHOW_FMTREV; 154208926Smjacob break; 155208926Smjacob 156208926Smjacob case 'l': 157208926Smjacob InfoPrefix = optarg; 158208926Smjacob break; 159208926Smjacob 160208926Smjacob case 'q': 161208926Smjacob Quiet = TRUE; 162208926Smjacob break; 163208926Smjacob 164208926Smjacob case 'Q': 165208926Smjacob Quiet = TRUE; 166208926Smjacob QUIET = TRUE; 167208926Smjacob break; 168208926Smjacob 169208926Smjacob case 't': 170208926Smjacob strlcpy(PlayPen, optarg, sizeof(PlayPen)); 171208926Smjacob break; 172208926Smjacob 173208926Smjacob case 'x': 174208926Smjacob MatchType = MATCH_REGEX; 175208926Smjacob break; 176208926Smjacob 177208926Smjacob case 'X': 178208926Smjacob MatchType = MATCH_EREGEX; 179208926Smjacob break; 180208926Smjacob 181208926Smjacob case 'e': 182208926Smjacob CheckPkg = optarg; 183208926Smjacob break; 184208926Smjacob 185208926Smjacob case 'W': 186208926Smjacob { 187208926Smjacob struct which_entry *entp; 188208926Smjacob 189208926Smjacob entp = calloc(1, sizeof(struct which_entry)); 190208926Smjacob if (entp == NULL) 191208926Smjacob err(2, NULL); 192208926Smjacob 193208926Smjacob strlcpy(entp->file, optarg, PATH_MAX); 194208926Smjacob entp->skip = FALSE; 195208926Smjacob TAILQ_INSERT_TAIL(whead, entp, next); 196208926Smjacob break; 197208926Smjacob } 198208926Smjacob 199208926Smjacob case 'P': 200208926Smjacob Flags = SHOW_PTREV; 201208926Smjacob break; 202208926Smjacob 203208926Smjacob case 'h': 204208926Smjacob case '?': 205208926Smjacob default: 206208926Smjacob usage(); 207208926Smjacob break; 208208926Smjacob } 209208926Smjacob } 210208926Smjacob 211208926Smjacob argc -= optind; 212208926Smjacob argv += optind; 213208926Smjacob 214208926Smjacob if (Flags & SHOW_PTREV) { 215208926Smjacob if (!Quiet) 216208926Smjacob printf("Package tools revision: "); 217208926Smjacob printf("%d\n", PKG_INSTALL_VERSION); 218208926Smjacob exit(0); 219208926Smjacob } 220208926Smjacob 221208926Smjacob /* Set some reasonable defaults */ 222208926Smjacob if (!Flags) 223208926Smjacob Flags = SHOW_COMMENT | SHOW_DESC | SHOW_REQBY; 224208926Smjacob 225208926Smjacob /* Get all the remaining package names, if any */ 226208926Smjacob while (*argv) { 227208926Smjacob /* 228208926Smjacob * Don't try to apply heuristics if arguments are regexs or if 229208926Smjacob * the argument refers to an existing file. 230208926Smjacob */ 231208926Smjacob if (MatchType != MATCH_REGEX && MatchType != MATCH_EREGEX && !isfile(*argv)) 232208926Smjacob while ((pkgs_split = strrchr(*argv, (int)'/')) != NULL) { 233208926Smjacob *pkgs_split++ = '\0'; 234208926Smjacob /* 235208926Smjacob * If character after the '/' is alphanumeric or shell 236208926Smjacob * metachar, then we've found the package name. Otherwise 237208926Smjacob * we've come across a trailing '/' and need to continue our 238211183Smjacob * quest. 239208926Smjacob */ 240208926Smjacob if (isalpha(*pkgs_split) || ((MatchType == MATCH_GLOB) && \ 241208926Smjacob strpbrk(pkgs_split, "*?[]") != NULL)) { 242208926Smjacob *argv = pkgs_split; 243208926Smjacob break; 244208926Smjacob } 245211183Smjacob } 246208926Smjacob *pkgs++ = *argv++; 247208926Smjacob } 248208926Smjacob 249208926Smjacob /* If no packages, yelp */ 250208926Smjacob if (pkgs == start && MatchType != MATCH_ALL && !CheckPkg && 251208926Smjacob TAILQ_EMPTY(whead) && LookUpOrigin == NULL) 252208926Smjacob warnx("missing package name(s)"), usage(); 253208926Smjacob *pkgs = NULL; 254208926Smjacob return pkg_perform(start); 255208926Smjacob} 256208926Smjacob 257208926Smjacobstatic void 258208926Smjacobusage() 259208926Smjacob{ 260208926Smjacob fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n", 261208926Smjacob "usage: pkg_info [-bcdDEfgGiIjLmopPqQrRsvVxX] [-e package] [-l prefix]", 262208926Smjacob " [-t template] -a | pkg-name ...", 263208926Smjacob " pkg_info [-qQ] -W filename", 264208926Smjacob " pkg_info [-qQ] -O origin", 265208926Smjacob " pkg_info"); 266208926Smjacob exit(1); 267208926Smjacob} 268208926Smjacob