diff options
author | Todd C. Miller <millert@cvs.openbsd.org> | 2003-06-26 18:19:30 +0000 |
---|---|---|
committer | Todd C. Miller <millert@cvs.openbsd.org> | 2003-06-26 18:19:30 +0000 |
commit | 138be56b4cb60252fc1f487b0ec6df1c45548d8a (patch) | |
tree | 5be413c1725e3594f74983431196f0b76692e6ca /usr.bin/diff | |
parent | 9b204b3b913998e74384425206e6298610ff2ae8 (diff) |
Fix temp file handling.
o honor TMPDIR environment variable as per man page
o need 2 temp files if both file1 and file2 are devices
o add error() and errorx() which cleanup temp file and then
call err() and errx() respectively.
OK tedu@
Diffstat (limited to 'usr.bin/diff')
-rw-r--r-- | usr.bin/diff/diff.c | 54 | ||||
-rw-r--r-- | usr.bin/diff/diff.h | 4 | ||||
-rw-r--r-- | usr.bin/diff/diffdir.c | 32 | ||||
-rw-r--r-- | usr.bin/diff/diffreg.c | 96 |
4 files changed, 86 insertions, 100 deletions
diff --git a/usr.bin/diff/diff.c b/usr.bin/diff/diff.c index 21122b48466..59605ced06e 100644 --- a/usr.bin/diff/diff.c +++ b/usr.bin/diff/diff.c @@ -1,4 +1,4 @@ -/* $OpenBSD: diff.c,v 1.14 2003/06/26 07:20:12 deraadt Exp $ */ +/* $OpenBSD: diff.c,v 1.15 2003/06/26 18:19:29 millert Exp $ */ /* * Copyright (C) Caldera International Inc. 2001-2002. @@ -34,7 +34,9 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include <errno.h> #include <stdlib.h> +#include <stdarg.h> #include <unistd.h> #include "diff.h" @@ -88,7 +90,6 @@ const char *diff = _PATH_DIFF; const char *diffh = _PATH_DIFFH; const char *pr = _PATH_PR; -static void noroom(void); __dead void usage(void); int @@ -178,19 +179,19 @@ main(int argc, char **argv) argv += optind; if (argc != 2) - errx(1, "two filename arguments required"); + errorx("two filename arguments required"); file1 = argv[0]; file2 = argv[1]; if (hflag && opt) - errx(1, "-h doesn't support -D, -c, -C, -e, -f, -I, -n, -u or -U"); + errorx("-h doesn't support -D, -c, -C, -e, -f, -I, -n, -u or -U"); if (!strcmp(file1, "-")) stb1.st_mode = S_IFREG; else if (stat(file1, &stb1) < 0) - err(1, "%s", file1); + error("%s", file1); if (!strcmp(file2, "-")) stb2.st_mode = S_IFREG; else if (stat(file2, &stb2) < 0) - err(1, "%s", file2); + error("%s", file2); if (S_ISDIR(stb1.st_mode) && S_ISDIR(stb2.st_mode)) diffdir(argv); else @@ -215,9 +216,9 @@ max(int a, int b) __dead void done(int sig) { - if (tempfiles[0]) + if (tempfiles[0] != NULL) unlink(tempfiles[0]); - if (tempfiles[1]) + if (tempfiles[1] != NULL) unlink(tempfiles[1]); if (sig) _exit(status); @@ -230,7 +231,7 @@ emalloc(size_t n) void *p; if ((p = malloc(n)) == NULL) - noroom(); + error("files too big, try -h"); return (p); } @@ -240,15 +241,38 @@ erealloc(void *p, size_t n) void *q; if ((q = realloc(p, n)) == NULL) - noroom(); + error("files too big, try -h"); return (q); } -static void -noroom(void) +__dead void +error(const char *fmt, ...) { - warn("files too big, try -h"); - done(0); + va_list ap; + int sverrno = errno; + + if (tempfiles[0] != NULL) + unlink(tempfiles[0]); + if (tempfiles[1] != NULL) + unlink(tempfiles[1]); + errno = sverrno; + va_start(ap, fmt); + verr(status, fmt, ap); + va_end(ap); +} + +__dead void +errorx(const char *fmt, ...) +{ + va_list ap; + + if (tempfiles[0] != NULL) + unlink(tempfiles[0]); + if (tempfiles[1] != NULL) + unlink(tempfiles[1]); + va_start(ap, fmt); + verrx(status, fmt, ap); + va_end(ap); } __dead void @@ -262,5 +286,5 @@ usage(void) " diff [-biwt] [-c | -e | -f | -h | -n | -u ] " "[-l] [-r] [-s] [-S name]\n dir1 dir2\n"); - exit(1); + exit(2); } diff --git a/usr.bin/diff/diff.h b/usr.bin/diff/diff.h index 4c33f03dba0..fc155fcf2a9 100644 --- a/usr.bin/diff/diff.h +++ b/usr.bin/diff/diff.h @@ -1,4 +1,4 @@ -/* $OpenBSD: diff.h,v 1.9 2003/06/26 04:52:26 millert Exp $ */ +/* $OpenBSD: diff.h,v 1.10 2003/06/26 18:19:29 millert Exp $ */ /* * Copyright (C) Caldera International Inc. 2001-2002. @@ -76,4 +76,6 @@ void diffdir(char **); void diffreg(void); int max(int, int); int min(int, int); +__dead void error(const char *, ...); +__dead void errorx(const char *, ...); __dead void done(int); diff --git a/usr.bin/diff/diffdir.c b/usr.bin/diff/diffdir.c index d34638f1853..1ba5117482a 100644 --- a/usr.bin/diff/diffdir.c +++ b/usr.bin/diff/diffdir.c @@ -1,4 +1,4 @@ -/* $OpenBSD: diffdir.c,v 1.13 2003/06/25 22:14:43 millert Exp $ */ +/* $OpenBSD: diffdir.c,v 1.14 2003/06/26 18:19:29 millert Exp $ */ /* * Copyright (C) Caldera International Inc. 2001-2002. @@ -186,7 +186,7 @@ setfile(char **fpp, char **epp, char *file) *fpp = emalloc(MAXPATHLEN); len = strlcpy(*fpp, file, MAXPATHLEN); if (len >= MAXPATHLEN - 1) - errx(1, "%s: %s", file, strerror(ENAMETOOLONG)); + errorx("%s: %s", file, strerror(ENAMETOOLONG)); cp = *fpp + len - 1; if (*cp == '/') ++cp; @@ -239,10 +239,8 @@ setupdir(char *cp) DIR *dirp; dirp = opendir(cp); - if (dirp == NULL) { - warn("%s", cp); - done(0); - } + if (dirp == NULL) + error("%s", cp); nitems = 0; dp = emalloc(sizeof(struct dir)); while ((rp = readdir(dirp))) { @@ -284,12 +282,12 @@ compare(struct dir *dp) strlcpy(efile2, dp->d_entry, file2 + MAXPATHLEN - efile2); f1 = open(file1, 0); if (f1 < 0) { - perror(file1); + warn("%s", file1); return; } f2 = open(file2, 0); if (f2 < 0) { - perror(file2); + warn("%s", file2); close(f1); return; } @@ -378,10 +376,8 @@ calldiff(char *wantpr) "%s %s", file1, file2); pipe(pv); pid = fork(); - if (pid == -1) { - warnx("No more processes"); - done(0); - } + if (pid == -1) + errorx("No more processes"); if (pid == 0) { close(0); dup(pv[0]); @@ -389,15 +385,12 @@ calldiff(char *wantpr) close(pv[1]); execv(pr + 4, prargs); execv(pr, prargs); - perror(pr); - done(0); + errorx("%s", pr); } } pid = fork(); - if (pid == -1) { - warnx("No more processes"); - done(0); - } + if (pid == -1) + errorx("No more processes"); if (pid == 0) { if (wantpr) { close(1); @@ -407,8 +400,7 @@ calldiff(char *wantpr) } execv(diff + 4, diffargv); execv(diff, diffargv); - perror(diff); - done(0); + error("%s", diff); } if (wantpr) { close(pv[0]); diff --git a/usr.bin/diff/diffreg.c b/usr.bin/diff/diffreg.c index e1c4332a298..0707749ae40 100644 --- a/usr.bin/diff/diffreg.c +++ b/usr.bin/diff/diffreg.c @@ -1,4 +1,4 @@ -/* $OpenBSD: diffreg.c,v 1.20 2003/06/26 04:52:26 millert Exp $ */ +/* $OpenBSD: diffreg.c,v 1.21 2003/06/26 18:19:29 millert Exp $ */ /* * Copyright (C) Caldera International Inc. 2001-2002. @@ -232,49 +232,33 @@ diffreg(void) if (hflag) { diffargv[0] = "diffh"; execv(diffh, diffargv); - warn("%s", diffh); - done(0); + error("%s", diffh); } chrtran = (iflag ? cup2low : clow2low); - if (strcmp(file1, "-") == 0 && strcmp(file2, "-") == 0) { - warnx("can't specify - -"); - done(0); - } + if (strcmp(file1, "-") == 0 && strcmp(file2, "-") == 0) + errorx("can't specify - -"); if (S_ISDIR(stb1.st_mode)) { file1 = splice(file1, file2); - if (stat(file1, &stb1) < 0) { - warn("%s", file1); - done(0); - } + if (stat(file1, &stb1) < 0) + error("%s", file1); } else if (!S_ISREG(stb1.st_mode) || strcmp(file1, "-") == 0) { file1 = copytemp(file1, 1); - if (stat(file1, &stb1) < 0) { - warn("%s", file1); - done(0); - } + if (stat(file1, &stb1) < 0) + error("%s", file1); } if (S_ISDIR(stb2.st_mode)) { file2 = splice(file2, file1); - if (stat(file2, &stb2) < 0) { - warn("%s", file2); - done(0); - } + if (stat(file2, &stb2) < 0) + error("%s", file2); } else if (!S_ISREG(stb2.st_mode) || strcmp(file2, "-") == 0) { file2 = copytemp(file2, 2); - if (stat(file2, &stb2) < 0) { - warn("%s", file2); - done(0); - } - } - if ((f1 = fopen(file1, "r")) == NULL) { - warn("%s", file1); - done(0); - } - if ((f2 = fopen(file2, "r")) == NULL) { - warn("%s", file2); - fclose(f1); - done(0); + if (stat(file2, &stb2) < 0) + error("%s", file2); } + if ((f1 = fopen(file1, "r")) == NULL) + error("%s", file1); + if ((f2 = fopen(file2, "r")) == NULL) + error("%s", file2); if (S_ISREG(stb1.st_mode) && S_ISREG(stb2.st_mode) && stb1.st_size != stb2.st_size) goto notsame; @@ -300,9 +284,7 @@ notsame: status = 1; if (!asciifile(f1) || !asciifile(f2)) { printf("Binary files %s and %s differ\n", file1, file2); - fclose(f1); - fclose(f2); - done(0); + exit(status); } prepare(0, f1); prepare(1, f2); @@ -339,7 +321,6 @@ notsame: same: if (anychange == 0 && (opt == D_CONTEXT || opt == D_UNIFIED)) printf("No differences encountered\n"); - done(0); } char *tempfiles[2]; @@ -355,17 +336,13 @@ copytemp(const char *file, int n) if (strcmp(file, "-") == 0) ifd = STDIN_FILENO; - else if ((ifd = open(file, O_RDONLY, 0644)) < 0) { - warn("%s", file); - done(0); - } + else if ((ifd = open(file, O_RDONLY, 0644)) < 0) + error("%s", file); if ((tempdir = getenv("TMPDIR")) == NULL) tempdir = _PATH_TMP; - if (asprintf(&tempfile, "%s/diff%d.XXXXXXXX", tempdir, n) == -1) { - warn(NULL); - done(0); - } + if (asprintf(&tempfile, "%s/diff%d.XXXXXXXX", tempdir, n) == -1) + error(NULL); tempfiles[n - 1] = tempfile; signal(SIGHUP, done); @@ -373,15 +350,12 @@ copytemp(const char *file, int n) signal(SIGPIPE, done); signal(SIGTERM, done); ofd = mkstemp(tempfile); - if (ofd < 0) { - warn("%s", tempfile); - done(0); + if (ofd < 0) + error("%s", tempfile); + while ((i = read(ifd, buf, BUFSIZ)) > 0) { + if (write(ofd, buf, i) != i) + error("%s", tempfile); } - while ((i = read(ifd, buf, BUFSIZ)) > 0) - if (write(ofd, buf, i) != i) { - warn("%s", tempfile); - done(0); - } close(ifd); close(ofd); return (tempfile); @@ -393,10 +367,8 @@ splice(char *dir, char *file) char *tail, *buf; size_t len; - if (!strcmp(file, "-")) { - warnx("can't specify - with other arg directory"); - done(0); - } + if (!strcmp(file, "-")) + errorx("can't specify - with other arg directory"); tail = strrchr(file, '/'); if (tail == NULL) tail = file; @@ -573,14 +545,10 @@ check(void) int i, j, jackpot, c, d; long ctold, ctnew; - if ((input[0] = fopen(file1, "r")) == NULL) { - perror(file1); - done(0); - } - if ((input[1] = fopen(file2, "r")) == NULL) { - perror(file2); - done(0); - } + if ((input[0] = fopen(file1, "r")) == NULL) + error("%s", file1); + if ((input[1] = fopen(file2, "r")) == NULL) + error("%s", file2); j = 1; ixold[0] = ixnew[0] = 0; jackpot = 0; |