main.c revision 131280
131921Sbrian/* 231921Sbrian * 331921Sbrian * FreeBSD install - a package for the installation and maintainance 431921Sbrian * of non-core utilities. 531921Sbrian * 631921Sbrian * Redistribution and use in source and binary forms, with or without 731921Sbrian * modification, are permitted provided that the following conditions 831921Sbrian * are met: 931921Sbrian * 1. Redistributions of source code must retain the above copyright 1031921Sbrian * notice, this list of conditions and the following disclaimer. 1131921Sbrian * 2. Redistributions in binary form must reproduce the above copyright 1231921Sbrian * notice, this list of conditions and the following disclaimer in the 1331921Sbrian * documentation and/or other materials provided with the distribution. 1431921Sbrian * 1531921Sbrian * Jordan K. Hubbard 1631921Sbrian * 18 July 1993 1731921Sbrian * 1831921Sbrian * This is the info module. 1931921Sbrian * 2031921Sbrian */ 2131921Sbrian 2231921Sbrian#include <sys/cdefs.h> 2331921Sbrian__FBSDID("$FreeBSD: head/usr.sbin/pkg_install/info/main.c 131280 2004-06-29 18:59:19Z eik $"); 2431921Sbrian 2531921Sbrian#include "lib.h" 2650479Speter#include "info.h" 2730715Sbrian#include <err.h> 2830715Sbrian 2936285Sbrianstatic char Options[] = "abcdDe:EfgGhiIjkl:LmoO:pPqQrRst:vVW:xX"; 3030715Sbrian 3147672Sbrianint Flags = 0; 326735Samuraimatch_t MatchType = MATCH_GLOB; 336735SamuraiBoolean Quiet = FALSE; 3434537SbrianBoolean QUIET = FALSE; 3530715SbrianBoolean UseBlkSz = FALSE; 3636285Sbrianchar *InfoPrefix = (char *)(uintptr_t)""; 3730715Sbrianchar PlayPen[FILENAME_MAX]; 3837009Sbrianchar *CheckPkg = NULL; 3931343Sbrianchar *LookUpOrigin = NULL; 4026516Sbrianstruct which_head *whead; 4126516Sbrian 4236285Sbrianstatic void usage __P((void)); 4336285Sbrian 446059Samuraiint 4581634Sbrianmain(int argc, char **argv) 4628679Sbrian{ 4738174Sbrian int ch; 4828679Sbrian char **pkgs, **start; 4928679Sbrian char *pkgs_split; 5028679Sbrian 5128679Sbrian whead = malloc(sizeof(struct which_head)); 5228679Sbrian if (whead == NULL) 5358033Sbrian err(2, NULL); 5465181Sbrian TAILQ_INIT(whead); 5528679Sbrian 5631061Sbrian pkgs = start = argv; 5728679Sbrian if (argc == 1) { 5881634Sbrian MatchType = MATCH_ALL; 5928679Sbrian Flags = SHOW_INDEX; 6028679Sbrian } 6128679Sbrian else while ((ch = getopt(argc, argv, Options)) != -1) { 6247061Sbrian switch(ch) { 63132273Sbrian case 'a': 6447061Sbrian MatchType = MATCH_ALL; 6528679Sbrian break; 6636285Sbrian 6728679Sbrian case 'b': 6828679Sbrian UseBlkSz = TRUE; 6928679Sbrian break; 7028679Sbrian 7126516Sbrian case 'v': 726059Samurai Verbose = TRUE; 7326516Sbrian /* Reasonable definition of 'everything' */ 746059Samurai Flags = SHOW_COMMENT | SHOW_DESC | SHOW_PLIST | SHOW_INSTALL | 7536285Sbrian SHOW_DEINSTALL | SHOW_REQUIRE | SHOW_DISPLAY | SHOW_MTREE; 7630913Sbrian break; 7726516Sbrian 78218397Sbrian case 'E': 7936314Sbrian Flags |= SHOW_PKGNAME; 8051005Sbrian break; 8138013Sbrian 826059Samurai case 'I': 8336314Sbrian Flags |= SHOW_INDEX; 8436314Sbrian break; 8536314Sbrian 8636314Sbrian case 'p': 8736314Sbrian Flags |= SHOW_PREFIX; 8836314Sbrian break; 8936285Sbrian 9036285Sbrian case 'c': 9136285Sbrian Flags |= SHOW_COMMENT; 9236314Sbrian break; 9336314Sbrian 9436314Sbrian case 'd': 9536314Sbrian Flags |= SHOW_DESC; 9636285Sbrian break; 9736285Sbrian 9836314Sbrian case 'D': 9936314Sbrian Flags |= SHOW_DISPLAY; 10036314Sbrian break; 10136314Sbrian 10236314Sbrian case 'f': 10336314Sbrian Flags |= SHOW_PLIST; 10436314Sbrian break; 10536285Sbrian 10636285Sbrian case 'g': 10736285Sbrian Flags |= SHOW_CKSUM; 10836285Sbrian break; 10936285Sbrian 11036285Sbrian case 'G': 11136314Sbrian MatchType = MATCH_EXACT; 11236285Sbrian break; 11336285Sbrian 11436285Sbrian case 'i': 11536285Sbrian Flags |= SHOW_INSTALL; 11636314Sbrian break; 11736314Sbrian 11836314Sbrian case 'j': 11936314Sbrian Flags |= SHOW_REQUIRE; 12036314Sbrian break; 12136314Sbrian 12236314Sbrian case 'k': 12336314Sbrian Flags |= SHOW_DEINSTALL; 12436314Sbrian break; 12536285Sbrian 12636285Sbrian case 'r': 12736285Sbrian Flags |= SHOW_DEPEND; 12836285Sbrian break; 12936285Sbrian 13036314Sbrian case 'R': 13136285Sbrian Flags |= SHOW_REQBY; 13236314Sbrian break; 13336314Sbrian 13436285Sbrian case 'L': 13536285Sbrian Flags |= SHOW_FILES; 13636285Sbrian break; 13738013Sbrian 13836285Sbrian case 'm': 13936285Sbrian Flags |= SHOW_MTREE; 14036285Sbrian break; 14136314Sbrian 14236314Sbrian case 's': 14336314Sbrian Flags |= SHOW_SIZE; 14444544Sbrian break; 14536314Sbrian 14636314Sbrian case 'o': 14744544Sbrian Flags |= SHOW_ORIGIN; 14836314Sbrian break; 14936314Sbrian 15044544Sbrian case 'O': 15144544Sbrian LookUpOrigin = strdup(optarg); 15244544Sbrian if (LookUpOrigin == NULL) 15344544Sbrian err(2, NULL); 15444544Sbrian break; 15536314Sbrian 15636314Sbrian case 'V': 15744544Sbrian Flags |= SHOW_FMTREV; 15844544Sbrian break; 15936314Sbrian 16036314Sbrian case 'l': 16136314Sbrian InfoPrefix = optarg; 16236314Sbrian break; 16336314Sbrian 16436314Sbrian case 'q': 16536314Sbrian Quiet = TRUE; 16636314Sbrian break; 16736314Sbrian 16836314Sbrian case 'Q': 16936314Sbrian Quiet = TRUE; 17036314Sbrian QUIET = TRUE; 17136314Sbrian break; 17236314Sbrian 17338200Sbrian case 't': 17436314Sbrian strlcpy(PlayPen, optarg, sizeof(PlayPen)); 17538200Sbrian break; 17636314Sbrian 17736314Sbrian case 'x': 17838200Sbrian MatchType = MATCH_REGEX; 17936314Sbrian break; 18036314Sbrian 18138200Sbrian case 'X': 18238200Sbrian MatchType = MATCH_EREGEX; 18336314Sbrian break; 18436314Sbrian 18536314Sbrian case 'e': 18636314Sbrian CheckPkg = optarg; 18736314Sbrian break; 18836314Sbrian 18936314Sbrian case 'W': 19036314Sbrian { 19136314Sbrian struct which_entry *entp; 19236314Sbrian 19336314Sbrian entp = calloc(1, sizeof(struct which_entry)); 19436314Sbrian if (entp == NULL) 19526516Sbrian err(2, NULL); 19626516Sbrian 1976059Samurai strlcpy(entp->file, optarg, PATH_MAX); 19828679Sbrian entp->skip = FALSE; 19985991Sbrian TAILQ_INSERT_TAIL(whead, entp, next); 20085991Sbrian break; 20136285Sbrian } 20236285Sbrian 20336285Sbrian case 'P': 20428679Sbrian Flags = SHOW_PTREV; 20528679Sbrian break; 20628679Sbrian 20728679Sbrian case 'h': 20828679Sbrian case '?': 20928679Sbrian default: 21028679Sbrian usage(); 21128679Sbrian break; 2126059Samurai } 2136059Samurai } 21426516Sbrian 21536285Sbrian argc -= optind; 2166059Samurai argv += optind; 21785991Sbrian 21885991Sbrian if (Flags & SHOW_PTREV) { 21928679Sbrian if (!Quiet) 2206059Samurai printf("Package tools revision: "); 2216059Samurai printf("%d\n", PKG_INSTALL_VERSION); 2226059Samurai exit(0); 22336285Sbrian } 2246059Samurai 22528679Sbrian /* Set some reasonable defaults */ 22628679Sbrian if (!Flags) 2276059Samurai Flags = SHOW_COMMENT | SHOW_DESC | SHOW_REQBY; 2286059Samurai 2296059Samurai /* Get all the remaining package names, if any */ 23036285Sbrian while (*argv) { 23130913Sbrian /* 23236285Sbrian * Don't try to apply heuristics if arguments are regexs or if 23330913Sbrian * the argument refers to an existing file. 23436285Sbrian */ 23536285Sbrian if (MatchType != MATCH_REGEX && MatchType != MATCH_EREGEX && !isfile(*argv)) 23630913Sbrian while ((pkgs_split = strrchr(*argv, (int)'/')) != NULL) { 23730913Sbrian *pkgs_split++ = '\0'; 23830913Sbrian /* 23936285Sbrian * If character after the '/' is alphanumeric or shell 2406059Samurai * metachar, then we've found the package name. Otherwise 24128679Sbrian * we've come across a trailing '/' and need to continue our 24228679Sbrian * quest. 2436059Samurai */ 2446059Samurai if (isalpha(*pkgs_split) || ((MatchType == MATCH_GLOB) && \ 2456059Samurai strpbrk(pkgs_split, "*?[]") != NULL)) { 24636285Sbrian *argv = pkgs_split; 24730913Sbrian break; 24836285Sbrian } 24936285Sbrian } 25036285Sbrian *pkgs++ = *argv++; 25136285Sbrian } 25230913Sbrian 25330913Sbrian /* If no packages, yelp */ 25430913Sbrian if (pkgs == start && MatchType != MATCH_ALL && !CheckPkg && 25536285Sbrian TAILQ_EMPTY(whead) && LookUpOrigin == NULL) 2566059Samurai warnx("missing package name(s)"), usage(); 25728679Sbrian *pkgs = NULL; 2586059Samurai return pkg_perform(start); 2596059Samurai} 26030913Sbrian 26136285Sbrianstatic void 26230913Sbrianusage() 26336285Sbrian{ 26436285Sbrian fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n", 26530913Sbrian "usage: pkg_info [-bcdDEfgGiIjkLmopPqQrRsvVxX] [-e package] [-l prefix]", 26630913Sbrian " [-t template] -a | pkg-name ...", 26726516Sbrian " pkg_info [-qQ] -W filename", 26836285Sbrian " pkg_info [-qQ] -O origin", 2696735Samurai " pkg_info"); 27085991Sbrian exit(1); 27185991Sbrian} 27230913Sbrian