From 1c30911ff0463c1215e15dd9f7acb886ca35a93d Mon Sep 17 00:00:00 2001 From: Adam Weinberger Date: Tue, 29 Jul 2014 14:30:10 +0000 Subject: Rename security/ patches to reflect the files they modify. --- security/rdigest/files/patch-Makefile.in | 60 +++++++++ security/rdigest/files/patch-aa | 60 --------- security/rdigest/files/patch-ab | 90 ------------- security/rdigest/files/patch-ac | 210 ------------------------------- security/rdigest/files/patch-digest.1 | 90 +++++++++++++ security/rdigest/files/patch-digest.c | 210 +++++++++++++++++++++++++++++++ 6 files changed, 360 insertions(+), 360 deletions(-) create mode 100644 security/rdigest/files/patch-Makefile.in delete mode 100644 security/rdigest/files/patch-aa delete mode 100644 security/rdigest/files/patch-ab delete mode 100644 security/rdigest/files/patch-ac create mode 100644 security/rdigest/files/patch-digest.1 create mode 100644 security/rdigest/files/patch-digest.c (limited to 'security/rdigest/files') diff --git a/security/rdigest/files/patch-Makefile.in b/security/rdigest/files/patch-Makefile.in new file mode 100644 index 000000000000..cb5a6e1f303a --- /dev/null +++ b/security/rdigest/files/patch-Makefile.in @@ -0,0 +1,60 @@ +$NetBSD: patch-aa,v 1.2 2005/03/28 20:52:55 agc Exp $ + +--- Makefile.in.orig 2005-03-28 21:39:38.000000000 +0100 ++++ Makefile.in 2005-03-28 21:41:02.000000000 +0100 +@@ -57,7 +57,7 @@ + .c.o: + $(COMPILE) -c $< -o $@ + +-all: digest ++all: rdigest + + digest-types.h: bits + ./bits digest-types.h +@@ -65,10 +65,10 @@ + bits: bits.o + $(LINK) $(bits_OBJS) $(LIBS) + +-digest: $(digest_OBJS) ++rdigest: $(digest_OBJS) + $(LINK) $(digest_OBJS) $(LIBS) + +-check: digest ++check: rdigest + @SHELL@ $(srcdir)/regress.sh + + digest.o: digest-types.h +@@ -84,7 +84,7 @@ + whirlpool.o: digest-types.h + + clean: +- rm -f *.o digest bits digest-types.h ++ rm -f *.o rdigest bits digest-types.h + + distclean: clean + rm -f Makefile config.h +@@ -93,18 +93,18 @@ + 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 + diff --git a/security/rdigest/files/patch-aa b/security/rdigest/files/patch-aa deleted file mode 100644 index cb5a6e1f303a..000000000000 --- a/security/rdigest/files/patch-aa +++ /dev/null @@ -1,60 +0,0 @@ -$NetBSD: patch-aa,v 1.2 2005/03/28 20:52:55 agc Exp $ - ---- Makefile.in.orig 2005-03-28 21:39:38.000000000 +0100 -+++ Makefile.in 2005-03-28 21:41:02.000000000 +0100 -@@ -57,7 +57,7 @@ - .c.o: - $(COMPILE) -c $< -o $@ - --all: digest -+all: rdigest - - digest-types.h: bits - ./bits digest-types.h -@@ -65,10 +65,10 @@ - bits: bits.o - $(LINK) $(bits_OBJS) $(LIBS) - --digest: $(digest_OBJS) -+rdigest: $(digest_OBJS) - $(LINK) $(digest_OBJS) $(LIBS) - --check: digest -+check: rdigest - @SHELL@ $(srcdir)/regress.sh - - digest.o: digest-types.h -@@ -84,7 +84,7 @@ - whirlpool.o: digest-types.h - - clean: -- rm -f *.o digest bits digest-types.h -+ rm -f *.o rdigest bits digest-types.h - - distclean: clean - rm -f Makefile config.h -@@ -93,18 +93,18 @@ - 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 - diff --git a/security/rdigest/files/patch-ab b/security/rdigest/files/patch-ab deleted file mode 100644 index 3098b1d69af0..000000000000 --- a/security/rdigest/files/patch-ab +++ /dev/null @@ -1,90 +0,0 @@ -$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. diff --git a/security/rdigest/files/patch-ac b/security/rdigest/files/patch-ac deleted file mode 100644 index bf6ee0d604a2..000000000000 --- a/security/rdigest/files/patch-ac +++ /dev/null @@ -1,210 +0,0 @@ -$NetBSD: patch-ac,v 1.2 2005/01/21 02:18:23 tv Exp $ - ---- digest.c.orig 2005-01-20 21:10:03.000000000 -0500 -+++ digest.c -@@ -43,9 +43,14 @@ __RCSID("$NetBSD: digest.c,v 1.8 2003/07 - #endif - - -+#include -+#include -+ - #ifdef HAVE_ERRNO_H - #include - #endif -+#include -+#include - #ifdef HAVE_LOCALE_H - #include - #endif -@@ -147,21 +152,178 @@ digest_file(char *fn, alg_t *alg) - return (rc); - } - -+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) - { - alg_t *alg; - 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; - } - } - argc -= optind; -@@ -186,7 +348,9 @@ 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; - } diff --git a/security/rdigest/files/patch-digest.1 b/security/rdigest/files/patch-digest.1 new file mode 100644 index 000000000000..3098b1d69af0 --- /dev/null +++ b/security/rdigest/files/patch-digest.1 @@ -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. diff --git a/security/rdigest/files/patch-digest.c b/security/rdigest/files/patch-digest.c new file mode 100644 index 000000000000..bf6ee0d604a2 --- /dev/null +++ b/security/rdigest/files/patch-digest.c @@ -0,0 +1,210 @@ +$NetBSD: patch-ac,v 1.2 2005/01/21 02:18:23 tv Exp $ + +--- digest.c.orig 2005-01-20 21:10:03.000000000 -0500 ++++ digest.c +@@ -43,9 +43,14 @@ __RCSID("$NetBSD: digest.c,v 1.8 2003/07 + #endif + + ++#include ++#include ++ + #ifdef HAVE_ERRNO_H + #include + #endif ++#include ++#include + #ifdef HAVE_LOCALE_H + #include + #endif +@@ -147,21 +152,178 @@ digest_file(char *fn, alg_t *alg) + return (rc); + } + ++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) + { + alg_t *alg; + 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; + } + } + argc -= optind; +@@ -186,7 +348,9 @@ 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; + } -- cgit v1.2.3