summaryrefslogtreecommitdiff
path: root/pkgtools
diff options
context:
space:
mode:
authorjoerg <joerg@pkgsrc.org>2008-03-09 19:02:27 +0000
committerjoerg <joerg@pkgsrc.org>2008-03-09 19:02:27 +0000
commit71135a904ef3ca5b4381d502f3bc3e6f7bb3f661 (patch)
treeb545ba625b26b120adc33e9f749b3de24afb5b70 /pkgtools
parent1f32c374bae1c5863677414b6f355c80c2e5033e (diff)
downloadpkgsrc-71135a904ef3ca5b4381d502f3bc3e6f7bb3f661.tar.gz
Split check functions into a separate file.
Drop checkall and implement it using "*" as wildcard match.
Diffstat (limited to 'pkgtools')
-rw-r--r--pkgtools/pkg_install/files/admin/Makefile.in4
-rw-r--r--pkgtools/pkg_install/files/admin/admin.h36
-rw-r--r--pkgtools/pkg_install/files/admin/check.c285
-rw-r--r--pkgtools/pkg_install/files/admin/main.c227
4 files changed, 328 insertions, 224 deletions
diff --git a/pkgtools/pkg_install/files/admin/Makefile.in b/pkgtools/pkg_install/files/admin/Makefile.in
index 418033e4da4..5d381685ed6 100644
--- a/pkgtools/pkg_install/files/admin/Makefile.in
+++ b/pkgtools/pkg_install/files/admin/Makefile.in
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.in,v 1.11 2007/07/16 09:57:57 joerg Exp $
+# $NetBSD: Makefile.in,v 1.12 2008/03/09 19:02:27 joerg Exp $
srcdir= @srcdir@
@@ -22,7 +22,7 @@ INSTALL= @INSTALL@
PROG= pkg_admin
-OBJS= main.o
+OBJS= check.o main.o
all: $(PROG)
diff --git a/pkgtools/pkg_install/files/admin/admin.h b/pkgtools/pkg_install/files/admin/admin.h
new file mode 100644
index 00000000000..934bbfada3b
--- /dev/null
+++ b/pkgtools/pkg_install/files/admin/admin.h
@@ -0,0 +1,36 @@
+/*-
+ * Copyright (c) 2008 The NetBSD Foundation, Inc.
+ * 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 the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``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 FOUNDATION OR CONTRIBUTORS
+ * 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.
+ */
+
+extern int quiet;
+
+void check(char **);
diff --git a/pkgtools/pkg_install/files/admin/check.c b/pkgtools/pkg_install/files/admin/check.c
new file mode 100644
index 00000000000..4f5d58e8326
--- /dev/null
+++ b/pkgtools/pkg_install/files/admin/check.c
@@ -0,0 +1,285 @@
+/* $NetBSD: check.c,v 1.1 2008/03/09 19:02:27 joerg Exp $ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <nbcompat.h>
+#if HAVE_SYS_CDEFS_H
+#include <sys/cdefs.h>
+#endif
+#ifndef lint
+__RCSID("$NetBSD: check.c,v 1.1 2008/03/09 19:02:27 joerg Exp $");
+#endif
+
+/*-
+ * Copyright (c) 1999-2008 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Hubert Feyrer <hubert@feyrer.de>.
+ *
+ * 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 the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``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 FOUNDATION OR CONTRIBUTORS
+ * 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.
+ */
+
+#if HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+#if HAVE_DIRENT_H
+#include <dirent.h>
+#endif
+#if HAVE_ERR_H
+#include <err.h>
+#endif
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
+#if HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#if HAVE_MD5_H
+#include <md5.h>
+#endif
+#if HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#if HAVE_STDIO_H
+#include <stdio.h>
+#endif
+#if HAVE_STRING_H
+#include <string.h>
+#endif
+
+#include "admin.h"
+#include "lib.h"
+
+static int checkpattern_fn(const char *, void *);
+
+/*
+ * Assumes CWD is in /var/db/pkg/<pkg>!
+ */
+static void
+check1pkg(const char *pkgdir, int *filecnt, int *pkgcnt)
+{
+ FILE *f;
+ plist_t *p;
+ package_t Plist;
+ char *PkgName, *dirp = NULL, *md5file;
+ char file[MaxPathSize];
+ char dir[MaxPathSize];
+
+ f = fopen(CONTENTS_FNAME, "r");
+ if (f == NULL)
+ err(EXIT_FAILURE, "can't open %s/%s/%s", _pkgdb_getPKGDB_DIR(), pkgdir, CONTENTS_FNAME);
+
+ Plist.head = Plist.tail = NULL;
+ read_plist(&Plist, f);
+ p = find_plist(&Plist, PLIST_NAME);
+ if (p == NULL)
+ errx(EXIT_FAILURE, "Package %s has no @name, aborting.",
+ pkgdir);
+ PkgName = p->name;
+ for (p = Plist.head; p; p = p->next) {
+ switch (p->type) {
+ case PLIST_FILE:
+ if (dirp == NULL) {
+ warnx("dirp not initialized, please send-pr!");
+ abort();
+ }
+
+ (void) snprintf(file, sizeof(file), "%s/%s", dirp, p->name);
+
+ if (isfile(file) || islinktodir(file)) {
+ if (p->next && p->next->type == PLIST_COMMENT) {
+ if (strncmp(p->next->name, CHECKSUM_HEADER, ChecksumHeaderLen) == 0) {
+ if ((md5file = MD5File(file, NULL)) != NULL) {
+ /* Mismatch? */
+#ifdef PKGDB_DEBUG
+ printf("%s: md5 should=<%s>, is=<%s>\n",
+ file, p->next->name + ChecksumHeaderLen, md5file);
+#endif
+ if (strcmp(md5file, p->next->name + ChecksumHeaderLen) != 0)
+ printf("%s fails MD5 checksum\n", file);
+
+ free(md5file);
+ }
+ } else if (strncmp(p->next->name, SYMLINK_HEADER, SymlinkHeaderLen) == 0) {
+ char buf[MaxPathSize + SymlinkHeaderLen];
+ int cc;
+
+ (void) strlcpy(buf, SYMLINK_HEADER, sizeof(buf));
+ if ((cc = readlink(file, &buf[SymlinkHeaderLen],
+ sizeof(buf) - SymlinkHeaderLen - 1)) < 0) {
+ warnx("can't readlink `%s'", file);
+ } else {
+ buf[SymlinkHeaderLen + cc] = 0x0;
+ if (strcmp(buf, p->next->name) != 0) {
+ printf("symlink (%s) is not same as recorded value, %s: %s\n",
+ file, buf, p->next->name);
+ }
+ }
+ }
+ }
+
+ (*filecnt)++;
+ } else if (isbrokenlink(file)) {
+ warnx("%s: Symlink `%s' exists and is in %s but target does not exist!", PkgName, file, CONTENTS_FNAME);
+ } else {
+ warnx("%s: File `%s' is in %s but not on filesystem!", PkgName, file, CONTENTS_FNAME);
+ }
+ break;
+ case PLIST_CWD:
+ if (strcmp(p->name, ".") != 0)
+ dirp = p->name;
+ else {
+ (void) snprintf(dir, sizeof(dir), "%s/%s", _pkgdb_getPKGDB_DIR(), pkgdir);
+ dirp = dir;
+ }
+ break;
+ case PLIST_IGNORE:
+ p = p->next;
+ break;
+ case PLIST_SHOW_ALL:
+ case PLIST_SRC:
+ case PLIST_CMD:
+ case PLIST_CHMOD:
+ case PLIST_CHOWN:
+ case PLIST_CHGRP:
+ case PLIST_COMMENT:
+ case PLIST_NAME:
+ case PLIST_UNEXEC:
+ case PLIST_DISPLAY:
+ case PLIST_PKGDEP:
+ case PLIST_MTREE:
+ case PLIST_DIR_RM:
+ case PLIST_IGNORE_INST:
+ case PLIST_OPTION:
+ case PLIST_PKGCFL:
+ case PLIST_BLDDEP:
+ break;
+ }
+ }
+ free_plist(&Plist);
+ fclose(f);
+ (*pkgcnt)++;
+}
+
+struct checkpattern_arg {
+ int filecnt;
+ int pkgcnt;
+ int got_match;
+};
+
+static int
+checkpattern_fn(const char *pkg, void *vp)
+{
+ struct checkpattern_arg *arg = vp;
+ int rc;
+
+ rc = chdir(pkg);
+ if (rc == -1)
+ err(EXIT_FAILURE, "Cannot chdir to %s/%s", _pkgdb_getPKGDB_DIR(), pkg);
+
+ check1pkg(pkg, &arg->filecnt, &arg->pkgcnt);
+ if (!quiet) {
+ printf(".");
+ }
+
+ chdir("..");
+
+ arg->got_match = 1;
+
+ return 0;
+}
+
+static void
+check_pkg(const char *pkg, int *filecnt, int *pkgcnt, int allow_unmatched)
+{
+ struct checkpattern_arg arg;
+ char *pattern;
+
+ arg.filecnt = *filecnt;
+ arg.pkgcnt = *pkgcnt;
+ arg.got_match = 0;
+
+ if (match_installed_pkgs(pkg, checkpattern_fn, &arg) == -1)
+ errx(EXIT_FAILURE, "Cannot process pkdbdb");
+ if (arg.got_match != 0) {
+ *filecnt = arg.filecnt;
+ *pkgcnt = arg.pkgcnt;
+ return;
+ }
+
+ if (ispkgpattern(pkg)) {
+ if (allow_unmatched)
+ return;
+ errx(EXIT_FAILURE, "No matching pkg for %s.", pkg);
+ }
+
+ if (asprintf(&pattern, "%s-[0-9]*", pkg) == -1)
+ errx(EXIT_FAILURE, "asprintf failed");
+
+ if (match_installed_pkgs(pattern, checkpattern_fn, &arg) == -1)
+ errx(EXIT_FAILURE, "Cannot process pkdbdb");
+
+ if (arg.got_match == 0)
+ errx(EXIT_FAILURE, "cannot find package %s", pkg);
+ free(pattern);
+
+ *filecnt = arg.filecnt;
+ *pkgcnt = arg.pkgcnt;
+}
+
+void
+check(char **argv)
+{
+ int filecnt, pkgcnt, rc;
+
+ filecnt = 0;
+ pkgcnt = 0;
+ setbuf(stdout, NULL);
+
+ rc = chdir(_pkgdb_getPKGDB_DIR());
+ if (rc == -1)
+ err(EXIT_FAILURE, "Cannot chdir to %s", _pkgdb_getPKGDB_DIR());
+
+ if (*argv == NULL) {
+ check_pkg("*", &filecnt, &pkgcnt, 1);
+ } else {
+ for (; *argv != NULL; ++argv)
+ check_pkg(*argv, &filecnt, &pkgcnt, 0);
+ }
+
+ printf("\n");
+ printf("Checked %d file%s from %d package%s.\n",
+ filecnt, (filecnt == 1) ? "" : "s",
+ pkgcnt, (pkgcnt == 1) ? "" : "s");
+}
diff --git a/pkgtools/pkg_install/files/admin/main.c b/pkgtools/pkg_install/files/admin/main.c
index ae9f3fec13c..7e75889b595 100644
--- a/pkgtools/pkg_install/files/admin/main.c
+++ b/pkgtools/pkg_install/files/admin/main.c
@@ -1,4 +1,4 @@
-/* $NetBSD: main.c,v 1.34 2008/01/29 15:39:30 hubertf Exp $ */
+/* $NetBSD: main.c,v 1.35 2008/03/09 19:02:27 joerg Exp $ */
#if HAVE_CONFIG_H
#include "config.h"
@@ -8,7 +8,7 @@
#include <sys/cdefs.h>
#endif
#ifndef lint
-__RCSID("$NetBSD: main.c,v 1.34 2008/01/29 15:39:30 hubertf Exp $");
+__RCSID("$NetBSD: main.c,v 1.35 2008/03/09 19:02:27 joerg Exp $");
#endif
/*-
@@ -78,6 +78,7 @@ __RCSID("$NetBSD: main.c,v 1.34 2008/01/29 15:39:30 hubertf Exp $");
#include <string.h>
#endif
+#include "admin.h"
#include "lib.h"
#define DEFAULT_SFX ".t[bg]z" /* default suffix for ls{all,best} */
@@ -87,9 +88,8 @@ static const char Options[] = "K:SVbd:qs:";
int filecnt;
int pkgcnt;
-static int quiet;
+int quiet;
-static int checkpattern_fn(const char *, void *);
static void set_unset_variable(char **, Boolean);
/* print usage message and exit */
@@ -118,115 +118,6 @@ usage(void)
}
/*
- * Assumes CWD is in /var/db/pkg/<pkg>!
- */
-static void
-check1pkg(const char *pkgdir)
-{
- FILE *f;
- plist_t *p;
- package_t Plist;
- char *PkgName, *dirp = NULL, *md5file;
- char file[MaxPathSize];
- char dir[MaxPathSize];
-
- f = fopen(CONTENTS_FNAME, "r");
- if (f == NULL)
- err(EXIT_FAILURE, "can't open %s/%s/%s", _pkgdb_getPKGDB_DIR(), pkgdir, CONTENTS_FNAME);
-
- Plist.head = Plist.tail = NULL;
- read_plist(&Plist, f);
- p = find_plist(&Plist, PLIST_NAME);
- if (p == NULL)
- errx(EXIT_FAILURE, "Package %s has no @name, aborting.",
- pkgdir);
- PkgName = p->name;
- for (p = Plist.head; p; p = p->next) {
- switch (p->type) {
- case PLIST_FILE:
- if (dirp == NULL) {
- warnx("dirp not initialized, please send-pr!");
- abort();
- }
-
- (void) snprintf(file, sizeof(file), "%s/%s", dirp, p->name);
-
- if (isfile(file) || islinktodir(file)) {
- if (p->next && p->next->type == PLIST_COMMENT) {
- if (strncmp(p->next->name, CHECKSUM_HEADER, ChecksumHeaderLen) == 0) {
- if ((md5file = MD5File(file, NULL)) != NULL) {
- /* Mismatch? */
-#ifdef PKGDB_DEBUG
- printf("%s: md5 should=<%s>, is=<%s>\n",
- file, p->next->name + ChecksumHeaderLen, md5file);
-#endif
- if (strcmp(md5file, p->next->name + ChecksumHeaderLen) != 0)
- printf("%s fails MD5 checksum\n", file);
-
- free(md5file);
- }
- } else if (strncmp(p->next->name, SYMLINK_HEADER, SymlinkHeaderLen) == 0) {
- char buf[MaxPathSize + SymlinkHeaderLen];
- int cc;
-
- (void) strlcpy(buf, SYMLINK_HEADER, sizeof(buf));
- if ((cc = readlink(file, &buf[SymlinkHeaderLen],
- sizeof(buf) - SymlinkHeaderLen - 1)) < 0) {
- warnx("can't readlink `%s'", file);
- } else {
- buf[SymlinkHeaderLen + cc] = 0x0;
- if (strcmp(buf, p->next->name) != 0) {
- printf("symlink (%s) is not same as recorded value, %s: %s\n",
- file, buf, p->next->name);
- }
- }
- }
- }
-
- filecnt++;
- } else if (isbrokenlink(file)) {
- warnx("%s: Symlink `%s' exists and is in %s but target does not exist!", PkgName, file, CONTENTS_FNAME);
- } else {
- warnx("%s: File `%s' is in %s but not on filesystem!", PkgName, file, CONTENTS_FNAME);
- }
- break;
- case PLIST_CWD:
- if (strcmp(p->name, ".") != 0)
- dirp = p->name;
- else {
- (void) snprintf(dir, sizeof(dir), "%s/%s", _pkgdb_getPKGDB_DIR(), pkgdir);
- dirp = dir;
- }
- break;
- case PLIST_IGNORE:
- p = p->next;
- break;
- case PLIST_SHOW_ALL:
- case PLIST_SRC:
- case PLIST_CMD:
- case PLIST_CHMOD:
- case PLIST_CHOWN:
- case PLIST_CHGRP:
- case PLIST_COMMENT:
- case PLIST_NAME:
- case PLIST_UNEXEC:
- case PLIST_DISPLAY:
- case PLIST_PKGDEP:
- case PLIST_MTREE:
- case PLIST_DIR_RM:
- case PLIST_IGNORE_INST:
- case PLIST_OPTION:
- case PLIST_PKGCFL:
- case PLIST_BLDDEP:
- break;
- }
- }
- free_plist(&Plist);
- fclose(f);
- pkgcnt++;
-}
-
-/*
* add1pkg(<pkg>)
* adds the files listed in the +CONTENTS of <pkg> into the
* pkgdb.byfile.db database file in the current package dbdir. It
@@ -382,70 +273,6 @@ rebuild(void)
cachename);
}
-static void
-checkall(void)
-{
- DIR *dp;
- struct dirent *de;
-
- pkgcnt = 0;
- filecnt = 0;
-
- setbuf(stdout, NULL);
- chdir(_pkgdb_getPKGDB_DIR());
-
- dp = opendir(".");
- if (dp == NULL)
- err(EXIT_FAILURE, "opendir failed");
- while ((de = readdir(dp))) {
- if (!(isdir(de->d_name) || islinktodir(de->d_name)))
- continue;
-
- if (strcmp(de->d_name, ".") == 0 ||
- strcmp(de->d_name, "..") == 0)
- continue;
-
- chdir(de->d_name);
-
- check1pkg(de->d_name);
- if (!quiet) {
- printf(".");
- }
-
- chdir("..");
- }
- closedir(dp);
- pkgdb_close();
-
-
- printf("\n");
- printf("Checked %d file%s from %d package%s.\n",
- filecnt, (filecnt == 1) ? "" : "s",
- pkgcnt, (pkgcnt == 1) ? "" : "s");
-}
-
-static int
-checkpattern_fn(const char *pkg, void *vp)
-{
- int *got_match, rc;
-
- rc = chdir(pkg);
- if (rc == -1)
- err(EXIT_FAILURE, "Cannot chdir to %s/%s", _pkgdb_getPKGDB_DIR(), pkg);
-
- check1pkg(pkg);
- if (!quiet) {
- printf(".");
- }
-
- chdir("..");
-
- got_match = vp;
- *got_match = 1;
-
- return 0;
-}
-
static int
lspattern(const char *pkg, void *vp)
{
@@ -633,54 +460,10 @@ main(int argc, char *argv[])
printf("Done.\n");
} else if (strcasecmp(argv[0], "check") == 0) {
-
argv++; /* "check" */
- if (*argv != NULL) {
- /* args specified */
- int rc;
-
- filecnt = 0;
-
- setbuf(stdout, NULL);
+ check(argv);
- rc = chdir(_pkgdb_getPKGDB_DIR());
- if (rc == -1)
- err(EXIT_FAILURE, "Cannot chdir to %s", _pkgdb_getPKGDB_DIR());
-
- while (*argv != NULL) {
- int got_match;
-
- got_match = 0;
- if (match_installed_pkgs(*argv, checkpattern_fn, &got_match) == -1)
- errx(EXIT_FAILURE, "Cannot process pkdbdb");
- if (got_match == 0) {
- char *pattern;
-
- if (ispkgpattern(*argv))
- errx(EXIT_FAILURE, "No matching pkg for %s.", *argv);
-
- if (asprintf(&pattern, "%s-[0-9]*", *argv) == -1)
- errx(EXIT_FAILURE, "asprintf failed");
-
- if (match_installed_pkgs(pattern, checkpattern_fn, &got_match) == -1)
- errx(EXIT_FAILURE, "Cannot process pkdbdb");
-
- if (got_match == 0)
- errx(EXIT_FAILURE, "cannot find package %s", *argv);
- free(pattern);
- }
-
- argv++;
- }
-
- printf("\n");
- printf("Checked %d file%s from %d package%s.\n",
- filecnt, (filecnt == 1) ? "" : "s",
- pkgcnt, (pkgcnt == 1) ? "" : "s");
- } else {
- checkall();
- }
if (!quiet) {
printf("Done.\n");
}