X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=hacks%2Fscreenhack.c;h=1a6cd69f879f8dbcd68accfe65730e4336f8da0c;hp=2dfd9781856d302045f56d5fc894b2deccd9c6f2;hb=c28aecf9fc41e3a03494bacf7279745425e2fa18;hpb=723c9eeee862766a1534b2ce17b78adbfac1c3be diff --git a/hacks/screenhack.c b/hacks/screenhack.c index 2dfd9781..1a6cd69f 100644 --- a/hacks/screenhack.c +++ b/hacks/screenhack.c @@ -338,6 +338,36 @@ visual_warning (Screen *screen, Window window, Visual *visual, Colormap cmap, } +static void +fix_fds (void) +{ + /* Bad Things Happen if stdin, stdout, and stderr have been closed + (as by the `sh incantation "attraction >&- 2>&-"). When you do + that, the X connection gets allocated to one of these fds, and + then some random library writes to stderr, and random bits get + stuffed down the X pipe, causing "Xlib: sequence lost" errors. + So, we cause the first three file descriptors to be open to + /dev/null if they aren't open to something else already. This + must be done before any other files are opened (or the closing + of that other file will again free up one of the "magic" first + three FDs.) + + We do this by opening /dev/null three times, and then closing + those fds, *unless* any of them got allocated as #0, #1, or #2, + in which case we leave them open. Gag. + + Really, this crap is technically required of *every* X program, + if you want it to be robust in the face of "2>&-". + */ + int fd0 = open ("/dev/null", O_RDWR); + int fd1 = open ("/dev/null", O_RDWR); + int fd2 = open ("/dev/null", O_RDWR); + if (fd0 > 2) close (fd0); + if (fd1 > 2) close (fd1); + if (fd2 > 2) close (fd2); +} + + int main (int argc, char **argv) { @@ -353,6 +383,8 @@ main (int argc, char **argv) Boolean dont_clear /*, dont_map */; char version[255]; + fix_fds(); + #ifdef XLOCKMORE pre_merge_options (); #endif @@ -495,6 +527,7 @@ main (int argc, char **argv) XGetWindowAttributes (dpy, window, &xgwa); cmap = xgwa.colormap; visual = xgwa.visual; + screen = xgwa.screen; visual_warning (screen, window, visual, cmap, True); /* Select KeyPress events on the external window.