Annotation of coherent/e/bin/ckermit/ckuusy.c, revision 1.1

1.1     ! root        1: #ifndef NOCMDL
        !             2: /*  C K U U S Y --  "User Interface" for Unix Kermit, part Y  */
        !             3: 
        !             4: /*  Command-Line Argument Parser */
        !             5:  
        !             6: /*
        !             7:   Author: Frank da Cruz ([email protected], [email protected]),
        !             8:   Columbia University Center for Computing Activities.
        !             9:   First released January 1985.
        !            10:   Copyright (C) 1985, 1992, Trustees of Columbia University in the City of New
        !            11:   York.  Permission is granted to any individual or institution to use this
        !            12:   software as long as it is not sold for profit.  This copyright notice must be
        !            13:   retained.  This software may not be included in commercial products without
        !            14:   written permission of Columbia University.
        !            15: */
        !            16: 
        !            17: #include "ckcdeb.h"
        !            18: #include "ckcasc.h"
        !            19: #include "ckcker.h"
        !            20: #include "ckucmd.h"
        !            21: #include "ckcnet.h"
        !            22: 
        !            23: #ifdef NETCONN
        !            24: #ifdef SUNX25
        !            25: #include "ckcnet.h"
        !            26: extern int revcall, closgr, cudata;
        !            27: extern char udata[MAXCUDATA];
        !            28: extern int x25fd;
        !            29: #endif /* SUNX25 */
        !            30: extern int telnetfd;
        !            31: #endif /* NETCONN */
        !            32: 
        !            33: extern char *ckxsys, *ckzsys, *cmarg, *cmarg2, **xargv, **cmlist, *clcmds;
        !            34: extern int action, cflg, xargc, stdouf, stdinf, displa, cnflg, nfils,
        !            35:   local, quiet, escape, network, mdmtyp, maxrps, rpsiz, bgset, xargs,
        !            36:   urpsiz, wslotr, swcapr, binary, warn, parity, turn, turnch, duplex, flow,
        !            37:   fncact, clfils, noinit, stayflg, nettype;
        !            38: extern long speed, ttgspd(), zchki();
        !            39: extern char ttname[];
        !            40: 
        !            41: #ifndef NODIAL
        !            42: extern int nmdm;
        !            43: extern struct keytab mdmtab[];
        !            44: #endif /* NODIAL */
        !            45: 
        !            46: /*  C M D L I N  --  Get arguments from command line  */
        !            47: /*
        !            48:  Simple Unix-style command line parser, conforming with 'A Proposed Command
        !            49:  Syntax Standard for Unix Systems', Hemenway & Armitage, Unix/World, Vol.1,
        !            50:  No.3, 1984.
        !            51: */
        !            52: int
        !            53: cmdlin() {
        !            54:     char x;                            /* Local general-purpose int */
        !            55:     cmarg = "";                                /* Initialize globals */
        !            56:     cmarg2 = "";
        !            57:     action = cflg = 0;
        !            58:  
        !            59: /* If we were started directly from a Kermit application file, its name is */
        !            60: /* in argv[1], so skip past it. */
        !            61: 
        !            62:     if (xargc > 1) {
        !            63:        if (*xargv[0] != '-' && *xargv[1] != '-') {
        !            64:            if (
        !            65:                /* some shells don't put full pathname... */
        !            66:                /* zchki(xargv[0]) > 0 && */ /* ...so skip this test */
        !            67:                zchki(xargv[1]) > 0) {  /* if it's an existing file */
        !            68:                xargc -= 1;             /* skip past it */
        !            69:                xargv += 1;             /* ... */
        !            70:            }
        !            71:        }
        !            72:     }
        !            73: 
        !            74:     while (--xargc > 0) {              /* Go through command line words */
        !            75:        xargv++;
        !            76:        debug(F111,"xargv",*xargv,xargc);
        !            77:        if (**xargv == '=') return(0);
        !            78: #ifdef VMS
        !            79:        else if (**xargv == '/') continue;
        !            80: #endif /* VMS */
        !            81:        else if (**xargv == '-') {      /* Got an option (begins with dash) */
        !            82:            x = *(*xargv+1);            /* Get the option letter */
        !            83:            if (doarg(x) < 0) doexit(BAD_EXIT,1); /* Go handle option */
        !            84:        } else {                        /* No dash where expected */
        !            85:            usage();
        !            86:            doexit(BAD_EXIT,1);
        !            87:        }
        !            88:     }
        !            89:     debug(F101,"action","",action);
        !            90:     if (!local) {
        !            91:        if ((action == 'c') || (cflg != 0))
        !            92:            fatal("-l and -b required");
        !            93:     }
        !            94:     if (*cmarg2 != 0) {
        !            95:        if ((action != 's') && (action != 'r') &&
        !            96:            (action != 'v'))
        !            97:            fatal("-a without -s, -r, or -g");
        !            98:     }
        !            99:     if ((action == 'v') && (stdouf) && (!local)) {
        !           100:        if (isatty(1))
        !           101:            fatal("unredirected -k can only be used in local mode");
        !           102:     }
        !           103:     if ((action == 's') || (action == 'v') ||
        !           104:        (action == 'r') || (action == 'x')) {
        !           105:        if (local) displa = 1;
        !           106:        if (stdouf) { displa = 0; quiet = 1; }
        !           107:     }
        !           108:  
        !           109:     if (quiet) displa = 0;             /* No display if quiet requested */
        !           110:     return(action);                    /* Then do any requested protocol */
        !           111: }
        !           112: 
        !           113: /*  D O A R G  --  Do a command-line argument.  */
        !           114:  
        !           115: int
        !           116: #ifdef CK_ANSIC
        !           117: doarg(char x)
        !           118: #else
        !           119: doarg(x) char x; 
        !           120: #endif /* CK_ANSIC */
        !           121: /* doarg */ {
        !           122:     int i, y, z; long zz; char *xp;
        !           123:  
        !           124:     xp = *xargv+1;                     /* Pointer for bundled args */
        !           125:     while (x) {
        !           126:        switch (x) {
        !           127: 
        !           128: #ifndef NOSPL
        !           129: case 'C':                              /* Commands for parser */
        !           130:     xargv++, xargc--;
        !           131:     if ((xargc < 1) || (**xargv == '-'))
        !           132:       fatal("No commands given for -C");
        !           133:     clcmds = *xargv;                   /* Get the argument (must be quoted) */
        !           134:     break;
        !           135: #endif /* NOSPL */
        !           136: 
        !           137: #ifndef NOICP
        !           138: case 'S':                              /* "Stay" - enter interactive */
        !           139:     stayflg = 1;                       /* command parser after executing */
        !           140:     break;                             /* command-line actions. */
        !           141: #endif /* NOICP */
        !           142: 
        !           143: #ifndef NOSERVER
        !           144: case 'x':                              /* server */
        !           145:     if (action) fatal("conflicting actions");
        !           146:     action = 'x';
        !           147:     break;
        !           148: #endif /* NOSERVER */
        !           149:  
        !           150: case 'f':                              /* finish */
        !           151:     if (action) fatal("conflicting actions");
        !           152:     action = setgen('F',"","","");
        !           153:     break;
        !           154:  
        !           155: case 'r':                              /* receive */
        !           156:     if (action) fatal("conflicting actions");
        !           157:     action = 'v';
        !           158:     break;
        !           159:  
        !           160: case 'k':                              /* receive to stdout */
        !           161:     if (action) fatal("conflicting actions");
        !           162:     stdouf = 1;
        !           163:     action = 'v';
        !           164:     break;
        !           165:  
        !           166: case 's':                              /* send */
        !           167:     if (action) fatal("conflicting actions");
        !           168:     if (*(xp+1)) fatal("invalid argument bundling after -s");
        !           169:     nfils = z = 0;                     /* Initialize file counter, flag */
        !           170:     cmlist = xargv+1;                  /* Remember this pointer */
        !           171:     while (--xargc > 0) {              /* Traverse the list */ 
        !           172:        xargv++;
        !           173:        if (**xargv == '-') {           /* Check for sending stdin */
        !           174:            if (strcmp(*xargv,"-") != 0) /* Watch out for next option. */
        !           175:              break;
        !           176:            z++;                        /* "-" alone means send from stdin. */
        !           177:         } else if (zchki(*xargv) > -1  /* Check if file exists */
        !           178: #ifndef UNIX
        !           179:                   /* or contains wildcard characters matching real files */
        !           180:                   || (iswild(*xargv) && zxpand(*xargv) > 0)
        !           181: #endif /* UNIX */
        !           182:                   ) {
        !           183:            nfils++;                    /* Bump file counter */
        !           184:        }
        !           185:     }
        !           186:     xargc++, xargv--;                  /* Adjust argv/argc */
        !           187:     if (nfils < 1 && z == 0)
        !           188: #ifdef VMS
        !           189:       fatal("%CKERMIT-E-SEARCHFAIL, no files for -s");
        !           190: #else
        !           191:       fatal("No files for -s");
        !           192: #endif /* VMS */
        !           193:     if (z > 1) fatal("-s: too many -'s");
        !           194:     if (z == 1 && nfils > 0)
        !           195:       fatal("invalid mixture of filenames and '-' in -s");
        !           196:     if (nfils == 0) {
        !           197:        if (isatty(0)) fatal("sending from terminal not allowed");
        !           198:        else stdinf = 1;
        !           199:     }
        !           200: 
        !           201: #ifdef COMMENT
        !           202:     /* If only one filespec was given, indicate "internal list" rather than */
        !           203:     /* "expanded list", so in case it includes wildcards, C-Kermit can */
        !           204:     /* expand them itself. */
        !           205:     if (nfils == 1) {
        !           206:        cmarg = *cmlist;
        !           207:        nfils = -1;
        !           208:     }
        !           209: #endif /* COMMENT */
        !           210: 
        !           211:     debug(F101,*xargv,"",nfils);
        !           212:     action = 's';
        !           213: #ifdef UNIX
        !           214: /* When set, this flag tells Kermit not to expand wildcard characters. */
        !           215: /* In UNIX, the shell has already expanded them.  In VMS, OS/2, etc, */
        !           216: /* Kermit must expand them.  Kermit must not expand them in UNIX because */
        !           217: /* a filename might itself contain metacharacters.  Imagine, for example, */
        !           218: /* what would happen if a directory contained a file named "*". */
        !           219:     clfils = 1;                                /* Flag for command-line files */
        !           220: #endif /* UNIX */
        !           221:     break;
        !           222:  
        !           223: case 'g':                              /* get */
        !           224:     if (action) fatal("conflicting actions");
        !           225:     if (*(xp+1)) fatal("invalid argument bundling after -g");
        !           226:     xargv++, xargc--;
        !           227:     if ((xargc == 0) || (**xargv == '-'))
        !           228:        fatal("missing filename for -g");
        !           229:     cmarg = *xargv;
        !           230:     action = 'r';
        !           231:     break;
        !           232:  
        !           233: case 'c':                              /* connect before */
        !           234:     cflg = 1;
        !           235:     break;
        !           236:  
        !           237: case 'n':                              /* connect after */
        !           238:     cnflg = 1;
        !           239:     break;
        !           240:  
        !           241: case 'h':                              /* help */
        !           242:     usage();
        !           243: #ifndef NOICP
        !           244:     if (stayflg)
        !           245:       break;
        !           246:     else
        !           247: #endif /* NOICP */
        !           248:       doexit(GOOD_EXIT,-1);
        !           249: 
        !           250: case 'a':                              /* "as" */
        !           251:     if (*(xp+1)) fatal("invalid argument bundling after -a");
        !           252:     xargv++, xargc--;
        !           253:     if ((xargc < 1) || (**xargv == '-'))
        !           254:        fatal("missing name in -a");
        !           255:     cmarg2 = *xargv;
        !           256:     break;
        !           257:  
        !           258: #ifndef NOICP
        !           259: case 'Y':                              /* No initialization file */
        !           260:     noinit = 1;
        !           261:     break;
        !           262: 
        !           263: case 'y':                              /* Alternate init-file name */
        !           264:     if (*(xp+1)) fatal("invalid argument bundling after -y");
        !           265:     xargv++, xargc--;
        !           266:     if (xargc < 1) fatal("missing name in -y");
        !           267:     /* strcpy(kermrc,*xargv); ...this was already done in prescan()... */
        !           268:     break;
        !           269: #endif /* NOICP */
        !           270: 
        !           271: case 'l':                              /* set line */
        !           272: #ifdef NETCONN
        !           273: case 'X':                              /* set host to X.25 address */
        !           274: case 'Z':                              /* set host to X.25 file descriptor */
        !           275: case 'j':                              /* set host (TCP/IP socket) */
        !           276: #endif /* NETCONN */
        !           277:     network = 0;
        !           278:     if (*(xp+1)) fatal("invalid argument bundling after -l or -j");
        !           279:     xargv++, xargc--;
        !           280:     if ((xargc < 1) || (**xargv == '-'))
        !           281:        fatal("communication line device name missing");
        !           282:     strcpy(ttname,*xargv);
        !           283:     local = (strcmp(ttname,CTTNAM) != 0);
        !           284:     if (x == 'l') {
        !           285:        if (ttopen(ttname,&local,mdmtyp,0) < 0)
        !           286:          fatal("can't open device");
        !           287:        debug(F101,"cmdlin speed","",speed);
        !           288: #ifdef COMMENT
        !           289: /* What can it hurt? */
        !           290:        if (speed < 0L)                 /* If speed hasn't been set yet, */
        !           291: #endif /* COMMENT */
        !           292:          speed = ttgspd();             /* get it. */
        !           293: #ifdef NETCONN
        !           294:     } else {
        !           295:        if (x == 'j') {                 /* IP network host name */
        !           296:            mdmtyp = -nettype;          /* perhaps alread set in init file */
        !           297:            telnetfd = 1;               /* Or maybe an open file descriptor */
        !           298: #ifdef SUNX25
        !           299:        } else if (x == 'X') {          /* X.25 address */
        !           300:            mdmtyp = 0 - NET_SX25;
        !           301:        } else if (x == 'Z') {          /* Open X.25 file descriptor */
        !           302:            mdmtyp = 0 - NET_SX25;
        !           303:            x25fd = 1;
        !           304: #endif /* SUNX25 */
        !           305:        }
        !           306:        if (ttopen(ttname,&local,mdmtyp,0) < 0)
        !           307:          fatal("can't open host connection");
        !           308:        network = 1;
        !           309: #endif /* NETCONN */
        !           310:     }
        !           311:     /* add more here later - decnet, etc... */
        !           312:     break;
        !           313:  
        !           314: #ifdef SUNX25
        !           315: case 'U':                               /* X.25 call user data */
        !           316:     if (*(xp+1)) fatal("invalid argument bundling");
        !           317:     xargv++, xargc--;
        !           318:     if ((xargc < 1) || (**xargv == '-'))
        !           319:         fatal("missing call user data string");
        !           320:     strcpy(udata,*xargv);
        !           321:     if ((int)strlen(udata) <= MAXCUDATA) cudata = 1;
        !           322:     else fatal("Invalid call user data");
        !           323:     break;
        !           324: 
        !           325: case 'o':                               /* X.25 closed user group */
        !           326:     if (*(xp+1)) fatal("invalid argument bundling");
        !           327:     xargv++, xargc--;
        !           328:     if ((xargc < 1) || (**xargv == '-'))
        !           329:        fatal("missing closed user group index");
        !           330:     z = atoi(*xargv);                  /* Convert to number */
        !           331:     if (z >= 0 && z <= 99) closgr = z;
        !           332:     else fatal("Invalid closed user group index");
        !           333:     break;
        !           334: 
        !           335: case 'u':                               /* X.25 reverse charge call */
        !           336:     revcall = 1;
        !           337:     break;
        !           338: #endif /* SUNX25 */
        !           339: 
        !           340: case 'b':                              /* set bits-per-second for serial */
        !           341:     if (*(xp+1)) fatal("invalid argument bundling"); /* communication device */
        !           342:     xargv++, xargc--;
        !           343:     if ((xargc < 1) || (**xargv == '-'))
        !           344:        fatal("missing baud");
        !           345:     zz = atol(*xargv);                 /* Convert to long int */
        !           346:     i = zz / 10L;
        !           347:     if (ttsspd(i) > -1)                        /* Check and set it */
        !           348:       speed = zz;
        !           349:     else
        !           350:       fatal("unsupported transmission rate");
        !           351:     break;
        !           352:  
        !           353: #ifndef NODIAL
        !           354: case 'm':                              /* Modem type */
        !           355:     if (*(xp+1)) fatal("invalid argument bundling after -m");    
        !           356:     xargv++, xargc--;
        !           357:     if ((xargc < 1) || (**xargv == '-'))
        !           358:        fatal("modem type missing");
        !           359:     y = lookup(mdmtab,*xargv,nmdm,&z);
        !           360:     if (y < 0)
        !           361:       fatal("unknown modem type");
        !           362:     mdmtyp = y;
        !           363:     break;
        !           364: #endif
        !           365: 
        !           366: case 'e':                              /* Extended packet length */
        !           367:     if (*(xp+1)) fatal("invalid argument bundling after -e");
        !           368:     xargv++, xargc--;
        !           369:     if ((xargc < 1) || (**xargv == '-'))
        !           370:        fatal("missing length");
        !           371:     z = atoi(*xargv);                  /* Convert to number */
        !           372:     if (z > 10 && z <= maxrps) {
        !           373:         rpsiz = urpsiz = z;
        !           374:        if (z > 94) rpsiz = 94;         /* Fallback if other Kermit can't */
        !           375:     } else fatal("Unsupported packet length");
        !           376:     break;
        !           377: 
        !           378: case 'v':                              /* Vindow size */
        !           379:     if (*(xp+1)) fatal("invalid argument bundling");
        !           380:     xargv++, xargc--;
        !           381:     if ((xargc < 1) || (**xargv == '-'))
        !           382:        fatal("missing or bad window size");
        !           383:     z = atoi(*xargv);                  /* Convert to number */
        !           384:     if (z < 32) {                      /* If in range */
        !           385:        wslotr = z;                     /* set it */
        !           386:        if (z > 1) swcapr = 1;          /* Set capas bit if windowing */
        !           387:     } else fatal("Unsupported packet length");
        !           388:     break;
        !           389: 
        !           390: case 'i':                              /* Treat files as binary */
        !           391:     binary = 1;
        !           392:     break;
        !           393:  
        !           394: case 'w':                              /* Writeover */
        !           395:     warn = 0;
        !           396:     fncact = XYFX_X;
        !           397:     break;
        !           398:  
        !           399: case 'q':                              /* Quiet */
        !           400:     quiet = 1;
        !           401:     break;
        !           402:  
        !           403: #ifdef DEBUG
        !           404: case 'd':                              /* debug */
        !           405: /** debopn("debug.log"); *** already did this in prescan() **/
        !           406:     break;
        !           407: #endif /* DEBUG */ 
        !           408: 
        !           409: case 'p':                              /* set parity */
        !           410:     if (*(xp+1)) fatal("invalid argument bundling");
        !           411:     xargv++, xargc--;
        !           412:     if ((xargc < 1) || (**xargv == '-'))
        !           413:        fatal("missing parity");
        !           414:     switch(x = **xargv) {
        !           415:        case 'e':
        !           416:        case 'o':
        !           417:        case 'm':
        !           418:        case 's': parity = x; break;
        !           419:        case 'n': parity = 0; break;
        !           420:        default:  fatal("invalid parity");
        !           421:         }
        !           422:     break;
        !           423:  
        !           424: case 't':
        !           425:     turn = 1;                          /* Line turnaround handshake */
        !           426:     turnch = XON;                      /* XON is turnaround character */
        !           427:     duplex = 1;                                /* Half duplex */
        !           428:     flow = 0;                          /* No flow control */
        !           429:     break;
        !           430:  
        !           431: case 'z':                              /* Not background */
        !           432:     bgset = 0;
        !           433:     break;
        !           434: 
        !           435: default:
        !           436:     fatal("invalid argument, type 'kermit -h' for help");
        !           437:         }
        !           438:  
        !           439:     x = *++xp;                         /* See if options are bundled */
        !           440:     }
        !           441:     return(0);
        !           442: }
        !           443: #else /* No command-line interface... */
        !           444: 
        !           445: extern int xargc;
        !           446: int
        !           447: cmdlin() {
        !           448:     if (xargc > 1) printf("Sorry, command-line options disabled.\n");
        !           449:     return(0);
        !           450: }
        !           451: #endif /* NOCMDL */

unix.superglobalmegacorp.com

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