From: Marco R. <mar...@ya...> - 2003-05-23 19:52:51
|
Greetings to everybody I have a problem with rox-filer 1.3.9 (running under FreeBSD 4.8). When calling rox from my window manager , Fvwm , if there isn't any rox-filer window already open the program will crash with the following error message: ROX-Filer: Fatal IO error 9 (Bad file descriptor) on X server :0.0. Maybe the problem is caused by fvwm closing stdin when calling a program from a menu, but also rox-filer tries to do it. In fact if I remove the involved code (the following lines at about line 457 of main.c), the problem disappears (but of course, in the other cases stdin won't be closed): /* Close stdin. We don't need it, and it can cause problems if * a child process wants a password, etc... */ { int fd; fd = open("/dev/null", O_RDONLY); if (fd > 0) { close(0); dup2(fd, 0); close(fd); } } probably it's just a matter of checking the result of close(0), but not being a good C programmer I can't tell for sure. (and anyway, removing the whole section does fine for me :D ). regards, Marco |
From: Keith R. J. W. <kr...@op...> - 2003-05-24 19:46:24
|
* Marco Righele <mar...@ya...> [23/05/2003 1555EDT]: [...] > Maybe the problem is caused by fvwm closing stdin when calling a > program from a menu, but also rox-filer tries to do it. In fact if I > remove the involved code (the following lines at about line 457 of > main.c), the problem disappears (but of course, in the other cases > stdin won't be closed): > > /* Close stdin. We don't need it, and it can cause problems if > * a child process wants a password, etc... > */ > { > int fd; > fd = open("/dev/null", O_RDONLY); > if (fd > 0) > { > close(0); > dup2(fd, 0); > close(fd); > } > } Yes, as you stated, try checking the return of the close(0). If stdin is already closed (by your window manager), ROX-Filer's attempt to close it will fail. Try changing the if (fd > 0) { close(0); dup2(fd, 0); close(fd); } to if (fd > 0) { if (close(0) == 0) dup2(fd, 0); close(fd); } and let us know if it works. I do not have fvwm here and thus cannot try it myself. A bug should probably be filed with the fvwm people. There's been a discussion relating to ROX-Filer's behaviour with stdin and stdout before. ROX-Filer specifically does not close stdin (not forever anyway); the above code actually re-opens stdin with it attached to /dev/null instead of the keyboard. This way, any program that tries to read from stdin later, or close stdin, will not break. (Thanks to Thomas for enlightening me to this logic.) fvwm should probably do the same thing. -- Keith R. John Warno [k r j w at optonline dot net] The words stuck in my mind\ Alive from what I've learned\ I have to seize the day -- Dream Theater, "A Change of Seasons" |
From: Thomas L. <ta...@ec...> - 2003-05-25 13:41:54
|
On Sat, May 24, 2003 at 01:15:49PM -0400, Keith R. John Warno wrote: [...] > to > > if (fd > 0) > { > if (close(0) == 0) > dup2(fd, 0); > close(fd); > } That won't help... it doesn't matter whether fd 0 exists or not, /dev/null still needs to be dup'd onto it, so no need to check the return code. The problem (I suspect) is: - fvwm closes fd 0 - ROX-Filer uses fd 0 for its connection to the window manager - ROX-Filer sets fd 0 to /dev/null > A bug should probably be filed with the fvwm people. There's been a > discussion relating to ROX-Filer's behaviour with stdin and stdout > before. ROX-Filer specifically does not close stdin (not forever > anyway); the above code actually re-opens stdin with it attached to > /dev/null instead of the keyboard. This way, any program that tries to > read from stdin later, or close stdin, will not break. (Thanks to > Thomas for enlightening me to this logic.) fvwm should probably do the > same thing. Indeed, this is exactly the kind of problem that closing the standard streams causes. Consider a program that tries to read a password from stdin: with the ROX-Filer method, it will read from /dev/null and hopefully do something sensible. With the fvwm method, it will read from whatever fd 0 got used for (eg, X server connection), messing everything up. -- Thomas Leonard http://rox.sourceforge.net ta...@ec... ta...@us... GPG: 9242 9807 C985 3C07 44A6 8B9A AE07 8280 59A5 3CC1 |
From: Marco R. <mar...@ya...> - 2003-05-27 10:30:07
|
Alle Saturday 24 May 2003 19:15, Keith R. John Warno ha scritto: > > [...] > > A bug should probably be filed with the fvwm people. There's been a > discussion relating to ROX-Filer's behaviour with stdin and stdout > before. ROX-Filer specifically does not close stdin (not forever > anyway); the above code actually re-opens stdin with it attached to > /dev/null instead of the keyboard. This way, any program that tries to > read from stdin later, or close stdin, will not break. (Thanks to > Thomas for enlightening me to this logic.) fvwm should probably do the > same thing. I filed the bug and your suggestion and now everything works perfectly. Thank you very much.. Marco |