Import of pkgsrc-2013Q2

This commit is contained in:
2013-09-26 17:14:40 +02:00
commit 785076ae39
74991 changed files with 4380255 additions and 0 deletions

16
pkgtools/rdigest/DESCR Normal file
View File

@@ -0,0 +1,16 @@
This utility is a wrapper for the md5(3), sha1(3), rmd160(3), and
tiger hash routines. It is remarkably similar to the digest package,
except that it can recursively checksum directory trees.
While a simple checksum on a tar file is usually satisfactory, once
said archive has been extracted, it is virtually impossible to
repackage the extracted tree in a form that can yield a repeatable
checksum. To be specific, changes in timestamps and ownership, and
changes in file ordering within directories can affect the checksum of
the archive, while not really impacting the actual code at all.
The algorithm used to checksum a directory in this implementation
is considers only the files' pathnames, the files' types (ie,
directory vs. file vs. symbolic link), and their contents (for
the latter two). It is described in greater detail in the man
page.

15
pkgtools/rdigest/Makefile Normal file
View File

@@ -0,0 +1,15 @@
# $NetBSD: Makefile,v 1.4 2010/03/21 16:29:42 wiz Exp $
DISTNAME= rdigest-${VERSION}
CATEGORIES= # be quiet pkglint
MASTER_SITES= # be quiet pkglint
MAINTAINER= pkgsrc-users@NetBSD.org
COMMENT= Recursive message digest wrapper utility
DIGESTDIR= ${.CURDIR}/../../pkgtools/digest
FILESDIR= ${DIGESTDIR}/files
USE_FEATURES= nbcompat
.include "${DIGESTDIR}/Makefile"

3
pkgtools/rdigest/PLIST Normal file
View File

@@ -0,0 +1,3 @@
@comment $NetBSD: PLIST,v 1.1.1.1 2003/07/24 05:21:04 atatat Exp $
bin/rdigest
man/man1/rdigest.1

View File

@@ -0,0 +1,5 @@
$NetBSD: distinfo,v 1.8 2010/02/24 22:00:03 joerg Exp $
SHA1 (patch-aa) = abb2e5088629b2b9ddd854d5238d6bcdf5cd9cae
SHA1 (patch-ab) = 576c6afbde00e64e1fb7c35c1c2f90b8037f2c9a
SHA1 (patch-ac) = c465218f29c8135a54a1a0cab91eae034780a077

View File

@@ -0,0 +1,50 @@
$NetBSD: patch-aa,v 1.3 2007/07/09 15:19:15 joerg Exp $
--- Makefile.in.orig 2007-07-07 17:26:43.000000000 +0000
+++ Makefile.in
@@ -56,16 +56,16 @@ missing mkinstalldirs regress.sh
.c.o:
$(COMPILE) -c $< -o $@
-all: digest
+all: rdigest
-digest: $(digest_OBJS)
+rdigest: $(digest_OBJS)
$(LINK) $(digest_OBJS) $(LIBS)
-check: digest
+check: rdigest
@SHELL@ $(srcdir)/regress.sh
clean:
- rm -f *.o digest
+ rm -f *.o rdigest
distclean: clean
rm -f Makefile config.h
@@ -74,18 +74,18 @@ distclean: clean
maintainer-clean: distclean
rm -f configure config.h.in
-install: digest
+install: rdigest
$(mkinstalldirs) $(DESTDIR)$(bindir)
- @f=`echo digest|sed '$(transform)'`; \
- echo "$(INSTALL_PROGRAM) digest $(DESTDIR)$(bindir)/$$f"; \
- $(INSTALL_PROGRAM) digest $(DESTDIR)$(bindir)/$$f
+ @f=`echo rdigest|sed '$(transform)'`; \
+ echo "$(INSTALL_PROGRAM) rdigest $(DESTDIR)$(bindir)/$$f"; \
+ $(INSTALL_PROGRAM) rdigest $(DESTDIR)$(bindir)/$$f
$(mkinstalldirs) $(DESTDIR)$(mandir)/man1
- @f=`echo digest.1|sed '$(transform)'`; \
+ @f=`echo rdigest.1|sed '$(transform)'`; \
echo "$(INSTALL_DATA) digest.1 $(DESTDIR)$(mandir)/man1/$$f"; \
$(INSTALL_DATA) digest.1 $(DESTDIR)$(mandir)/man1/$$f
uninstall:
- @f=`echo digest|sed '$(transform)'`; \
+ @f=`echo rdigest|sed '$(transform)'`; \
echo " rm -f $(DESTDIR)$(bindir)/$$f"; \
rm -f $(DESTDIR)$(bindir)/$$f

View File

