[comp.dcom.modems] 'Trailblazer uucp retry problem': NOT a Trailblazer problem!

root@octopus.UUCP (Superuser) (11/24/87)

Several people (including myself) have noted symptoms of a problem when
receiving uucp data over a Telebit Trailblazer modem. In my case, it
involved:

	- data gets lost in byte stream between modem and CPU while
		receiving uucp data at high speed
	- uucp goes into a retry sequence (pkcget: Alarm 1)
	- the link never recovers: it simply keeps retrying forever.
		The modem never *seems* to be able to send a good
		set of packet info.

    Well, I'm happy(?) to report that the problem is not in the modem.
I investigated as far as I could on my own, then called Telebit. They
responded immediately and completely (I should note for the record that,
in my favor- I'm located in the same city; going against me- I'm a VERY
small organization). They came out to our site (within hours) with an ASCII
analyzer, looked at the data stream, and proved convincingly that the modem
was correctly handling everything. 

Somehow, my version of uucp was locking itself into an out-of-sync mode,
couldn't recover, and never timed out either. At the time (last week), we
were running System V.1 with some BSD4.2 stuff thrown in. The uucp was the
'directory-ized' spool directory version, in case that helps. I'm really
not sure about the detailed blood line, since we don't have source. In any
case, we are now running a more recent version based on V.2 and BSD4.3, and
the problem has completely disappeared (it was easily duplicated by 
manually glitching the RS-232 line while receiving data at high speed. Now,
there's a simple retry and recovery).

So: If you are having similar problems, I'd suspect your uucp before suspecting
the Trailblazer! And here's a big positive vote for the tech support that
Telebit gives. Rather responsive in my opinion.

Disclaimer: I'm simply a happy Telebit customer.


  OOO   __| ___      Peter Holzmann, Octopus Enterprises
 OOOOOOO___/ _______ USPS: 19611 La Mar Court, Cupertino, CA 95014
  OOOOO \___/        UUCP: {hplabs!hpdsd,pyramid}!octopus!pete
___| \_____          Phone: 408/996-7746

david@ms.uky.edu (David Herron -- Resident E-mail Hack) (11/25/87)

In article <369@octopus.UUCP> root@octopus.UUCP (Superuser) writes:
>Several people (including myself) have noted symptoms of a problem when
>receiving uucp data over a Telebit Trailblazer modem. In my case, it
>involved:
>
>	- data gets lost in byte stream between modem and CPU while
>		receiving uucp data at high speed
>	- uucp goes into a retry sequence (pkcget: Alarm 1)
>	- the link never recovers: it simply keeps retrying forever.
>		The modem never *seems* to be able to send a good
>		set of packet info.

I was beating my head against this EXACT SAME PROBLEM for about 2
days while trying to get the modem to work.  After two days of tweaking
things I took a look around in the files I had saved away over time
and found a couple of bug reports for UUCP.  One from Rick Adams which
described this exact situation and included a one-line fix in pk1.c.
I don't remember it exactly, but there's a line which has "(hline>>3)"
and the patch fixes that to be just "hline".  The variable might not
be called "hline" ... my memory is a little vague right now as I
was up most of last night studying for an exam and I haven't gotten
to sleep yet.

If there is demand, I (or Rick I suppose) could re-post the patch.  Note
that my copy came through bitnet and is slightly munged.  You should request
a copy from Rick ...

As soon as I applied the patch to the UUCP on our vax the problem between
it and uunet went away.  Between my home 3b1 and the vax however, I'm
seeing some pretty bad baud rates ... ~2500 baud whereas I'm seeing rates
more like 9600 baud sending files to uunet.  I haven't investigated this yet.


I very satisfied potential Telebit customer ...
-- 
<---- David Herron -- Resident E-Mail Hack     <david@ms.uky.edu>
<---- or:                {rutgers,uunet,cbosgd}!ukma!david, david@UKMA.BITNET
<---- "The market doesn't drop hundreds of points on a normal day..." --
<---- 		Fidelity Investments Corporation

rick@seismo.CSS.GOV (Rick Adams) (11/25/87)

Path: seismo!rick
From: rick@seismo.CSS.GOV (Rick Adams)
Newsgroups: net.bugs.uucp
Subject: updates for 4.3bsd uucp
Keywords: from the author
Message-ID: <41989@beno.seismo.CSS.GOV>
Date: 8 Nov 86 00:02:11 GMT
Organization: Center for Seismic Studies, Arlington, VA
Lines: 1334

Subject: uucico is SLOW and other minor problems
Index:	usr.bin/uucp 4.3BSD

Description:
	uucico is incredibly slow on systems with a lot of jobs queued up.
	This is an artifact of the way uucico was converted to use the new
	directory reading routines.
	The PC Pursuit suport is for the old style dial back PC Pursuit service.
	Support for the new one is provided.
	The 'g' protocol packet driver as a bug in it.
	Several other small bugs are fixed.
Repeat-By:
	Run uucico with 8000 jobs queued up and listen to your vax whine.
Fix:
	Delete the file gnamef.c. It is no longer used.
	Apply the following patches.

*** Makefile	Fri Nov  7 17:50:53 1986
--- ../nuucp/Makefile	Sun May 18 23:41:30 1986
***************
*** 1,4 ****
! #	Makefile	5.11	85/12/12
  #
  # This version expects the 4.2BSD directory reading routines to
  # located in libc.a.  If they aren't, augment LIBS.  Also, LIBS
--- 1,4 ----
! #	%W%	%G%
  #
  # This version expects the 4.2BSD directory reading routines to
  # located in libc.a.  If they aren't, augment LIBS.  Also, LIBS
***************
*** 12,18 ****
  # Common object files placed in uulib.a
  COMMON=	anlwrk.o anyread.o assert.o cfgets.o chkpth.o \
  	cpmv.o expfile.o gename.o getargs.o getprm.o \
! 	getpwinfo.o gnamef.o gnxseq.o lastpart.o logent.o mailst.o \
  	prefix.o setline.o strpbrk.o subdir.o sysacct.o systat.o \
  	ulockf.o uucpname.o versys.o xqt.o uucpdefs.o
  SRCS=	${USRCS} ${OSRCS} ${LSRCS}
--- 12,18 ----
  # Common object files placed in uulib.a
  COMMON=	anlwrk.o anyread.o assert.o cfgets.o chkpth.o \
  	cpmv.o expfile.o gename.o getargs.o getprm.o \
! 	getpwinfo.o gnxseq.o lastpart.o logent.o mailst.o \
  	prefix.o setline.o strpbrk.o subdir.o sysacct.o systat.o \
  	ulockf.o uucpname.o versys.o xqt.o uucpdefs.o
  SRCS=	${USRCS} ${OSRCS} ${LSRCS}
***************
*** 22,29 ****
  	uusend.c uusnap.c uux.c uuxqt.c uuq.c acucntrl.c
  LSRCS=	anlwrk.c anyread.c assert.c cfgets.c chkpth.c \
  	cpmv.c expfile.c \
! 	gename.c getargs.c getprm.c getpwinfo.c \
! 	gnamef.c gnxseq.c \
  	lastpart.c logent.c mailst.c prefix.c \
  	setline.c strpbrk.c subdir.c sysacct.c systat.c ulockf.c \
  	uucpdefs.c uucpname.c versys.c xqt.c
--- 22,28 ----
  	uusend.c uusnap.c uux.c uuxqt.c uuq.c acucntrl.c
  LSRCS=	anlwrk.c anyread.c assert.c cfgets.c chkpth.c \
  	cpmv.c expfile.c \
! 	gename.c getargs.c getprm.c getpwinfo.c gnxseq.c \
  	lastpart.c logent.c mailst.c prefix.c \
  	setline.c strpbrk.c subdir.c sysacct.c systat.c ulockf.c \
  	uucpdefs.c uucpname.c versys.c xqt.c
***************
*** 153,170 ****
  	for i in uucico uuclean; do \
  		install -s -m 6111 -o ${OWNER} -g ${GROUP} $$i ${LIBDIR} ;\
  	done
! 	for i in uucp uux uulog uuname uusnap uupoll uuq uusend; do \
  		install -s -m 6111 -o ${OWNER} -g ${GROUP} $$i ${BIN} ;\
  	done
  	rm -f ${BIN}/ruusend
  	ln ${BIN}/uusend ${BIN}/ruusend
  	install -s -m 6110 -o ${OWNER} -g ${GROUP} uuxqt ${LIBDIR}
! 	install -s -m 6110 -o root -g ${GROUP} acucntrl ${LIBDIR}
  	install -s -m 500 -o uucp uucpd ${ETC}
  	@echo Dont forget to fork off /etc/uucpd in /etc/rc.local
  	@echo if you are not running /etc/inetd
  	install -s uuencode ${BIN}
  	install -s uudecode ${BIN}
  
  clean:
  	rm -f *.o ${ALL} uulib.a
--- 152,170 ----
  	for i in uucico uuclean; do \
  		install -s -m 6111 -o ${OWNER} -g ${GROUP} $$i ${LIBDIR} ;\
  	done
! 	for i in uucp uux uulog uuname uusnap uupoll uuq; do \
  		install -s -m 6111 -o ${OWNER} -g ${GROUP} $$i ${BIN} ;\
  	done
  	rm -f ${BIN}/ruusend
  	ln ${BIN}/uusend ${BIN}/ruusend
  	install -s -m 6110 -o ${OWNER} -g ${GROUP} uuxqt ${LIBDIR}
! 	install -s -m 6111 -o root -g ${GROUP} acucntrl ${LIBDIR}
  	install -s -m 500 -o uucp uucpd ${ETC}
  	@echo Dont forget to fork off /etc/uucpd in /etc/rc.local
  	@echo if you are not running /etc/inetd
  	install -s uuencode ${BIN}
  	install -s uudecode ${BIN}
+ 	install -s uusend ${BIN}
  
  clean:
  	rm -f *.o ${ALL} uulib.a
***************
*** 274,282 ****
  gio.o: uucp.h
  gio.o: pk.h
  gio.o: /usr/include/setjmp.h
- gnamef.o: gnamef.c
- gnamef.o: uucp.h
- gnamef.o: /usr/include/sys/dir.h
  gnsys.o: gnsys.c
  gnsys.o: uucp.h
  gnsys.o: /usr/include/sys/dir.h
--- 274,279 ----
*** anlwrk.c	Fri Nov  7 17:50:54 1986
--- ../nuucp/anlwrk.c	Tue Oct 28 16:34:29 1986
***************
*** 1,5 ****
  #ifndef lint
! static char sccsid[] = "@(#)anlwrk.c	5.5 (Berkeley) 6/19/85";
  #endif
  
  #include "uucp.h"
--- 1,5 ----
  #ifndef lint
! static char sccsid[] = "%W%	%G%";
  #endif
  
  #include "uucp.h"
***************
*** 12,18 ****
  #endif
  #include <ctype.h>
  
! #define TLIMIT	(5*60L)
  #define NITEMS(X)	(sizeof (X) / sizeof ((X)[0]))
  
  int Nfiles = 0;
--- 12,18 ----
  #endif
  #include <ctype.h>
  
! #define TLIMIT	(15*60L)
  #define NITEMS(X)	(sizeof (X) / sizeof ((X)[0]))
  
  int Nfiles = 0;
***************
*** 61,67 ****
  			bnp = rindex(file, '/');
  			sprintf(rqstr, "%s/%s", CORRUPT, bnp ? bnp + 1 : file);
  			xmv(file, rqstr);
! 			logent(subfile(file), "CMD FILE UNREADABLE");
  			unlink(subfile(file));
  			return 0;
  		}
