Annotation of researchv10dc/lbin/kermit/ckuus3.c, revision 1.1.1.1

1.1       root        1: /*  C K U U S 3 --  "User Interface" for Unix Kermit, part 3  */
                      2:  
                      3: /*
                      4:  Author: Frank da Cruz (SY.FDC@CU20B),
                      5:  Columbia University Center for Computing Activities, January 1985.
                      6:  Copyright (C) 1985, Trustees of Columbia University in the City of New York.
                      7:  Permission is granted to any individual or institution to use, copy, or
                      8:  redistribute this software so long as it is not sold for profit, provided this
                      9:  copyright notice is retained. 
                     10: */
                     11:  
                     12: /*  SET and REMOTE commands; screen, debug, interrupt, and logging functions */
                     13:  
                     14: /* Includes */
                     15:  
                     16: #include "ckcdeb.h"
                     17: #include <stdio.h>
                     18: #include <ctype.h>
                     19: #include "ckcker.h"
                     20: #include "ckucmd.h"
                     21: #include "ckuusr.h"
                     22: #ifdef UXIII
                     23: #include <termio.h>
                     24: #endif
                     25:  
                     26: #ifdef datageneral
                     27: extern int con_reads_mt,            /* Flag if console read asynch is active */
                     28:            conint_ch,               /* The character read by asynch read */
                     29:            conint_avl;              /* Flag that char available */
                     30: #endif
                     31:  
                     32: /* Variables */
                     33: 
                     34: extern int size, spsiz, rpsiz, urpsiz, npad, timint, rtimo, speed,
                     35:   local, server, lpcapr, fmask, cmask, backgrd,
                     36:   flow, displa, binary, fncnv, delay, parity, deblog, escape, xargc,
                     37:   turn, duplex, cxseen, czseen, nfils, ckxech, pktlog, seslog, tralog, stdouf,
                     38:   turnch, bctr, bctu, dfloc, mdmtyp, keep, maxtry,
                     39:   rptflg, ebqflg, warn, quiet, cnflg, timef, spsizf, mypadn;
                     40:  
                     41: extern long filcnt, tlci, tlco, ffc, tfc, fsize;
                     42: 
                     43: extern char *versio, *protv, *ckxv, *ckzv, *fnsv, *connv, *dftty, *cmdv;
                     44: extern char *cmarg, *cmarg2, **xargv, **cmlist;
                     45: extern CHAR stchr, mystch, sstate, padch, mypadc, eol, seol, ctlq;
                     46: extern CHAR filnam[], ttname[];
                     47: char *strcpy();
                     48:  
                     49: /* Declarations from cmd package */
                     50:  
                     51: extern char cmdbuf[];                  /* Command buffer */
                     52:  
                     53: /* From main ckuser module... */
                     54:  
                     55: extern char line[100], *lp;            /* Character buffer for anything */
                     56: extern char debfil[50],                        /* Debugging log file name */
                     57:  pktfil[50],                           /* Packet log file name */
                     58:  sesfil[50],                           /* Session log file name */
                     59:  trafil[50];                           /* Transaction log file name */
                     60:  
                     61: extern int tlevel;                     /* Take Command file level */
                     62: extern FILE *tfile[];                  /* Array of take command fd's */
                     63: 
                     64:  
                     65: /* Keyword tables for SET commands */
                     66:  
                     67:  
                     68: /* Block checks */
                     69:  
                     70: struct keytab blktab[] = {
                     71:     "1", 1, 0,
                     72:     "2", 2, 0,
                     73:     "3", 3, 0
                     74: };
                     75:  
                     76: /* Duplex keyword table */
                     77:  
                     78: struct keytab dpxtab[] = {
                     79:     "full",     0, 0,
                     80:     "half",      1, 0
                     81: };
                     82:  
                     83: struct keytab filtab[] = {
                     84:     "display", XYFILD, 0,
                     85:     "names",   XYFILN, 0,
                     86:     "type",    XYFILT, 0,
                     87:     "warning", XYFILW, 0
                     88: };
                     89: int nfilp = (sizeof(filtab) / sizeof(struct keytab));
                     90:  
                     91: /* Send/Receive Parameters */
                     92:  
                     93: struct keytab srtab[] = {
                     94:     "end-of-packet", XYEOL, 0,
                     95:     "packet-length", XYLEN, 0,
                     96:     "pad-character", XYPADC, 0,
                     97:     "padding", XYNPAD, 0,
                     98:     "start-of-packet", XYMARK, 0,
                     99:     "timeout", XYTIMO, 0
                    100: };
                    101: int nsrtab = (sizeof(srtab) / sizeof(struct keytab));
                    102:  
                    103: /* Flow Control */
                    104:  
                    105: struct keytab flotab[] = {
                    106:     "none",     0, 0,
                    107:     "xon/xoff", 1, 0
                    108: };
                    109: int nflo = (sizeof(flotab) / sizeof(struct keytab));
                    110: 
                    111: /*  Handshake characters  */
                    112:  
                    113: struct keytab hshtab[] = {
                    114:     "bell", 007, 0,
                    115:     "cr",   015, 0,
                    116:     "esc",  033, 0,
                    117:     "lf",   012, 0,
                    118:     "none", 999, 0,                    /* (can't use negative numbers) */
                    119:     "xoff", 023, 0,
                    120:     "xon",  021, 0
                    121: };
                    122: int nhsh = (sizeof(hshtab) / sizeof(struct keytab));
                    123:  
                    124: struct keytab fntab[] = {              /* File naming */
                    125:     "converted", 1, 0,
                    126:     "literal",   0, 0
                    127: };
                    128:  
                    129: struct keytab fttab[] = {              /* File types */
                    130:     "binary",    1, 0,
                    131:     "text",      0, 0
                    132: };
                    133:  
                    134: extern struct keytab mdmtab[] ;                /* Modem types (in module ckudia.c) */
                    135: extern int nmdm;
                    136:  
                    137: /* Parity keyword table */
                    138:  
                    139: struct keytab partab[] = {
                    140:     "even",    'e', 0,
                    141:     "mark",    'm', 0,
                    142:     "none",      0, 0,
                    143:     "odd",     'o', 0,
                    144:     "space",   's', 0
                    145: };
                    146: int npar = (sizeof(partab) / sizeof(struct keytab));
                    147:  
                    148:  
                    149: /* On/Off table */
                    150:  
                    151: struct keytab onoff[] = {
                    152:     "off",       0, 0,
                    153:     "on",        1, 0
                    154: };
                    155:  
                    156: /* Incomplete File Disposition table */
                    157:  
                    158: struct keytab ifdtab[] = {
                    159:     "discard",   0, 0,
                    160:     "keep",      1, 0
                    161: };
                    162: 
                    163: /* Terminal parameters table */
                    164: 
                    165: struct keytab trmtab[] = {
                    166:     "bytesize",  0, 0
                    167: };
                    168: 
                    169: /*  D O P R M  --  Set a parameter.  */
                    170: /*
                    171:  Returns:
                    172:   -2: illegal input
                    173:   -1: reparse needed
                    174:    0: success
                    175: */
                    176: doprm(xx) int xx; {
                    177:     int x, y, z;
                    178:     char *s;
                    179:  
                    180: switch (xx) {
                    181:  
                    182:  
                    183: case XYEOL:    /* These have all been moved to set send/receive... */
                    184: case XYLEN:    /* Let the user know what to do. */
                    185: case XYMARK:
                    186: case XYNPAD:
                    187: case XYPADC:
                    188: case XYTIMO:
                    189:     printf("...Use 'set send' or 'set receive' instead.\n");
                    190:     printf("Type 'help set send' or 'help set receive' for more info.\n");
                    191:     return(0);
                    192:  
                    193: case XYIFD:                            /* Incomplete file disposition */
                    194:     if ((y = cmkey(ifdtab,2,"","discard")) < 0) return(y);
                    195:     if ((x = cmcfm()) < 0) return(x);
                    196:     keep = y;
                    197:     return(0);
                    198:  
                    199: case XYLINE:
                    200:     if ((x = cmtxt("Device name",dftty,&s)) < 0) return(x);
                    201:     ttclos();                          /* close old line, if any was open */
                    202:  
                    203:     x = strcmp(s,dftty) ? -1 : dfloc;  /* Maybe let ttopen figure it out... */
                    204:     if (ttopen(s,&x,mdmtyp) < 0 ) {    /* Can we open the new line? */
                    205:        perror("Sorry, can't open line");
                    206:        return(-2);                     /* If not, give bad return */
                    207:     }
                    208:     if (x > -1) local = x;             /* Set local/remote status. */
                    209:     strcpy(ttname,s);                  /* OK, copy name into real place. */
                    210:     if (!local) speed = -1;            /* If remote, say speed unknown. */
                    211:     debug(F111,"set line ",ttname,local);
                    212:     return(0);
                    213:  
                    214: case XYCHKT:
                    215:     if ((y = cmkey(blktab,3,"","1")) < 0) return(y);
                    216:     if ((x = cmcfm()) < 0) return(x);
                    217:     bctr = y;
                    218:     return(0);
                    219:  
                    220: case XYDEBU:
                    221:     return(seton(&deblog));
                    222:  
                    223: case XYDELA:
                    224:     y = cmnum("Number of seconds before starting to send","5",10,&x);
                    225:     debug(F101,"XYDELA: y","",y);
                    226:     return(setnum(&delay,x,y,94));
                    227:  
                    228: case XYDUPL:
                    229:     if ((y = cmkey(dpxtab,2,"","full")) < 0) return(y);
                    230:     if ((x = cmcfm()) < 0) return(x);
                    231:     duplex = y;
                    232:     return(0);
                    233:  
                    234: case XYESC:
                    235:     y = cmnum("Decimal ASCII code for escape character","",10,&x);
                    236:     return(setcc(&escape,x,y));
                    237: 
                    238: case XYFILE:
                    239:     if ((y = cmkey(filtab,nfilp,"File parameter","")) < 0) return(y);
                    240:     switch (y) {
                    241:        int z;
                    242:        case XYFILD:                    /* Display */
                    243:            y = seton(&z);
                    244:            if (y < 0) return(y);
                    245:            quiet = !z;
                    246:            return(0);
                    247:  
                    248:        case XYFILN:                    /* Names */
                    249:            if ((x = cmkey(fntab,2,"how to handle filenames","converted")) < 0)
                    250:                return(x);
                    251:            if ((z = cmcfm()) < 0) return(z);
                    252:            fncnv = x;
                    253:            return(0);
                    254:  
                    255:        case XYFILT:                    /* Type */
                    256:            if ((x = cmkey(fttab,2,"type of file","text")) < 0)
                    257:                return(x);
                    258:            if ((y = cmnum("file byte size (7 or 8)","8",10,&z)) < 0)
                    259:                return(y);
                    260:            if (z != 7 && z != 8) {
                    261:                printf("\n?The choices are 7 and 8\n");
                    262:                return(-2);
                    263:            }
                    264:            if ((y = cmcfm()) < 0) return(y);
                    265:            binary = x;
                    266:            if (z == 7) fmask = 0177;
                    267:              else if (z == 8) fmask = 0377;
                    268:            return(0);
                    269:  
                    270:        case XYFILW:                    /* Warning/Write-Protect */
                    271:            return(seton(&warn));
                    272:  
                    273:        default:
                    274:            printf("?unexpected file parameter\n");
                    275:            return(-2);
                    276:     }
                    277:  
                    278: case XYFLOW:                           /* Flow control */
                    279:     if ((y = cmkey(flotab,nflo,"","xon/xoff")) < 0) return(y);
                    280:     if ((x = cmcfm()) < 0) return(x);
                    281:     flow = y;
                    282:     return(0);
                    283:  
                    284: case XYHAND:                           /* Handshake */
                    285:     if ((y = cmkey(hshtab,nhsh,"","none")) < 0) return(y);
                    286:     if ((x = cmcfm()) < 0) return(x);
                    287:     turn = (y > 0127) ? 0 : 1 ;
                    288:     turnch = y;
                    289:     return(0);
                    290:  
                    291: case XYMODM:
                    292:     if ((x=cmkey(mdmtab,nmdm,"type of modem, direct means none","direct")) < 0)
                    293:        return(x);
                    294:     if ((z = cmcfm()) < 0) return(z);
                    295:     mdmtyp = x;
                    296:     return(0);
                    297:       
                    298: case XYPARI:                           /* Parity */
                    299:     if ((y = cmkey(partab,npar,"","none")) < 0) return(y);
                    300:     if ((x = cmcfm()) < 0) return(x);
                    301:  
                    302: /* If parity not none, then we also want 8th-bit prefixing */
                    303:  
                    304:     if (parity = y) ebqflg = 1; else ebqflg = 0;
                    305:     return(0);
                    306:  
                    307: case XYPROM:
                    308:     if ((x = cmtxt("Program's command prompt","C-Kermit>",&s)) < 0) return(x);
                    309:     if (*s == '\42') {                 /* Quoted string? */
                    310:        x = strlen(s) - 1;              /* Yes, strip quotes. */
                    311:        if (*(s+x) == '\42')            /* This allows leading or trailing */
                    312:            *(s+x) = '\0';              /* blanks. */
                    313:            s++;
                    314:        }
                    315:     cmsetp(s);
                    316:     return(0);
                    317:  
                    318: case XYRETR:                           /* Per-packet retry limit */
                    319:     y = cmnum("Maximum retries per packet","10",10,&x);
                    320:     return(setnum(&maxtry,x,y,94));
                    321:  
                    322: case XYTERM:                           /* Terminal parameters */
                    323:     if ((y = cmkey(trmtab,1,"","bytesize")) < 0) return(y);
                    324:     switch (y) {
                    325:       case 0:
                    326:        if ((y = cmnum("bytesize for terminal connection","8",10,&x)) < 0)
                    327:          return(y);
                    328:        if (x != 7 && x != 8) {
                    329:            printf("\n?The choices are 7 and 8\n");
                    330:            return(-2);
                    331:        }
                    332:        if ((y = cmcfm()) < 0) return(y);
                    333:        if (x == 7) cmask = 0177;
                    334:        else if (x == 8) cmask = 0377;
                    335:         return(y);
                    336:       default:       /* Add more cases when we think of more parameters */
                    337:        return(-2);
                    338:     }    
                    339: 
                    340: /* SET SEND/RECEIVE... */
                    341:  
                    342: case XYRECV:
                    343: case XYSEND:
                    344:     if (xx == XYRECV)
                    345:        strcpy(line,"Parameter for inbound packets");
                    346:     else
                    347:        strcpy(line,"Parameter for outbound packets");
                    348:  
                    349:     if ((y = cmkey(srtab,nsrtab,line,"")) < 0) return(y);
                    350:     switch (y) {
                    351:  
                    352: case XYEOL:
                    353:     y = cmnum("Decimal ASCII code for packet terminator","13",10,&x);
                    354:     if ((y = setcc(&z,x,y)) < 0) return(y);
                    355:     if (xx == XYRECV) eol = z; else seol = z;
                    356:     return(y);
                    357:  
                    358: case XYLEN:
                    359:     y = cmnum("Maximum number of characters in a packet","90",10,&x);
                    360:     if (xx == XYRECV) {                        /* Receive... */
                    361:        if ((y = setnum(&z,x,y,MAXRP)) < 0)
                    362:          return(y);
                    363:        urpsiz = z;
                    364:        rpsiz =  (z > 94) ? 94 : z;
                    365:     } else {                           /* Send... */
                    366:        if ((y = setnum(&z,x,y,MAXSP)) < 0)
                    367:          return(y);
                    368:        spsiz = z;                      /*   Set it and flag that it was set */
                    369:        spsizf = 1;                     /*   to allow overriding Send-Init. */
                    370:     }
                    371:     if (z > 94 && !backgrd) printf("Extended-length packets requested\n");
                    372:     return(y);
                    373:  
                    374: case XYMARK:
                    375:     y = cmnum("Decimal ASCII code for packet-start character","1",10,&x);
                    376:     if ((y = setcc(&z,x,y)) < 0) return(y);
                    377:     if (xx == XYRECV) stchr = z; else mystch = z;
                    378:     return(y);
                    379: 
                    380: case XYNPAD:                           /* Padding */
                    381:     y = cmnum("How many padding characters for inbound packets","0",10,&x);
                    382:     if ((y = setnum(&z,x,y,94)) < 0) return(y);
                    383:     if (xx == XYRECV) mypadn = z; else npad = z;
                    384:     return(y);
                    385:  
                    386: case XYPADC:                           /* Pad character */
                    387:     y = cmnum("Decimal ASCII code for inbound pad character","0",10,&x);
                    388:     if ((y = setcc(&z,x,y)) < 0) return(y);
                    389:     if (xx == XYRECV) mypadc = z; else padch = z;
                    390:     return(y);
                    391:  
                    392: case XYTIMO:
                    393:     y = cmnum("Interpacket timeout interval","5",10,&x);
                    394:     if ((y = setnum(&z,x,y,94)) < 0) return(y);
                    395:     if (xx == XYRECV) {
                    396:        timef = 1;
                    397:        timint = z;
                    398:     } else rtimo = z;
                    399:     return(y);
                    400:  
                    401:     }
                    402:  
                    403: case XYSPEE:
                    404:     if (!local) {
                    405:        printf("\nSpeed setting can only be done on an external line\n");
                    406:        printf("You must 'set line' before issuing this command\n");
                    407:        return(0);
                    408:     }  
                    409:     lp = line;
                    410:     sprintf(lp,"Baud rate for %s",ttname);
                    411:     if ((y = cmnum(line,"",10,&x)) < 0) return(y);
                    412:     if (y = (cmcfm()) < 0) return(y);
                    413:     y = chkspd(x);
                    414:     if (y < 0) 
                    415:        printf("?Unsupported line speed - %d\n",x);
                    416:     else {
                    417:        speed = y;
                    418:        if (!backgrd) printf("%s: %d baud\n",ttname,speed);
                    419:     }
                    420:     return(0);
                    421:  
                    422: default:
                    423:     if ((x = cmcfm()) < 0) return(x);
                    424:     printf("Not working yet - %s\n",cmdbuf);
                    425:     return(0);
                    426:     }
                    427: }
                    428: 
                    429: /*  C H K S P D  --  Check if argument is a valid baud rate  */
                    430:  
                    431: chkspd(x) int x; {
                    432:     switch (x) {
                    433: #ifndef AMIGA
                    434:        case 0:
                    435: #endif
                    436: #ifndef datageneral
                    437:        case 110:
                    438:        case 150:
                    439:        case 300:
                    440:        case 600:
                    441:        case 1200:
                    442:        case 1800:
                    443:        case 2400:
                    444:        case 4800:
                    445:        case 9600:
                    446: #ifdef apollo
                    447:         case 19200:
                    448: #else
                    449: #ifdef AMIGA
                    450:         case 19200:
                    451:        case 38400:
                    452:        case 57600:
                    453: #else
                    454: /* #ifdef B19200       (this high speed stuff needs much more work...)
                    455: /*      case 19200:    (have to make corresponding changes in ckuus2, ckutio)
                    456: /* #else
                    457: /* #ifdef B38400
                    458: /*      case 38400:
                    459: /* #endif
                    460: /* #endif
                    461: */
                    462: #endif
                    463: #endif
                    464: #endif
                    465: 
                    466: #ifdef datageneral
                    467:        case 50:
                    468:        case 75:
                    469:        case 134:
                    470:        case 3600:
                    471:        case 7200:
                    472:        case 19200:
                    473:        case 38400:
                    474: #endif
                    475:            return(x);
                    476:        default: 
                    477: #ifdef AMIGA
                    478:            if (ttsspd(x) > 0)
                    479:            {
                    480:                printf("Warning: non-standard baud rate - %d\n", x);
                    481:                return(x);
                    482:            }
                    483: #endif
                    484:            return(-1);
                    485:       }
                    486: }
                    487:  
                    488: /*  S E T O N  --  Parse on/off (default on), set parameter to result  */
                    489:  
                    490: seton(prm) int *prm; {
                    491:     int x, y;
                    492:     if ((y = cmkey(onoff,2,"","on")) < 0) return(y);
                    493:     if ((x = cmcfm()) < 0) return(x);
                    494:     *prm = y;
                    495:     return(0);
                    496: }
                    497:  
                    498: /*  S E T N U M  --  Set parameter to result of cmnum() parse.  */
                    499: /*
                    500:  Call with x - number from cnum parse, y - return code from cmnum
                    501: */
                    502: setnum(prm,x,y,max) int x, y, *prm, max; {
                    503:     debug(F101,"setnum","",y);
                    504:     if (y < 0) return(y);
                    505:     if (x > max) {
                    506:        printf("\n?Sorry, %d is the maximum\n",max);
                    507:        return(-2);
                    508:     }
                    509:     if ((y = cmcfm()) < 0) return(y);
                    510:     *prm = x;
                    511:     return(0);
                    512: }
                    513:  
                    514: /*  S E T C C  --  Set parameter to an ASCII control character value.  */
                    515:  
                    516: setcc(prm,x,y) int x, y, *prm; {
                    517:     if (y < 0) return(y);
                    518:     if ((x > 037) && (x != 0177)) {
                    519:        printf("\n?Not in ASCII control range - %d\n",x);
                    520:        return(-2);
                    521:     }
                    522:     if ((y = cmcfm()) < 0) return(y);
                    523:     *prm = x;
                    524:     return(0);
                    525: }
                    526: 
                    527: /*  D O R M T  --  Do a remote command  */
                    528:  
                    529: dormt(xx) int xx; {
                    530:     int x;
                    531:     char *s, sbuf[50], *s2;
                    532:  
                    533:     if (xx < 0) return(xx);
                    534:     switch (xx) {
                    535:  
                    536: case XZCWD:                            /* CWD */
                    537:     if ((x = cmtxt("Remote directory name","",&s)) < 0) return(x);
                    538:     debug(F111,"XZCWD: ",s,x);
                    539:     *sbuf = NUL;
                    540:     s2 = sbuf;
                    541:     if (*s != NUL) {                   /* If directory name given, */
                    542:                                        /* get password on separate line. */
                    543:         if (tlevel > -1) {             /* From take file... */
                    544:  
                    545:            if (fgets(sbuf,50,tfile[tlevel]) == NULL)
                    546:                fatal("take file ends prematurely in 'remote cwd'");
                    547:            debug(F110," pswd from take file",s2,0);
                    548:            for (x = strlen(sbuf);
                    549:                 x > 0 && (sbuf[x-1] == '\n' || sbuf[x-1] == '\r');
                    550:                 x--)
                    551:                sbuf[x-1] = '\0';
                    552:  
                    553:         } else {                       /* From terminal... */
                    554:  
                    555:            printf(" Password: ");              /* get a password */
                    556:            while (((x = getchar()) != NL) && (x != CR)) { /* with no echo */
                    557:                if ((x &= 0177) == '?') {
                    558:                    printf("? Password of remote directory\n Password: ");
                    559:                    s2 = sbuf;
                    560:                    *sbuf = NUL;
                    561:                }
                    562:                else if (x == ESC)      /* Mini command line editor... */
                    563:                    putchar(BEL);
                    564:                else if (x == BS || x == 0177)
                    565:                    s2--;
                    566:                else if (x == 025) {    /* Ctrl-U */
                    567:                    s2 = sbuf;
                    568:                    *sbuf = NUL;
                    569:                }
                    570:                else
                    571:                    *s2++ = x;
                    572:             }
                    573:            *s2 = NUL;
                    574:            putchar('\n');
                    575:         }
                    576:         s2 = sbuf;
                    577:     } else s2 = "";
                    578:     debug(F110," password",s2,0);
                    579:     sstate = setgen('C',s,s2,"");
                    580:     return(0);
                    581: 
                    582: case XZDEL:                            /* Delete */
                    583:     if ((x = cmtxt("Name of remote file(s) to delete","",&s)) < 0) return(x);
                    584:     return(sstate = rfilop(s,'E'));
                    585:  
                    586: case XZDIR:                            /* Directory */
                    587:     if ((x = cmtxt("Remote directory or file specification","",&s)) < 0)
                    588:        return(x);
                    589:     return(sstate = setgen('D',s,"",""));
                    590:  
                    591: case XZHLP:                            /* Help */
                    592:     if (x = (cmcfm()) < 0) return(x);
                    593:     sstate = setgen('H',"","","");
                    594:     return(0);
                    595:  
                    596: case XZHOS:                            /* Host */
                    597:     if ((x = cmtxt("Command for remote system","",&cmarg)) < 0) return(x);
                    598:     return(sstate = 'c');
                    599:  
                    600: case XZPRI:                            /* Print */
                    601:     if ((x = cmtxt("Remote file(s) to print on remote printer","",&s)) < 0)
                    602:        return(x);
                    603:     return(sstate = rfilop(s,'S'));
                    604:  
                    605: case XZSPA:                            /* Space */
                    606:     if ((x = cmtxt("Confirm, or remote directory name","",&s)) < 0) return(x);
                    607:     return(sstate = setgen('U',s,"",""));
                    608:     
                    609: case XZTYP:                            /* Type */
                    610:     if ((x = cmtxt("Remote file specification","",&s)) < 0) return(x);
                    611:     return(sstate = rfilop(s,'T'));
                    612:  
                    613: case XZWHO:
                    614:     if ((x = cmtxt("Remote user name, or carriage return","",&s)) < 0)
                    615:        return(x);
                    616:     return(sstate = setgen('W',s,"",""));
                    617:  
                    618: default:
                    619:     if (x = (cmcfm()) < 0) return(x);
                    620:     printf("not working yet - %s\n",cmdbuf);
                    621:     return(-2);
                    622:     }
                    623: }
                    624:  
                    625:  
                    626:  
                    627: /*  R F I L O P  --  Remote File Operation  */
                    628:  
                    629: rfilop(s,t) char *s, t; {
                    630:     if (*s == NUL) {
                    631:        printf("?File specification required\n");
                    632:        return(-2);
                    633:     }
                    634:     debug(F111,"rfilop",s,t);
                    635:     return(setgen(t,s,"",""));
                    636: }
                    637: 
                    638: /*  S C R E E N  --  Screen display function  */
                    639:  
                    640: /*  screen(f,c,n,s)
                    641:       f - argument descriptor
                    642:       c - a character or small integer
                    643:       n - a long integer
                    644:       s - a string.
                    645:  Fill in this routine with the appropriate display update for the system.
                    646:  This version is for a dumb tty.
                    647: */
                    648: screen(f,c,n,s) int f; long n; char c; char *s; {
                    649:     static int p = 0;                  /* Screen position */
                    650:     int len;                           /* Length of string */
                    651:     char buf[80];                      /* Output buffer */
                    652:     len = strlen(s);                   /* Length of string */
                    653:     if (!displa || quiet) return;      /* No update if display flag off */
                    654:  
                    655:     switch (f) {
                    656:  
                    657: case SCR_FN:                           /* filename */
                    658:     conoll(""); conol(s); conoc(SP); p = len + 1; return;
                    659:  
                    660: case SCR_AN:                           /* as-name */
                    661:     if (p + len > 75) { conoll(""); p = 0; }
                    662:     conol("=> "); conol(s); if ((p += (len + 3)) > 78) { conoll(""); p = 0; }
                    663:     return;
                    664:  
                    665: case SCR_FS:                           /* file-size */
                    666:     sprintf(buf,", Size: %ld",n);  conoll(buf);  p = 0; return;
                    667:  
                    668: case SCR_XD:                           /* x-packet data */
                    669:     conoll(""); conoll(s); p = 0; return;
                    670:     
                    671: case SCR_ST:                           /* File status */
                    672:     switch (c) {
                    673:        case ST_OK:                     /*  Transferred OK */
                    674:            if ((p += 5) > 78) { conoll(""); p = 0; }
                    675:            conoll(" [OK]"); p += 5; return;
                    676:  
                    677:        case ST_DISC:                   /*  Discarded */
                    678:            if ((p += 12) > 78) { conoll(""); p = 0; }
                    679:            conoll(" [discarded]"); p += 12; return;
                    680:  
                    681:        case ST_INT:                    /*  Interrupted */
                    682:            if ((p += 14) > 78) { conoll(""); p = 0; }
                    683:            conoll(" [interrupted]"); p += 14; return;
                    684:  
                    685:        case ST_SKIP:                   /*  Skipped */
                    686:            conoll("");
                    687:            conol("Skipping "); conoll(s); p = 0;
                    688:            return;
                    689:  
                    690:         default:
                    691:            conoll("*** screen() called with bad status ***"); p = 0; return;
                    692:     }
                    693: 
                    694: case SCR_PN:                           /* Packet number */
                    695:     sprintf(buf,"%s: %ld",s,n); conol(buf); p += strlen(buf); return;
                    696:  
                    697: case SCR_PT:                           /* Packet type or pseudotype */
                    698:     if (c == 'Y') return;              /* Don't bother with ACKs */
                    699:     if (c == 'D') {                    /* Only show every 4th data packet */
                    700:        if (n % 4) return;
                    701:        c = '.';
                    702:     }
                    703: #ifndef AMIGA
                    704:     if (p++ > 78) {                    /* If near right margin, */
                    705:        conoll("");                     /* Start new line */
                    706:        p = 0;                          /* and reset counter. */
                    707:     }
                    708: #endif
                    709:     conoc(c);                          /* Display the character. */
                    710: #ifdef AMIGA
                    711:     if (c == 'G') conoll("");           /* new line after G packets */
                    712: #endif
                    713:     return;
                    714:  
                    715: case SCR_TC:                           /* transaction complete */
                    716:     conoc(BEL); return;
                    717:  
                    718: case SCR_EM:                           /* Error message */
                    719:     conoll(""); conoc('?'); conoll(s); p = 0; return;          /* +1   */
                    720:  
                    721: case SCR_WM:                           /* Warning message */
                    722:     conoll(""); conoll(s); p = 0; return;
                    723:  
                    724: case SCR_TU:                           /* Undelimited text */
                    725:     if ((p += len) > 78) { conoll(""); p = len; }
                    726:     conol(s); return;
                    727:  
                    728: case SCR_TN:                           /* Text delimited at beginning */
                    729:     conoll(""); conol(s); p = len; return;
                    730:  
                    731: case SCR_TZ:                           /* Text delimited at end */
                    732:     if ((p += len) > 78) { conoll(""); p = len; }
                    733:     conoll(s); return;
                    734:     
                    735: case SCR_QE:                           /* Quantity equals */
                    736:     sprintf(buf,"%s: %ld",s,n);
                    737:     conoll(buf); p = 0; return;
                    738:  
                    739: default:
                    740:     conoll("*** screen() called with bad object ***"); p = 0; return;
                    741:     }
                    742: }
                    743: 
                    744: /*  I N T M S G  --  Issue message about terminal interrupts  */
                    745:  
                    746: intmsg(n) long n; {
                    747:     extern char *chstr();
                    748:     char buf[80];
                    749:  
                    750:     if ((!displa) || (quiet)) return;
                    751: #ifdef UXIII
                    752:     (void) conchk();   /* clear out pending escape-signals in ckxbsd.c */
                    753: #endif
                    754:     if (n == 1) {
                    755: #ifdef UXIII
                    756: 
                    757: #ifndef apollo
                    758: #ifndef datageneral
                    759:                                /* we need to signal before kb input */
                    760:        sprintf(buf,"Type escape (%s) followed by:",chstr(escape));
                    761:        screen(SCR_TN,0,0l,buf);
                    762: #endif
                    763: #endif
                    764: #endif
                    765:  screen(SCR_TN,0,0l,"CTRL-F to cancel file,  CTRL-R to resend current packet");
                    766:  screen(SCR_TN,0,0l,"CTRL-B to cancel batch, CTRL-A for status report: ");
                    767:     }
                    768:     else screen(SCR_TU,0,0l," ");
                    769: }
                    770: 
                    771: /*  C H K I N T  --  Check for console interrupts  */
                    772:  
                    773: /*** should rework not to destroy typeahead ***/
                    774:  
                    775: chkint() {
                    776:     int ch, cn;
                    777:  
                    778:     if ((!local) || (quiet)) return(0);        /* Only do this if local & not quiet */
                    779: #ifdef datageneral
                    780:     cn = (con_reads_mt) ? 1 : conchk();        /* Any input waiting? */
                    781: #else
                    782:     cn = conchk();                     /* Any input waiting? */
                    783: #endif
                    784:     debug(F101,"conchk","",cn);
                    785:  
                    786:     while (cn > 0) {                   /* Yes, read it. */
                    787:        cn--;
                    788:                        /* give read 5 seconds for interrupt character */
                    789: #ifdef datageneral
                    790:         /* We must be careful to just print out one result for each character
                    791:          * read.  The flag, conint_avl, controls duplication of characters.
                    792:          * Only one character is handled at a time, which is a reasonable
                    793:          * limit.  More complicated schemes could handle a buffer.
                    794:          */
                    795:         if (con_reads_mt) {
                    796:             if ((ch = conint_ch) <= 0) return(0);   /* I/O error, or no data */
                    797:             else if (conint_avl == 0) return(0);    /* Char already read */
                    798:             else conint_avl = 0;                    /* Flag character as read */
                    799:         }
                    800:         else { if ((ch = coninc(5)) < 0) return(0);  }
                    801: #else
                    802:        if ((ch = coninc(5)) < 0) return(0);
                    803: #endif
                    804:        switch (ch & 0177) {
                    805:            case 0001:                  /* CTRL-A */
                    806:                screen(SCR_TN,0,0l,"^A  Status report:");
                    807:                screen(SCR_TN,0,0l," file type: ");
                    808:                if (binary) screen(SCR_TZ,0,0l,"binary");
                    809:                    else    screen(SCR_TZ,0,0l,"text");
                    810:                screen(SCR_QE,0,(long)filcnt," file number");
                    811:                screen(SCR_QE,0,(long)ffc,   " characters ");
                    812:                screen(SCR_QE,0,(long)bctu,  " block check");
                    813:                screen(SCR_QE,0,(long)rptflg," compression");
                    814:                screen(SCR_QE,0,(long)ebqflg," 8th-bit prefixing");
                    815:                continue;
                    816:            case 0002:                  /* CTRL-B */
                    817:                screen(SCR_TN,0,0l,"^B - Cancelling Batch ");
                    818:                czseen = 1;
                    819:                continue;
                    820:            case 0006:                  /* CTRL-F */
                    821:                screen(SCR_TN,0,0l,"^F - Cancelling File ");
                    822:                cxseen = 1;
                    823:                continue;
                    824:            case 0022:                  /* CTRL-R */
                    825:                screen(SCR_TN,0,0l,"^R - Resending ");
                    826:                resend();
                    827:                return(1);
                    828:            default:                    /* Anything else, just ignore */
                    829:                screen(SCR_TU,0,0l," [Ignored] ");
                    830:                continue;
                    831:        }
                    832:     }
                    833:     return(0);
                    834: }
                    835: 
                    836: /*  D E B U G  --  Enter a record in the debugging log  */
                    837:  
                    838: /*
                    839:  Call with a format, two strings, and a number:
                    840:    f  - Format, a bit string in range 0-7.
                    841:         If bit x is on, then argument number x is printed.
                    842:    s1 - String, argument number 1.  If selected, printed as is.
                    843:    s2 - String, argument number 2.  If selected, printed in brackets.
                    844:    n  - Int, argument 3.  If selected, printed preceded by equals sign.
                    845:  
                    846:    f=0 is special: print s1,s2, and interpret n as a char.
                    847: */
                    848: #ifdef DEBUG
                    849: #define DBUFL 1000
                    850: debug(f,s1,s2,n) int f, n; char *s1, *s2; {
                    851:     static char s[DBUFL];
                    852:     char *sp = s;
                    853:  
                    854:     if (!deblog) return;               /* If no debug log, don't */
                    855:     switch (f) {
                    856:        case F000:                      /* 0, print both strings, */
                    857:            if (strlen(s1) + strlen(s2) + 3 > DBUFL)
                    858:              sprintf(sp,"DEBUG string too long\n");
                    859:            else sprintf(sp,"%s%s%c\n",s1,s2,n); /* interpret n as a char */
                    860:            zsout(ZDFILE,s);
                    861:            break;
                    862:        case F001:                      /* 1, "=n" */
                    863:            sprintf(sp,"=%d\n",n);
                    864:            zsout(ZDFILE,s);
                    865:            break;
                    866:        case F010:                      /* 2, "[s2]" */
                    867:            if (strlen(s2) + 4 > DBUFL)
                    868:              sprintf(sp,"DEBUG string too long\n");
                    869:            else sprintf(sp,"[%s]\n",s2);
                    870:            zsout(ZDFILE,"");
                    871:            break;
                    872:        case F011:                      /* 3, "[s2]=n" */
                    873:            if (strlen(s2) + 15 > DBUFL)
                    874:              sprintf(sp,"DEBUG string too long\n");
                    875:            else sprintf(sp,"[%s]=%d\n",s2,n);
                    876:            zsout(ZDFILE,s);
                    877:            break;
                    878:        case F100:                      /* 4, "s1" */
                    879:            zsoutl(ZDFILE,s1);
                    880:            break;
                    881:        case F101:                      /* 5, "s1=n" */
                    882:            if (strlen(s1) + 15 > DBUFL)
                    883:              sprintf(sp,"DEBUG string too long\n");
                    884:            else sprintf(sp,"%s=%d\n",s1,n);
                    885:            zsout(ZDFILE,s);
                    886:            break;
                    887:        case F110:                      /* 6, "s1[s2]" */
                    888:            if (strlen(s1) + strlen(s2) + 4 > DBUFL)
                    889:              sprintf(sp,"DEBUG string too long\n");
                    890:            else sprintf(sp,"%s[%s]\n",s1,s2);
                    891:            zsout(ZDFILE,s);
                    892:            break;
                    893:        case F111:                      /* 7, "s1[s2]=n" */
                    894:            if (strlen(s1) + strlen(s2) + 15 > DBUFL)
                    895:              sprintf(sp,"DEBUG string too long\n");
                    896:            else sprintf(sp,"%s[%s]=%d\n",s1,s2,n);
                    897:            zsout(ZDFILE,s);
                    898:            break;
                    899:        default:
                    900:            sprintf(sp,"\n?Invalid format for debug() - %d\n",n);
                    901:            zsout(ZDFILE,s);
                    902:     }
                    903: }
                    904: #endif
                    905: 
                    906: #ifdef TLOG
                    907: #define TBUFL 300
                    908: /*  T L O G  --  Log a record in the transaction file  */
                    909: /*
                    910:  Call with a format and 3 arguments: two strings and a number:
                    911:    f  - Format, a bit string in range 0-7, bit x is on, arg #x is printed.
                    912:    s1,s2 - String arguments 1 and 2.
                    913:    n  - Int, argument 3.
                    914: */
                    915: tlog(f,s1,s2,n) int f; long n; char *s1, *s2; {
                    916:     static char s[TBUFL];
                    917:     char *sp = s; int x;
                    918:     
                    919:     if (!tralog) return;               /* If no transaction log, don't */
                    920:     switch (f) {
                    921:        case F000:                      /* 0 (special) "s1 n s2"  */
                    922:            if (strlen(s1) + strlen(s2) + 15 > TBUFL)
                    923:              sprintf(sp,"?T-Log string too long\n");
                    924:            else sprintf(sp,"%s %ld %s\n",s1,n,s2);
                    925:            zsout(ZTFILE,s);
                    926:            break;
                    927:        case F001:                      /* 1, " n" */
                    928:            sprintf(sp," %ld\n",n);
                    929:            zsout(ZTFILE,s);
                    930:            break;
                    931:        case F010:                      /* 2, "[s2]" */
                    932:            x = strlen(s2);
                    933:            if (s2[x] == '\n') s2[x] = '\0';
                    934:            if (x + 6 > TBUFL)
                    935:              sprintf(sp,"?T-Log string too long\n");
                    936:            else sprintf(sp,"[%s]\n",s2);
                    937:            zsout(ZTFILE,"");
                    938:            break;
                    939:        case F011:                      /* 3, "[s2] n" */
                    940:            x = strlen(s2);
                    941:            if (s2[x] == '\n') s2[x] = '\0';
                    942:            if (x + 6 > TBUFL)
                    943:              sprintf(sp,"?T-Log string too long\n");
                    944:            else sprintf(sp,"[%s] %ld\n",s2,n);
                    945:            zsout(ZTFILE,s);
                    946:            break;
                    947:        case F100:                      /* 4, "s1" */
                    948:            zsoutl(ZTFILE,s1);
                    949:            break;
                    950:        case F101:                      /* 5, "s1: n" */
                    951:            if (strlen(s1) + 15 > TBUFL)
                    952:              sprintf(sp,"?T-Log string too long\n");
                    953:            else sprintf(sp,"%s: %ld\n",s1,n);
                    954:            zsout(ZTFILE,s);
                    955:            break;
                    956:        case F110:                      /* 6, "s1 s2" */
                    957:            x = strlen(s2);
                    958:            if (s2[x] == '\n') s2[x] = '\0';
                    959:            if (strlen(s1) + x + 4 > TBUFL)
                    960:              sprintf(sp,"?T-Log string too long\n");
                    961:            else sprintf(sp,"%s %s\n",s1,s2);
                    962:            zsout(ZTFILE,s);
                    963:            break;
                    964:        case F111:                      /* 7, "s1 s2: n" */
                    965:            x = strlen(s2);
                    966:            if (s2[x] == '\n') s2[x] = '\0';
                    967:            if (strlen(s1) + x + 15 > TBUFL)
                    968:              sprintf(sp,"?T-Log string too long\n");
                    969:            else sprintf(sp,"%s %s: %ld\n",s1,s2,n);
                    970:            zsout(ZTFILE,s);
                    971:            break;
                    972:        default:
                    973:            sprintf(sp,"\n?Invalid format for tlog() - %ld\n",n);
                    974:            zsout(ZTFILE,s);
                    975:     }
                    976: }
                    977: #endif

unix.superglobalmegacorp.com

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