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)