--- 61,67 ----
  			bnp = rindex(file, '/');
  			sprintf(rqstr, "%s/%s", CORRUPT, bnp ? bnp + 1 : file);
  			xmv(file, rqstr);
! 			assert("CMD FILE UNREADABLE", subfile(file), 0);
  			unlink(subfile(file));
  			return 0;
  		}
***************
*** 113,122 ****
  register char *dir, *pre;
  {
  	static DIR  *dirp = NULL;
! 	register nfound;
! 	char filename[NAMESIZE];
! 	int plen = strlen (pre);
! 	int flen;
  	extern char MaxGrade;
  
  	if (dirp == NULL) {
--- 113,121 ----
  register char *dir, *pre;
  {
  	static DIR  *dirp = NULL;
! 	register struct direct *dentp;
! 	register int i;
! 	int plen = strlen(pre);
  	extern char MaxGrade;
  
  	if (dirp == NULL) {
***************
*** 124,133 ****
  			DEBUG(1,"opendir(%s) FAILS\n",subdir(dir,pre[0]));
  			return 0;
  		}
! 	}
! 	else
  		rewinddir(dirp);
! 	for (nfound = 0, Nfiles = 0; gnamef(dirp, filename);) {
  		/* Check for two systems with the same prefix.
  		 * Magic number "5" is 1 for "grade" character plus
  		 * 4 for sequence number.  The point here is to not
--- 123,133 ----
  			DEBUG(1,"opendir(%s) FAILS\n",subdir(dir,pre[0]));
  			return 0;
  		}
! 	} else
  		rewinddir(dirp);
! 
! 	Nfiles = 0;
! 	while ((dentp = readdir(dirp)) != NULL && Nfiles < LLEN) {
  		/* Check for two systems with the same prefix.
  		 * Magic number "5" is 1 for "grade" character plus
  		 * 4 for sequence number.  The point here is to not
***************
*** 136,185 ****
  		 * Special case: prefix "X." does not do this check
  		 * so uuxqt can use bldflst.
  		 */
! 		flen = strlen(filename);
! 		if (!prefix(pre, filename) || (plen != 2 && flen-plen != 5)) {
! 			DEBUG(99,"bldflst rejects %s\n",filename);
  			continue;
  		}
! 		if (filename[flen-5] > MaxGrade ) {
! 			DEBUG(8,"bldflst rejects %s, grade too low\n",filename);
  			continue;
  		}
- 		nfound++;
  		if (*reqst == 'c')
  			return 1;
- 		entflst(filename);
- 	}
- 	return  nfound? 1: 0;
- }
  
! /*
!  *	put new name if list is not full  or new name is less than the MAX
!  *		  now in the list.
!  *
!  */
  
! /* LOCAL only */
! int
! entflst(file)
! register char *file;
! {
! 	register int i;
  
- 	/* locate position for the new file and make room for it */
- 	for (i = Nfiles; i > 0; i--) {
- 		if (pcompar(file, Filent[i-1]) <= 0)
- 			break;
- 		if (i <LLEN)
- 			strcpy(Filent[i], Filent[i-1]);
  	}
! 
! 	/* add new file (if there is room), and increase Nfiles if need be */
! 	if (i < LLEN) {
! 		strcpy(Filent[i], file);
! 		if (Nfiles < LLEN)
! 			Nfiles++;
! 	}
  }
  
  /*
--- 136,171 ----
  		 * Special case: prefix "X." does not do this check
  		 * so uuxqt can use bldflst.
  		 */
! 		if (!prefix(pre, dentp->d_name) ||
! 			(plen != 2 && (dentp->d_namlen-plen) != 5)) {
! 			DEBUG(99,"bldflst rejects %s\n",dentp->d_name);
  			continue;
  		}
! 		if (dentp->d_name[dentp->d_namlen-5] > MaxGrade) {
! 			DEBUG(8, "bldflst rejects %s, grade too low\n",
! 				dentp->d_name);
  			continue;
  		}
  		if (*reqst == 'c')
  			return 1;
  
! 		/* locate position for the new file and make room for it */
! 		for (i = Nfiles; i > 0; i--) {
! 			if (pcompar(dentp->d_name, Filent[i-1]) <= 0)
! 				break;
! 			if (i <LLEN)
! 				strcpy(Filent[i], Filent[i-1]);
! 		}
  
! 		/* add new file (if there is room), and increase Nfiles if need be */
! 		if (i < LLEN) {
! 			strcpy(Filent[i], dentp->d_name);
! 			if (Nfiles < LLEN)
! 				Nfiles++;
! 		}
  
  	}
