Annotation of 43BSDReno/contrib/isode-beta/ftam2/ftam.c, revision 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.