Messages in this thread Patch in this message | | | From | Miquel van Smoorenburg <> | Subject | Re: Linux-1.3.81& sysvinit | Date | Tue, 2 Apr 1996 13:48:33 +0200 (MET DST) |
| |
You (Karl Keyte) wrote: > I fixed sysvinit-2.59 to work with 1.3.81 and dumped the changes in > sunsite's incoming. It's running fine for me and allows runlevel > changes.
As Linus pointed out to me, simply opening the pipe O_RDWR instead of O_RDONLY is enough. The above mentioned patch is subject to nasty race conditions.
Here a proper patch, that also fixes another race condition.
NOTE: This is NOT the official 2.60.
--- sysvinit-2.59/init.c Sun Mar 10 11:37:29 1996 +++ sysvinit-2.60/init.c Tue Apr 2 13:44:50 1996 @@ -242,6 +242,10 @@ sigaddset(&got_signals, SIGCHLD); ch->exstat = st; ch->flags |= ZOMBIE; + if (ch->new) { + ch->new->exstat = st; + ch->new->flags |= ZOMBIE; + } break; } #if DEBUG @@ -1411,7 +1415,7 @@ /* Try to open /dev/initctl */ if (pipe_fd < 0) { - if ((pipe_fd = open(INIT_FIFO, O_RDONLY|O_NONBLOCK)) >= 0) { + if ((pipe_fd = open(INIT_FIFO, O_RDWR|O_NONBLOCK)) >= 0) { /* Don't use fd's 0, 1 or 2. */ (void) dup2(pipe_fd, PIPE_FD); close(pipe_fd); @@ -1433,6 +1437,16 @@ /* Read the data, return on EINTR. */ n = read(pipe_fd, &request, sizeof(request)); + if (n == 0) { + /* + * End of file. This can't happen under Linux (because + * the pipe is opened O_RDWR - see select() in the + * kernel) but you never know... + */ + close(pipe_fd); + pipe_fd = -1; + return; + } if (n <= 0) { if (errno == EINTR) return; Log(L_VB, "error reading initrequest"); -- Miquel van | Cistron Internet Services -- Alphen aan den Rijn. Smoorenburg, | mailto:info@cistron.nl http://www.cistron.nl/ miquels@het.net | Tel: +31-172-419445 (Voice) 430979 (Fax) 442580 (Data)
| |