[MPlayer-users] alsa 0.9.1- xscreensaver
D Richard Felker III
dalias at aerifal.cx
Fri Mar 21 21:09:43 CET 2003
On Fri, Mar 21, 2003 at 09:46:15AM +0100, Jindrich Makovicka wrote:
> >It's a known limitation of the broken design of alsa userspace libs,
> >as well as a bug in xscreensaver which the author refuses to fix. Use
> >oss emulation (should work just as well) or else killall -9
> >xscreensaver (preferred).
> >
> >
> Here is a spinoff of a recent patch by Tobias Geiger
> <tobias.geiger at web.de> posted to devel, with the changes you proposed. I
> changed my opinion on this after having the same problem with /dev/rtc
> and who knows what else can be affected.
>
> Regards,
>
> --
> Jindrich Makovicka
>
> Index: x11_common.c
> ===================================================================
> RCS file: /cvsroot/mplayer/main/libvo/x11_common.c,v
> retrieving revision 1.140
> diff -u -b -B -r1.140 x11_common.c
> --- x11_common.c 10 Feb 2003 14:08:37 -0000 1.140
> +++ x11_common.c 21 Mar 2003 08:56:57 -0000
> @@ -12,6 +12,7 @@
>
> #include <string.h>
> #include <unistd.h>
> +#include <fcntl.h>
> #include <sys/mman.h>
>
> #include "video_out.h"
> @@ -890,7 +891,28 @@
> }
>
> if (xscreensaver_was_running && stop_xscreensaver) {
> + pid_t pid;
> +
> + if ((pid = fork()) < 0)
> + exit(1);
> + if (pid == 0) {
> + unsigned int i;
> + for (i = 3; i < 1024; i++)
> + close(i);
> + i = open("/dev/null", O_RDONLY);
> + dup2(i, 0);
> + close(i);
> + i = open("/dev/null", O_WRONLY);
> + dup2(i, 1);
> + close(i);
> + i = open("/dev/null", O_WRONLY);
> + dup2(i, 2);
> + close(i);
This code is total nonsense. You have to close 0-2 AFTER opening
/dev/null but before the dup2; otherwise these fd's might already get
reused!! Here is the correct implementation:
i = open("/dev/null", O_RDWR);
close(0); close(1); close(2);
dup2(i,0); dup2(i,1); dup2(i,2); close(i);
But in any case, it will NOT fix the problem, since the fd's being
wrongly inherited by xscreensaver are not stdin/out/err but other
stuff!!
One 'correct' (but still nonsense) fix is:
for (i=3; i<1024; i++) close(i);
A much better solution (WHY WON'T SOMEONE IMPLEMENT THIS???) is to
killall -STOP xscreensaver when starting and killall -CONT
xscreensaver on exit.
Rich
More information about the MPlayer-users
mailing list