more fixes from rick adams
[unix-history] / usr / src / usr.bin / uucp / uucico / pk1.c
index 8811e35..93e57fa 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)pk1.c      5.6 (Berkeley) %G%";
+static char sccsid[] = "@(#)pk1.c      5.7 (Berkeley) %G%";
 #endif
 
 #include <signal.h>
 #endif
 
 #include <signal.h>
@@ -18,9 +18,9 @@ int iomask[2];
 #endif VMS
 
 #define PKMAXSTMSG 40
 #endif VMS
 
 #define PKMAXSTMSG 40
-#define        PKTIME  25
+#define        MAXPKTIME 32    /* was 16 */
 #define CONNODATA 10
 #define CONNODATA 10
-#define NTIMEOUT 10
+#define MAXTIMEOUT 32
 
 extern int errno;
 extern int Retries;
 
 extern int errno;
 extern int Retries;
@@ -30,6 +30,7 @@ extern        char *malloc();
 
 int Connodata = 0;
 int Ntimeout = 0;
 
 int Connodata = 0;
 int Ntimeout = 0;
+int pktimeout = 4;
 /*
  * packet driver support routines
  *
 /*
  * packet driver support routines
  *
@@ -49,8 +50,6 @@ int ifn, ofn;
        register char **bp;
        register int i;
 
        register char **bp;
        register int i;
 
-       if (++pkactive >= NPLINES)
-               return NULL;
        if ((pk = (struct pack *) malloc(sizeof (struct pack))) == NULL)
                return NULL;
        bzero((caddr_t) pk, sizeof (struct pack));
        if ((pk = (struct pack *) malloc(sizeof (struct pack))) == NULL)
                return NULL;
        bzero((caddr_t) pk, sizeof (struct pack));
@@ -65,8 +64,10 @@ int ifn, ofn;
                *bp = (char *) pk->p_ipool;
                pk->p_ipool = bp;
        }
                *bp = (char *) pk->p_ipool;
                pk->p_ipool = bp;
        }
-       if (i == 0)
+       if (i == 0) {
+               DEBUG(1, "pkopen: can't malloc i = 0\n", CNULL);
                return NULL;
                return NULL;
+       }
        pk->p_rwindow = i;
 
        /* start synchronization */
        pk->p_rwindow = i;
 
        /* start synchronization */
@@ -77,8 +78,10 @@ int ifn, ofn;
                        break;
                }
        }
                        break;
                }
        }
-       if (i >= NPLINES)
+       if (i >= NPLINES) {
+               DEBUG(1,"pkopen: i>=NPLINES\n", CNULL);
                return NULL;
                return NULL;
+       }
        pkoutput(pk);
 
        for (i = 0; i < PKMAXSTMSG; i++) {
        pkoutput(pk);
 
        for (i = 0; i < PKMAXSTMSG; i++) {
@@ -86,8 +89,10 @@ int ifn, ofn;
                if ((pk->p_state & LIVE) != 0)
                        break;
        }
                if ((pk->p_state & LIVE) != 0)
                        break;
        }
-       if (i >= PKMAXSTMSG)
+       if (i >= PKMAXSTMSG) {
+               DEBUG(1, "pkopen: i>= PKMAXSTMSG\n", CNULL);
                return NULL;
                return NULL;
+       }
 
        pkreset(pk);
        return pk;
 
        pkreset(pk);
        return pk;
@@ -113,25 +118,23 @@ int pksizes[] = {
        1, 32, 64, 128, 256, 512, 1024, 2048, 4096, 1
 };
 
        1, 32, 64, 128, 256, 512, 1024, 2048, 4096, 1
 };
 
-#define GETRIES 5
+#define GETRIES 10
 /*
  * Pseudo-dma byte collection.
  */
 
 /*
  * Pseudo-dma byte collection.
  */
 
