X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=driver%2Fstderr.c;h=84fa697290d6268c34846fb36fb548ea56b8503a;hb=aa75c7476aeaa84cf3abc192b376a8b03c325213;hp=6246dd3a8e554fd8caa0e8486599283a571473a0;hpb=49f5b54f312fe4ac2e9bc47581a72451bd0e8439;p=xscreensaver diff --git a/driver/stderr.c b/driver/stderr.c index 6246dd3a..84fa6972 100644 --- a/driver/stderr.c +++ b/driver/stderr.c @@ -1,5 +1,5 @@ /* stderr.c --- capturing stdout/stderr output onto the screensaver window. - * xscreensaver, Copyright (c) 1991-2006 Jamie Zawinski + * xscreensaver, Copyright (c) 1991-2016 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -464,6 +464,7 @@ initialize_stderr (saver_info *si) perror ("could not dup() a new stdout:"); return; } + close (out); } stderr_stdout_read_fd = in; @@ -472,6 +473,47 @@ initialize_stderr (saver_info *si) } +/* If the "-log file" command-line option has been specified, + open the file for append, and redirect stdout/stderr there. + This is called very early, before initialize_stderr(). + */ +void +stderr_log_file (saver_info *si) +{ + int stdout_fd = 1; + int stderr_fd = 2; + const char *filename = get_string_resource (si->dpy, "logFile", "LogFile"); + int fd; + + if (!filename || !*filename) return; + + fd = open (filename, O_WRONLY | O_APPEND | O_CREAT, 0666); + + if (fd < 0) + { + char buf[255]; + FAIL: + sprintf (buf, "%.100s: %.100s", blurb(), filename); + perror (buf); + fflush (stderr); + fflush (stdout); + exit (1); + } + + fprintf (stderr, "%s: logging to file %s\n", blurb(), filename); + + if (dup2 (fd, stdout_fd) < 0) goto FAIL; + if (dup2 (fd, stderr_fd) < 0) goto FAIL; + + fprintf (stderr, "\n\n" + "##########################################################################\n" + "%s: logging to \"%s\" at %s\n" + "##########################################################################\n" + "\n", + blurb(), filename, timestring(0)); +} + + /* If there is anything in the stderr buffer, flush it to the real stderr. This does no X operations. Call this when exiting to make sure any last words actually show up. @@ -487,8 +529,7 @@ shutdown_stderr (saver_info *si) stderr_callback ((XtPointer) si, &stderr_stdout_read_fd, 0); - if (stderr_buffer && - stderr_tail && + if (stderr_tail && stderr_buffer < stderr_tail) { *stderr_tail = 0; @@ -500,9 +541,20 @@ shutdown_stderr (saver_info *si) if (real_stderr) fflush (real_stderr); if (stdout != real_stdout) - dup2 (fileno(real_stdout), fileno(stdout)); + { + dup2 (fileno(real_stdout), fileno(stdout)); + fclose (real_stdout); + real_stdout = stdout; + } if (stderr != real_stderr) - dup2 (fileno(real_stderr), fileno(stderr)); - - stderr_stdout_read_fd = -1; + { + dup2 (fileno(real_stderr), fileno(stderr)); + fclose (real_stderr); + real_stderr = stderr; + } + if (stderr_stdout_read_fd != -1) + { + close (stderr_stdout_read_fd); + stderr_stdout_read_fd = -1; + } }