@@ -0,0 +1,90 @@
$NetBSD: patch-ab,v 1.3 2005/03/31 05:02:24 atatat Exp $
--- digest.1.orig 2005-03-30 23:40:39.000000000 -0500
+++ digest.1
@@ -2,5 +2,5 @@
.\"
.\"
-.\" Copyright (c) 2001 Alistair G. Crooks. All rights reserved.
+.\" Copyright (c) 2001-2005 Alistair G. Crooks. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
@@ -32,12 +32,13 @@
.\"
.\"
-.Dd March 23, 2005
-.Dt DIGEST 1
+.Dd March 31, 2005
+.Dt RDIGEST 1
.Os
.Sh NAME
-.Nm digest
-.Nd calculate message digests
+.Nm rdigest
+.Nd calculate message digests of files and directories
.Sh SYNOPSIS
.Nm
+.Op Fl x Ar directory
.Ar algorithm
.Op file ...
@@ -45,6 +46,13 @@
The
.Nm
-utility calculates message digests of files or,
+utility calculates message digests of files, directories, or,
if no file is specified, standard input.
+The
+.Fl x
+option can be used as many times as required to indicate directories
+not to be included in a directory's hash.
+This allows you to skip, eg, CVS subdirectories in a given tree, which
+can have relatively volatile contents not pertinent to the hash.
+.Pp
The list of possible algorithms is:
.Bl -tag -width Ds
@@ -89,4 +97,23 @@ algorithm implementations, which are loc
C library, and was designed to be scalable as new message digest
algorithms are developed.
+The checksum for a directory is implemented as the hash over a list of
+one or two hashes for each of the items in the tree.
+.Bl -bullet
+.It
+For a file, the string
+.Dq f \&
+along with the path make up the data for one hash, and the contents of
+the file is used for the second hash.
+.It
+For a symbolic link, the string
+.Dq l \&
+along with the path to the symbolic link make up the data for one
+hash, and the target of the symbolic link is used for the second hash.
+.It
+For a directory, the string
+.Dq d \&
+along with the path make up the data for one hash.
+There is no second hash for a directory.
+.El
.Pp
The
@@ -95,4 +122,5 @@ utility exits 0 on success, and \*[Gt]0
.Sh SEE ALSO
.Xr cksum 1 ,
+.Xr digest 1 ,
.Xr md5 3 ,
.Xr rmd160 3 ,
@@ -102,8 +130,12 @@ The
.Nm
utility first appeared in
-.Nx 1.6 .
+.Nx 2.0 .
.Sh AUTHORS
The
+.Xr digest 1
+utility was written by Alistair G. Crooks \*[Lt]agc@netbsd.org\*[Gt].
.Nm
-utility was written by
-.An Alistair G. Crooks Aq agc@netbsd.org .
+was implemented by Andrew Brown \*[Lt]atatat@netbsd.org\*[Gt] as a
+patch to
+.Xr digest 1
+to add recursive capabilities.

View File