-pkgetpack(ipk)
-struct pack *ipk;
+pkgetpack(pk)
+register struct pack *pk;
 {
        int k, tries, noise;
        register char *p;
 {
        int k, tries, noise;
        register char *p;
-       register struct pack *pk;
        register struct header *h;
        unsigned short sum;
        int ifn;
        char **bp;
        char hdchk;
 
        register struct header *h;
        unsigned short sum;
        int ifn;
        char **bp;
        char hdchk;
 
-       pk = ipk;
-       if ((pk->p_state & DOWN) || Connodata > CONNODATA || Ntimeout > NTIMEOUT)
+       if ((pk->p_state & DOWN) || Connodata > CONNODATA || Ntimeout > MAXTIMEOUT)
                pkfail();
        ifn = pk->p_ifn;
 
                pkfail();
        ifn = pk->p_ifn;
 
@@ -142,10 +145,11 @@ struct pack *ipk;
                        if (*p++ == SYN) {
                                if (pkcget(ifn, p, HDRSIZ-1) == SUCCESS)
                                        break;
                        if (*p++ == SYN) {
                                if (pkcget(ifn, p, HDRSIZ-1) == SUCCESS)
                                        break;
-                       } else
-                               if (noise++ < (3*pk->p_rsize))
+                       } else {
+                               if (noise++ < 10 || noise < (3*pk->p_rsize))
                                        continue;
                                        continue;
-                       DEBUG(4, "Noisy line - set up RXMIT", "");
+                       }
+                       DEBUG(4, "Noisy line - set up RXMIT\n", CNULL);
                        noise = 0;
                }
                /* set up retransmit or REJ */
                        noise = 0;
                }
                /* set up retransmit or REJ */
@@ -157,12 +161,6 @@ struct pack *ipk;
                if ((pk->p_state & LIVE) == LIVE)
                        pk->p_state |= RXMIT;
                pkoutput(pk);
                if ((pk->p_state & LIVE) == LIVE)
                        pk->p_state |= RXMIT;
                pkoutput(pk);
-
-               if (*p != SYN)
-                       continue;
-               p++;
-               if (pkcget(ifn, p, HDRSIZ - 1) == SUCCESS)
-                       break;
        }
        if (tries >= GETRIES) {
                DEBUG(4, "tries = %d\n", tries);
        }
        if (tries >= GETRIES) {
                DEBUG(4, "tries = %d\n", tries);
@@ -170,7 +168,7 @@ struct pack *ipk;
        }
 
        Connodata++;
        }
 
        Connodata++;
-       h = (struct header * ) &pk->p_ihbuf;
+       h = (struct header *) &pk->p_ihbuf;
        p = (caddr_t) h;
        hdchk = p[1] ^ p[2] ^ p[3] ^ p[4];
        p += 2;
        p = (caddr_t) h;
        hdchk = p[1] ^ p[2] ^ p[3] ^ p[4];
        p += 2;
@@ -199,19 +197,18 @@ struct pack *ipk;
        if (k && pksizes[k] == pk->p_rsize) {
                pk->p_rpr = h->cntl & MOD8;
                pksack(pk);
        if (k && pksizes[k] == pk->p_rsize) {
                pk->p_rpr = h->cntl & MOD8;
                pksack(pk);
-               Connodata = 0;
                bp = pk->p_ipool;
                if (bp == NULL) {
                        DEBUG(7, "bp NULL %s\n", "");
                        return;
                }
                pk->p_ipool = (char **) *bp;
                bp = pk->p_ipool;
                if (bp == NULL) {
                        DEBUG(7, "bp NULL %s\n", "");
                        return;
                }
                pk->p_ipool = (char **) *bp;
-       } else {
+               Connodata = 0;
+       } else
                return;
                return;
-       }
+
        if (pkcget(pk->p_ifn, (char *) bp, pk->p_rsize) == SUCCESS)
                pkdata(h->cntl, h->sum, pk, (char **) bp);
        if (pkcget(pk->p_ifn, (char *) bp, pk->p_rsize) == SUCCESS)
                pkdata(h->cntl, h->sum, pk, (char **) bp);
-       Ntimeout = 0;
 }
 
 pkdata(c, sum, pk, bp)
 }
 
 pkdata(c, sum, pk, bp)
@@ -247,8 +244,6 @@ slot:
        pk->p_ib[x] = (char *)bp;
 }
 
        pk->p_ib[x] = (char *)bp;
 }
 