! 	return Nfiles > 0;
  }
  
  /*
***************
*** 216,247 ****
  }
  
  /*
-  *	get next work file
-  *
-  *	return value:
-  *
-  *		0  - No file gotten
-  *		1  - File successfully gotten.
-  *
-  */
- 
- /* LOCAL only */
- gtwrkf(dir, file)
- char *file, *dir;
- {
- 	register int i;
- 
- 	if (Nfiles-- <= 0) {
- 		Nfiles = 0;
- 		return 0;
- 	}
- 	sprintf(file, "%s/%s", dir, Filent[0]);
- 	for (i=0; i<Nfiles;i++)
- 		strcpy(Filent[i], Filent[i+1]);
- 	return 1;
- }
- 
- /*
   *	get work vector
   *
   *	return codes:
--- 202,207 ----
***************
*** 284,335 ****
  register char *file, *reqst, *dir, *pre;
  {
  	static char *lastpre = 0;
! 	register ret;
  
  	/* Starting new system; re-init */
! 	if (lastpre == 0 || strcmp(lastpre,pre) != 0) {
! 		anlwrk ("", (char **)0);	/* Force close of work file */
  
  		/* Save last worked-on prefix */
  		if (lastpre != 0)
! 			free (lastpre);
  		lastpre = malloc((unsigned)(strlen(pre)+1));
! 		strcpy (lastpre, pre);
  
! 		/* Set the external indexes properly
! 		 */
  		Nfiles = 0;
  	}
  
! 	/* If the list is empty or new files have entered
  	 * the spool area, call "bldflst" to read
! 	 * some file names into it.  Because names can
! 	 * be put in the list that later turn out to
! 	 * be unusable (from "gtwrkf"), this operation
! 	 * continues until either "bldflst" can't find
! 	 * any new files, or "gtwrkf" signals success.
  	 */
! 	for (;;) {
! 		ret = 0;
! 		if (Nfiles <= 0 || newspool((time_t)TLIMIT)) {
! 			ret = bldflst (reqst, dir, pre);
! 			DEBUG(99,"bldflst returns %d\n",ret);
! 		}
  
! 		/* If they only wanted to check, return
! 		 * boolean list not empty.  NB: the list
! 		 * will be forcibly emptied as soon as
! 		 * a new system name is mentioned.
! 		 */
! 		if (*reqst == 'c')
! 			return ret;
  
! 		if (Nfiles <= 0)
! 			return 0;
! 
! 		if (gtwrkf(dir, file))
! 			return 1;
  	}
  }
  
  /* Return non-zero if there is new work in the spool
--- 244,295 ----
  register char *file, *reqst, *dir, *pre;
  {
  	static char *lastpre = 0;
! 	register ret = 0;
! 	int i;
  
  	/* Starting new system; re-init */
! 	if (lastpre == 0 || strcmp(lastpre, pre) != SAME) {
! 		/* Force close of work file */
! 		anlwrk("", (char **)0);
  
  		/* Save last worked-on prefix */
  		if (lastpre != 0)
! 			free(lastpre);
  		lastpre = malloc((unsigned)(strlen(pre)+1));
! 		strcpy(lastpre, pre);
  
! 		/* Set the external indexes properly */
  		Nfiles = 0;
  	}
  
