main.c revision 71965
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 71965 2001-02-03 20:56:32Z jkh $";
2955567Sphantom#endif
30327Sjkh
3171965Sjkhstatic char Options[] = "acdDe:fghiIkl:LmopqrRst: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
9171965Sjkh	case 'g':
9271965Sjkh	    Flags |= SHOW_CKSUM;
9371965Sjkh	    break;
9471965Sjkh
95327Sjkh	case 'i':
96327Sjkh	    Flags |= SHOW_INSTALL;
97327Sjkh	    break;
98327Sjkh
99327Sjkh	case 'k':
100327Sjkh	    Flags |= SHOW_DEINSTALL;
101327Sjkh	    break;
102327Sjkh
103327Sjkh	case 'r':
104327Sjkh	    Flags |= SHOW_REQUIRE;
105327Sjkh	    break;
106327Sjkh
1074996Sjkh	case 'R':
1084996Sjkh	    Flags |= SHOW_REQBY;
1094996Sjkh	    break;
1104996Sjkh
111411Sjkh	case 'L':
112411Sjkh	    Flags |= SHOW_FILES;
113411Sjkh	    break;
114411Sjkh
1154996Sjkh	case 'm':
1164996Sjkh	    Flags |= SHOW_MTREE;
1174996Sjkh	    break;
1184996Sjkh
11962775Ssobomax        case 's':
12062775Ssobomax            Flags |= SHOW_SIZE;
12162775Ssobomax            break;
12262775Ssobomax
12367454Ssobomax	case 'o':
12467454Ssobomax	    Flags |= SHOW_ORIGIN;
12567454Ssobomax	    break;
12667454Ssobomax
127379Sjkh	case 'l':
128379Sjkh	    InfoPrefix = optarg;
129379Sjkh	    break;
130379Sjkh
131411Sjkh	case 'q':
132411Sjkh	    Quiet = TRUE;
133411Sjkh	    break;
134411Sjkh
135383Sjkh	case 't':
13611780Sjkh	    strcpy(PlayPen, optarg);
137383Sjkh	    break;
138383Sjkh
139392Sjkh	case 'e':
140392Sjkh	    CheckPkg = optarg;
141392Sjkh	    break;
142392Sjkh
143327Sjkh	case 'h':
144327Sjkh	case '?':
145327Sjkh	default:
14630221Scharnier	    usage();
147327Sjkh	    break;
148327Sjkh	}
14946105Sjkh    }
150327Sjkh
1518857Srgrimes    argc -= optind;
152327Sjkh    argv += optind;
153327Sjkh
154327Sjkh    /* Set some reasonable defaults */
155327Sjkh    if (!Flags)
1564996Sjkh	Flags = SHOW_COMMENT | SHOW_DESC | SHOW_REQBY;
157327Sjkh
158327Sjkh    /* Get all the remaining package names, if any */
15960563Ssteve    while (*argv) {
16067429Sjkh	while ((pkgs_split = strrchr(*argv, (int)'/')) != NULL) {
16160563Ssteve	    *pkgs_split++ = '\0';
16260563Ssteve	    /*
16360563Ssteve	     * If character after the '/' is alphanumeric, then we've found the
16460563Ssteve	     * package name.  Otherwise we've come across a trailing '/' and
16560563Ssteve	     * need to continue our quest.
16660563Ssteve	     */
16760563Ssteve	    if (isalpha(*pkgs_split)) {
16860563Ssteve		*argv = pkgs_split;
16960563Ssteve		break;
17060563Ssteve	    }
17160563Ssteve	}
17260563Ssteve	*pkgs++ = *argv++;
17356001Sdan    }
174327Sjkh
175327Sjkh    /* If no packages, yelp */
176392Sjkh    if (pkgs == start && !AllInstalled && !CheckPkg)
17730221Scharnier	warnx("missing package name(s)"), usage();
178327Sjkh    *pkgs = NULL;
179327Sjkh    return pkg_perform(start);
180327Sjkh}
181327Sjkh
18230221Scharnierstatic void
18330221Scharnierusage()
184327Sjkh{
18530221Scharnier    fprintf(stderr, "%s\n%s\n%s\n",
18669616Ssobomax	"usage: pkg_info [-cdDfiIkLmopqrRsv] [-e package] [-l prefix]",
18755567Sphantom	"                [-t template] [pkg-name ...]",
18830221Scharnier	"       pkg_info -a [flags]");
189327Sjkh    exit(1);
190327Sjkh}
191