double INMAX and OUTMAX (from thomas@utah-cs)
[unix-history] / usr / src / usr.bin / uucp / uucico / pk0.c
index 166bb61..44ffbe9 100644 (file)
@@ -1,37 +1,21 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)pk0.c      5.1 (Berkeley) %G%";
+static char sccsid[] = "@(#)pk0.c      5.5 (Berkeley) %G%";
 #endif
 
 #endif
 
-extern char    *malloc();
-
-#define USER   1
-#include <stdio.h>
-#ifdef SYSIII
-#include <sys/types.h>
-#endif
-#include "pk.p"
-#include <sys/param.h>
+#include "uucp.h"
 #include "pk.h"
 #include "pk.h"
-#include <sys/buf.h>
-
 
 /*
  * packet driver
  */
 
 
 /*
  * packet driver
  */
 
-char next[8]   ={ 1,2,3,4,5,6,7,0};    /* packet sequence numbers */
-char mask[8]   ={ 1,2,4,010,020,040,0100,0200 };
+char next[8] = { 1, 2, 3, 4, 5, 6, 7, 0};      /* packet sequence numbers */
+char mask[8] = { 1, 2, 4, 010, 020, 040, 0100, 0200 };
 
 struct pack *pklines[NPLINES];
 
 
 struct pack *pklines[NPLINES];
 
-/*
- * Here are a couple of strange variables (rti!trt).
- * pkactive is only incremented in pkopen.
- * perhaps it should be decremented in pkclose?
- * And pkdebug is set in gio.c but never used.
- */
-int    pkactive;
-int    pkdebug;
+#define PKTIME 4
+extern int pktimeout, Ntimeout;
 
 /*
  * receive control messages
 
 /*
  * receive control messages
@@ -39,25 +23,22 @@ int pkdebug;
 pkcntl(c, pk)
 register struct pack *pk;
 {
 pkcntl(c, pk)
 register struct pack *pk;
 {
-register cntl, val;
+       register cntl, val;
 
        val = c & MOD8;
        cntl = (c>>3) & MOD8;
 
 
        val = c & MOD8;
        cntl = (c>>3) & MOD8;
 
-       if ( ! ISCNTL(c) ) {
-               fprintf(stderr, "not cntl\n");
+       if (!ISCNTL(c)) {
+               logent("PK0", "not cntl");
                return;
        }
 
                return;
        }
 
-       if (pk->p_mode & 02)
-               fprintf(stderr, "%o ",c);
        switch(cntl) {
        switch(cntl) {
-
        case INITB:
                val++;
                pk->p_xsize = pksizes[val];
                pk->p_lpsize = val;
        case INITB:
                val++;
                pk->p_xsize = pksizes[val];
                pk->p_lpsize = val;
-               pk->p_bits = DTOM(pk->p_xsize);
+               pk->p_bits = 1;
                if (pk->p_state & LIVE) {
                        pk->p_msg |= M_INITC;
                        break;
                if (pk->p_state & LIVE) {
                        pk->p_msg |= M_INITC;
                        break;
@@ -73,7 +54,6 @@ register cntl, val;
        case INITC:
                if ((pk->p_state&INITab)==INITab) {
                        pk->p_state = LIVE;
        case INITC:
                if ((pk->p_state&INITab)==INITab) {
                        pk->p_state = LIVE;
-                       WAKEUP(&pk->p_state);
                        pk->p_rmsg &= ~M_INITB;
                } else
                        pk->p_msg |= M_INITB;
                        pk->p_rmsg &= ~M_INITB;
                } else
                        pk->p_msg |= M_INITB;
@@ -81,8 +61,8 @@ register cntl, val;
                        pk->p_swindow = val;
                break;
        case INITA:
                        pk->p_swindow = val;
                break;
        case INITA:
-               if (val==0 && pk->p_state&LIVE) {
-                       fprintf(stderr, "alloc change not implemented\n");
+               if (val == 0 && pk->p_state&LIVE) {
+                       logent("PK0", "alloc change not implemented");
                        break;
                }
                if (val) {
                        break;
                }
                if (val) {
@@ -97,50 +77,36 @@ register cntl, val;
                pk->p_msg |= M_RR;
        case RR:
                pk->p_rpr = val;
                pk->p_msg |= M_RR;
        case RR:
                pk->p_rpr = val;
-               if (pksack(pk)==0) {
-                       WAKEUP(&pk->p_ps);
-               }
+               (void) pksack(pk);
                break;
        case SRJ:
                break;
        case SRJ:
-               fprintf(stderr, "srj not implemented\n");
+               logent("PK0", "srj not implemented");
                break;
        case CLOSE:
                pk->p_state = DOWN+RCLOSE;
                break;
        case CLOSE:
                pk->p_state = DOWN+RCLOSE;
-               SIGNAL;
-               WAKEUP(&pk->p_pr);
-               WAKEUP(&pk->p_ps);
-               WAKEUP(&pk->p_state);
                return;
        }
                return;
        }
-out:
        if (pk->p_msg)
                pkoutput(pk);
 }
 
        if (pk->p_msg)
                pkoutput(pk);
 }
 
-
-
 pkaccept(pk)
 register struct pack *pk;
 {
 pkaccept(pk)
 register struct pack *pk;
 {
-register x,seq;
-char m, cntl, *p, imask, **bp;
-int bad,accept,skip,s,t,h,cc;
-unsigned short sum;
-
+       register x, seq;
+       char m, cntl, *p, imask, **bp;
+       int bad, accept, skip, t,  cc;
+       unsigned short sum;
 
        bad = accept = skip = 0;
        /*
         * wait for input
         */
 
        bad = accept = skip = 0;
        /*
         * wait for input
         */
