john@jwt.UUCP (John Temples) (03/10/91)
There is an annoying bug in the ESIX Fast File System which prevents
this version of TinyMUD from working correctly. The stat() system call
returns incorrect values on named pipes. Following are patches to
fifoiface.c which attempt a workaround. Note that these patches are
only required if you start the server on an ESIX FFS. If you've got an
S51K file system to start the server on, or you're running someone
else's UNIX, you don't need these patches.
------ cut here ------
*** fifoiface.c Sat Mar 9 16:27:55 1991
--- fifoiface.c Sat Mar 9 16:48:13 1991
***************
*** 146,151
#define FREE(x) (free((void *) x))
char *fifonames[FD_SETSIZE] = {0};
int shutdown (s) int s;
{
--- 146,152 -----
#define FREE(x) (free((void *) x))
char *fifonames[FD_SETSIZE] = {0};
+ time_t mtime[FD_SETSIZE];
int shutdown (s) int s;
{
***************
*** 186,193
if(FD_ISSET(fd,rfds)) {
if (stat(fifonames[fd],&sbuf) != 0)
goto foo;
! else if(sbuf.st_size>0)
! ++maxfd;
else
FD_CLR(fd,rfds);
}
--- 187,196 -----
if(FD_ISSET(fd,rfds)) {
if (stat(fifonames[fd],&sbuf) != 0)
goto foo;
! else if(sbuf.st_mtime>mtime[fd]) {
! mtime[fd] = sbuf.st_mtime;
! ++maxfd;
! }
else
FD_CLR(fd,rfds);
}
***************
*** 194,203
if(FD_ISSET(fd,wfds)) {
if (stat(fifonames[fd],&sbuf) != 0)
goto foo;
! else if(sbuf.st_size<5120)
! ++maxfd;
! else
! FD_CLR(fd,wfds);
}
}
if(maxfd > 0 || --sec < 0) break;
--- 197,203 -----
if(FD_ISSET(fd,wfds)) {
if (stat(fifonames[fd],&sbuf) != 0)
goto foo;
! ++maxfd;
}
}
if(maxfd > 0 || --sec < 0) break;
***************
*** 484,492
if (addr_len>0) {
buf[addr_len] = '\0';
addr.sin_addr.s_addr = n = atoi(buf);
! } else {
! return 0;
! }
rnewsock = fifo(n,0);
wnewsock = fifo(n,1);
--- 484,494 -----
if (addr_len>0) {
buf[addr_len] = '\0';
addr.sin_addr.s_addr = n = atoi(buf);
! } else if (addr_len == 0){
! errno = EINTR; /* kludge so it doesn't look like an error jwt */
! return 0;
! } else
! return 0;
rnewsock = fifo(n,0);
wnewsock = fifo(n,1);
***************
*** 693,700
for (qp = &d->output.head; cur = *qp;) {
cnt = write (d->wdescriptor, cur -> start, cur -> nchars);
! if (cnt < 0) {
! if (errno == EWOULDBLOCK)
return 1;
return 0;
}
--- 695,701 -----
for (qp = &d->output.head; cur = *qp;) {
cnt = write (d->wdescriptor, cur -> start, cur -> nchars);
! if (cnt == 0)
return 1;
if (cnt < 0)
return 0;
***************
*** 696,701
if (cnt < 0) {
if (errno == EWOULDBLOCK)
return 1;
return 0;
}
d->output_size -= cnt;
--- 697,703 -----
cnt = write (d->wdescriptor, cur -> start, cur -> nchars);
if (cnt == 0)
return 1;
+ if (cnt < 0)
return 0;
d->output_size -= cnt;
if (cnt == cur -> nchars) {
***************
*** 697,703
if (errno == EWOULDBLOCK)
return 1;
return 0;
- }
d->output_size -= cnt;
if (cnt == cur -> nchars) {
if (!cur -> nxt)
--- 699,704 -----
return 1;
if (cnt < 0)
return 0;
d->output_size -= cnt;
if (cnt == cur -> nchars) {
if (!cur -> nxt)
***************
*** 787,793
char *p, *pend, *q, *qend;
got = read (d->rdescriptor, buf, sizeof buf);
! if (got <= 0)
return 0;
if (!d->raw_input) {
MALLOC(d->raw_input,char,MAX_COMMAND_LEN);
--- 788,796 -----
char *p, *pend, *q, *qend;
got = read (d->rdescriptor, buf, sizeof buf);
! if (got == 0)
! return 1;
! if (got < 0)
return 0;
if (!d->raw_input) {
MALLOC(d->raw_input,char,MAX_COMMAND_LEN);
--
John W. Temples -- john@jwt.UUCP (uunet!jwt!john)