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