From http://www.jwz.org/xscreensaver/xscreensaver-5.35.tar.gz
[xscreensaver] / driver / stderr.c
index 8b7ac8b55cc7860cae16ba4f6a025d2858188472..84fa697290d6268c34846fb36fb548ea56b8503a 100644 (file)
@@ -1,5 +1,5 @@
 /* stderr.c --- capturing stdout/stderr output onto the screensaver window.
- * xscreensaver, Copyright (c) 1991-1998, 2001 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1991-2016 Jamie Zawinski <jwz@jwz.org>
  *
  * 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;
+    }
 }