-
-
 /*
  * setup input transfers
  */
 /*
  * setup input transfers
  */
@@ -274,8 +269,7 @@ register x;
        if (x < 0) {
                *p++ = hdchk = 9;
                checkword = cntl;
        if (x < 0) {
                *p++ = hdchk = 9;
                checkword = cntl;
-       }
-       else {
+       } else {
                *p++ = hdchk = pk->p_lpsize;
                checkword = pk->p_osum[x] ^ (unsigned)(cntl & 0377);
        }
                *p++ = hdchk = pk->p_lpsize;
                checkword = pk->p_osum[x] ^ (unsigned)(cntl & 0377);
        }
@@ -296,15 +290,19 @@ register x;
                        logent("PKXSTART write failed", sys_errlist[errno]);
                        longjmp(Sjbuf, 4);
                }
                        logent("PKXSTART write failed", sys_errlist[errno]);
                        longjmp(Sjbuf, 4);
                }
-       }
-       else {
-               char buf[PKMAXBUF + HDRSIZ], *b;
+       } else {
+               char buf[PKMAXBUF + HDRSIZ + TAILSIZE], *b;
                int i;
                for (i = 0, b = buf; i < HDRSIZ; i++)
                        *b++ = *p++;
                for (i = 0, p = pk->p_ob[x]; i < pk->p_xsize; i++)
                        *b++ = *p++;
                int i;
                for (i = 0, b = buf; i < HDRSIZ; i++)
                        *b++ = *p++;
                for (i = 0, p = pk->p_ob[x]; i < pk->p_xsize; i++)
                        *b++ = *p++;
-               if (write(pk->p_ofn, buf, pk->p_xsize + HDRSIZ) != (HDRSIZ + pk->p_xsize)) {
+#if TAILSIZE != 0
+               for (i = 0; i < TAILSIZE; i++)
+                       *b++ = '\0';
+#endif TAILSIZE
+               if (write(pk->p_ofn, buf, pk->p_xsize + HDRSIZ + TAILSIZE)
+                   != (HDRSIZ + TAILSIZE + pk->p_xsize)) {
                        alarm(0);
                        logent("PKXSTART write failed", sys_errlist[errno]);
                        longjmp(Sjbuf, 5);
                        alarm(0);
                        logent("PKXSTART write failed", sys_errlist[errno]);
                        longjmp(Sjbuf, 5);
@@ -335,11 +333,8 @@ int count, flag;
 }
 
 
 }
 
 
-/***
- *     pkcget(fn, b, n)        get n characters from input
- *     char *b;                - buffer for characters
- *     int fn;                 - file descriptor
- *     int n;                  - requested number of characters
+/*
+ *     get n characters from input
  *
  *     return codes:
  *             n - number of characters returned
  *
  *     return codes:
  *             n - number of characters returned
@@ -354,8 +349,8 @@ cgalarm()
 
 pkcget(fn, b, n)
 int fn;
 
 pkcget(fn, b, n)
 int fn;
-register int n;
 register char *b;
 register char *b;
+register int n;
 {
        register int ret;
        extern int linebaudrate;
 {
        register int ret;
        extern int linebaudrate;
@@ -371,12 +366,15 @@ register char *b;
 
        if (setjmp(Getjbuf)) {
                Ntimeout++;
 
        if (setjmp(Getjbuf)) {
                Ntimeout++;
+               pktimeout += 2;
+               if (pktimeout > MAXPKTIME)
+                       pktimeout = MAXPKTIME;
                DEBUG(4, "pkcget: alarm %d\n", Ntimeout);
                return FAIL;
        }
        signal(SIGALRM, cgalarm);
 
                DEBUG(4, "pkcget: alarm %d\n", Ntimeout);
                return FAIL;
        }
        signal(SIGALRM, cgalarm);
 
-       alarm(PKTIME);
+       alarm(pktimeout);
        while (n > 0) {
 #ifdef BSD4_2
                if (linebaudrate > 0) {
        while (n > 0) {
 #ifdef BSD4_2
                if (linebaudrate > 0) {