-       LOCK;
        x = next[pk->p_pr];
        x = next[pk->p_pr];
-       while ((imask=pk->p_imap) == 0 && pk->p_rcount==0) {
-               PKGETPKT(pk);
-               SLEEP(&pk->p_pr, PKIPRI);
+       while ((imask=pk->p_imap) == 0 && pk->p_rcount == 0) {
+               pkgetpack(pk);
        }
        pk->p_imap = 0;
        }
        pk->p_imap = 0;
-       UNLOCK;
-
 
        /*
         * determine input window in m.
 
        /*
         * determine input window in m.
@@ -149,24 +115,20 @@ unsigned short sum;
        m = t;
        m |= t>>8;
 
        m = t;
        m |= t>>8;
 
-
        /*
         * mark newly accepted input buffers
         */
        for(x=0; x<8; x++) {
        /*
         * mark newly accepted input buffers
         */
        for(x=0; x<8; x++) {
-
                if ((imask & mask[x]) == 0)
                        continue;
 
                if ((imask & mask[x]) == 0)
                        continue;
 
-               if (((cntl=pk->p_is[x])&0200)==0) {
+               if (((cntl=pk->p_is[x])&0200) == 0) {
                        bad++;
 free:
                        bp = (char **)pk->p_ib[x];
                        bad++;
 free:
                        bp = (char **)pk->p_ib[x];
-                       LOCK;
                        *bp = (char *)pk->p_ipool;
                        pk->p_ipool = bp;
                        pk->p_is[x] = 0;
                        *bp = (char *)pk->p_ipool;
                        pk->p_ipool = bp;
                        pk->p_is[x] = 0;
-                       UNLOCK;
                        continue;
                }
 
                        continue;
                }
 
@@ -183,12 +145,10 @@ free:
                                        goto free;
                                }
                                if (x != seq) {
                                        goto free;
                                }
                                if (x != seq) {
-                                       LOCK;
                                        p = pk->p_ib[x];
                                        pk->p_ib[x] = pk->p_ib[seq];
                                        pk->p_is[x] = pk->p_is[seq];
                                        pk->p_ib[seq] = p;
                                        p = pk->p_ib[x];
                                        pk->p_ib[x] = pk->p_ib[seq];
                                        pk->p_is[x] = pk->p_is[seq];
                                        pk->p_ib[seq] = p;
-                                       UNLOCK;
                                }
                                pk->p_is[seq] = B_MARK;
                                accept++;
                                }
                                pk->p_is[seq] = B_MARK;
                                accept++;
@@ -218,28 +178,19 @@ free:
         * numbers.
         */
        accept = 0;
         * numbers.
         */
        accept = 0;
