summaryrefslogtreecommitdiff
path: root/pkgtools/pkg_install/files/info/show.c
diff options
context:
space:
mode:
Diffstat (limited to 'pkgtools/pkg_install/files/info/show.c')
-rw-r--r--pkgtools/pkg_install/files/info/show.c290
1 files changed, 290 insertions, 0 deletions
diff --git a/pkgtools/pkg_install/files/info/show.c b/pkgtools/pkg_install/files/info/show.c
new file mode 100644
index 00000000000..29c4b5a56cd
--- /dev/null
+++ b/pkgtools/pkg_install/files/info/show.c
@@ -0,0 +1,290 @@
+/* $NetBSD: show.c,v 1.1.1.1 2002/12/20 18:14:14 schmonz Exp $ */
+
+#if 0
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static const char *rcsid = "from FreeBSD Id: show.c,v 1.11 1997/10/08 07:47:38 charnier Exp";
+#else
+__RCSID("$NetBSD: show.c,v 1.1.1.1 2002/12/20 18:14:14 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
+ * 23 Aug 1993
+ *
+ * Various display routines for the info module.
+ *
+ */
+/*
+ * Copyright (c) 1999 Hubert Feyrer. All rights reserved.
+ *
+ * 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Hubert Feyrer for
+ * the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_ERR_H
+#include <err.h>
+#endif
+
+#include "lib.h"
+#include "info.h"
+
+/* Structure to define entries for the "show table" */
+typedef struct show_t {
+ pl_ent_t sh_type; /* type of entry */
+ char *sh_quiet; /* message when quiet */
+ char *sh_verbose; /* message when verbose */
+} show_t;
+
+/*
+ * The entries in this table must be ordered the same as
+ * pl_ent_t constants
+ */
+static const show_t showv[] = {
+ {PLIST_FILE, "%s", "\tFile: %s"},
+ {PLIST_CWD, "@cwd %s", "\tCWD to: %s"},
+ {PLIST_CMD, "@exec %s", "\tEXEC '%s'"},
+ {PLIST_CHMOD, "@chmod %s", "\tCHMOD to %s"},
+ {PLIST_CHOWN, "@chown %s", "\tCHOWN to %s"},
+ {PLIST_CHGRP, "@chgrp %s", "\tCHGRP to %s"},
+ {PLIST_COMMENT, "@comment %s", "\tComment: %s"},
+ {PLIST_IGNORE, "@ignore", "Ignore next file:"},
+ {PLIST_NAME, "@name %s", "\tPackage name: %s"},
+ {PLIST_UNEXEC, "@unexec %s", "\tUNEXEC '%s'"},
+ {PLIST_SRC, "@src: %s", "\tSRC to: %s"},
+ {PLIST_DISPLAY, "@display %s", "\tInstall message file: %s"},
+ {PLIST_PKGDEP, "@pkgdep %s", "\tPackage depends on: %s"},
+ {PLIST_MTREE, "@mtree %s", "\tPackage mtree file: %s"},
+ {PLIST_DIR_RM, "@dirrm %s", "\tDeinstall directory remove: %s"},
+ {PLIST_IGNORE_INST, "@ignore_inst ??? doesn't belong here",
+ "\tIgnore next file installation directive (doesn't belong)"},
+ {PLIST_OPTION, "@option %s", "\tPackage has option: %s"},
+ {PLIST_PKGCFL, "@pkgcfl %s", "\tPackage conflicts with: %s"},
+ {PLIST_BLDDEP, "@blddep %s", "\tPackage depends exactly on: %s"},
+ {-1, NULL, NULL}
+};
+
+void
+show_file(char *title, char *fname)
+{
+ FILE *fp;
+ char line[1024];
+ int n;
+
+ if (!Quiet) {
+ printf("%s%s", InfoPrefix, title);
+ }
+ if ((fp = fopen(fname, "r")) == (FILE *) NULL) {
+ printf("ERROR: show_file: Can't open '%s' for reading!\n", fname);
+ } else {
+ int append_nl = 0;
+ while ((n = fread(line, 1, sizeof(line), fp)) != 0) {
+ fwrite(line, 1, n, stdout);
+ append_nl = (line[n - 1] != '\n');
+ }
+ (void) fclose(fp);
+ if (append_nl)
+ printf("\n");
+ }
+ printf("\n"); /* just in case */
+}
+
+void
+show_index(char *title, char *fname)
+{
+ FILE *fp;
+ char *line;
+ size_t linelen;
+ size_t maxline = termwidth;
+
+ if (!Quiet) {
+ printf("%s%s", InfoPrefix, title);
+ maxline -= MAXNAMESIZE;
+ }
+ if ((fp = fopen(fname, "r")) == (FILE *) NULL) {
+ warnx("show_file: can't open '%s' for reading", fname);
+ return;
+ }
+ if ((line = fgetln(fp, &linelen))) {
+ line[linelen - 1] = '\0'; /* tromp newline & terminate string */
+ if (termwidth && (linelen > maxline)) {
+ /* XXX -1 if term does NOT have xn (or xenl) quirk */
+ line[maxline] = '\0';
+ }
+ (void) printf("%s\n", line);
+ }
+ (void) fclose(fp);
+}
+
+/*
+ * Show a packing list item type. If type is PLIST_SHOW_ALL, show all
+ */
+void
+show_plist(char *title, package_t *plist, pl_ent_t type)
+{
+ plist_t *p;
+ Boolean ign;
+
+ if (!Quiet) {
+ printf("%s%s", InfoPrefix, title);
+ }
+ for (ign = FALSE, p = plist->head; p; p = p->next) {
+ if (p->type == type || type == PLIST_SHOW_ALL) {
+ switch (p->type) {
+ case PLIST_FILE:
+ printf(Quiet ? showv[p->type].sh_quiet : showv[p->type].sh_verbose, p->name);
+ if (ign) {
+ if (!Quiet) {
+ printf(" (ignored)");
+ }
+ ign = FALSE;
+ }
+ break;
+ case PLIST_CHMOD:
+ case PLIST_CHOWN:
+ case PLIST_CHGRP:
+ printf(Quiet ? showv[p->type].sh_quiet : showv[p->type].sh_verbose,
+ p->name ? p->name : "(clear default)");
+ break;
+ case PLIST_IGNORE:
+ printf(Quiet ? showv[p->type].sh_quiet : showv[p->type].sh_verbose);
+ ign = TRUE;
+ break;
+ case PLIST_IGNORE_INST:
+ printf(Quiet ? showv[p->type].sh_quiet : showv[p->type].sh_verbose, p->name);
+ ign = TRUE;
+ break;
+ case PLIST_CWD:
+ case PLIST_CMD:
+ case PLIST_SRC:
+ case PLIST_UNEXEC:
+ case PLIST_COMMENT:
+ case PLIST_NAME:
+ case PLIST_DISPLAY:
+ case PLIST_PKGDEP:
+ case PLIST_MTREE:
+ case PLIST_DIR_RM:
+ case PLIST_OPTION:
+ case PLIST_PKGCFL:
+ case PLIST_BLDDEP:
+ printf(Quiet ? showv[p->type].sh_quiet : showv[p->type].sh_verbose, p->name);
+ break;
+ default:
+ warnx("unknown command type %d (%s)", p->type, p->name);
+ }
+ (void) fputc('\n', stdout);
+ }
+ }
+}
+
+/*
+ * Show all files in the packing list (except ignored ones)
+ */
+void
+show_files(char *title, package_t *plist)
+{
+ plist_t *p;
+ Boolean ign;
+ char *dir = ".";
+
+ if (!Quiet) {
+ printf("%s%s", InfoPrefix, title);
+ }
+ for (ign = FALSE, p = plist->head; p; p = p->next) {
+ switch (p->type) {
+ case PLIST_FILE:
+ if (!ign) {
+ printf("%s/%s\n", dir, p->name);
+ }
+ ign = FALSE;
+ break;
+ case PLIST_CWD:
+ dir = p->name;
+ break;
+ case PLIST_IGNORE:
+ ign = TRUE;
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+/*
+ * Show dependencies (packages this pkg requires)
+ */
+void
+show_depends(char *title, package_t *plist)
+{
+ plist_t *p;
+ int nodepends;
+
+ nodepends = 1;
+ for (p = plist->head; p && nodepends; p = p->next) {
+ switch (p->type) {
+ case PLIST_PKGDEP:
+ nodepends = 0;
+ break;
+ default:
+ break;
+ }
+ }
+ if (nodepends)
+ return;
+
+ if (!Quiet) {
+ printf("%s%s", InfoPrefix, title);
+ }
+ for (p = plist->head; p; p = p->next) {
+ switch (p->type) {
+ case PLIST_PKGDEP:
+ printf("%s\n", p->name);
+ break;
+ default:
+ break;
+ }
+ }
+
+ printf("\n");
+}