[net.bugs] PMDF vs. 4.3BSD

spaf@gatech.EDU (Gene Spafford) (10/03/86)

If any of you are running PMDF II (as many CSNet sites are), you will
discover that PMDF will not work once you convert to 4.3BSD.  It works
a little, but keeps timing out and your queue keeps growing.

Well, after a few dead-ends, we found the problem.  The following
changes should be made to your PMDF code and then the whole
package should be recompiled and relinked.

Mark Johnson
Gene Spafford
	postmasters at GaTech


*** osc.c.orig	Wed Oct  1 10:41:55 1986
--- osc.c	Wed Oct  1 10:59:44 1986
***************
*** 10,15 ****
--- 10,16 ----
  #include <stdio.h>
  #include <fcntl.h>
  #include  <sgtty.h>
+ #include <sys/types.h>
  #include "pcvars.h" /* excerpt from h00vars.h */
  
  #define R_OK 4
***************
*** 236,248 ****
  
  	register int r;
  	struct timeval timeout;
! 	int readfs;
  
  	timeout.tv_sec = timelimit;
  	timeout.tv_usec = 0;
! 	readfs = 1;
! 	select(1,&readfs,0,0,&timeout);
! 	if (readfs == 0) return(0);
  	r = read(fileno(stdin),ch,1);
  	(*ch) &= 0x7f;
  	if (r < 0) return(-errno);
--- 237,251 ----
  
  	register int r;
  	struct timeval timeout;
! 	int s_result;
! 	fd_set readfs;
  
  	timeout.tv_sec = timelimit;
  	timeout.tv_usec = 0;
! 	FD_ZERO(&readfs);
! 	FD_SET(0, &readfs);
! 	s_result = select(1,&readfs,0,0,&timeout);
! 	if (s_result <= 0 || !FD_ISSET(0, &readfs)) return(0);
  	r = read(fileno(stdin),ch,1);
  	(*ch) &= 0x7f;
  	if (r < 0) return(-errno);
***************
*** 257,269 ****
  
  {
  	struct timeval timeout;
! 	int readfs;
  
  	timeout.tv_sec = timelimit;
  	timeout.tv_usec = 0;
! 	readfs = 1;
! 	select(1,&readfs,0,0,&timeout);
! 	if (readfs == 0) return(0); 
  	gets(packet->body, sizeof packet->body);
  	if ferror(stdin) {
  	  clearerr(stdin);
--- 260,274 ----
  
  {
  	struct timeval timeout;
! 	int s_result;
! 	fd_set readfs;
  
  	timeout.tv_sec = timelimit;
  	timeout.tv_usec = 0;
! 	FD_ZERO(&readfs);
! 	FD_SET(0, &readfs);
! 	s_result = select(1,&readfs,0,0,&timeout);
! 	if (s_result <= 0 || !FD_ISSET(0, &readfs)) return(0); 
  	gets(packet->body, sizeof packet->body);
  	if ferror(stdin) {
  	  clearerr(stdin);