diff --git a/Makefile b/Makefile index b9d6e7c..d782193 100644 --- a/Makefile +++ b/Makefile @@ -50,6 +50,7 @@ LIBUTILSRC =\ libutil/eregcomp.c\ libutil/estrtod.c\ libutil/fnck.c\ + libutil/fshut.c\ libutil/getlines.c\ libutil/human.c\ libutil/md5.c\ diff --git a/basename.c b/basename.c index 3e74590..bb5eaa4 100644 --- a/basename.c +++ b/basename.c @@ -33,5 +33,5 @@ main(int argc, char *argv[]) } puts(p); - return 0; + return fshut(stdout, ""); } diff --git a/cal.c b/cal.c index e5f7b56..732917d 100644 --- a/cal.c +++ b/cal.c @@ -208,5 +208,5 @@ main(int argc, char *argv[]) drawcal(year, month - 1, ncols, nmons, fday); - return 0; + return fshut(stdout, ""); } diff --git a/cat.c b/cat.c index b50380c..d363bec 100644 --- a/cat.c +++ b/cat.c @@ -36,10 +36,12 @@ main(int argc, char *argv[]) ret = 1; } else { concat(fp, *argv, stdout, ""); - fclose(fp); + if (fshut(fp, *argv)) { + ret = 1; + } } } } - return ret; + return !!(fshut(stdin, "") + fshut(stdout, "")) || ret; } diff --git a/cksum.c b/cksum.c index e931c6e..b2a95b4 100644 --- a/cksum.c +++ b/cksum.c @@ -111,9 +111,11 @@ main(int argc, char *argv[]) continue; } cksum(fp, *argv); - fclose(fp); + if (fshut(fp, *argv)) { + ret = 1; + } } } - return ret; + return fshut(stdout, "") || ret; } diff --git a/cmp.c b/cmp.c index 685dd26..47ea1e4 100644 --- a/cmp.c +++ b/cmp.c @@ -71,5 +71,9 @@ main(int argc, char *argv[]) } } + enfshut(2, fp[0], argv[0]); + if (fp[0] != fp[1]) + enfshut(2, fp[1], argv[1]); + enfshut(2, stdout, ""); return !same; } diff --git a/col.c b/col.c index 41a01d5..358d4a8 100644 --- a/col.c +++ b/col.c @@ -217,5 +217,5 @@ main(int argc, char *argv[]) col(); flush(); - return 0; + return !!(fshut(stdin, "") + fshut(stdout, "")); } diff --git a/cols.c b/cols.c index 2833e2f..c4c3b91 100644 --- a/cols.c +++ b/cols.c @@ -25,7 +25,7 @@ main(int argc, char *argv[]) struct winsize w; struct linebuf b = EMPTY_LINEBUF; size_t chars = 65, maxlen = 0, i, j, k, len, bytes, cols, rows; - int cflag = 0; + int cflag = 0, ret = 0; char *p; ARGBEGIN { @@ -50,10 +50,12 @@ main(int argc, char *argv[]) for (; *argv; argc--, argv++) { if (!(fp = fopen(*argv, "r"))) { weprintf("fopen %s:", *argv); + ret = 1; continue; } getlines(fp, &b); - fclose(fp); + if (fshut(fp, *argv)) + ret = 1; } } @@ -82,5 +84,5 @@ main(int argc, char *argv[]) putchar('\n'); } - return 0; + return !!(fshut(stdin, "") + fshut(stdout, "")) || ret; } diff --git a/comm.c b/comm.c index ee79047..4464c43 100644 --- a/comm.c +++ b/comm.c @@ -76,8 +76,9 @@ main(int argc, char *argv[]) } diff = strcmp(line[0], line[1]); LIMIT(diff, -1, 1); - printline((2-diff) % 3, line[MAX(0, diff)]); + printline((2 - diff) % 3, line[MAX(0, diff)]); } end: - return 0; + return !!(fshut(fp[0], argv[0]) + (fp[0] != fp[1] && fshut(fp[1], argv[1])) + + fshut(stdout, "")); } diff --git a/config.mk b/config.mk index 8d4dbe3..ba43212 100644 --- a/config.mk +++ b/config.mk @@ -11,6 +11,6 @@ AR = ar RANLIB = ranlib # For NetBSD add -D_NETBSD_SOURCE -CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 +CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -DDEBUG CFLAGS = -std=c99 -Wall -pedantic LDFLAGS = -s # -lrt diff --git a/cp.c b/cp.c index ebc3566..ded0122 100644 --- a/cp.c +++ b/cp.c @@ -53,5 +53,5 @@ main(int argc, char *argv[]) } enmasse(argc, argv, cp); - return cp_status; + return fshut(stdout, "") || cp_status; } diff --git a/cut.c b/cut.c index 7c806af..07faf21 100644 --- a/cut.c +++ b/cut.c @@ -196,10 +196,11 @@ main(int argc, char *argv[]) continue; } cut(fp, *argv); - fclose(fp); + if (fshut(fp, *argv)) + ret = 1; } } } - return ret; + return !!(fshut(stdin, "") + fshut(stdout, "")) || ret; } diff --git a/date.c b/date.c index a3cd313..f6581d5 100644 --- a/date.c +++ b/date.c @@ -45,5 +45,5 @@ main(int argc, char *argv[]) strftime(buf, sizeof(buf), fmt, now); puts(buf); - return 0; + return fshut(stdout, ""); } diff --git a/dirname.c b/dirname.c index 501e5a0..4542199 100644 --- a/dirname.c +++ b/dirname.c @@ -23,5 +23,5 @@ main(int argc, char *argv[]) puts(dirname(argv[0])); - return 0; + return fshut(stdout, ""); } diff --git a/du.c b/du.c index 0bc732b..086c9b8 100644 --- a/du.c +++ b/du.c @@ -108,5 +108,5 @@ main(int argc, char *argv[]) } } - return recurse_status; + return fshut(stdout, "") || recurse_status; } diff --git a/echo.c b/echo.c index c845c47..44941d1 100644 --- a/echo.c +++ b/echo.c @@ -18,5 +18,5 @@ main(int argc, char *argv[]) if (!nflag) putchar('\n'); - return 0; + return fshut(stdout, ""); } diff --git a/env.c b/env.c index 5af93e0..72d078f 100644 --- a/env.c +++ b/env.c @@ -45,5 +45,5 @@ main(int argc, char *argv[]) for (; environ && *environ; environ++) puts(*environ); - return 0; + return fshut(stdout, ""); } diff --git a/expand.c b/expand.c index 506039d..8e6afe1 100644 --- a/expand.c +++ b/expand.c @@ -116,9 +116,10 @@ main(int argc, char *argv[]) continue; } expand(*argv, fp); - fclose(fp); + if (fshut(fp, *argv)) + ret = 1; } } - return ret; + return !!(fshut(stdin, "") + fshut(stdout, "")) || ret; } diff --git a/expr.c b/expr.c index e9b794f..b1995c1 100644 --- a/expr.c +++ b/expr.c @@ -266,5 +266,6 @@ main(int argc, char *argv[]) usage(); } ARGEND; + enfshut(3, stdout, ""); return !parse(argv, argc); } diff --git a/find.c b/find.c index b0f8a93..55d4fef 100644 --- a/find.c +++ b/find.c @@ -1036,5 +1036,5 @@ main(int argc, char **argv) t->u.pinfo->freearg(t->extra); free(toks); - return gflags.ret; + return !!(fshut(stdin, "") + fshut(stdout, "")) || gflags.ret; } diff --git a/fold.c b/fold.c index 6a52466..e896527 100644 --- a/fold.c +++ b/fold.c @@ -100,10 +100,11 @@ main(int argc, char *argv[]) ret = 1; } else { fold(fp, *argv); - fclose(fp); + if (fshut(fp, *argv)) + ret = 1; } } } - return ret; + return !!(fshut(stdin, "") + fshut(stdout, "")) || ret; } diff --git a/grep.c b/grep.c index 1267055..bf162ae 100644 --- a/grep.c +++ b/grep.c @@ -196,7 +196,7 @@ main(int argc, char *argv[]) if (!(fp = fmemopen(arg, strlen(arg) + 1, "r"))) eprintf("fmemopen:"); addpatternfile(fp); - fclose(fp); + efshut(fp, arg); eflag = 1; break; case 'f': @@ -205,7 +205,7 @@ main(int argc, char *argv[]) if (!fp) enprintf(Error, "fopen %s:", arg); addpatternfile(fp); - fclose(fp); + efshut(fp, arg); fflag = 1; break; case 'h': @@ -246,7 +246,7 @@ main(int argc, char *argv[]) if (!(fp = fmemopen(argv[0], strlen(argv[0]) + 1, "r"))) eprintf("fmemopen:"); addpatternfile(fp); - fclose(fp); + efshut(fp, argv[0]); argc--; argv++; } @@ -269,8 +269,12 @@ main(int argc, char *argv[]) m = grep(fp, argv[i]); if (m == Error || (match != Error && m == Match)) match = m; - fclose(fp); + if (fshut(fp, argv[i])) + match = Error; } } + + enfshut(Error, stdin, ""); + enfshut(Error, stdout, ""); return match; } diff --git a/head.c b/head.c index 5137729..a7f08d2 100644 --- a/head.c +++ b/head.c @@ -62,9 +62,10 @@ main(int argc, char *argv[]) } newline = 1; head(fp, *argv, n); - fclose(fp); + if(fshut(fp, *argv)) + ret = 1; } } - return ret; + return !!(fshut(stdin, "") + fshut(stdout, "")) || ret; } diff --git a/hostname.c b/hostname.c index 2aad4ad..dff32af 100644 --- a/hostname.c +++ b/hostname.c @@ -32,5 +32,5 @@ main(int argc, char *argv[]) usage(); } - return 0; + return fshut(stdout, ""); } diff --git a/kill.c b/kill.c index 8a62b54..a3429a0 100644 --- a/kill.c +++ b/kill.c @@ -74,17 +74,15 @@ main(int argc, char *argv[]) if (!argc) { for (i = 0; i < LEN(sigs); i++) puts(sigs[i].name); - return 0; } else if (argc == 1) { sig = estrtonum(*argv, 0, INT_MAX); if (sig > 128) sig = WTERMSIG(sig); puts(sig2name(sig)); - return 0; } else { usage(); } - break; + return fshut(stdout, ""); case 's': if ((*argv)[2]) goto longopt; diff --git a/libutil/concat.c b/libutil/concat.c index 551b5b9..fad9471 100644 --- a/libutil/concat.c +++ b/libutil/concat.c @@ -12,11 +12,8 @@ concat(FILE *fp1, const char *s1, FILE *fp2, const char *s2) while ((n = fread(buf, 1, sizeof(buf), fp1))) { fwrite(buf, 1, n, fp2); - if (ferror(fp2)) - eprintf("fwrite %s:", s2); - if (feof(fp1) || ferror(fp1)) + + if (feof(fp1) || ferror(fp1) || ferror(fp2)) break; } - if (ferror(fp1)) - eprintf("fread %s", s1); } diff --git a/libutil/fshut.c b/libutil/fshut.c new file mode 100644 index 0000000..f243a82 --- /dev/null +++ b/libutil/fshut.c @@ -0,0 +1,37 @@ +#include +#include + +#include "../util.h" + +int fshut(FILE *fp, const char *fname) +{ + int ret = 0; + + if (fflush(fp) && !ret) { + weprintf("fflush %s:", fname); + ret = 1; + } + + if (ferror(fp) && !ret) { + weprintf("ferror %s:", fname); + ret = 1; + } + + if (fclose(fp) && !ret) { + weprintf("fclose %s:", fname); + ret = 1; + } + + return ret; +} + +void enfshut(int status, FILE *fp, const char *fname) +{ + if (fshut(fp, fname)) + exit(status); +} + +void efshut(FILE *fp, const char *fname) +{ + enfshut(1, fp, fname); +} diff --git a/logger.c b/logger.c index a4c240e..36e20d1 100644 --- a/logger.c +++ b/logger.c @@ -72,8 +72,6 @@ main(int argc, char *argv[]) if (!argc) { while (getline(&buf, &sz, stdin) > 0) syslog(priority, "%s", buf); - if (ferror(stdin)) - eprintf("getline %s:", ""); } else { for (i = 0, sz = 0; i < argc; i++) sz += strlen(argv[i]); @@ -89,5 +87,5 @@ main(int argc, char *argv[]) closelog(); - return 0; + return fshut(stdin, ""); } diff --git a/logname.c b/logname.c index 11d287b..2a591cd 100644 --- a/logname.c +++ b/logname.c @@ -25,5 +25,5 @@ main(int argc, char *argv[]) else eprintf("no login name\n"); - return 0; + return fshut(stdout, ""); } diff --git a/ls.c b/ls.c index 6fce25e..91c055d 100644 --- a/ls.c +++ b/ls.c @@ -365,5 +365,5 @@ main(int argc, char *argv[]) for (i = 0; i < argc; i++) ls(&ents[rflag ? argc-i-1 : i], 1); - return 0; + return fshut(stdout, ""); } diff --git a/md5sum.c b/md5sum.c index 5baeecf..7aeb9e1 100644 --- a/md5sum.c +++ b/md5sum.c @@ -35,5 +35,6 @@ main(int argc, char *argv[]) usage(); } ARGEND; - return cryptfunc(argc, argv, &md5_ops, md, sizeof(md)); + return cryptfunc(argc, argv, &md5_ops, md, sizeof(md)) || + !!(fshut(stdin, "") + fshut(stdout, "")); } diff --git a/mktemp.c b/mktemp.c index b4ecaf1..e25ef43 100644 --- a/mktemp.c +++ b/mktemp.c @@ -61,9 +61,11 @@ main(int argc, char *argv[]) eprintf("mkstemp %s:", path); return 1; } - close(fd); + if (close(fd)) + eprintf("close %s:", path); } puts(path); + efshut(stdout, ""); return 0; } diff --git a/nl.c b/nl.c index 7609d5e..b84fe32 100644 --- a/nl.c +++ b/nl.c @@ -193,8 +193,8 @@ main(int argc, char *argv[]) if (!(fp = fopen(argv[0], "r"))) eprintf("fopen %s:", argv[0]); nl(argv[0], fp); - fclose(fp); } - return 0; + return !!(fshut(fp, argv[0]) + fshut(stdin, "") + + fshut(stdout, "")); } diff --git a/paste.c b/paste.c index 5ccda3a..dc9c32a 100644 --- a/paste.c +++ b/paste.c @@ -86,10 +86,10 @@ int main(int argc, char *argv[]) { struct fdescr *dsc; - Rune *delim; + Rune *delim; size_t i, len; - int seq = 0; - char *adelim = "\t"; + int seq = 0, ret = 0; + char *adelim = "\t"; ARGBEGIN { case 's': @@ -116,22 +116,23 @@ main(int argc, char *argv[]) dsc = ereallocarray(NULL, argc, sizeof(*dsc)); for (i = 0; i < argc; i++) { - if (!strcmp(argv[i], "-")) + if (!strcmp(argv[i], "-")) { dsc[i].fp = stdin; - else - dsc[i].fp = fopen(argv[i], "r"); - if (!dsc[i].fp) + } else if (!(dsc[i].fp = fopen(argv[i], "r"))) { eprintf("fopen %s:", argv[i]); + } dsc[i].name = argv[i]; } - if (seq) + if (seq) { sequential(dsc, argc, delim, len); - else + } else { parallel(dsc, argc, delim, len); + } for (i = 0; i < argc; i++) - fclose(dsc[i].fp); + if (dsc[i].fp != stdin && fshut(dsc[i].fp, argv[i])) + ret = 1; - return 0; + return fshut(stdin, "") || fshut(stdout, "") || ret; } diff --git a/printenv.c b/printenv.c index 135e0e3..f88e4d2 100644 --- a/printenv.c +++ b/printenv.c @@ -35,5 +35,5 @@ main(int argc, char *argv[]) } } - return ret; + return fshut(stdout, "") || ret; } diff --git a/printf.c b/printf.c index 8c204b8..6c99ad2 100644 --- a/printf.c +++ b/printf.c @@ -152,5 +152,5 @@ main(int argc, char *argv[]) cooldown = 1; } - return 0; + return fshut(stdout, ""); } diff --git a/pwd.c b/pwd.c index 759bdcd..a506cea 100644 --- a/pwd.c +++ b/pwd.c @@ -46,5 +46,5 @@ main(int argc, char *argv[]) eprintf("getcwd:"); puts((mode == 'L') ? getpwd(cwd) : cwd); - return 0; + return fshut(stdout, ""); } diff --git a/readlink.c b/readlink.c index e80767f..3fa1f2e 100644 --- a/readlink.c +++ b/readlink.c @@ -91,5 +91,5 @@ mdone: if (!nflag) putchar('\n'); - return 0; + return fshut(stdout, ""); } diff --git a/sed.c b/sed.c index 59bf9cb..ddf90f5 100644 --- a/sed.c +++ b/sed.c @@ -433,8 +433,7 @@ compile(char *s, int isfile) } } - if (fclose(f)) - weprintf("fclose:"); + fshut(f, s); } /* FIXME: if we decide to honor lack of trailing newline, set/clear a global @@ -1119,8 +1118,8 @@ next_file(void) if (file == stdin) clearerr(file); - else if (file && fclose(file)) - weprintf("fclose:"); + if (file) + fshut(file, ""); file = NULL; do { @@ -1188,8 +1187,7 @@ write_file(char *path, FILE *out) while (read_line(in, &genbuf) != EOF) check_puts(genbuf.str, out); - if (fclose(in)) - weprintf("fclose:"); + fshut(in, path); } static void @@ -1730,5 +1728,6 @@ main(int argc, char *argv[]) files = argv; run(); - return 0; + + return !!(fshut(stdin, "") + fshut(stdout, "")); } diff --git a/seq.c b/seq.c index 5a306ea..4f2dd48 100644 --- a/seq.c +++ b/seq.c @@ -143,5 +143,5 @@ main(int argc, char *argv[]) } putchar('\n'); - return 0; + return fshut(stdout, ""); } diff --git a/sha1sum.c b/sha1sum.c index b7222fd..6a564e5 100644 --- a/sha1sum.c +++ b/sha1sum.c @@ -34,5 +34,6 @@ main(int argc, char *argv[]) usage(); } ARGEND; - return cryptfunc(argc, argv, &sha1_ops, md, sizeof(md)); + return cryptfunc(argc, argv, &sha1_ops, md, sizeof(md)) || + !!(fshut(stdin, "") + fshut(stdout, "")); } diff --git a/sha256sum.c b/sha256sum.c index 06e8832..3c898c7 100644 --- a/sha256sum.c +++ b/sha256sum.c @@ -34,5 +34,6 @@ main(int argc, char *argv[]) usage(); } ARGEND; - return cryptfunc(argc, argv, &sha256_ops, md, sizeof(md)); + return cryptfunc(argc, argv, &sha256_ops, md, sizeof(md)) || + !!(fshut(stdin, "") + fshut(stdout, "")); } diff --git a/sha512sum.c b/sha512sum.c index a0fc3cc..7dd547b 100644 --- a/sha512sum.c +++ b/sha512sum.c @@ -34,5 +34,6 @@ main(int argc, char *argv[]) usage(); } ARGEND; - return cryptfunc(argc, argv, &sha512_ops, md, sizeof(md)); + return cryptfunc(argc, argv, &sha512_ops, md, sizeof(md)) || + !!(fshut(stdin, "") + fshut(stdout, "")); } diff --git a/sort.c b/sort.c index 58e0b91..3e4f3a3 100644 --- a/sort.c +++ b/sort.c @@ -236,7 +236,7 @@ main(int argc, char *argv[]) FILE *fp, *ofp = stdout; struct linebuf linebuf = EMPTY_LINEBUF; size_t i; - int global_flags = 0; + int global_flags = 0, ret = 0; char *outfile = NULL; ARGBEGIN { @@ -300,7 +300,8 @@ main(int argc, char *argv[]) } else { getlines(fp, &linebuf); } - fclose(fp); + if (fshut(fp, *argv)) + ret = 1; } if (!Cflag && !cflag) { @@ -318,5 +319,7 @@ main(int argc, char *argv[]) } } - return 0; + enfshut(2, stdin, ""); + enfshut(2, stdout, ""); + return ret; } diff --git a/split.c b/split.c index c0aa87e..c4c777d 100644 --- a/split.c +++ b/split.c @@ -27,7 +27,7 @@ nextfile(FILE *f, char *buf, int plen, int slen) static int filecount = 0; if (f) - fclose(f); + fshut(f, ""); if (itostr(buf + plen, filecount++, slen) < 0) return NULL; @@ -124,9 +124,6 @@ main(int argc, char *argv[]) putc(ch, out); } - fclose(in); - if (out) - fclose(out); - - return 0; + return !!(fshut(in, "") + (out && fshut(out, "")) + + fshut(stdin, "") + fshut(stdout, "")); } diff --git a/sponge.c b/sponge.c index bcc0f7a..ee1d338 100644 --- a/sponge.c +++ b/sponge.c @@ -32,8 +32,5 @@ main(int argc, char *argv[]) eprintf("fopen %s:", argv[0]); concat(tmpfp, "", fp, argv[0]); - fclose(fp); - fclose(tmpfp); - - return 0; + return !!(fshut(fp, argv[0]) + fshut(tmpfp, "")); } diff --git a/strings.c b/strings.c index 8c6c094..598b2e4 100644 --- a/strings.c +++ b/strings.c @@ -85,9 +85,10 @@ main(int argc, char *argv[]) continue; } strings(fp, *argv, len); - fclose(fp); + if (fshut(fp, *argv)) + ret = 1; } } - return ret; + return !!(fshut(stdin, "") + fshut(stdout, "")) || ret; } diff --git a/tail.c b/tail.c index 888dd47..65d6c97 100644 --- a/tail.c +++ b/tail.c @@ -130,7 +130,8 @@ main(int argc, char *argv[]) tail(fp, *argv); if (!fflag) { - fclose(fp); + if (fshut(fp, *argv)) + ret = 1; continue; } for (tmp = NULL, tmpsize = 0;;) { @@ -155,5 +156,5 @@ main(int argc, char *argv[]) } } - return ret; + return !!(fshut(stdin, "") + fshut(stdout, "")) || ret; } diff --git a/tar.c b/tar.c index 31cc399..d0d72a1 100644 --- a/tar.c +++ b/tar.c @@ -166,8 +166,7 @@ archive(const char *path) if (fwrite(b, BLKSIZ, 1, tarfile) != 1) eprintf("fwrite:"); } - if (fclose(f) == EOF) - eprintf("fclose %s:", path); + efshut(f, path); } return 0; @@ -246,8 +245,8 @@ unarchive(char *fname, ssize_t l, char b[BLKSIZ]) if (f && fwrite(b, MIN(l, BLKSIZ), 1, f) != 1) eprintf("fwrite %s:", fname); } - if (f && fclose(f) == EOF) - eprintf("fclose %s:", fname); + if (f) + fshut(f, fname); if (!mflag) { times[0].tv_sec = times[1].tv_sec = mtime; diff --git a/tee.c b/tee.c index 3bf1946..c0ad6f2 100644 --- a/tee.c +++ b/tee.c @@ -46,8 +46,6 @@ main(int argc, char *argv[]) eprintf("fwrite %s:", (i != argc) ? argv[i] : ""); } } - if (ferror(stdin)) - eprintf("fread :"); - return 0; + return !!(fshut(stdin, "") + fshut(stdout, "")); } diff --git a/tr.c b/tr.c index 5dcc307..83d7b69 100644 --- a/tr.c +++ b/tr.c @@ -204,7 +204,7 @@ main(int argc, char *argv[]) eprintf("set2 can't be imaged to from a complement.\n"); read: if (!efgetrune(&r, stdin, "")) - return 0; + return !!(fshut(stdin, "") + fshut(stdout, "")); off1 = off2 = 0; for (i = 0; i < set1ranges; i++) { if (set1[i].start <= r && r <= set1[i].end) { diff --git a/tty.c b/tty.c index 1c23bf4..6b580d3 100644 --- a/tty.c +++ b/tty.c @@ -26,5 +26,5 @@ main(int argc, char *argv[]) tty = ttyname(STDIN_FILENO); puts(tty ? tty : "not a tty"); - return !tty; + return fshut(stdout, "") || !tty; } diff --git a/uname.c b/uname.c index f0e9264..2fa3960 100644 --- a/uname.c +++ b/uname.c @@ -55,5 +55,5 @@ main(int argc, char *argv[]) putword(u.machine); putchar('\n'); - return 0; + return fshut(stdout, ""); } diff --git a/unexpand.c b/unexpand.c index 17dd532..333b8e9 100644 --- a/unexpand.c +++ b/unexpand.c @@ -159,7 +159,8 @@ main(int argc, char *argv[]) continue; } unexpand(*argv, fp); - fclose(fp); + if (fshut(fp, *argv)) + ret = 1; } } diff --git a/uniq.c b/uniq.c index cb96c13..030b622 100644 --- a/uniq.c +++ b/uniq.c @@ -131,10 +131,9 @@ main(int argc, char *argv[]) eprintf("fopen %s:", argv[1]); } uniq(fp, ofp); - fclose(fp); } uniqfinish(ofp); - fclose(ofp); - return 0; + return !!(fshut(fp, fp == stdin ? "" : argv[0]) + + fshut(ofp, ofp == stdout ? "" : argv[1])); } diff --git a/util.h b/util.h index d4415a5..a878d73 100644 --- a/util.h +++ b/util.h @@ -3,6 +3,7 @@ #include #include +#include #include "arg.h" #include "compat.h" @@ -34,6 +35,10 @@ void *enrealloc(int, void *, size_t); char *enstrdup(int, const char *); char *enstrndup(int, const char *, size_t); +void enfshut(int, FILE *, const char *); +void efshut(FILE *, const char *); +int fshut(FILE *, const char *); + void enprintf(int, const char *, ...); void eprintf(const char *, ...); void weprintf(const char *, ...); diff --git a/uudecode.c b/uudecode.c index 7c18af6..a443e7c 100644 --- a/uudecode.c +++ b/uudecode.c @@ -273,10 +273,7 @@ main(int argc, char *argv[]) if (nfp != stdout && chmod(fname, mode) < 0) eprintf("chmod %s:", fname); - if (fp) - fclose(fp); - if (nfp) - fclose(nfp); - return 0; + return !!(fshut(fp, fp == stdin ? "" : argv[0]) + + fshut(nfp, nfp == stdout ? "" : fname)); } diff --git a/uuencode.c b/uuencode.c index 63ea7bd..ddd68ad 100644 --- a/uuencode.c +++ b/uuencode.c @@ -101,7 +101,7 @@ usage(void) int main(int argc, char *argv[]) { - FILE *fp; + FILE *fp = NULL; ARGBEGIN { case 'm': @@ -126,8 +126,8 @@ main(int argc, char *argv[]) uuencodeb64(fp, argv[1], argv[0]); else uuencode(fp, argv[1], argv[0]); - fclose(fp); } - return 0; + return !!((fp && fshut(fp, argv[0])) + fshut(stdin, "") + + fshut(stdout, "")); } diff --git a/wc.c b/wc.c index 0b196d8..ed2c94d 100644 --- a/wc.c +++ b/wc.c @@ -91,11 +91,12 @@ main(int argc, char *argv[]) continue; } wc(fp, *argv); - fclose(fp); + if (fshut(fp, *argv)) + ret = 1; } if (many) output("total", tc, tl, tw); } - return ret; + return !!(fshut(stdin, "") + fshut(stdout, "")) || ret; } diff --git a/xargs.c b/xargs.c index de09ae9..92e0745 100644 --- a/xargs.c +++ b/xargs.c @@ -269,5 +269,6 @@ main(int argc, char *argv[]) free(argb); - return nerrors ? 123 : 0; + return (nerrors || !!(fshut(stdin, "") + + fshut(stdout, ""))) ? 123 : 0; }