Make strace_fopen abort on error
Error from strace_fopen in main results in call to exit(1).
Error from strace_fopen in newoutf is propagated to newoutf
callers: startup_attach (where it results in exit(1))
and alloc_tcb (where error is ignored). In second case,
the behavior doesn't seem to be right: it means with -ff
on open error for new LOGFILE.PID the output will continue
to go into *the same file as the previous process* - which
would be confusing. Moreover, on droptcb outf may be closed
and the output of other, still running process outputting
to the same outf will be lost. I don't think this is sane.
IOW: in all cases, error in strace_fopen should be fatal.
* strace.c (strace_fopen): Abort on error instead of returning NULL.
(newoutf): Change return type to void.
(startup_attach): Remove error check on newoutf return value.
(main): Remove error check on strace_fopen return value.
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
diff --git a/strace.c b/strace.c
index d353eac..bbb7ac1 100644
--- a/strace.c
+++ b/strace.c
@@ -333,17 +333,16 @@
#endif
static FILE *
-strace_fopen(const char *path, const char *mode)
+strace_fopen(const char *path)
{
FILE *fp;
swap_uid();
- if ((fp = fopen_for_output(path, mode)) == NULL)
- fprintf(stderr, "%s: can't fopen '%s': %s\n",
- progname, path, strerror(errno));
+ fp = fopen_for_output(path, "w");
+ if (!fp)
+ perror_msg_and_die("Can't fopen '%s'", path);
swap_uid();
- if (fp)
- set_cloexec_flag(fileno(fp));
+ set_cloexec_flag(fileno(fp));
return fp;
}
@@ -395,19 +394,14 @@
return fp;
}
-static int
+static void
newoutf(struct tcb *tcp)
{
if (outfname && followfork > 1) {
char name[520 + sizeof(int) * 3];
- FILE *fp;
-
sprintf(name, "%.512s.%u", outfname, tcp->pid);
- if ((fp = strace_fopen(name, "w")) == NULL)
- return -1;
- tcp->outf = fp;
+ tcp->outf = strace_fopen(name);
}
- return 0;
}
static void
@@ -455,8 +449,7 @@
#endif
/* Reinitialize the output since it may have changed. */
tcp->outf = outf;
- if (newoutf(tcp) < 0)
- exit(1);
+ newoutf(tcp);
#ifdef USE_PROCFS
if (proc_open(tcp, 1) < 0) {
@@ -1129,9 +1122,8 @@
error_msg_and_die("Piping the output and -ff are mutually exclusive");
outf = strace_popen(outfname + 1);
}
- else if (followfork <= 1 &&
- (outf = strace_fopen(outfname, "w")) == NULL)
- exit(1);
+ else if (followfork <= 1)
+ outf = strace_fopen(outfname);
}
if (!outfname || outfname[0] == '|' || outfname[0] == '!')