! 	/*
! 	 * If the list is empty or new files have entered
  	 * the spool area, call "bldflst" to read
! 	 * some file names into it. 
  	 */
! 	if (Nfiles <= 0 || newspool((time_t)TLIMIT)) {
! 		ret = bldflst(reqst, dir, pre);
! 		DEBUG(99, "bldflst returns %d\n", ret);
! 	}
  
! 	/* If they only wanted to check, return
! 	 * boolean list not empty.  NB: the list
! 	 * will be forcibly emptied as soon as
! 	 * a new system name is mentioned.
! 	 */
! 	if (*reqst == 'c')
! 		return ret;
  
! 	if (Nfiles-- <= 0) {
! 		/* Didn't find any files in the spool area */
! 		Nfiles = 0;
! 		return 0;
  	}
+ 	/* Found some files, return the first one */
+ 	sprintf(file, "%s/%s", dir, Filent[0]);
+ 	for (i = 0; i < Nfiles; i++)
+ 		strcpy(Filent[i], Filent[i+1]);
+ 	return 1;
  }
  
  /* Return non-zero if there is new work in the spool
*** cico.c	Fri Nov  7 17:50:57 1986
--- ../nuucp/cico.c	Wed May 21 18:48:21 1986
***************
*** 220,226 ****
  		/*
  		 * Determine if we are on TCPIP
  		 */
! 		if (isatty(Ifn) < 0) {
  			IsTcpIp = 1;
  			DEBUG(4, "TCPIP connection -- ioctl-s disabled\n", CNULL);
  		} else
--- 220,226 ----
  		/*
  		 * Determine if we are on TCPIP
  		 */
! 		if (isatty(Ifn) == 0) {
  			IsTcpIp = 1;
  			DEBUG(4, "TCPIP connection -- ioctl-s disabled\n", CNULL);
  		} else
*** cntrl.c	Fri Nov  7 17:50:59 1986
--- ../nuucp/cntrl.c	Sun May 18 23:44:20 1986
***************
*** 198,204 ****
  			bnp = rindex(Wfile, '/');
  			sprintf(rqstr, "%s/%s", CORRUPT, bnp ? bnp + 1 : Wfile);
  			xmv(Wfile, rqstr);
! 			logent(Wfile, "CMD FILE CORRUPTED");
  			Wfile[0] = '\0';
  			goto top;
  		}
--- 198,204 ----
  			bnp = rindex(Wfile, '/');
  			sprintf(rqstr, "%s/%s", CORRUPT, bnp ? bnp + 1 : Wfile);
  			xmv(Wfile, rqstr);
! 			assert("CMD FILE CORRUPTED", Wfile, narg);
  			Wfile[0] = '\0';
  			goto top;
  		}
***************
*** 392,399 ****
  			}
  			notify(mailopt, W_USER, W_FILE1, Rmtname, &msg[1]);
  			ASSERT(role == MASTER, "WRONG ROLE - SN", CNULL, role);
! 			if (msg[1] != '4')
! 				unlinkdf(W_DFILE);
  			goto top;
  		}
  
--- 392,398 ----
  			}
  			notify(mailopt, W_USER, W_FILE1, Rmtname, &msg[1]);
  			ASSERT(role == MASTER, "WRONG ROLE - SN", CNULL, role);
! 			unlinkdf(W_DFILE);
  			goto top;
  		}
  
***************
*** 431,437 ****
  			bnp = rindex(Wfile, '/');
  			sprintf(rqstr, "%s/%s", CORRUPT, bnp ? bnp + 1 : Wfile);
  			xmv(Wfile, rqstr);
! 			logent(Wfile, "CMD FILE CORRUPTED");
  			Wfile[0] = '\0';
  			goto top;
  		}
--- 430,436 ----
  			bnp = rindex(Wfile, '/');
  			sprintf(rqstr, "%s/%s", CORRUPT, bnp ? bnp + 1 : Wfile);
  			xmv(Wfile, rqstr);
! 			assert("CMD FILE CORRUPTED",Wfile, i);
  			Wfile[0] = '\0';
  			goto top;
  		}
***************
*** 606,612 ****
  			bnp = rindex(Wfile, '/');
  			sprintf(rqstr, "%s/%s", CORRUPT, bnp ? bnp + 1 : Wfile);
  			xmv(Wfile, rqstr);
! 			logent(Wfile, "CMD FILE CORRUPTED");
  			Wfile[0] = '\0';
  			goto top;
  		}
--- 605,611 ----
  			bnp = rindex(Wfile, '/');
  			sprintf(rqstr, "%s/%s", CORRUPT, bnp ? bnp + 1 : Wfile);
  			xmv(Wfile, rqstr);
! 			assert("CMD FILE CORRUPTED", Wfile, i);
  			Wfile[0] = '\0';
  			goto top;
  		}
*** condevs.c	Fri Nov  7 17:51:02 1986
--- ../nuucp/condevs.c	Sun May 18 23:45:30 1986
***************
*** 315,324 ****
  			}
  		}
  
! 		if (mlock(dev.D_line) == FAIL) {
! 			acustatus++;
  			continue;
! 		}
  		if (acustatus < 1)
  			acustatus = 1;	/* has been found */
  #ifdef DIALINOUT
--- 318,326 ----
  			}
  		}
  
! 		if (mlock(dev.D_line) == FAIL)
  			continue;
! 
  		if (acustatus < 1)
  			acustatus = 1;	/* has been found */
  #ifdef DIALINOUT
*** conn.c	Fri Nov  7 17:51:05 1986
--- ../nuucp/conn.c	Mon Jul 28 18:36:31 1986
***************
*** 61,70 ****
   */
  #define PCP_BAUD	3
  #define PCP_PHONE	4