-       for(x=next[pk->p_pr],t=h= -1; m & mask[x]; x = next[x]) {
+       t = -1;
+       for(x=next[pk->p_pr]; m & mask[x]; x = next[x]) {
                if (pk->p_is[x] & B_MARK)
                        pk->p_is[x] |= B_COPY;
                if (pk->p_is[x] & B_MARK)
                        pk->p_is[x] |= B_COPY;
-       /*  hole code 
-               if (pk->p_is[x] & B_COPY) {
-                       if (h<0 && t>=0)
-                               h = x;
-               } else {
-                       if (t<0)
-                               t = x;
-               }
-       */
+
                if (pk->p_is[x] & B_COPY) {
                        if (t >= 0) {
                                bp = (char **)pk->p_ib[x];
                if (pk->p_is[x] & B_COPY) {
                        if (t >= 0) {
                                bp = (char **)pk->p_ib[x];
-                               LOCK;
                                *bp = (char *)pk->p_ipool;
                                pk->p_ipool = bp;
                                pk->p_is[x] = 0;
                                *bp = (char *)pk->p_ipool;
                                pk->p_ipool = bp;
                                pk->p_is[x] = 0;
-                               UNLOCK;
                                skip++;
                                skip++;
-                       } else 
+                       } else
                                accept++;
                } else {
                        if (t<0)
                                accept++;
                } else {
                        if (t<0)
@@ -256,31 +207,32 @@ free:
        }
 
        pk->p_rcount = accept;
        }
 
        pk->p_rcount = accept;
-       return(accept);
+       return accept;
 }
 
 }
 
-
-pkread(S)
-SDEF;
-{
+/*ARGSUSED*/
+pkread(pk, ibuf, icount)
 register struct pack *pk;
 register struct pack *pk;
-register x,s;
-int is,cc,xfr,count;
-char *cp, **bp;
+char *ibuf;
+int icount;
+{
+       register x;
+       int is, cc, xfr, count;
+       char *cp, **bp;
 
 
-       pk = PADDR;
        xfr = 0;
        count = 0;
        xfr = 0;
        count = 0;
-       while (pkaccept(pk)==0);
-
-
-       while (UCOUNT) {
+       pktimeout = PKTIME;
+       Ntimeout = 0;
+       while (pkaccept(pk) == 0)
+               ;
 
 
+       while (icount) {
                x = next[pk->p_pr];
                is = pk->p_is[x];
 
                if (is & B_COPY) {
                x = next[pk->p_pr];
                is = pk->p_is[x];
 
                if (is & B_COPY) {
-                       cc = MIN(pk->p_isum[x], UCOUNT);
+                       cc = MIN(pk->p_isum[x], icount);
                        if (cc==0 && xfr) {
                                break;
                        }
                        if (cc==0 && xfr) {
                                break;
                        }
@@ -293,19 +245,19 @@ char *cp, **bp;
                                                cp++;
                                }
                        }
                                                cp++;
                                }
                        }
-                       IOMOVE(cp,cc,B_READ);
+                       pkmove(cp, ibuf, cc, B_READ);
+                       ibuf += cc;
+                       icount -= cc;
                        count += cc;
                        xfr++;
                        pk->p_isum[x] -= cc;
                        if (pk->p_isum[x] == 0) {
                                pk->p_pr = x;
                                bp = (char **)pk->p_ib[x];
                        count += cc;
                        xfr++;
                        pk->p_isum[x] -= cc;
                        if (pk->p_isum[x] == 0) {
                                pk->p_pr = x;
                                bp = (char **)pk->p_ib[x];
-                               LOCK;
                                *bp = (char *)pk->p_ipool;
                                pk->p_ipool = bp;
                                pk->p_is[x] = 0;
                                pk->p_rcount--;
                                *bp = (char *)pk->p_ipool;
                                pk->p_ipool = bp;
                                pk->p_is[x] = 0;
                                pk->p_rcount--;
-                               UNLOCK;
                                pk->p_msg |= M_RR;
                        } else {
                                pk->p_rptr = cp+cc;
                                pk->p_msg |= M_RR;
                        } else {
                                pk->p_rptr = cp+cc;
@@ -317,49 +269,44 @@ char *cp, **bp;
                        break;
        }
        pkoutput(pk);
                        break;
        }
        pkoutput(pk);
-       return(count);
+       return count;
 }
 
 }
 
