Module Name: src
Committed By: kre
Date: Wed Oct 30 11:37:00 UTC 2024
Modified Files:
src/usr.bin/ctags: ctags.c
Log Message:
PR bin/58786 More ctags error handling
Inspired by RVP's patch in PR bin/58786 add handling of write
errors, and failures to build or execute commands used in
implementing the -u option but implemented a little differently
(and avoiding adding yet more 80 column violations to this mess).
The processing of -u needs to be completely redone sometime, I mean,
no-one would really ever want to keep a file named OTAGS in "." would they?
Really???
XXX - pullups? Probably not, no-one has ever cared about this before.
To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 src/usr.bin/ctags/ctags.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.bin/ctags/ctags.c
diff -u src/usr.bin/ctags/ctags.c:1.16 src/usr.bin/ctags/ctags.c:1.17
--- src/usr.bin/ctags/ctags.c:1.16 Tue Oct 29 11:30:20 2024
+++ src/usr.bin/ctags/ctags.c Wed Oct 30 11:37:00 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: ctags.c,v 1.16 2024/10/29 11:30:20 kre Exp $ */
+/* $NetBSD: ctags.c,v 1.17 2024/10/30 11:37:00 kre Exp $ */
/*
* Copyright (c) 1987, 1993, 1994, 1995
@@ -43,7 +43,7 @@ __COPYRIGHT("@(#) Copyright (c) 1987, 19
#if 0
static char sccsid[] = "@(#)ctags.c 8.4 (Berkeley) 2/7/95";
#endif
-__RCSID("$NetBSD: ctags.c,v 1.16 2024/10/29 11:30:20 kre Exp $");
+__RCSID("$NetBSD: ctags.c,v 1.17 2024/10/30 11:37:00 kre Exp $");
#endif /* not lint */
#include <err.h>
@@ -134,17 +134,18 @@ main(int argc, char **argv)
argv += optind;
argc -= optind;
if (!argc) {
-usage: (void)fprintf(stderr,
+ usage:; (void)fprintf(stderr,
"usage: ctags [-BFadtuwvx] [-f tagsfile] file ...\n");
- exit(1);
+ exit(EXIT_FAILURE);
}
init();
- for (exit_val = step = 0; step < argc; ++step)
+ exit_val = EXIT_SUCCESS;
+ for (step = 0; step < argc; ++step)
if (!(inf = fopen(argv[step], "r"))) {
warn("%s", argv[step]);
- exit_val = 1;
+ exit_val = EXIT_FAILURE;
}
else {
curfile = argv[step];
@@ -158,25 +159,44 @@ usage: (void)fprintf(stderr,
else {
if (uflag) {
for (step = 0; step < argc; step++) {
- (void)snprintf(cmd, sizeof(cmd),
- "mv %s OTAGS; fgrep -v '\t%s\t' OTAGS >%s; rm OTAGS",
- outfile, argv[step],
- outfile);
- system(cmd);
+ if (snprintf(cmd, sizeof(cmd),
+ "mv %s OTAGS &&\n"
+ "\tfgrep -v '\t%s\t' OTAGS >%s &&"
+ "\n\trm OTAGS",
+ outfile, argv[step], outfile)
+ >= (int)sizeof(cmd))
+ errx(EXIT_FAILURE,
+ "Command to update %s for -u"
+ " %s too long",
+ argv[step], outfile);
+ if (system(cmd) != 0)
+ errx(EXIT_FAILURE,
+ "Update (-u) of %s failed. "
+ "Cmd:\n %s", outfile, cmd);
}
++aflag;
}
if (!(outf = fopen(outfile, aflag ? "a" : "w")))
err(EXIT_FAILURE, "%s", outfile);
put_entries(head);
+ (void)fflush(outf);
+ if (ferror(outf))
+ err(EXIT_FAILURE, "output error (%s)", outfile);
(void)fclose(outf);
if (uflag) {
- (void)snprintf(cmd, sizeof(cmd),
- "sort -o %s %s", outfile, outfile);
- system(cmd);
+ if (snprintf(cmd, sizeof(cmd), "sort -o %s %s",
+ outfile, outfile) >= (int)sizeof(cmd))
+ errx(EXIT_FAILURE,
+ "sort command (-u) for %s too long",
+ outfile);
+ if (system(cmd) != 0)
+ errx(EXIT_FAILURE, "-u: sort %s failed"
+ "\t[ %s ]", outfile, cmd);
}
}
}
+ if ((vflag || xflag) && (fflush(stdout) != 0 || ferror(stdout) != 0))
+ errx(EXIT_FAILURE, "write error (stdout)");
exit(exit_val);
}