diff options
Diffstat (limited to 'pkgtools/pkg_install/files/info/main.c')
-rw-r--r-- | pkgtools/pkg_install/files/info/main.c | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/pkgtools/pkg_install/files/info/main.c b/pkgtools/pkg_install/files/info/main.c new file mode 100644 index 00000000000..27e17085533 --- /dev/null +++ b/pkgtools/pkg_install/files/info/main.c @@ -0,0 +1,287 @@ +/* $NetBSD: main.c,v 1.1.1.1 2002/12/20 18:14:12 schmonz Exp $ */ + +#if 0 +#include <sys/cdefs.h> +#ifndef lint +#if 0 +static char *rcsid = "from FreeBSD Id: main.c,v 1.14 1997/10/08 07:47:26 charnier Exp"; +#else +__RCSID("$NetBSD: main.c,v 1.1.1.1 2002/12/20 18:14:12 schmonz Exp $"); +#endif +#endif +#endif + +/* + * + * FreeBSD install - a package for the installation and maintainance + * of non-core utilities. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Jordan K. Hubbard + * 18 July 1993 + * + * This is the add module. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_SYS_IOCTL_H +#include <sys/ioctl.h> +#endif + +#ifdef HAVE_TERMIOS_H +#include <termios.h> +#endif + +#ifdef HAVE_ERR_H +#include <err.h> +#endif + +#include "lib.h" +#include "info.h" + +static const char Options[] = "aBbcDde:fFhIikLl:mnpqRrsSvV"; + +int Flags = 0; +Boolean AllInstalled = FALSE; +Boolean File2Pkg = FALSE; +Boolean Quiet = FALSE; +char *InfoPrefix = ""; +char PlayPen[FILENAME_MAX]; +size_t PlayPenSize = sizeof(PlayPen); +char *CheckPkg = NULL; +size_t termwidth = 0; +lpkg_head_t pkgs; + +static void +usage(void) +{ + fprintf(stderr, "%s\n%s\n%s\n", + "usage: pkg_info [-BbcDdFfIikLmnpqRrSsVvh] [-e package] [-l prefix]", + " pkg-name [pkg-name ...]", + " pkg_info -a [flags]"); + exit(1); +} + +int +main(int argc, char **argv) +{ + int ch, rc; + lpkg_t *lpp; + + setprogname(argv[0]); + + while ((ch = getopt(argc, argv, Options)) != -1) + switch (ch) { + case 'a': + AllInstalled = TRUE; + break; + + case 'B': + Flags |= SHOW_BUILD_INFO; + break; + + case 'b': + Flags |= SHOW_BUILD_VERSION; + break; + + case 'c': + Flags |= SHOW_COMMENT; + break; + + case 'D': + Flags |= SHOW_DISPLAY; + break; + + case 'd': + Flags |= SHOW_DESC; + break; + + case 'e': + CheckPkg = optarg; + break; + + case 'f': + Flags |= SHOW_PLIST; + break; + + case 'F': + File2Pkg = 1; + break; + + case 'I': + Flags |= SHOW_INDEX; + break; + + case 'i': + Flags |= SHOW_INSTALL; + break; + + case 'k': + Flags |= SHOW_DEINSTALL; + break; + + case 'L': + Flags |= SHOW_FILES; + break; + + case 'l': + InfoPrefix = optarg; + break; + + case 'm': + Flags |= SHOW_MTREE; + break; + + case 'n': + Flags |= SHOW_DEPENDS; + break; + + case 'p': + Flags |= SHOW_PREFIX; + break; + + case 'q': + Quiet = TRUE; + break; + + case 'R': + Flags |= SHOW_REQBY; + break; + + case 'r': + Flags |= SHOW_REQUIRE; + break; + + case 's': + Flags |= SHOW_PKG_SIZE; + break; + + case 'S': + Flags |= SHOW_ALL_SIZE; + break; + + case 'v': + Verbose = TRUE; + /* Reasonable definition of 'everything' */ + Flags = SHOW_COMMENT | SHOW_DESC | SHOW_PLIST | SHOW_INSTALL | + SHOW_DEINSTALL | SHOW_REQUIRE | SHOW_DISPLAY | SHOW_MTREE | + SHOW_REQBY | SHOW_DEPENDS | SHOW_PKG_SIZE | SHOW_ALL_SIZE; + break; + + case 'V': + show_version(); + /* NOTREACHED */ + + case 'h': + case '?': + default: + usage(); + /* NOTREACHED */ + } + + argc -= optind; + argv += optind; + + if (argc == 0 && !Flags && !CheckPkg) { + /* No argument or flags specified - assume -Ia */ + Flags = SHOW_INDEX; + AllInstalled = TRUE; + } + + /* Don't do FTP stuff when operating on all pkgs */ + if (AllInstalled && getenv("PKG_PATH") != 0) { + warnx("disabling PKG_PATH when operating on all packages."); + unsetenv("PKG_PATH"); + } + + path_create(getenv("PKG_PATH")); + + /* Set some reasonable defaults */ + if (!Flags) + Flags = SHOW_COMMENT | SHOW_DESC | SHOW_REQBY | SHOW_DEPENDS; + + /* -Fe /filename -> change CheckPkg to real packagename */ + if (CheckPkg && File2Pkg) { + char *s; + + if (pkgdb_open(1) == -1) + err(1, "cannot open pkgdb"); + + s = pkgdb_retrieve(CheckPkg); + + if (s) { + CheckPkg = strdup(s); + } else { + errx(1, "No matching pkg for %s.", CheckPkg); + } + + pkgdb_close(); + } + + TAILQ_INIT(&pkgs); + + /* Get all the remaining package names, if any */ + if (File2Pkg && !AllInstalled) + if (pkgdb_open(1) == -1) { + err(1, "cannot open pkgdb"); + } + while (*argv) { + /* pkgdb: if -F flag given, don't add pkgnames to the "pkgs" + * queue but rather resolve the given filenames to pkgnames + * using pkgdb_retrieve, then add them. */ + if (File2Pkg) { + char *s; + + s = pkgdb_retrieve(*argv); + + if (s) { + lpp = alloc_lpkg(s); + TAILQ_INSERT_TAIL(&pkgs, lpp, lp_link); + } else + errx(1, "No matching pkg for %s.", *argv); + } else { + if (ispkgpattern(*argv)) { + if (findmatchingname(_pkgdb_getPKGDB_DIR(), *argv, add_to_list_fn, &pkgs) == 0) + errx(1, "No matching pkg for %s.", *argv); + } else { + lpp = alloc_lpkg(*argv); + TAILQ_INSERT_TAIL(&pkgs, lpp, lp_link); + } + } + argv++; + } + + if (File2Pkg) + pkgdb_close(); + + /* If no packages, yelp */ + if (TAILQ_FIRST(&pkgs) == NULL && !AllInstalled && !CheckPkg) + warnx("missing package name(s)"), usage(); + + if (isatty(STDOUT_FILENO)) { + const char *p; + struct winsize win; + + if ((p = getenv("COLUMNS")) != NULL) + termwidth = atoi(p); + else if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &win) == 0 && + win.ws_col > 0) + termwidth = win.ws_col; + } + + rc = pkg_perform(&pkgs); + exit(rc); + /* NOTREACHED */ +} |