-
-
-
-pkwrite(S)
-SDEF;
-{
+/*ARGSUSED*/
+pkwrite(pk, ibuf, icount)
 register struct pack *pk;
 register struct pack *pk;
-register x;
-int partial;
-caddr_t cp;
-int cc, s, fc, count;
+char *ibuf;
+int icount;
+{
+       register x;
+       int partial;
+       caddr_t cp;
+       int cc, fc, count;
 
 
-       pk = PADDR;
        if (pk->p_state&DOWN || !pk->p_state&LIVE) {
        if (pk->p_state&DOWN || !pk->p_state&LIVE) {
-               SETERROR;
-               return(-1);
+               return -1;
        }
 
        }
 
-       count = UCOUNT;
+       pktimeout = PKTIME;
+       Ntimeout = 0;
+       count = icount;
        do {
        do {
-               LOCK;
                while (pk->p_xcount>=pk->p_swindow)  {
                        pkoutput(pk);
                while (pk->p_xcount>=pk->p_swindow)  {
                        pkoutput(pk);
-                       PKGETPKT(pk);
-                       SLEEP(&pk->p_ps,PKOPRI);
+                       pkgetpack(pk);
                }
                x = next[pk->p_pscopy];
                while (pk->p_os[x]!=B_NULL)  {
                }
                x = next[pk->p_pscopy];
                while (pk->p_os[x]!=B_NULL)  {
-                       PKGETPKT(pk);
-                       SLEEP(&pk->p_ps,PKOPRI);
+                       pkgetpack(pk);
                }
                pk->p_os[x] = B_MARK;
                pk->p_pscopy = x;
                pk->p_xcount++;
                }
                pk->p_os[x] = B_MARK;
                pk->p_pscopy = x;
                pk->p_xcount++;
-               UNLOCK;
 
 
-               cp = pk->p_ob[x] = GETEPACK;
+               cp = pk->p_ob[x] = malloc((unsigned)pk->p_xsize);
                partial = 0;
                partial = 0;
-               if ((int)UCOUNT < pk->p_xsize) {
-                       cc = UCOUNT;
+               if ((int)icount < pk->p_xsize) {
+                       cc = icount;
                        fc = pk->p_xsize - cc;
                        *cp = fc&0177;
                        if (fc > 127) {
                        fc = pk->p_xsize - cc;
                        *cp = fc&0177;
                        if (fc > 127) {
@@ -370,19 +317,21 @@ int cc, s, fc, count;
                        partial = B_SHORT;
                } else
                        cc = pk->p_xsize;
                        partial = B_SHORT;
                } else
                        cc = pk->p_xsize;
-               IOMOVE(cp,cc,B_WRITE);
+               pkmove(cp, ibuf, cc, B_WRITE);
+               ibuf += cc;
+               icount -= cc;
                pk->p_osum[x] = chksum(pk->p_ob[x], pk->p_xsize);
                pk->p_os[x] = B_READY+partial;
                pkoutput(pk);
                pk->p_osum[x] = chksum(pk->p_ob[x], pk->p_xsize);
                pk->p_os[x] = B_READY+partial;
                pkoutput(pk);
-       } while (UCOUNT);
+       } while (icount);
 
 
-       return(count);
+       return count;
 }
 
 pksack(pk)
 register struct pack *pk;
 {
 }
 
 pksack(pk)
 register struct pack *pk;
 {
-register x, i;
+       register x, i;
 
        i = 0;
        for(x=pk->p_ps; x!=pk->p_rpr; ) {
 
        i = 0;
        for(x=pk->p_ps; x!=pk->p_rpr; ) {
@@ -392,36 +341,24 @@ register x, i;
                        pk->p_os[x] = B_NULL;
                        pk->p_state &= ~WAITO;
                        pk->p_xcount--;
                        pk->p_os[x] = B_NULL;
                        pk->p_state &= ~WAITO;
                        pk->p_xcount--;
-                       FREEPACK(pk->p_ob[x], pk->p_bits);
+                       free((char *)pk->p_ob[x]);
                        pk->p_ps = x;
                        pk->p_ps = x;
-                       WAKEUP(&pk->p_ps);
                }
        }
                }
        }
-       return(i);
+       return i;
 }
 
 }
 