@@ -0,0 +1,208 @@
$NetBSD: patch-ac,v 1.5 2010/02/24 22:00:03 joerg Exp $
--- digest.c.orig 2008-09-18 12:13:50.000000000 +0200
+++ digest.c
@@ -41,8 +41,17 @@
#endif
+#include <nbcompat.h>
+#include <nbcompat/queue.h>
+#include <nbcompat/stat.h>
#ifdef HAVE_ERRNO_H
#include <errno.h>
#endif
+#include <fcntl.h>
+#ifdef HAVE_FTS_H
+#include <fts.h>
+#else
+#include <nbcompat/fts.h>
+#endif
#ifdef HAVE_LOCALE_H
#include <locale.h>
@@ -158,4 +167,155 @@ digest_file(char *fn, alg_t *alg)
}
+struct excl {
+ LIST_ENTRY(excl) n;
+ const char *p;
+};
+
+LIST_HEAD(, excl) excl;
+
+static void
+exclude(const char *p)
+{
+ struct excl *e;
+
+ e = malloc(sizeof(struct excl));
+ e->p = p;
+ LIST_INSERT_HEAD(&excl, e, n);
+}
+
+static int
+skip(const char *p)
+{
+ struct excl *e;
+
+#ifdef LIST_FOREACH
+ LIST_FOREACH(e, &excl, n)
+#else
+ for (e = excl.lh_first; e; e = e->n.le_next)
+#endif
+ if (strcmp(e->p, p) == 0)
+ return (1);
+
+ return (0);
+}
+
+static int
+compar(const FTSENT **fa, const FTSENT **fb)
+{
+ return (strcmp((*fa)->fts_name, (*fb)->fts_name));
+}
+
+static int
+digest_directory(char *dn, alg_t *alg)
+{
+ char in[BUFSIZ * 20], dot[2];
+ char *digest;
+ int cc, rc, l, fd, cwd;
+ char *pathlist[2];
+ FTS *ftsp;
+ FTSENT *f;
+
+ rc = 1;
+ l = alg->hash_len * 2;
+ digest = malloc(l + 1);
+ sprintf(dot, ".");
+ pathlist[0] = dot;
+ pathlist[1] = NULL;
+
+ if ((cwd = open(".", O_RDONLY)) == -1 ||
+ chdir(dn) == -1 ||
+ (ftsp = fts_open(pathlist,
+ FTS_COMFOLLOW | FTS_NOCHDIR | FTS_PHYSICAL,
+ compar)) == NULL) {
+ (void) fprintf(stderr, "%s\n", dn);
+ free(digest);
+ return (0);
+ }
+
+ (*alg->hash_init)(&alg->hash_ctx);
+
+ while ((f = fts_read(ftsp)) != NULL) {
+ /* skip the second pass on a directory */
+ if (f->fts_info == FTS_DP)
+ continue;
+
+ /* skip directories named CVS, RCS, or SCCS */
+ if ((f->fts_info == FTS_NS ||
+ S_ISDIR(f->fts_statp->st_mode)) &&
+ skip(f->fts_name)) {
+ fts_set(ftsp, f, FTS_SKIP);
+ continue;
+ }
+
+ /* try to handle things based on stat info */
+ if (f->fts_info != FTS_NS) {
+ /* only mention directories */
+ if (S_ISDIR(f->fts_statp->st_mode)) {
+ (*alg->hash_init)(&alg->hash_ctx2);
+ (*alg->hash_update)(&alg->hash_ctx2, "d ", 2);
+ (*alg->hash_update)(&alg->hash_ctx2, f->fts_path, f->fts_pathlen);
+ (*alg->hash_end)(&alg->hash_ctx2, digest);
+ digest[l] = '\n';
+ (*alg->hash_update)(&alg->hash_ctx, digest, l + 1);
+
+ /* hash the filename and then the contents separately */
+ } else if (S_ISREG(f->fts_statp->st_mode)) {
+ if ((fd = open(f->fts_path, O_RDONLY)) != -1) {
+ (*alg->hash_init)(&alg->hash_ctx2);
+ (*alg->hash_update)(&alg->hash_ctx2, "f ", 2);
+ (*alg->hash_update)(&alg->hash_ctx2, f->fts_path, f->fts_pathlen);
+ (*alg->hash_end)(&alg->hash_ctx2, &digest[0]);
+ digest[l] = '\n';
+ (*alg->hash_update)(&alg->hash_ctx, digest, 33);
+
+ (*alg->hash_init)(&alg->hash_ctx2);
+ while ((cc = read(fd, in, sizeof(in))) > 0) {
+ (*alg->hash_update)(&alg->hash_ctx2, in, cc);
+ }
+ close(fd);
+ (*alg->hash_end)(&alg->hash_ctx2, digest);
+ digest[l] = '\n';
+ (*alg->hash_update)(&alg->hash_ctx, digest, l + 1);
+ } else {
+ (void) fprintf(stderr, "%s\n", f->fts_path);
+ rc = 0;
+ }
+
+ /* hash in symlinks as well, along with the link contents */
+ } else if (S_ISLNK(f->fts_statp->st_mode)) {
+ if ((cc = readlink(f->fts_path, in, sizeof(in))) > 0) {
+ (*alg->hash_init)(&alg->hash_ctx2);
+ (*alg->hash_update)(&alg->hash_ctx2, "l ", 2);
+ (*alg->hash_update)(&alg->hash_ctx2, f->fts_path, f->fts_pathlen);
+ (*alg->hash_end)(&alg->hash_ctx2, digest);
+ digest[l] = '\n';
+ (*alg->hash_update)(&alg->hash_ctx, digest, l + 1);
+
+ (*alg->hash_init)(&alg->hash_ctx2);
+ (*alg->hash_update)(&alg->hash_ctx2, in, cc);
+ (*alg->hash_end)(&alg->hash_ctx2, digest);
+ digest[l] = '\n';
+ (*alg->hash_update)(&alg->hash_ctx, digest, l + 1);
+ } else {
+ (void) fprintf(stderr, "%s\n", f->fts_path);
+ rc = 0;
+ }
+ }
+ }
+ }
+
+ fts_close(ftsp);
+ fchdir(cwd);
+ close(cwd);
+
+ if (rc == 1) {
+ (*alg->hash_end)(&alg->hash_ctx, digest);
+ (void) printf("%s (%s) = %s\n", alg->name, dn, digest);
+ }
+
+ free(digest);
+ return (rc);
+}
+
int
main(int argc, char **argv)
@@ -164,13 +324,19 @@ main(int argc, char **argv)
int rval;
int i;
+ struct stat st;
+
+ LIST_INIT(&excl);
#ifdef HAVE_SETLOCALE
(void) setlocale(LC_ALL, "");
#endif
- while ((i = getopt(argc, argv, "V")) != -1) {
+ while ((i = getopt(argc, argv, "Vx:")) != -1) {
switch(i) {
case 'V':
printf("%s\n", VERSION);
return EXIT_SUCCESS;
+ case 'x':
+ exclude(optarg);
+ break;
}
}
@@ -197,5 +363,7 @@ main(int argc, char **argv)
} else {
for (i = 0 ; i < argc ; i++) {
- if (!digest_file(argv[i], alg)) {
+ if (stat(argv[i], &st) == -1 ||
+ (S_ISREG(st.st_mode) && !digest_file(argv[i], alg)) ||
+ (S_ISDIR(st.st_mode) && !digest_directory(argv[i], alg))) {
(void) fprintf(stderr, "%s\n", argv[i]);
rval = EXIT_FAILURE;