From: Denys Vlasenko Date: Wed, 22 Jun 2011 11:17:16 +0000 (+0200) Subject: Make strace_fopen abort on error X-Git-Tag: v4.7~358 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3d5ed41252ab8c0bb9f410058c61e95ba91caf90;p=strace 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 --- diff --git a/strace.c b/strace.c index d353eacf..bbb7ac17 100644 --- a/strace.c +++ b/strace.c @@ -333,17 +333,16 @@ swap_uid(void) #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 @@ strace_popen(const char *command) 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 @@ startup_attach(void) #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 @@ main(int argc, char *argv[]) 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] == '!')