X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=driver%2Fstderr.c;h=84fa697290d6268c34846fb36fb548ea56b8503a;hb=aa75c7476aeaa84cf3abc192b376a8b03c325213;hp=8b7ac8b55cc7860cae16ba4f6a025d2858188472;hpb=c28aecf9fc41e3a03494bacf7279745425e2fa18;p=xscreensaver diff --git a/driver/stderr.c b/driver/stderr.c index 8b7ac8b5..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-1998, 2001 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 @@ -113,7 +113,7 @@ print_stderr_1 (saver_screen_info *ssi, char *string) if (! ssi->stderr_font) { - char *font_name = get_string_resource ("font", "Font"); + char *font_name = get_string_resource (dpy, "font", "Font"); if (!font_name) font_name = strdup ("fixed"); ssi->stderr_font = XLoadQueryFont (dpy, font_name); if (! ssi->stderr_font) ssi->stderr_font = XLoadQueryFont (dpy, "fixed"); @@ -129,7 +129,7 @@ print_stderr_1 (saver_screen_info *ssi, char *string) Colormap cmap = ssi->cmap; if (!ssi->stderr_overlay_window && - get_boolean_resource("overlayStderr", "Boolean")) + get_boolean_resource(dpy, "overlayStderr", "Boolean")) { make_stderr_overlay_window (ssi); if (ssi->stderr_overlay_window) @@ -138,8 +138,8 @@ print_stderr_1 (saver_screen_info *ssi, char *string) cmap = ssi->stderr_cmap; } - fg = get_pixel_resource ("overlayTextForeground","Foreground",dpy,cmap); - bg = get_pixel_resource ("overlayTextBackground","Background",dpy,cmap); + fg = get_pixel_resource (dpy,cmap,"overlayTextForeground","Foreground"); + bg = get_pixel_resource (dpy,cmap,"overlayTextBackground","Background"); gcv.font = ssi->stderr_font->fid; gcv.foreground = fg; gcv.background = bg; @@ -378,7 +378,7 @@ initialize_stderr (saver_info *si) real_stderr = stderr; real_stdout = stdout; - stderr_dialog_p = get_boolean_resource ("captureStderr", "Boolean"); + stderr_dialog_p = get_boolean_resource (si->dpy, "captureStderr", "Boolean"); if (!stderr_dialog_p) return; @@ -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; + } }