/* 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-2008 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
if (! ssi->stderr_font)
{
- char *font_name = get_string_resource ("font", "Font");
- if (!font_name) font_name = "fixed";
+ 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");
ssi->stderr_line_height = (ssi->stderr_font->ascent +
ssi->stderr_font->descent);
+ free (font_name);
}
if (! ssi->stderr_gc)
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)
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;
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;
}
+/* 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());
+}
+
+
/* 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.
stderr_callback ((XtPointer) si, &stderr_stdout_read_fd, 0);
- if (stderr_buffer &&
- stderr_tail &&
+ if (stderr_tail &&
stderr_buffer < stderr_tail)
{
*stderr_tail = 0;