-
-
 pkoutput(pk)
 register struct pack *pk;
 {
 pkoutput(pk)
 register struct pack *pk;
 {
-register x,rx;
-int s;
-char bstate;
-int i;
-SDEF;
-int flag;
-
-       flag = 0;
-       ISYSTEM;
-       LOCK;
-       if (pk->p_obusy++ || OBUSY) {
+       register x;
+       int i;
+       char bstate;
+
+       if (pk->p_obusy++) {
                pk->p_obusy--;
                pk->p_obusy--;
-               UNLOCK;
                return;
        }
                return;
        }
-       UNLOCK;
-
 
        /*
         * find seq number and buffer state
 
        /*
         * find seq number and buffer state
@@ -429,22 +366,21 @@ int flag;
         */
        if (pk->p_state&RXMIT)  {
                pk->p_nxtps = next[pk->p_rpr];
         */
        if (pk->p_state&RXMIT)  {
                pk->p_nxtps = next[pk->p_rpr];
-               flag++;
        }
        x = pk->p_nxtps;
        bstate = pk->p_os[x];
 
        }
        x = pk->p_nxtps;
        bstate = pk->p_os[x];
 
-
        /*
         * Send control packet if indicated
         */
        if (pk->p_msg) {
                if (pk->p_msg & ~M_RR || !(bstate&B_READY) ) {
                        x = pk->p_msg;
        /*
         * Send control packet if indicated
         */
        if (pk->p_msg) {
                if (pk->p_msg & ~M_RR || !(bstate&B_READY) ) {
                        x = pk->p_msg;
-                       for(i=0; i<8; i++) 
+                       for(i=0; i<8; i++)
                                if (x&1)
                                if (x&1)
-                                       break; else
-                               x >>= 1;
+                                       break;
+                               else
+                                       x >>= 1;
                        x = i;
                        x <<= 3;
                        switch(i) {
                        x = i;
                        x <<= 3;
                        switch(i) {
@@ -478,7 +414,6 @@ int flag;
         * Don't send data packets if line is marked dead.
         */
        if (pk->p_state&DOWN) {
         * Don't send data packets if line is marked dead.
         */
        if (pk->p_state&DOWN) {
-               WAKEUP(&pk->p_ps);
                goto out;
        }
        /*
                goto out;
        }
        /*
@@ -509,48 +444,38 @@ int flag;
                pk->p_state |= WAITO;
        } else
                pk->p_state &= ~WAITO;
                pk->p_state |= WAITO;
        } else
                pk->p_state &= ~WAITO;
-       WAKEUP(&pk->p_ps);
 out:
        pk->p_obusy = 0;
 }
 
 out:
        pk->p_obusy = 0;
 }
 
-
 /*
  * shut down line by
  *     ignoring new input
  *     letting output drain
  *     releasing space and turning off line discipline
  */
 /*
  * shut down line by
  *     ignoring new input
  *     letting output drain
  *     releasing space and turning off line discipline
  */
-pkclose(S)
-SDEF;
-{
+/*ARGSUSED*/
+pkclose(pk)
 register struct pack *pk;
 register struct pack *pk;
-register i,s,rbits;
-char **bp;
-int rcheck;
-char *p;
-
+{
+       register i;
+       char **bp;
+       int rcheck = 0;
 
 
-       pk = PADDR;
        pk->p_state |= DRAINO;
 
        pk->p_state |= DRAINO;
 
-
        /*
         * try to flush output
         */
        i = 0;
        /*
         * try to flush output
         */
        i = 0;
-       LOCK;
        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 = 2;
        while (pk->p_xcount && pk->p_state&LIVE) {
                if (pk->p_state&(RCLOSE+DOWN) || ++i > 2)
                        break;
                pkoutput(pk);
-               SLEEP(&pk->p_ps,PKOPRI);
        }
        pk->p_timer = 0;
        pk->p_state |= DOWN;
        }
        pk->p_timer = 0;
        pk->p_state |= DOWN;
-       UNLOCK;
-
 
        /*
         * try to exchange CLOSE messages
 
        /*
         * try to exchange CLOSE messages
@@ -560,51 +485,40 @@ char *p;
                pk->p_msg = M_CLOSE;
                pk->p_timer = 2;
                pkoutput(pk);
                pk->p_msg = M_CLOSE;
                pk->p_timer = 2;
                pkoutput(pk);
-               SLEEP(&pk->p_ps, PKOPRI);
                i++;
        }
 
                i++;
        }
 
-
        for(i=0;i<NPLINES;i++)
                if (pklines[i]==pk)  {
                        pklines[i] = NULL;
                }
        for(i=0;i<NPLINES;i++)
                if (pklines[i]==pk)  {
                        pklines[i] = NULL;
                }
-       TURNOFF;
-
 
        /*
         * free space
         */
 
        /*
         * free space
         */
-       rbits = DTOM(pk->p_rsize);
        rcheck = 0;
        for (i=0;i<8;i++) {
        rcheck = 0;
        for (i=0;i<8;i++) {
-               if (pk->p_os[i]!=B_NULL) {
-                       FREEPACK(pk->p_ob[i],pk->p_bits);
+               if (pk->p_os[i] != B_NULL) {
+                       free((char *)pk->p_ob[i]);
                        pk->p_xcount--;
                }
                        pk->p_xcount--;
                }
-               if (pk->p_is[i]!=B_NULL)  {
-                       FREEPACK(pk->p_ib[i],rbits);
+               if (pk->p_is[i] != B_NULL)  {
+                       free((char *)pk->p_ib[i]);
                        rcheck++;
                }
        }
                        rcheck++;
                }
        }
-       LOCK;
        while (pk->p_ipool != NULL) {
                bp = pk->p_ipool;
                pk->p_ipool = (char **)*bp;
                rcheck++;
        while (pk->p_ipool != NULL) {
                bp = pk->p_ipool;
                pk->p_ipool = (char **)*bp;
                rcheck++;
-               FREEPACK(bp, rbits);
+               free((char *)bp);
        }
        }
-       UNLOCK;
-       if (rcheck  != pk->p_rwindow) {
-               fprintf(stderr, "r short %d want %d\n",rcheck,pk->p_rwindow);
-               fprintf(stderr, "rcount = %d\n",pk->p_rcount);
-               fprintf(stderr, "xcount = %d\n",pk->p_xcount);
+       if (rcheck != pk->p_rwindow) {
+               logent("PK0", "pkclose rcheck != p_rwindow");
        }
        }
-       FREEPACK((caddr_t)pk, npbits);
+       free((char *)pk);
 }
 
 }
 
-
-
 pkreset(pk)
 register struct pack *pk;
 {
 pkreset(pk)
 register struct pack *pk;
 {
@@ -613,58 +527,23 @@ register struct pack *pk;
        pk->p_nxtps = 1;
 }
 
        pk->p_nxtps = 1;
 }
 
-chksum(s,n)
-register char *s;
-register n;
-{
-       register unsigned sum, t;
-       register x;
-
-       sum = -1;
-       x = 0;
-
-       do {
-               if (sum&0x8000) {
-                       sum <<= 1;
-                       sum++;
-               } else
-                       sum <<= 1;
-               t = sum;
-               sum += (unsigned)*s++ & 0377;
-               x += sum^n;
-               if ((sum&0xffff) <= (t&0xffff)) {
-                       sum ^= x;
-               }
-       } while (--n > 0);
-
-       return(sum & 0xffff);
-}
-
-pkline(pk)
-register struct pack *pk;
-{
-register i;
-       for(i=0;i<NPLINES;i++) {
-               if (pklines[i]==pk)
-                       return(i);
-       }
-       return(-i);
-}
-
-pkzero(s,n)
+#ifndef BSD4_2
+bzero(s,n)
 register char *s;
 register n;
 {
        while (n--)
                *s++ = 0;
 }
 register char *s;
 register n;
 {
        while (n--)
                *s++ = 0;
 }
+#endif !BSD4_2
 
 pksize(n)
 register n;
 {
 
 pksize(n)
 register n;
 {
-register k;
+       register k;
 
        n >>= 5;
 
        n >>= 5;
-       for(k=0; n >>= 1; k++);
-       return(k);
+       for(k=0; n >>= 1; k++)
+               ;
+       return k;
 }
 }