|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.