Annotation of 43BSDReno/contrib/isode-beta/ftam2/ftam.c, revision 1.1.1.1

1.1       root        1: /* ftam.c - interactive FTAM initiator */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftam.c,v 7.1 90/07/09 14:37:18 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/ftam2/RCS/ftam.c,v 7.1 90/07/09 14:37:18 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       ftam.c,v $
                     12:  * Revision 7.1  90/07/09  14:37:18  mrose
                     13:  * sync
                     14:  * 
                     15:  * Revision 7.0  89/11/23  21:54:27  mrose
                     16:  * Release 6.0
                     17:  * 
                     18:  */
                     19: 
                     20: /*
                     21:  *                               NOTICE
                     22:  *
                     23:  *    Acquisition, use, and distribution of this module and related
                     24:  *    materials are subject to the restrictions of a license agreement.
                     25:  *    Consult the Preface in the User's Manual for the full terms of
                     26:  *    this agreement.
                     27:  *
                     28:  */
                     29: 
                     30: 
                     31: #include <ctype.h>
                     32: #include <setjmp.h>
                     33: #include <signal.h>
                     34: #include <stdio.h>
                     35: #include <varargs.h>
                     36: #include "ftamuser.h"
                     37: #include "tailor.h"
                     38: 
                     39: /*    DATA */
                     40: 
                     41: #ifndef        BRIDGE
                     42: static char *myname = "ftam";
                     43: 
                     44: static char **op = NULL;
                     45: 
                     46: static char *aflag = NULL;
                     47: static char *oflag = NULL;
                     48: static int   fflag = 0;
                     49: static char *hflag = NULL;
                     50: static char *uflag = NULL;
                     51: 
                     52: 
                     53: static char ringring = 0x07;
                     54: 
                     55: int    ontty;
                     56: 
                     57: static int     armed;
                     58: static jmp_buf intrenv;
                     59: #endif
                     60: int    interrupted;
                     61: 
                     62: 
                     63: void   adios (), advise ();
                     64: #ifndef        BRIDGE
                     65: SFD    intrser ();
                     66: #endif
                     67: 
                     68: /*    MAIN */
                     69: 
                     70: /* ARGSUSED */
                     71: 
                     72: #ifndef        BRIDGE
                     73: main (argc, argv, envp)
                     74: int    argc;
                     75: char  **argv,
                     76:       **envp;
                     77: {
                     78:     int     eof,
                     79:            status,
                     80:             vecp;
                     81:     SFP            istat;
                     82:     char   *bp,
                     83:            buffer[BUFSIZ],
                     84:            *vec[NVEC + 1];
                     85:     FILE   *fp;
                     86: 
                     87:     arginit (argv);
                     88: 
                     89:     runcom = 1;
                     90:     
                     91:     rcinit ();
                     92:     (void) sprintf (buffer, "%s/.ftamrc", myhome);
                     93: 
                     94:     if (!fflag && (fp = fopen (buffer, "r"))) {
                     95:        while (fgets (buffer, sizeof buffer, fp)) {
                     96:            if (bp = index (buffer, '\n'))
                     97:                *bp = NULL;
                     98: 
                     99:            bzero ((char *) vec, sizeof vec);
                    100:            if ((vecp = str2vec (buffer, vec)) < 1)
                    101:                continue;
                    102: 
                    103:            if (ftamloop (vec, NOTOK) != OK && op)
                    104:                exit (1);
                    105:        }
                    106:     
                    107:        (void) fclose (fp);
                    108:     }
                    109:        
                    110:     if (hflag) {
                    111:        vecp = 0;
                    112:        vec[vecp++] = "open";
                    113:        vec[vecp++] = hflag;
                    114:        if (uflag)
                    115:            vec[vecp++] = uflag;
                    116:        if (aflag)
                    117:            vec[vecp++] = aflag;
                    118:        vec[vecp] = NULL;
                    119: 
                    120:        if (ftamloop (vec, NOTOK) != OK && op)
                    121:            exit (1);
                    122:     }
                    123:     else {
                    124:        if (uflag)
                    125:            user = strdup (uflag);
                    126:        if (aflag)
                    127:            account = strdup (aflag);
                    128:     }
                    129: 
                    130:     if (oflag) {
                    131:        vecp = 0;
                    132:        vec[vecp++] = "set";
                    133:        vec[vecp++] = "override";
                    134:        vec[vecp++] = oflag;
                    135:        vec[vecp] = NULL;
                    136: 
                    137:        if (ftamloop (vec, NOTOK) != OK && op)
                    138:            exit (1);
                    139:     }
                    140:        
                    141:     runcom = 0;
                    142: 
                    143:     if (op) {
                    144:        for (vecp = 0; *op; op++)
                    145:            vec[vecp++] = *op;
                    146:        vec[vecp] = NULL;
                    147: 
                    148:        status = ftamfd != NOTOK ? 1 : 0;
                    149:        switch (ftamloop (vec, NOTOK)) {
                    150:            case NOTOK: 
                    151:                status = 1;
                    152:                break;
                    153: 
                    154:            case OK: 
                    155:            case DONE: 
                    156:            default:
                    157:                if (ftamfd != NOTOK)
                    158:                    status = 0;
                    159:                break;
                    160:        }
                    161:     }
                    162:     else {
                    163:        istat = signal (SIGINT, intrser);
                    164: 
                    165:        eof = 0;
                    166:        for (interrupted = 0;; interrupted = 0) {
                    167:            if (hash && marks >= BUFSIZ) {
                    168:                marks = 0;
                    169:                printf ("\n");
                    170:            }
                    171: 
                    172:            if (getline ("%s> ", buffer) == NOTOK) {
                    173:                if (eof)
                    174:                    break;
                    175: 
                    176:                eof = 1;
                    177:                continue;
                    178:            }
                    179:            eof = 0;
                    180: 
                    181:            bzero ((char *) vec, sizeof vec);
                    182:            if ((vecp = str2vec (buffer, vec)) < 1)
                    183:                continue;
                    184: 
                    185:            switch (ftamloop (vec, OK)) {
                    186:                case NOTOK: 
                    187:                    status = 1;
                    188:                    break;
                    189: 
                    190:                case OK: 
                    191:                default: 
                    192:                    if (bell)
                    193:                        (void) putchar (ringring);
                    194:                    continue;
                    195: 
                    196:                case DONE: 
                    197:                    status = 0;
                    198:                    break;
                    199:            }
                    200:            break;
                    201:        }
                    202: 
                    203:        (void) signal (SIGINT, istat);
                    204:     }
                    205: 
                    206:     if (ftamfd != NOTOK) {
                    207:        vecp = 0;
                    208:        vec[vecp++] = "close";
                    209:        vec[vecp] = NULL;
                    210:        
                    211:        (void) ftamloop (vec, NOTOK);
                    212:     }
                    213: 
                    214:     exit (status);             /* NOTREACHED */
                    215: }
                    216: #endif
                    217: 
                    218: /*  */
                    219: 
                    220: #ifndef        BRIDGE
                    221: static ftamloop (vec, error)
                    222: char  **vec;
                    223: int    error;
                    224: {
                    225:     register struct dispatch   *ds;
                    226: 
                    227:     if ((ds = getds (strcmp (*vec, "?") ? *vec : "help")) == NULL)
                    228:        return error;
                    229: 
                    230:     if (ftamfd == NOTOK) {
                    231:        if (ds -> ds_flags & DS_OPEN) {
                    232:            advise (NULLCP, "not associated with virtual filestore");
                    233:            return error;
                    234:        }
                    235:     }
                    236:     else
                    237:        if (ds -> ds_flags & DS_CLOSE) {
                    238:            advise (NULLCP, "already associated with virtual filestore");
                    239:            return error;
                    240:        }
                    241: 
                    242:     if (ds -> ds_flags & DS_MODES) {
                    243:        switch (ds -> ds_class) {
                    244:            case FCLASS_TRANSFER:
                    245:                if (class != FCLASS_TRANSFER && class != FCLASS_TM) {
                    246:                    advise (NULLCP, "need transfer service class");
                    247:                    return error;
                    248:                }
                    249:                break;
                    250: 
                    251:            case FCLASS_MANAGE:
                    252:                if (class != FCLASS_MANAGE && class != FCLASS_TM) {
                    253:                    advise (NULLCP, "need management service class");
                    254:                    return error;
                    255:                }
                    256:                break;
                    257: 
                    258:            default:
                    259:                break;
                    260:        }
                    261: 
                    262:        if ((ds -> ds_units & units) != ds -> ds_units) {
                    263:            advise (NULLCP, "need %s functional units",
                    264:                    sprintb (ds -> ds_units & ~units, UMASK));
                    265:            return error;
                    266:        }
                    267:     }
                    268: 
                    269:     switch ((*ds -> ds_fnx) (vec)) {
                    270:        case NOTOK: 
                    271:            return error;
                    272: 
                    273:        case OK: 
                    274:        default: 
                    275:            return OK;
                    276: 
                    277:        case DONE: 
                    278:            return DONE;
                    279:     }
                    280: }
                    281: #endif
                    282: 
                    283: /*    ARGINIT */
                    284: 
                    285: #ifndef        BRIDGE
                    286: static arginit (vec)
                    287: char  **vec;
                    288: {
                    289:     register char  *ap,
                    290:                    *pp;
                    291: 
                    292:     if (myname = rindex (*vec, '/'))
                    293:        myname++;
                    294:     if (myname == NULL || *myname == NULL)
                    295:        myname = *vec;
                    296: 
                    297:     isodetailor (myname, 1);
                    298:     ftam_log -> ll_file = strdup ("./ftam.log");
                    299:     ll_hdinit (ftam_log, myname);
                    300: 
                    301:     storename = strdup ("filestore");
                    302:     if (ontty = isatty (fileno (stdin)))
                    303:        verbose++;
                    304: 
                    305:     for (vec++; ap = *vec; vec++) {
                    306:        if (*ap == '-') {
                    307:            while (*++ap)
                    308:                switch (*ap) {
                    309:                    case 'a': 
                    310:                        if ((pp = *++vec) == NULL || *pp == NULL)
                    311:                            adios (NULLCP, "usage: %s -a acct", myname);
                    312:                        aflag = pp;
                    313:                        break;
                    314: 
                    315:                    case 'd': 
                    316:                        debug++;
                    317:                        break;
                    318: 
                    319:                    case 'f':
                    320:                        fflag++;
                    321:                        break;
                    322: 
                    323:                    case 'h': 
                    324:                        hash++;
                    325:                        break;
                    326: 
                    327:                    case 'o': 
                    328:                        if ((pp = *++vec) == NULL || *pp == NULL)
                    329:                            adios (NULLCP, "usage: %s -o mode", myname);
                    330:                        oflag = pp;
                    331:                        break;
                    332: 
                    333:                    case 't': 
                    334:                        trace++;
                    335:                        break;
                    336: 
                    337:                    case 'u': 
                    338:                        if ((pp = *++vec) == NULL || *pp == NULL)
                    339:                            adios (NULLCP, "usage: %s -u user", myname);
                    340:                        uflag = pp;
                    341:                        break;
                    342: 
                    343:                    case 'v': 
                    344:                        verbose = 1;
                    345:                        break;
                    346: 
                    347:                    case 'w': 
                    348:                        watch++;
                    349:                        break;
                    350: 
                    351:                    default: 
                    352:                        adios (NULLCP, "unknown switch -%c", *ap);
                    353:                }
                    354:            continue;
                    355:        }
                    356: 
                    357:        if (hflag == NULL)
                    358:            hflag = ap;
                    359:        else
                    360:            if (op == NULL) {
                    361:                op = vec;
                    362:                break;
                    363:            }
                    364:     }
                    365: }
                    366: #endif
                    367: 
                    368: /*    INTERACTIVE */
                    369: 
                    370: #ifndef        BRIDGE
                    371: int    getline (prompt, buffer)
                    372: char   *prompt,
                    373:        *buffer;
                    374: {
                    375:     register int    i;
                    376:     register char  *cp,
                    377:                    *ep;
                    378:     static int  sticky = 0;
                    379: 
                    380:     if (interrupted) {
                    381:        interrupted = 0;
                    382:        return NOTOK;
                    383:     }
                    384: 
                    385:     if (sticky) {
                    386:        sticky = 0;
                    387:        return NOTOK;
                    388:     }
                    389: 
                    390:     switch (setjmp (intrenv)) {
                    391:        case OK:
                    392:            armed++;
                    393:            break;
                    394: 
                    395:        case NOTOK:
                    396:            if (ontty)
                    397:                printf ("\n");  /* and fall */
                    398:        default:
                    399:            armed = 0;
                    400:            return NOTOK;
                    401:     }
                    402:        
                    403:     if (ontty) {
                    404:        printf (prompt, ftamfd != NOTOK ? host : myname);
                    405:        (void) fflush (stdout);
                    406:     }
                    407: 
                    408:     for (ep = (cp = buffer) + BUFSIZ - 1; (i = getchar ()) != '\n';) {
                    409:        if (i == EOF) {
                    410:            if (ontty)
                    411:                printf ("\n");
                    412:            clearerr (stdin);
                    413:            if (cp == buffer)
                    414:                longjmp (intrenv, DONE);
                    415: 
                    416:            sticky++;
                    417:            break;
                    418:        }
                    419: 
                    420:        if (cp < ep)
                    421:            *cp++ = i;
                    422:     }
                    423:     *cp = NULL;
                    424: 
                    425:     armed = 0;
                    426:     
                    427:     return OK;
                    428: }
                    429: #endif
                    430: 
                    431: /*  */
                    432: 
                    433: #ifndef        BRIDGE
                    434: 
                    435: /* ARGSUSED */
                    436: 
                    437: static SFD intrser (sig)
                    438: int    sig;
                    439: {
                    440: #ifndef        BSDSIGS
                    441:     (void) signal (SIGINT, intrser);
                    442: #endif
                    443: 
                    444:     if (armed)
                    445:        longjmp (intrenv, NOTOK);
                    446: 
                    447:     interrupted++;
                    448: }
                    449: #endif
                    450: 
                    451: /*  */
                    452: 
                    453: #ifndef        BRIDGE
                    454: #ifndef        lint
                    455: int    ask (va_alist)
                    456: va_dcl
                    457: {
                    458:     int     x,
                    459:             y,
                    460:             result;
                    461:     char    buffer[BUFSIZ];
                    462:     va_list ap;
                    463: 
                    464:     if (interrupted) {
                    465:        interrupted = 0;
                    466:        return NOTOK;
                    467:     }
                    468: 
                    469:     if (!ontty)
                    470:        return OK;
                    471: 
                    472:     switch (setjmp (intrenv)) {
                    473:        case OK: 
                    474:            armed++;
                    475:            break;
                    476: 
                    477:        case NOTOK: 
                    478:        default: 
                    479:            printf ("\n");
                    480:            armed = 0;
                    481:            return DONE;
                    482:     }
                    483:     if (bell)
                    484:        (void) putchar (ringring);
                    485: 
                    486:     va_start (ap);
                    487: 
                    488:     _asprintf (buffer, NULLCP, ap);
                    489: 
                    490:     va_end (ap);
                    491:     
                    492: again: ;
                    493:     printf ("%s? (y)es, (n)o: ", buffer);
                    494: 
                    495:     x = y = getchar ();
                    496:     while (y != '\n' && y != EOF)
                    497:        y = getchar ();
                    498: 
                    499:     switch (x) {
                    500:        case 'y': 
                    501:        case '\n':
                    502:            result = OK;
                    503:            break;
                    504: 
                    505:        case 'n': 
                    506:            result = NOTOK;
                    507:            break;
                    508: 
                    509:        case EOF: 
                    510:            result = DONE;
                    511:            break;
                    512: 
                    513:        default: 
                    514:            goto again;
                    515:     }
                    516: 
                    517:     armed = 0;
                    518: 
                    519:     return result;
                    520: }
                    521: #else
                    522: /* VARARGS */
                    523: 
                    524: int    ask (fmt)
                    525: char   *fmt;
                    526: {
                    527:     return ask (fmt);
                    528: }
                    529: #endif
                    530: #endif
                    531: 
                    532: /*    ERRORS */
                    533: 
                    534: #ifndef        lint
                    535: void   _advise ();
                    536: 
                    537: 
                    538: void   adios (va_alist)
                    539: va_dcl
                    540: {
                    541:     struct FTAMindication   ftis;
                    542:     va_list ap;
                    543: 
                    544:     va_start (ap);
                    545: 
                    546:     _advise (ap);
                    547: 
                    548:     va_end (ap);
                    549: 
                    550:     if (ftamfd != NOTOK)
                    551:        (void) FUAbortRequest (ftamfd, FACTION_PERM,
                    552:                (struct FTAMdiagnostic *) 0, 0, &ftis);
                    553: 
                    554: #ifdef BRIDGE
                    555:     reply (550, ftam_error);
                    556:     exit (1);
                    557: #else
                    558:     _exit (1);
                    559: #endif
                    560: }
                    561: #else
                    562: /* VARARGS */
                    563: 
                    564: void   adios (what, fmt)
                    565: char   *what,
                    566:        *fmt;
                    567: {
                    568:     adios (what, fmt);
                    569: }
                    570: #endif
                    571: 
                    572: 
                    573: #ifndef        lint
                    574: void   advise (va_alist)
                    575: va_dcl
                    576: {
                    577:     va_list ap;
                    578: 
                    579:     va_start (ap);
                    580: 
                    581:     _advise (ap);
                    582: 
                    583:     va_end (ap);
                    584: }
                    585: 
                    586: 
                    587: static void  _advise (ap)
                    588: va_list        ap;
                    589: {
                    590:     char    buffer[BUFSIZ];
                    591: 
                    592:     asprintf (buffer, ap);
                    593: 
                    594: #ifndef        BRIDGE
                    595:     if (hash && marks >= BUFSIZ) {
                    596:        marks = 0;
                    597:        printf ("\n");
                    598:     }
                    599: 
                    600:     (void) fflush (stdout);
                    601: 
                    602:     fprintf (stderr, "%s: ", myname);
                    603:     (void) fputs (buffer, stderr);
                    604:     (void) fputc ('\n', stderr);
                    605: 
                    606:     (void) fflush (stderr);
                    607: #else
                    608:     (void) ll_log (ftam_log, LLOG_NOTICE, NULLCP, "%s", buffer);
                    609:     (void) strcpy (ftam_error, buffer);
                    610: #endif
                    611: }
                    612: #else
                    613: /* VARARGS */
                    614: 
                    615: void   advise (what, fmt)
                    616: char   *what,
                    617:        *fmt;
                    618: {
                    619:     advise (what, fmt);
                    620: }
                    621: #endif
                    622: 
                    623: /*    MISCELLANY */
                    624: 
                    625: #ifndef        lint
                    626: char   *strdup (s)
                    627: char   *s;
                    628: {
                    629:     char    *p;
                    630: 
                    631:     if ((p = malloc((unsigned) (strlen (s) + 1))) == NULL)
                    632:        adios (NULLCP, "out of memory");
                    633: 
                    634:     (void) strcpy (p, s);
                    635: 
                    636:     return p;
                    637: }
                    638: #endif

unix.superglobalmegacorp.com

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