main.c revision 60563
1327Sjkh/* 2327Sjkh * 3327Sjkh * FreeBSD install - a package for the installation and maintainance 4327Sjkh * of non-core utilities. 5327Sjkh * 6327Sjkh * Redistribution and use in source and binary forms, with or without 7327Sjkh * modification, are permitted provided that the following conditions 8327Sjkh * are met: 9327Sjkh * 1. Redistributions of source code must retain the above copyright 10327Sjkh * notice, this list of conditions and the following disclaimer. 11327Sjkh * 2. Redistributions in binary form must reproduce the above copyright 12327Sjkh * notice, this list of conditions and the following disclaimer in the 13327Sjkh * documentation and/or other materials provided with the distribution. 14327Sjkh * 15327Sjkh * Jordan K. Hubbard 16327Sjkh * 18 July 1993 17327Sjkh * 1831997Shoek * This is the info module. 19327Sjkh * 20327Sjkh */ 21327Sjkh 2230221Scharnier#include <err.h> 23327Sjkh#include "lib.h" 24327Sjkh#include "info.h" 25327Sjkh 2655567Sphantom#ifndef lint 2755567Sphantomstatic const char rcsid[] = 2855567Sphantom "$FreeBSD: head/usr.sbin/pkg_install/info/main.c 60563 2000-05-14 19:54:04Z steve $"; 2955567Sphantom#endif 30327Sjkh 3155567Sphantomstatic char Options[] = "acdDe:fhiIkl:LmpqrRt:v"; 3255567Sphantom 33327Sjkhint Flags = 0; 34327SjkhBoolean AllInstalled = FALSE; 35411SjkhBoolean Quiet = FALSE; 36379Sjkhchar *InfoPrefix = ""; 3711780Sjkhchar PlayPen[FILENAME_MAX]; 38392Sjkhchar *CheckPkg = NULL; 39327Sjkh 4030221Scharnierstatic void usage __P((void)); 4130221Scharnier 42327Sjkhint 43327Sjkhmain(int argc, char **argv) 44327Sjkh{ 45327Sjkh int ch; 46327Sjkh char **pkgs, **start; 4756001Sdan char *pkgs_split; 48327Sjkh 49327Sjkh pkgs = start = argv; 5046105Sjkh if (argc == 1) { 5146105Sjkh AllInstalled = TRUE; 5246105Sjkh Flags = SHOW_INDEX; 5346105Sjkh } 5446105Sjkh else while ((ch = getopt(argc, argv, Options)) != -1) { 55327Sjkh switch(ch) { 56327Sjkh case 'a': 57327Sjkh AllInstalled = TRUE; 58327Sjkh break; 59327Sjkh 60327Sjkh case 'v': 61327Sjkh Verbose = TRUE; 62327Sjkh /* Reasonable definition of 'everything' */ 63327Sjkh Flags = SHOW_COMMENT | SHOW_DESC | SHOW_PLIST | SHOW_INSTALL | 644996Sjkh SHOW_DEINSTALL | SHOW_REQUIRE | SHOW_DISPLAY | SHOW_MTREE; 65327Sjkh break; 66327Sjkh 67327Sjkh case 'I': 68327Sjkh Flags |= SHOW_INDEX; 69327Sjkh break; 70327Sjkh 71327Sjkh case 'p': 72327Sjkh Flags |= SHOW_PREFIX; 73327Sjkh break; 74327Sjkh 75327Sjkh case 'c': 76327Sjkh Flags |= SHOW_COMMENT; 77327Sjkh break; 78327Sjkh 79327Sjkh case 'd': 80327Sjkh Flags |= SHOW_DESC; 81327Sjkh break; 82327Sjkh 834996Sjkh case 'D': 844996Sjkh Flags |= SHOW_DISPLAY; 854996Sjkh break; 864996Sjkh 87327Sjkh case 'f': 88327Sjkh Flags |= SHOW_PLIST; 89327Sjkh break; 90327Sjkh 91327Sjkh case 'i': 92327Sjkh Flags |= SHOW_INSTALL; 93327Sjkh break; 94327Sjkh 95327Sjkh case 'k': 96327Sjkh Flags |= SHOW_DEINSTALL; 97327Sjkh break; 98327Sjkh 99327Sjkh case 'r': 100327Sjkh Flags |= SHOW_REQUIRE; 101327Sjkh break; 102327Sjkh 1034996Sjkh case 'R': 1044996Sjkh Flags |= SHOW_REQBY; 1054996Sjkh break; 1064996Sjkh 107411Sjkh case 'L': 108411Sjkh Flags |= SHOW_FILES; 109411Sjkh break; 110411Sjkh 1114996Sjkh case 'm': 1124996Sjkh Flags |= SHOW_MTREE; 1134996Sjkh break; 1144996Sjkh 115379Sjkh case 'l': 116379Sjkh InfoPrefix = optarg; 117379Sjkh break; 118379Sjkh 119411Sjkh case 'q': 120411Sjkh Quiet = TRUE; 121411Sjkh break; 122411Sjkh 123383Sjkh case 't': 12411780Sjkh strcpy(PlayPen, optarg); 125383Sjkh break; 126383Sjkh 127392Sjkh case 'e': 128392Sjkh CheckPkg = optarg; 129392Sjkh break; 130392Sjkh 131327Sjkh case 'h': 132327Sjkh case '?': 133327Sjkh default: 13430221Scharnier usage(); 135327Sjkh break; 136327Sjkh } 13746105Sjkh } 138327Sjkh 1398857Srgrimes argc -= optind; 140327Sjkh argv += optind; 141327Sjkh 142327Sjkh /* Set some reasonable defaults */ 143327Sjkh if (!Flags) 1444996Sjkh Flags = SHOW_COMMENT | SHOW_DESC | SHOW_REQBY; 145327Sjkh 146327Sjkh /* Get all the remaining package names, if any */ 14760563Ssteve while (*argv) { 14860563Ssteve while ((pkgs_split = rindex(*argv, (int)'/')) != NULL) { 14960563Ssteve *pkgs_split++ = '\0'; 15060563Ssteve /* 15160563Ssteve * If character after the '/' is alphanumeric, then we've found the 15260563Ssteve * package name. Otherwise we've come across a trailing '/' and 15360563Ssteve * need to continue our quest. 15460563Ssteve */ 15560563Ssteve if (isalpha(*pkgs_split)) { 15660563Ssteve *argv = pkgs_split; 15760563Ssteve break; 15860563Ssteve } 15960563Ssteve } 16060563Ssteve *pkgs++ = *argv++; 16156001Sdan } 162327Sjkh 163327Sjkh /* If no packages, yelp */ 164392Sjkh if (pkgs == start && !AllInstalled && !CheckPkg) 16530221Scharnier warnx("missing package name(s)"), usage(); 166327Sjkh *pkgs = NULL; 167327Sjkh return pkg_perform(start); 168327Sjkh} 169327Sjkh 17030221Scharnierstatic void 17130221Scharnierusage() 172327Sjkh{ 17330221Scharnier fprintf(stderr, "%s\n%s\n%s\n", 17455567Sphantom "usage: pkg_info [-cdDfikrRpLqImv] [-e package] [-l prefix]", 17555567Sphantom " [-t template] [pkg-name ...]", 17630221Scharnier " pkg_info -a [flags]"); 177327Sjkh exit(1); 178327Sjkh} 179