[net.news.b] vnews bug on 4.2 systems

jeff@voder.UUCP (07/10/84)

After installing vnews recently on our 4.2 system I noticed that
the time field in the prompt line wasn't being updated.  Long hours
(and several wild goose chases) later I discovered the following
problems.

In visual.c: vgetc() uses select() to wait for input from the keyboard.
Unfortunately, there is already a subroutine called select defined
in rfuncs.c.  The solution here is easy: edit rfuncs.c and readr.c
to change the names of the innocent.

*** diff old.rfuncs.c rfuncs.c

214c214
< 			|| !select(&h, FALSE)) {
---
> 			|| !selectart(&h, FALSE)) {
417c417
< select(hp, insist)
---
> selectart(hp, insist)

*** diff old.readr.c readr.c

1163c1163
< 	|| (!rfq && !select(&h, abs))) {
---
> 	|| (!rfq && !selectart(&h, abs))) {

In visual.c the changes are slightly more involved:

*** old.visual.c	Mon Jul  9 23:04:32 1984
--- visual.c	Mon Jul  9 23:04:54 1984
***************
*** 1802,1803
  	i = 60 - t->tm_sec;
  	alarm(i > 30? 30 : i);			/* reset alarm */

--- 1802,1806 -----
  	i = 60 - t->tm_sec;
+ #ifdef	BSD4_2
+ 	alarm((unsigned) i);			/* reset alarm */
+ #else
  	alarm(i > 30? 30 : i);			/* reset alarm */
***************
*** 1803,1804
  	alarm(i > 30? 30 : i);			/* reset alarm */
  	hour = t->tm_hour % 12;

--- 1806,1808 -----
  	alarm(i > 30? 30 : i);			/* reset alarm */
+ #endif
  	hour = t->tm_hour % 12;
***************
*** 1882,1883
  	int readfds, exceptfds;
  #endif

--- 1886,1888 -----
  	int readfds, exceptfds;
+ 	int nfound;
  #endif
***************
*** 1902,1904
  #ifdef BSD4_2
! 			/* use a read because it can be interrupted */
  			readfds = 1; exceptfds = 1;

--- 1907,1909 -----
  #ifdef BSD4_2
! 			/* use a select because it can be interrupted */
  			readfds = 1; exceptfds = 1;
***************
*** 1904,1907
  			readfds = 1; exceptfds = 1;
! 			select(1,&readfds,0,&exceptfds,0);
! 			if (readfds & 1) { /* got a key, go ahead and get it */
  				innleft = read(0,inbuf,INBUFSIZ);

--- 1909,1912 -----
  			readfds = 1; exceptfds = 1;
! 			nfound = select(1,&readfds,0,&exceptfds,0);
! 			if (nfound > 0) { /* got a key, go ahead and get it */
  				innleft = read(0,inbuf,INBUFSIZ);
***************
*** 2041,2042
  	register int i;
  	unsigned oldalarm;

--- 2046,2050 -----
  	register int i;
+ #ifdef	BSD4_2
+ 	int mask;
+ #else
  	unsigned oldalarm;
***************
*** 2042,2043
  	unsigned oldalarm;
  

--- 2050,2052 -----
  	unsigned oldalarm;
+ #endif
  
***************
*** 2047,2048
       */
  	oldalarm = alarm((unsigned)0); /* suspend interrupts while writing */

--- 2056,2060 -----
       */
+ #ifdef	BSD4_2
+ 	mask = sigblock(1<<SIGALRM); /* suspend interrupts while writing */
+ #else
  	oldalarm = alarm((unsigned)0); /* suspend interrupts while writing */
***************
*** 2048,2049
  	oldalarm = alarm((unsigned)0); /* suspend interrupts while writing */
  	for (p = outbuf; p < outnext ; p += i)

--- 2060,2062 -----
  	oldalarm = alarm((unsigned)0); /* suspend interrupts while writing */
+ #endif
  	for (p = outbuf; p < outnext ; p += i)
***************
*** 2059,2060
  	outnext = outbuf;
  	alarm(oldalarm);			/* reset the timer */

--- 2072,2076 -----
  	outnext = outbuf;
+ #ifdef	BSD4_2
+ 	sigblock(mask);				/* reenable timer interrupts */
+ #else
  	alarm(oldalarm);			/* reset the timer */
***************
*** 2060,2061
  	alarm(oldalarm);			/* reset the timer */
  }

--- 2076,2078 -----
  	alarm(oldalarm);			/* reset the timer */
+ #endif
  }

N.B. The last set of changes (in vflush()) is necessitated by a
bug in the 4.2 implementation of alarm().  Another article will
follow explaining the problem; sorry, no fix.

Jeff Gilliam

No pain, no gain ...	*sigh*