Annotation of researchv10no/cmd/uucp/pk1.c, revision 1.1.1.1

1.1       root        1: /*     /sccs/src/cmd/uucp/s.pk1.c
                      2:        pk1.c   1.2     8/30/84 17:37:38
                      3: */
                      4: #include "uucp.h"
                      5: VERSION(@(#)pk1.c      1.2);
                      6: 
                      7: #define USER   1
                      8: 
                      9: #include "pk.h"
                     10: #include <sys/buf.h>
                     11: 
                     12: 
                     13: /*
                     14: ** Code added to allow translation of states from numbers to
                     15: ** letters, to be done in such a way as to be meaningful to 
                     16: ** John Q. Public
                     17: */
                     18: struct {
                     19:        int state;
                     20:        char *msg;
                     21: } st_trans[] = {
                     22:        DEAD,   "Dead!",
                     23:        INITa,  "INIT code a",
                     24:        INITb,  "INIT code b",
                     25:        LIVE,   "O.K.",
                     26:        RXMIT,  "Rcv/Xmit",
                     27:        RREJ,   "RREJ?",
                     28:        PDEBUG, "PDEBUG?",
                     29:        DRAINO, "Draino...",
                     30:        WAITO,  "Waiting",
                     31:        DOWN,   "Link down",
                     32:        RCLOSE, "RCLOSE?",
                     33:        BADFRAME,       "Bad frame",
                     34:        -1,     "End of the line",
                     35: };
                     36: 
                     37: 
                     38: 
                     39: #define PKMAXSTMSG 40
                     40: extern int Errorrate;
                     41: int Connodata = 0;             /* Continuous Non Valid Data Count */
                     42: int Ntimeout = 0;
                     43: #define CONNODATA      20      /* Max Continuous Non Valid Data Count */
                     44: #define NTIMEOUT       50      /* This is not currently used, but maybe future */
                     45: 
                     46: /*
                     47:  * packet driver support routines
                     48:  *
                     49:  */
                     50: extern struct pack *pklines[];
                     51: 
                     52: /*
                     53:  * start initial synchronization.
                     54:  */
                     55: struct pack *
                     56: pkopen(ifn, ofn)
                     57: int ifn, ofn;
                     58: {
                     59:        register struct pack *pk;
                     60:        register char **bp;
                     61:        register int i;
                     62:        char *malloc();
                     63: 
                     64:        if (++pkactive >= NPLINES)
                     65:                return(NULL);
                     66:        if ((pk = (struct pack *) malloc(sizeof (struct pack))) == NULL)
                     67:                return(NULL);
                     68:        pkzero((caddr_t) pk, sizeof (struct pack));
                     69:        pk->p_ifn = ifn;
                     70:        pk->p_ofn = ofn;
                     71:        pk->p_xsize = pk->p_rsize = PACKSIZE;
                     72:        pk->p_rwindow = pk->p_swindow = WINDOWS;
                     73: 
                     74:        /*
                     75:         * allocate input window
                     76:         */
                     77:        for (i = 0; i < pk->p_rwindow; i++) {
                     78:                if ((bp = (char **) malloc((unsigned) pk->p_xsize)) == NULL)
                     79:                        break;
                     80:                *bp = (char *) pk->p_ipool;
                     81:                pk->p_ipool = bp;
                     82:        }
                     83:        if (i == 0)
                     84:                return(NULL);
                     85:        pk->p_rwindow = i;
                     86: 
                     87:        /*
                     88:         * start synchronization
                     89:         */
                     90:        pk->p_msg = pk->p_rmsg = M_INITA;
                     91:        for (i = 0; i < NPLINES; i++) {
                     92:                if (pklines[i] == NULL) {
                     93:                        pklines[i] = pk;
                     94:                        break;
                     95:                }
                     96:        }
                     97:        if (i >= NPLINES)
                     98:                return(NULL);
                     99:        pkoutput(pk);
                    100: 
                    101:        for (i = 0; i < PKMAXSTMSG; i++) {
                    102:                pkgetpack(pk);
                    103:                if ((pk->p_state & LIVE) != 0)
                    104:                        break;
                    105:        }
                    106:        if (i >= PKMAXSTMSG)
                    107:                return(NULL);
                    108: 
                    109:        pkreset(pk);
                    110:        return(pk);
                    111: }
                    112: 
                    113: /*
                    114:  * input framing and block checking.
                    115:  * frame layout for most devices is:
                    116:  *     
                    117:  *     S|K|X|Y|C|Z|  ... data ... |
                    118:  *
                    119:  *     where   S       == initial synch byte
                    120:  *             K       == encoded frame size (indexes pksizes[])
                    121:  *             X, Y    == block check bytes
                    122:  *             C       == control byte
                    123:  *             Z       == XOR of header (K^X^Y^C)
                    124:  *             data    == 0 or more data bytes
                    125:  *
                    126:  */
                    127: #define GETRIES 10
                    128: #define        GESYN   4100            /* overkill */
                    129: 
                    130: /*
                    131:  * Pseudo-dma byte collection.
                    132:  */
                    133: pkgetpack(ipk)
                    134: register struct pack *ipk;
                    135: {
                    136:        register char *p;
                    137:        register struct pack *pk;
                    138:        register struct header *h;
                    139:        unsigned short sum;
                    140:        int i, ret, k, tries, ifn, notsyn;
                    141:        char **bp, hdchk, msgline[80], delimc;
                    142: 
                    143:        pk = ipk;
                    144:        if ((pk->p_state & DOWN) ||
                    145:          Connodata > CONNODATA  /* || Ntimeout > NTIMEOUT */ )
                    146:                pkfail();
                    147:        ifn = pk->p_ifn;
                    148: 
                    149:        /*=
                    150:         * find HEADER
                    151:         */
                    152:        for (tries = 0, notsyn = 0; tries < GETRIES && notsyn < GESYN; ) {
                    153:                p = (caddr_t) &pk->p_ihbuf;
                    154:                if ((ret = pkcget(ifn, p, 1)) < 0) {
                    155: 
                    156:                        /*
                    157:                         * set up retransmit or REJ
                    158:                         */
                    159:                        tries++;
                    160:                        pk->p_msg |= pk->p_rmsg;
                    161:                        if (pk->p_msg == 0)
                    162:                                pk->p_msg |= M_RR;
                    163:                        if ((pk->p_state & LIVE) == LIVE)
                    164:                                pk->p_state |= RXMIT;
                    165:                        pkoutput(pk);
                    166:                        continue;
                    167:                }
                    168:                if (*p != SYN) {
                    169:                        notsyn++;
                    170:                        continue;
                    171:                }
                    172:                p++;
                    173:                ret = pkcget(ifn, p, HDRSIZ - 1);
                    174:                if (ret == -1)
                    175:                        continue;
                    176:                break;
                    177:        }
                    178:        if (tries >= GETRIES) {
                    179:                DEBUG(4, "tries = %d\n", tries);
                    180:                pkfail();
                    181:        }
                    182:        if (notsyn >= GESYN) {
                    183:                DEBUG(4, "notsyn = %d\n", notsyn);
                    184:                pkfail();
                    185:        }
                    186: 
                    187:        Connodata++;
                    188:        DEBUG(9, "pkgetpack: Connodata=%d\n", Connodata);
                    189:        h = (struct header * ) &pk->p_ihbuf;
                    190:        p = (caddr_t) h;
                    191:        hdchk = p[1] ^ p[2] ^ p[3] ^ p[4];
                    192:        p += 2;
                    193:        sum = (unsigned) *p++ & 0377;
                    194:        sum |= (unsigned) *p << 8;
                    195:        h->sum = sum;
                    196:        DEBUG(9, "rec h->cntl %o\n", (unsigned) h->cntl);
                    197:        k = h->ksize;
                    198:        if (hdchk != h->ccntl) {
                    199: 
                    200:                /*
                    201:                 * bad header
                    202:                 */
                    203:                DEBUG(7, "bad header %o,", hdchk);
                    204:                DEBUG(7, "h->ccntl %o\n", h->ccntl);
                    205:                return;
                    206:        }
                    207:        if (k == 9) {
                    208:                if (h->sum + h->cntl == CHECK) {
                    209:                        pkcntl(h->cntl, pk);
                    210:                        /* 
                    211:                        ** New code added to make the state diagnostics
                    212:                        ** meaningful to human beings that can't figure
                    213:                        ** out bizarre, silly, cryptic numbers.
                    214:                        ** 
                    215:                        ** Exhibit A: DEBUG(7, "state - %o\n", pk->p_state);
                    216:                        */
                    217:                        if(Debug >= 7) {
                    218:                            sprintf(msgline,"state -");
                    219:                            delimc = ' ';
                    220:                            for(i=0;st_trans[i].state!= -1;i++) {
                    221:                                if(pk->p_state&st_trans[i].state){
                    222:                                    sprintf(msgline,"%s%c[%s]",msgline,delimc,
                    223:                                        st_trans[i].msg);
                    224:                                    delimc = '&';
                    225:                                }
                    226:                            }
                    227:                            sprintf(msgline,"%s (%o)\n",msgline,pk->p_state);
                    228:                            DEBUG(7,"%s",msgline);
                    229:                        }
                    230:                                        
                    231:                } else {
                    232: 
                    233:                        /*
                    234:                         * bad header
                    235:                         */
                    236:                        DEBUG(7, "bad header %o\n", h->cntl);
                    237:                        pk->p_state |= BADFRAME;
                    238:                }
                    239:                return;
                    240:        }
                    241:        if (k && pksizes[k] == pk->p_rsize) {
                    242:                pk->p_rpr = h->cntl & MOD8;
                    243:                pksack(pk);
                    244:                if ((bp = pk->p_ipool) == NULL) {
                    245:                        DEBUG(7, "bp NULL %s\n", "");
                    246:                        return;
                    247:                }
                    248:                pk->p_ipool = (char **) *bp;
                    249:                ret = pkcget(pk->p_ifn, (char *) bp, pk->p_rsize);
                    250:                if (ret == 0)
                    251:                        pkdata(h->cntl, h->sum, pk, bp);
                    252:        }
                    253: }
                    254: 
                    255: 
                    256: pkdata(c, sum, pk, bp)
                    257: register struct pack *pk;
                    258: unsigned short sum;
                    259: char c;
                    260: char **bp;
                    261: {
                    262:        register x;
                    263:        int t;
                    264:        char m;
                    265: 
                    266:        if (pk->p_state & DRAINO || !(pk->p_state & LIVE)) {
                    267:                pk->p_msg |= pk->p_rmsg;
                    268:                pkoutput(pk);
                    269:                goto drop;
                    270:        }
                    271:        t = next[pk->p_pr];
                    272:        for(x=pk->p_pr; x!=t; x = (x-1)&7) {
                    273:                if (pk->p_is[x] == 0)
                    274:                        goto slot;
                    275:        }
                    276: drop:
                    277:        *bp = (char *)pk->p_ipool;
                    278:        pk->p_ipool = bp;
                    279:        return;
                    280: 
                    281: slot:
                    282:        m = mask[x];
                    283:        pk->p_imap |= m;
                    284:        pk->p_is[x] = c;
                    285:        pk->p_isum[x] = sum;
                    286:        pk->p_ib[x] = (char *)bp;
                    287:        return;
                    288: }
                    289: 
                    290: #define PKMAXBUF 128
                    291: 
                    292: /*
                    293:  * Start transmission on output device 
                    294:  * device associated with pk.
                    295:  * For asynch devices (t_line==1) framing is
                    296:  * imposed.  For devices with framing and crc
                    297:  * in the driver (t_line==2) the transfer is
                    298:  * passed on to the driver.
                    299:  */
                    300: pkxstart(pk, cntl, x)
                    301: register struct pack *pk;
                    302: int x;
                    303: char cntl;
                    304: {
                    305:        register char *p;
                    306:        register short checkword;
                    307:        register char hdchk;
                    308:        int ret;
                    309: 
                    310:        p = (caddr_t) &pk->p_ohbuf;
                    311:        *p++ = SYN;
                    312:        if (x < 0) {
                    313:                *p++ = hdchk = 9;
                    314:                checkword = cntl;
                    315:        } else {
                    316:                *p++ = hdchk = pk->p_lpsize;
                    317:                checkword = pk->p_osum[x] ^ (unsigned)(cntl & 0377);
                    318:        }
                    319:        checkword = CHECK - checkword;
                    320:        *p = checkword;
                    321:        hdchk ^= *p++;
                    322:        *p = checkword>>8;
                    323:        hdchk ^= *p++;
                    324:        *p = cntl;
                    325:        hdchk ^= *p++;
                    326:        *p = hdchk;
                    327: 
                    328:  /*
                    329:   * writes
                    330:   */
                    331: DEBUG(9, "send %o\n", (unsigned) cntl);
                    332:        p = (caddr_t) & pk->p_ohbuf;
                    333:        if (x < 0) {
                    334:                ret = write(pk->p_ofn, p, HDRSIZ);
                    335:                PKASSERT(ret == HDRSIZ, "PKXSTART ret", "", ret);
                    336:        } else {
                    337:                register char *b, *q;
                    338:                register int i;
                    339:                char buf[PKMAXBUF + HDRSIZ]; 
                    340: 
                    341: 
                    342: /*
                    343:                for (i = 0, b = buf; i < HDRSIZ; i++) 
                    344:                        *b++ = *p++;
                    345:                for (i = 0, p = pk->p_ob[x]; i < pk->p_xsize; i++)
                    346:                        *b++ = *p++;
                    347: */
                    348:                i = HDRSIZ;
                    349:                b = buf;
                    350:                q = p;
                    351:                do
                    352:                        *b++ = *q++;
                    353:                while(--i);
                    354:                if(i = pk->p_xsize){
                    355:                        q = pk->p_ob[x];
                    356:                        do
                    357:                                *b++ = *q++;
                    358:                        while(--i);
                    359:                }
                    360:                ret = write(pk->p_ofn, buf, pk->p_xsize + HDRSIZ);
                    361:                PKASSERT(ret == pk->p_xsize + HDRSIZ,
                    362:                  "PKXSTART ret", "", ret);
                    363:        }
                    364:        if (pk->p_msg)
                    365:                pkoutput(pk);
                    366:        return;
                    367: }
                    368: 
                    369: 
                    370: 
                    371: 
                    372: /*
                    373:  * get n characters from input
                    374:  *     b       -> buffer for characters
                    375:  *     fn      -> file descriptor
                    376:  *     n       -> requested number of characters
                    377:  * return: 
                    378:  *     n       -> number of characters returned
                    379:  *     0       -> end of file
                    380:  */
                    381: jmp_buf Getjbuf;
                    382: cgalarm() { longjmp(Getjbuf, 1); }
                    383: int npkccall, npkctry, npkcnap, npkcchar;
                    384: 
                    385: pkcget(fn, b, n)
                    386: register int n;
                    387: register char *b;
                    388: register int fn;
                    389: {
                    390:        register int ret;
                    391:        register int donap;
                    392: 
                    393:        if (n == 0)
                    394:                return(0);
                    395:        npkccall++;
                    396:        donap = (linebaudrate > 0 && linebaudrate < 4800);
                    397:        if (setjmp(Getjbuf)) {
                    398:                Ntimeout++;
                    399:                DEBUG(4, "alarm %d\n", Ntimeout);
                    400:                return(-1);
                    401:        }
                    402:        (void) signal(SIGALRM, cgalarm);
                    403: 
                    404:        (void) alarm((unsigned) (n < HDRSIZ ? 10 : 20));
                    405:        while (1) {
                    406:                if ((ret = read(fn, b, n)) == 0) {
                    407:                        (void) alarm(0);
                    408:                        return(-1);
                    409:                }
                    410:                npkctry++;
                    411:                npkcchar += ret;
                    412:                PKASSERT(ret > 0, "PKCGET READ", "", ret);
                    413:                if ((n -= ret) <= 0)
                    414:                        break;
                    415: #ifdef PKSPEEDUP
                    416:                if (donap) {
                    417:                        sleep(1);
                    418:                        npkcnap++;
                    419:                }
                    420: #endif PKSPEEDUP
                    421:                b += ret;
                    422:        }
                    423:        (void) alarm(0);
                    424:        return(0);
                    425: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.