[comp.sources.games.bugs] v12i046: tinymud2 - user-extendible multi-user adventure

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)