! #define PCP_CALLBACK	8
! #define PCP_CITY	10
! #define PCP_RPHONE	12
! #define NPCFIELDS	15
  
  static char *PCFlds[] = {
  	"PC-PURSUIT",
--- 61,70 ----
   */
  #define PCP_BAUD	3
  #define PCP_PHONE	4
! #define PCP_CITY	14
! #define PCP_PASSWORD	16
! #define PCP_RPHONE	20
! #define NPCFIELDS	23
  
  static char *PCFlds[] = {
  	"PC-PURSUIT",
***************
*** 71,91 ****
  	"Any",
  	"ACU",
  	"1200",
! 	CNULL,	/* <--- **** Welcome to Telenet PC Pursuit ***** */
  	"ABORT",
! 	"Good",	/* Abort of Good bye! */
! 	")", 	/* <--- Enter your 7-digit phone number (xxx-xxxx) */
! 	CNULL,	/* ---> 528-1234 */
! 	"call?", 	/* <--- Which city do you wish to call? */
! 	CNULL,	/* ---> CHICAGO */
! 	")", 	/* <--- Enter the phone number you wish to call (xxx-xxxx) */
! 	CNULL,	/* ---> 690-7171 */
! 	"R)?", 	/* <--- You are #1 in the queue. Do you want to wait, or Restart (Y/N/R)? */
! 	"Y",
! 	CNULL 	/* <--- .....Good Bye! */
  };
  
! static char PCP_brand[20];
  
  /*
   *	place a telephone call to system and login, etc.
--- 71,99 ----
  	"Any",
  	"ACU",
  	"1200",
! 	CNULL,
! 	CNULL,
! 	"P_ZERO",	/* Telenet insists on zero parity */
  	"ABORT",
! 	"BUSY",		/* Abort on Busy Signal */
! 	CNULL,
! 	"\\d\\d\\r\\d\\r",	/* Get telenet's attention */
! 	"TERMINAL=~3-\r-TERM~3-\r-TERM~5", 	/* Terminal type ? */
! 	"\\r",
! 	"@",		/* telenet's prompt */
! 	"c\sdial312/21,telenetloginstring", /* overwritten later */
! 	"PASSWORD",
! 	CNULL,		/* telenet password */
! 	"CONNECTED",	/* We're now talking to a Hayes in the remote city */
! 	"ATZ",		/* Reset it */
! 	"OK",
! 	"ATDT6907171", /* overwritten */
! 	"CONNECT",	
! 	"\\d\\r",		/* We're in !*/
! 	CNULL,
  };
  
! static char PCP_brand[25];
  
  /*
   *	place a telephone call to system and login, etc.
***************
*** 141,146 ****
--- 149,155 ----
  			FILE *dfp;
  			int status;
  			static struct Devices dev;
+ 
  			dfp = fopen(DEVFILE, "r");
  			ASSERT(dfp != NULL, "Can't open", DEVFILE, 0);
  			while ((status=rddev(dfp, &dev)) != FAIL
***************
*** 156,180 ****
  			}
  			PCFlds[PCP_BAUD] = dev.D_class;
  			PCFlds[PCP_PHONE] = dev.D_calldev;
! 			PCFlds[PCP_CALLBACK] = dev.D_arg[D_CHAT];
! 			PCFlds[PCP_CITY] = Flds[F_CLASS];
! 			PCFlds[PCP_RPHONE] = Flds[F_PHONE];
  			strncpy(PCP_brand, dev.D_brand, sizeof(PCP_brand));
! 			if ((fcode = getto(PCFlds)) < 0)
  				continue;
  			Dcf = fcode;
  			fcode = login(NPCFIELDS, PCFlds, Dcf);
! 			clsacu(); /* Hang up, they'll call back */
! 			if (fcode != SUCCESS) {
! 				fcode = CF_DIAL;
! 				continue;
! 			}
! 			Flds[F_CLASS] = dev.D_class;
! 			Flds[F_PHONE] = dev.D_line;
! 			
! 		} /* end PC Pursuit */
! 		if ((fcode = getto(Flds)) > 0) 
  			break;
  	}
  
  	if (nf <= 0) {
--- 165,190 ----
  			}
  			PCFlds[PCP_BAUD] = dev.D_class;
  			PCFlds[PCP_PHONE] = dev.D_calldev;
! 			sprintf(PCFlds[PCP_CITY], "c\\sdial%s/12,%s",
! 				Flds[F_CLASS], dev.D_arg[D_CHAT]);
! 			PCFlds[PCP_PASSWORD] = dev.D_line;
! 			strncpy(&PCFlds[PCP_RPHONE][4], Flds[F_PHONE], 7);
  			strncpy(PCP_brand, dev.D_brand, sizeof(PCP_brand));
! 			if ((fcode = getto(PCFlds)) < 0) {
! 				rmlock(PCP);
  				continue;
+ 			}
  			Dcf = fcode;
  			fcode = login(NPCFIELDS, PCFlds, Dcf);
! 			if (fcode == SUCCESS)
! 				break;
! 			fcode = CF_DIAL;
! 			rmlock(PCP);
! 			/* end PC Pursuit */
! 		} else if ((fcode = getto(Flds)) > 0)  {
! 			Dcf = fcode;
  			break;
+ 		}
  	}
  
  	if (nf <= 0) {
***************
*** 182,201 ****
  		return fcode ? fcode : nf;
  	}
  
- 	Dcf = fcode;
  
- 	if (fcode >= 0 && snccmp(LineType, PCP) == SAME) {
- 		AbortOn = "Good";	/* .... Good Bye */
- 		fcode = expect("****~300", Dcf);
- 		if (fcode != SUCCESS) {
- 			DEBUG(4, "\nexpect timed out\n", CNULL);
- 			fcode = CF_DIAL;
- 		}
- 	}
  	if (fcode >= 0) {
  		DEBUG(4, "login %s\n", "called");
! 		fcode = login(nf, Flds, Dcf);
! 	}
  	if (fcode < 0) {
  		clsacu();
  		if (fcode == ABORT) {
--- 192,201 ----
  		return fcode ? fcode : nf;
  	}
  
  
  	if (fcode >= 0) {
  		DEBUG(4, "login %s\n", "called");
! 		fcode = login(nf, Flds, Dcf); }
  	if (fcode < 0) {
  		clsacu();
  		if (fcode == ABORT) {
***************
*** 443,449 ****
  				sendthem(altern, fn);
  			} else
  				if (ok == ABORT) {
! 					logent("LOGIN ABORTED", _FAILED);
  					return ABORT;
  				}
  		}
--- 443,451 ----
  				sendthem(altern, fn);
  			} else
  				if (ok == ABORT) {
! 					char sbuf[MAXFULLNAME];
! 					sprintf(sbuf, "LOGIN ABORTED on \"%s\"",						AbortOn);
! 					logent(sbuf, _FAILED);
  					return ABORT;
  				}
  		}
*** gnsys.c	Fri Nov  7 17:51:06 1986
--- ../nuucp/gnsys.c	Sun May 18 23:43:50 1986
***************
*** 1,5 ****
  #ifndef lint
! static char sccsid[] = "@(#)gnsys.c	5.4 (Berkeley) 6/20/85";
  #endif
  
  #include "uucp.h"
--- 1,5 ----
  #ifndef lint
