[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