! static char sccsid[] = "%W%	%G%";
  #endif
  
  #include "uucp.h"
***************
*** 25,45 ****
   *		SUCCESS  -  no more names
   *		FAIL  -  bad directory
   */
- 
  gnsys(sname, dir, pre)
  char *sname, *dir, pre;
  {
! 	register char *s, *p1, *p2;
! 	char px[3];
  	static char *list[LSIZE];
! 	static int nitem=0, n=0, base=0;
! 	char systname[NAMESIZE], filename[NAMESIZE];
! 	DIR *dirp;
  
  retry:
- 	px[0] = pre;
- 	px[1] = '.';
- 	px[2] = '\0';
  	if (nitem == base) {
  		/* get list of systems with work */
  		int i;
--- 25,40 ----
   *		SUCCESS  -  no more names
   *		FAIL  -  bad directory
   */
  gnsys(sname, dir, pre)
  char *sname, *dir, pre;
  {
! 	register DIR *dirp;
! 	register struct direct *dentp;
  	static char *list[LSIZE];
! 	static int nitem = 0, n = 0, base = 0;
! 	char systname[NAMESIZE];
  
  retry:
  	if (nitem == base) {
  		/* get list of systems with work */
  		int i;
***************
*** 47,58 ****
  		ASSERT(dirp != NULL, "BAD DIRECTORY", dir, 0);
  		for (i = base; i < LSIZE; i++)
  			list[i] = NULL;
! 		while (gnamef(dirp, filename) != 0) {
! 			if (!prefix(px, filename))
  				continue;
! 			p2 = filename + strlen(filename)
! 				- WSUFSIZE;
! 			p1 = filename + strlen(px);
  			for(s = systname; p1 <= p2; p1++)
  				*s++ = *p1;
  			*s = '\0';
--- 42,53 ----
  		ASSERT(dirp != NULL, "BAD DIRECTORY", dir, 0);
  		for (i = base; i < LSIZE; i++)
  			list[i] = NULL;
! 		while (dentp = readdir(dirp)) {
! 			register char *s, *p1, *p2;
! 			if (dentp->d_name[0] != pre || dentp->d_name[1] != '.')
  				continue;
! 			p2 = dentp->d_name + dentp->d_namlen - WSUFSIZE;
! 			p1 = dentp->d_name + 2;
  			for(s = systname; p1 <= p2; p1++)
  				*s++ = *p1;
  			*s = '\0';
***************
*** 59,67 ****
  			if (systname[0] == '\0')
  				continue;
  			nitem = srchst(systname, list, nitem);
! 			if (LSIZE <= nitem) break;
  		}
- 
  		closedir(dirp);
  	}
  
--- 54,62 ----
  			if (systname[0] == '\0')
  				continue;
  			nitem = srchst(systname, list, nitem);
! 			if (LSIZE <= nitem)
! 				break;
  		}
  		closedir(dirp);
  	}
  
***************
*** 71,77 ****
  				free(list[n]);
  		return SUCCESS;
  	}
! 	while(nitem > n) {
  		/* We only have at most a SYSNSIZE character site name encoded
  		 * in the file. However, we would like to use the full sitename
  		 * if possible. If the number of chars in list[n] is < SYSNSIZE
--- 66,72 ----
  				free(list[n]);
  		return SUCCESS;
  	}
! 	while (nitem > n) {
  		/* We only have at most a SYSNSIZE character site name encoded
  		 * in the file. However, we would like to use the full sitename
  		 * if possible. If the number of chars in list[n] is < SYSNSIZE
***************
*** 113,119 ****
   *	return codes:
   *		n - the number of items in the list
   */
- 
  srchst(name, list, n)
  char *name;
  register char **list;
--- 108,113 ----
*** pk.h	Fri Nov  7 17:51:07 1986
--- ../nuucp/pk.h	Sun May 18 23:43:35 1986
***************
*** 1,4 ****
! /*	pk.h	5.4	86/01/06	*/
  
  struct header {
  	char	sync;
--- 1,4 ----
! /*	%W%	%G%	*/
  
  struct header {
  	char	sync;
***************
*** 22,35 ****
  	struct	header p_ihbuf;	/* input header */
  	struct	header p_ohbuf; /* output header */
  	char	*p_rptr;
- 	char	p_mode;
  	char	**p_ipool;
  	char	p_xcount;	/* # active output buffers */
  	char	p_rcount;
- 	char	p_nout,p_tout;
  	char	p_lpsize;	/* log(psize/32) */
! 	char	p_timer;
! 	char	p_obusy;
  	char	p_srxmit;
  	char	p_rwindow;	/* window size */
  	char	p_swindow;
--- 22,32 ----
  	struct	header p_ihbuf;	/* input header */
  	struct	header p_ohbuf; /* output header */
  	char	*p_rptr;
  	char	**p_ipool;
  	char	p_xcount;	/* # active output buffers */
  	char	p_rcount;
  	char	p_lpsize;	/* log(psize/32) */
! 	char	p_obusy;	/* output busy? for reentrant pkoutput() */
  	char	p_srxmit;
  	char	p_rwindow;	/* window size */
  	char	p_swindow;
*** pk0.c	Fri Nov  7 17:51:08 1986
--- ../nuucp/pk0.c	Sun May 18 23:43:15 1986
***************
*** 1,5 ****
  #ifndef lint
! static char sccsid[] = "@(#)pk0.c	5.7 (Berkeley) 5/30/86";
  #endif
  
  #include "uucp.h"
--- 1,5 ----
  #ifndef lint
! static char sccsid[] = "%W% (Berkeley) %G%";
  #endif
  
  #include "uucp.h"
***************
*** 453,459 ****
  		pkxstart(pk, x, seq);
  		pk->p_os[seq] = bstate;
  		pk->p_state &= ~RXMIT;
- 		pk->p_nout++;
  		goto out;
  	}
  	/*
--- 453,458 ----
***************
*** 461,467 ****
  	 * and transmission buffers are languishing
  	 */
  	if (pk->p_xcount) {
- 		pk->p_timer = 2;
  		pk->p_state |= WAITO;
  	} else
  		pk->p_state &= ~WAITO;
--- 460,465 ----
***************
*** 489,501 ****
  	 * try to flush output
  	 */
  	i = 0;
- 	pk->p_timer = 2;
  	while (pk->p_xcount && pk->p_state&LIVE) {
  		if (pk->p_state&(RCLOSE+DOWN) || ++i > 2)
  			break;
  		pkoutput(pk);
  	}
- 	pk->p_timer = 0;
  	pk->p_state |= DOWN;
  
  	/*
--- 487,497 ----
***************
*** 504,510 ****
  	i = 0;
  	while ((pk->p_state&RCLOSE)==0 && i<2) {
  		pk->p_msg = M_CLOSE;
- 		pk->p_timer = 2;
  		pkoutput(pk);
  		i++;
  	}
--- 500,505 ----
***************
*** 538,544 ****
  		char buf[256];
  
  		sprintf(buf, "PK0: rc %d rw %d", rcheck, pk->p_rwindow);
! 		logent(buf, "pkclose rcheck != p_rwindow");
  	}
  	free((char *)pk);
  }
--- 533,539 ----
  		char buf[256];
  
  		sprintf(buf, "PK0: rc %d rw %d", rcheck, pk->p_rwindow);
! 		assert(buf, Rmtname, 0);
  	}
  	free((char *)pk);
  }
*** pk1.c	Fri Nov  7 17:51:10 1986
--- ../nuucp/pk1.c	Sun Nov  2 21:12:49 1986
***************
*** 1,5 ****
  #ifndef lint
! static char sccsid[] = "@(#)pk1.c	5.9 (Berkeley) 5/30/86";
  #endif
  
  #include <signal.h>
--- 1,5 ----
  #ifndef lint
! static char sccsid[] = "%W% (Berkeley) %G%";
  #endif
  
  #include <signal.h>
***************
*** 196,202 ****
  		return;
  	}
  	if (k && pksizes[k] == pk->p_rsize) {
! 		pk->p_rpr = (h->cntl >> 3) & MOD8;
  		pksack(pk);
  		bp = pk->p_ipool;
  		if (bp == NULL) {
--- 196,203 ----
  		return;
  	}
  	if (k && pksizes[k] == pk->p_rsize) {
! 		pk->p_rpr = h->cntl & MOD8;
! 		DEBUG(7, "end pksack 0%o\n", pk->p_rpr);
  		pksack(pk);
  		bp = pk->p_ipool;
  		if (bp == NULL) {
*** uuclean.c	Fri Nov  7 17:51:11 1986
--- ../nuucp/uuclean.c	Sun May 18 23:44:33 1986
***************
*** 1,5 ****
  #ifndef lint
! static char sccsid[] = "@(#)uuclean.c	5.6 (Berkeley) 10/9/85";
  #endif
  
  #include <signal.h>
--- 1,5 ----
  #ifndef lint
! static char sccsid[] = "%W%	%G%";
  #endif
  
  #include <signal.h>
***************
*** 39,49 ****
  main(argc, argv)
  char *argv[];
  {
! 	DIR *dirp;
! 	char file[NAMESIZE];
  	time_t nomtime, ptime;
  	struct stat stbuf;
! 	int mflg=0;
  
  	strcpy(Progname, "uuclean");
  	uucpname(Myname);
--- 39,49 ----
  main(argc, argv)
  char *argv[];
  {
! 	register DIR *dirp;
! 	register struct direct *dentp;
  	time_t nomtime, ptime;
  	struct stat stbuf;
! 	int mflg = 0;
  
  	strcpy(Progname, "uuclean");
  	uucpname(Myname);
***************
*** 89,100 ****
  	}
  
  	time(&ptime);
! 	while (gnamef(dirp, file)) {
! 		if (checkprefix && !chkpre(file))
  			continue;
  
! 		if (stat(file, &stbuf) == -1) {
! 			DEBUG(4, "stat on %s failed\n", file);
  			continue;
  		}
  
--- 89,100 ----
  	}
  
  	time(&ptime);
! 	while (dentp = readdir(dirp)) {
! 		if (checkprefix && !chkpre(dentp->d_name))
  			continue;
  
! 		if (stat(dentp->d_name, &stbuf) == -1) {
! 			DEBUG(4, "stat on %s failed\n", dentp->d_name);
  			continue;
  		}
  
***************
*** 103,114 ****
  			continue;
  		if ((ptime - stbuf.st_mtime) < nomtime)
  			continue;
! 		if (file[0] == CMDPRE)
! 			notfyuser(file);
! 		DEBUG(4, "unlink file %s\n", file);
! 		unlink(file);
  		if (mflg)
! 			sdmail(file, stbuf.st_uid);
  	}
  
  	closedir(dirp);
--- 103,114 ----
  			continue;
  		if ((ptime - stbuf.st_mtime) < nomtime)
  			continue;
! 		if (dentp->d_name[0] == CMDPRE)
! 			notfyuser(dentp->d_name);
! 		DEBUG(4, "unlink file %s\n", dentp->d_name);
! 		unlink(dentp->d_name);
  		if (mflg)
! 			sdmail(dentp->d_name, stbuf.st_uid);
  	}
  
  	closedir(dirp);
*** uucp.c	Fri Nov  7 17:51:12 1986
--- ../nuucp/uucp.c	Sun May 18 23:42:37 1986
***************
*** 260,265 ****
--- 260,267 ----
  			return FAIL;
  		}
  		xcp(file1, file2);
+ 		/* With odd umask() might not be able to read it himself */
+ 		(void) chmod(file2, 0666);
  		logent("WORK HERE", "DONE");
  		return SUCCESS;
  	case 1:
*** uuq.c	Fri Nov  7 17:51:14 1986
--- ../nuucp/uuq.c	Wed May 28 18:58:39 1986
***************
*** 131,137 ****
  			/* The 80 * njobs is because of the uucp handshaking */
  			minutes = (float)(sp->s_bytes + 80 * sp->s_njobs)/baudrate;
  			hours = minutes/60;
! 			printf(", %d bytes, ", sp->s_bytes);
  			if (minutes > 60){
  				printf("%d hour%s, ",hours,
  					hours > 1 ? "s": "");
--- 131,137 ----
  			/* The 80 * njobs is because of the uucp handshaking */
  			minutes = (float)(sp->s_bytes + 80 * sp->s_njobs)/baudrate;
  			hours = minutes/60;
! 			printf(", %ld bytes, ", sp->s_bytes);
  			if (minutes > 60){
  				printf("%d hour%s, ",hours,
  					hours > 1 ? "s": "");
***************
*** 144,151 ****
  		if (hflag)
  			continue;
  		/* sort them babies! */
! 		sortjob = (struct job **)calloc(sp->s_njobs, sizeof (struct job
!  *));
  		for (i=0, jp=sp->s_jobp; i < sp->s_njobs; i++, jp=jp->j_jobp)
  			sortjob[i] = jp;
  		qsort(sortjob, sp->s_njobs, sizeof (struct job *), jcompare);
--- 144,150 ----
  		if (hflag)
  			continue;
  		/* sort them babies! */
! 		sortjob = (struct job **)calloc(sp->s_njobs, sizeof (struct job *));
  		for (i=0, jp=sp->s_jobp; i < sp->s_njobs; i++, jp=jp->j_jobp)
  			sortjob[i] = jp;
  		qsort(sortjob, sp->s_njobs, sizeof (struct job *), jcompare);
***************
*** 152,158 ****
  		for (i = 0; i < sp->s_njobs; i++) {
  			jp = sortjob[i];
  			if (lflag) {
! 				printf("%s %2d %-*s%7d%5.1f %-12.12s %c %.*s\n",
  	jp->j_jobno, jp->j_files, Maxulen, jp->j_user, jp->j_bytes, jp->j_bytes/baudrate,
  	ctime(&jp->j_date) + 4, jp->j_flags, sizeof (jp->j_fname), jp->j_fname
  				);
--- 151,157 ----
  		for (i = 0; i < sp->s_njobs; i++) {
  			jp = sortjob[i];
  			if (lflag) {
! 				printf("%s %2d %-*s%7ld%5.1f %-12.12s %c %.*s\n",
  	jp->j_jobno, jp->j_files, Maxulen, jp->j_user, jp->j_bytes, jp->j_bytes/baudrate,
  	ctime(&jp->j_date) + 4, jp->j_flags, sizeof (jp->j_fname), jp->j_fname
  				);
*** uuxqt.c	Fri Nov  7 17:51:16 1986
--- ../nuucp/uuxqt.c	Thu Jul  3 13:46:31 1986
***************
*** 18,23 ****
--- 18,25 ----
  char *p;\
  for (p = d; *p != '\0';) *cmdp++ = *p++; *cmdp++ = ' '; *cmdp = '\0';}
  
+ extern char Filent[LLEN][NAMESIZE];
+ 
  /*
   *	uuxqt will execute commands set up by a uux command,
   *	usually from a remote machine - set by uucp.
***************
*** 406,412 ****
  register char *file;
  {
  	char pre[3];
! 	int rechecked;
  	time_t ystrdy;		/* yesterday */
  	struct stat stbuf;	/* for X file age */
  
--- 408,414 ----
  register char *file;
  {
  	char pre[3];
! 	register int rechecked, i;
  	time_t ystrdy;		/* yesterday */
  	struct stat stbuf;	/* for X file age */
  
***************
*** 415,421 ****
  	pre[2] = '\0';
  	rechecked = 0;
  retry:
! 	if (!gtwrkf(Spool, file)) {
  		if (rechecked)
  			return 0;
  		rechecked = 1;
--- 417,424 ----
  	pre[2] = '\0';
  	rechecked = 0;
  retry:
! 	if (Nfiles-- <= 0) {
! 		Nfiles = 0;
  		if (rechecked)
  			return 0;
  		rechecked = 1;
***************
*** 423,428 ****
--- 426,435 ----
  		if (!iswrk(file, "get", Spool, pre))
  			return 0;
  	}
+ 	sprintf(file, "%s/%s", Spool, Filent[0]);
+ 	for (i=0; i<Nfiles;i++)
+ 		strcpy(Filent[i], Filent[i+1]);
+ 
  	DEBUG(4, "file - %s\n", file);
  	/* skip spurious subdirectories */
  	if (strcmp(pre, file) == SAME)
***************
*** 434,440 ****
  	    time(&ystrdy);
  	    ystrdy -= (4 * 3600L);		/* 4 hours ago */
  	    DEBUG(4, "gtxfile: Nfiles > LLEN/2\n", CNULL);
! 	    while (gtwrkf(Spool, file) && !gotfiles(file)) {
  		if (stat(subfile(file), &stbuf) == 0)
  		    if (stbuf.st_mtime <= ystrdy) {
  			char *bnp, cfilename[NAMESIZE];
--- 441,453 ----
  	    time(&ystrdy);
  	    ystrdy -= (4 * 3600L);		/* 4 hours ago */
  	    DEBUG(4, "gtxfile: Nfiles > LLEN/2\n", CNULL);
! 	    while (Nfiles-- > 0) {
! 		sprintf(file, "%s/%s", Spool, Filent[0]);
! 		for (i=0; i<Nfiles; i++)
! 			strcpy(Filent[i], Filent[i+1]);
! 
! 		if (gotfiles(file))
! 			return 1;
  		if (stat(subfile(file), &stbuf) == 0)
  		    if (stbuf.st_mtime <= ystrdy) {
  			char *bnp, cfilename[NAMESIZE];
***************
*** 444,452 ****
  			sprintf(cfilename, "%s/%s", CORRUPT,
  				bnp ? bnp + 1 : subfile(file));
  			xmv(subfile(file), cfilename);
! 			logent(file, "X. FILE CORRUPTED");
  		    }
  	    }
  	    DEBUG(4, "iswrk\n", CNULL);
  	    if (!iswrk(file, "get", Spool, pre))
  		return 0;
--- 457,466 ----
  			sprintf(cfilename, "%s/%s", CORRUPT,
  				bnp ? bnp + 1 : subfile(file));
  			xmv(subfile(file), cfilename);
! 			assert("X. FILE MISSING FILES", file, 0);
  		    }
  	    }
+  	    Nfiles = 0;
  	    DEBUG(4, "iswrk\n", CNULL);
  	    if (!iswrk(file, "get", Spool, pre))
  		return 0;
***************
*** 675,681 ****
  	int status, f;
  	int uid, pid, ret;
  	char path[MAXFULLNAME];
! 	char *args[20];
  	extern int errno;
  
  	if (fi == NULL)
--- 689,695 ----
  	int status, f;
  	int uid, pid, ret;
  	char path[MAXFULLNAME];
! 	char *args[128];
  	extern int errno;
  
  	if (fi == NULL)
***************
*** 683,689 ****
  	if (fo == NULL)
  		fo = DEVNULL;
  
! 	getargs(cmd, args, 20);
  	DEBUG(3, "shio - %s\n", cmd);
  #ifdef SIGCHLD
  	signal(SIGCHLD, SIG_IGN);
--- 697,703 ----
  	if (fo == NULL)
  		fo = DEVNULL;
  
! 	getargs(cmd, args, 128);
  	DEBUG(3, "shio - %s\n", cmd);
  #ifdef SIGCHLD
  	signal(SIGCHLD, SIG_IGN);