|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1985 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that the above copyright notice and this paragraph are ! 7: * duplicated in all such forms and that any documentation, ! 8: * advertising materials, and other materials related to such ! 9: * distribution and use acknowledge that the software was developed ! 10: * by the University of California, Berkeley. The name of the ! 11: * University may not be used to endorse or promote products derived ! 12: * from this software without specific prior written permission. ! 13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 16: */ ! 17: ! 18: #ifndef lint ! 19: static char sccsid[] = "@(#)cmds.c 5.8 (Berkeley) 6/29/88"; ! 20: #endif /* not lint */ ! 21: ! 22: /* ! 23: * FTP User Program -- Command Routines. ! 24: */ ! 25: #include "ftp_var.h" ! 26: #include <sys/socket.h> ! 27: ! 28: #include <arpa/ftp.h> ! 29: ! 30: #include <signal.h> ! 31: #include <stdio.h> ! 32: #include <errno.h> ! 33: #include <netdb.h> ! 34: #include <ctype.h> ! 35: #include <sys/wait.h> ! 36: ! 37: ! 38: extern char *globerr; ! 39: extern char **glob(); ! 40: extern char *home; ! 41: extern short gflag; ! 42: extern char *remglob(); ! 43: extern char *getenv(); ! 44: extern char *index(); ! 45: extern char *rindex(); ! 46: char *mname; ! 47: jmp_buf jabort; ! 48: char *dotrans(), *domap(); ! 49: ! 50: /* ! 51: * Connect to peer server and ! 52: * auto-login, if possible. ! 53: */ ! 54: setpeer(argc, argv) ! 55: int argc; ! 56: char *argv[]; ! 57: { ! 58: char *host, *hookup(); ! 59: int port; ! 60: ! 61: if (connected) { ! 62: printf("Already connected to %s, use close first.\n", ! 63: hostname); ! 64: code = -1; ! 65: return; ! 66: } ! 67: if (argc < 2) { ! 68: (void) strcat(line, " "); ! 69: printf("(to) "); ! 70: (void) gets(&line[strlen(line)]); ! 71: makeargv(); ! 72: argc = margc; ! 73: argv = margv; ! 74: } ! 75: if (argc > 3) { ! 76: printf("usage: %s host-name [port]\n", argv[0]); ! 77: code = -1; ! 78: return; ! 79: } ! 80: port = sp->s_port; ! 81: if (argc > 2) { ! 82: port = atoi(argv[2]); ! 83: if (port <= 0) { ! 84: printf("%s: bad port number-- %s\n", argv[1], argv[2]); ! 85: printf ("usage: %s host-name [port]\n", argv[0]); ! 86: code = -1; ! 87: return; ! 88: } ! 89: port = htons(port); ! 90: } ! 91: host = hookup(argv[1], port); ! 92: if (host) { ! 93: connected = 1; ! 94: if (autologin) ! 95: (void) login(argv[1]); ! 96: } ! 97: } ! 98: ! 99: struct types { ! 100: char *t_name; ! 101: char *t_mode; ! 102: int t_type; ! 103: char *t_arg; ! 104: } types[] = { ! 105: { "ascii", "A", TYPE_A, 0 }, ! 106: { "binary", "I", TYPE_I, 0 }, ! 107: { "image", "I", TYPE_I, 0 }, ! 108: { "ebcdic", "E", TYPE_E, 0 }, ! 109: { "tenex", "L", TYPE_L, bytename }, ! 110: 0 ! 111: }; ! 112: ! 113: /* ! 114: * Set transfer type. ! 115: */ ! 116: settype(argc, argv) ! 117: char *argv[]; ! 118: { ! 119: register struct types *p; ! 120: int comret; ! 121: ! 122: if (argc > 2) { ! 123: char *sep; ! 124: ! 125: printf("usage: %s [", argv[0]); ! 126: sep = " "; ! 127: for (p = types; p->t_name; p++) { ! 128: printf("%s%s", sep, p->t_name); ! 129: if (*sep == ' ') ! 130: sep = " | "; ! 131: } ! 132: printf(" ]\n"); ! 133: code = -1; ! 134: return; ! 135: } ! 136: if (argc < 2) { ! 137: printf("Using %s mode to transfer files.\n", typename); ! 138: code = 0; ! 139: return; ! 140: } ! 141: for (p = types; p->t_name; p++) ! 142: if (strcmp(argv[1], p->t_name) == 0) ! 143: break; ! 144: if (p->t_name == 0) { ! 145: printf("%s: unknown mode\n", argv[1]); ! 146: code = -1; ! 147: return; ! 148: } ! 149: if ((p->t_arg != NULL) && (*(p->t_arg) != '\0')) ! 150: comret = command ("TYPE %s %s", p->t_mode, p->t_arg); ! 151: else ! 152: comret = command("TYPE %s", p->t_mode); ! 153: if (comret == COMPLETE) { ! 154: (void) strcpy(typename, p->t_name); ! 155: type = p->t_type; ! 156: } ! 157: } ! 158: ! 159: /* ! 160: * Set binary transfer type. ! 161: */ ! 162: /*VARARGS*/ ! 163: setbinary() ! 164: { ! 165: ! 166: call(settype, "type", "binary", 0); ! 167: } ! 168: ! 169: /* ! 170: * Set ascii transfer type. ! 171: */ ! 172: /*VARARGS*/ ! 173: setascii() ! 174: { ! 175: ! 176: call(settype, "type", "ascii", 0); ! 177: } ! 178: ! 179: /* ! 180: * Set tenex transfer type. ! 181: */ ! 182: /*VARARGS*/ ! 183: settenex() ! 184: { ! 185: ! 186: call(settype, "type", "tenex", 0); ! 187: } ! 188: ! 189: /* ! 190: * Set ebcdic transfer type. ! 191: */ ! 192: /*VARARGS*/ ! 193: setebcdic() ! 194: { ! 195: ! 196: call(settype, "type", "ebcdic", 0); ! 197: } ! 198: ! 199: /* ! 200: * Set file transfer mode. ! 201: */ ! 202: /*ARGSUSED*/ ! 203: setmode(argc, argv) ! 204: char *argv[]; ! 205: { ! 206: ! 207: printf("We only support %s mode, sorry.\n", modename); ! 208: code = -1; ! 209: } ! 210: ! 211: /* ! 212: * Set file transfer format. ! 213: */ ! 214: /*ARGSUSED*/ ! 215: setform(argc, argv) ! 216: char *argv[]; ! 217: { ! 218: ! 219: printf("We only support %s format, sorry.\n", formname); ! 220: code = -1; ! 221: } ! 222: ! 223: /* ! 224: * Set file transfer structure. ! 225: */ ! 226: /*ARGSUSED*/ ! 227: setstruct(argc, argv) ! 228: char *argv[]; ! 229: { ! 230: ! 231: printf("We only support %s structure, sorry.\n", structname); ! 232: code = -1; ! 233: } ! 234: ! 235: /* ! 236: * Send a single file. ! 237: */ ! 238: put(argc, argv) ! 239: int argc; ! 240: char *argv[]; ! 241: { ! 242: char *cmd; ! 243: int loc = 0; ! 244: char *oldargv1; ! 245: ! 246: if (argc == 2) { ! 247: argc++; ! 248: argv[2] = argv[1]; ! 249: loc++; ! 250: } ! 251: if (argc < 2) { ! 252: (void) strcat(line, " "); ! 253: printf("(local-file) "); ! 254: (void) gets(&line[strlen(line)]); ! 255: makeargv(); ! 256: argc = margc; ! 257: argv = margv; ! 258: } ! 259: if (argc < 2) { ! 260: usage: ! 261: printf("usage:%s local-file remote-file\n", argv[0]); ! 262: code = -1; ! 263: return; ! 264: } ! 265: if (argc < 3) { ! 266: (void) strcat(line, " "); ! 267: printf("(remote-file) "); ! 268: (void) gets(&line[strlen(line)]); ! 269: makeargv(); ! 270: argc = margc; ! 271: argv = margv; ! 272: } ! 273: if (argc < 3) ! 274: goto usage; ! 275: oldargv1 = argv[1]; ! 276: if (!globulize(&argv[1])) { ! 277: code = -1; ! 278: return; ! 279: } ! 280: /* ! 281: * If "globulize" modifies argv[1], and argv[2] is a copy of ! 282: * the old argv[1], make it a copy of the new argv[1]. ! 283: */ ! 284: if (argv[1] != oldargv1 && argv[2] == oldargv1) { ! 285: argv[2] = argv[1]; ! 286: } ! 287: cmd = (argv[0][0] == 'a') ? "APPE" : ((sunique) ? "STOU" : "STOR"); ! 288: if (loc && ntflag) { ! 289: argv[2] = dotrans(argv[2]); ! 290: } ! 291: if (loc && mapflag) { ! 292: argv[2] = domap(argv[2]); ! 293: } ! 294: sendrequest(cmd, argv[1], argv[2]); ! 295: } ! 296: ! 297: /* ! 298: * Send multiple files. ! 299: */ ! 300: mput(argc, argv) ! 301: char *argv[]; ! 302: { ! 303: register int i; ! 304: int ointer, (*oldintr)(), mabort(); ! 305: extern jmp_buf jabort; ! 306: char *tp; ! 307: ! 308: if (argc < 2) { ! 309: (void) strcat(line, " "); ! 310: printf("(local-files) "); ! 311: (void) gets(&line[strlen(line)]); ! 312: makeargv(); ! 313: argc = margc; ! 314: argv = margv; ! 315: } ! 316: if (argc < 2) { ! 317: printf("usage:%s local-files\n", argv[0]); ! 318: code = -1; ! 319: return; ! 320: } ! 321: mname = argv[0]; ! 322: mflag = 1; ! 323: oldintr = signal(SIGINT, mabort); ! 324: (void) setjmp(jabort); ! 325: if (proxy) { ! 326: char *cp, *tp2, tmpbuf[MAXPATHLEN]; ! 327: ! 328: while ((cp = remglob(argv,0)) != NULL) { ! 329: if (*cp == 0) { ! 330: mflag = 0; ! 331: continue; ! 332: } ! 333: if (mflag && confirm(argv[0], cp)) { ! 334: tp = cp; ! 335: if (mcase) { ! 336: while (*tp && !islower(*tp)) { ! 337: tp++; ! 338: } ! 339: if (!*tp) { ! 340: tp = cp; ! 341: tp2 = tmpbuf; ! 342: while ((*tp2 = *tp) != NULL) { ! 343: if (isupper(*tp2)) { ! 344: *tp2 = 'a' + *tp2 - 'A'; ! 345: } ! 346: tp++; ! 347: tp2++; ! 348: } ! 349: } ! 350: tp = tmpbuf; ! 351: } ! 352: if (ntflag) { ! 353: tp = dotrans(tp); ! 354: } ! 355: if (mapflag) { ! 356: tp = domap(tp); ! 357: } ! 358: sendrequest((sunique) ? "STOU" : "STOR", cp,tp); ! 359: if (!mflag && fromatty) { ! 360: ointer = interactive; ! 361: interactive = 1; ! 362: if (confirm("Continue with","mput")) { ! 363: mflag++; ! 364: } ! 365: interactive = ointer; ! 366: } ! 367: } ! 368: } ! 369: (void) signal(SIGINT, oldintr); ! 370: mflag = 0; ! 371: return; ! 372: } ! 373: for (i = 1; i < argc; i++) { ! 374: register char **cpp, **gargs; ! 375: ! 376: if (!doglob) { ! 377: if (mflag && confirm(argv[0], argv[i])) { ! 378: tp = (ntflag) ? dotrans(argv[i]) : argv[i]; ! 379: tp = (mapflag) ? domap(tp) : tp; ! 380: sendrequest((sunique) ? "STOU" : "STOR", ! 381: argv[i], tp); ! 382: if (!mflag && fromatty) { ! 383: ointer = interactive; ! 384: interactive = 1; ! 385: if (confirm("Continue with","mput")) { ! 386: mflag++; ! 387: } ! 388: interactive = ointer; ! 389: } ! 390: } ! 391: continue; ! 392: } ! 393: gargs = glob(argv[i]); ! 394: if (globerr != NULL) { ! 395: printf("%s\n", globerr); ! 396: if (gargs) ! 397: blkfree(gargs); ! 398: continue; ! 399: } ! 400: for (cpp = gargs; cpp && *cpp != NULL; cpp++) { ! 401: if (mflag && confirm(argv[0], *cpp)) { ! 402: tp = (ntflag) ? dotrans(*cpp) : *cpp; ! 403: tp = (mapflag) ? domap(tp) : tp; ! 404: sendrequest((sunique) ? "STOU" : "STOR", ! 405: *cpp, tp); ! 406: if (!mflag && fromatty) { ! 407: ointer = interactive; ! 408: interactive = 1; ! 409: if (confirm("Continue with","mput")) { ! 410: mflag++; ! 411: } ! 412: interactive = ointer; ! 413: } ! 414: } ! 415: } ! 416: if (gargs != NULL) ! 417: blkfree(gargs); ! 418: } ! 419: (void) signal(SIGINT, oldintr); ! 420: mflag = 0; ! 421: } ! 422: ! 423: /* ! 424: * Receive one file. ! 425: */ ! 426: get(argc, argv) ! 427: char *argv[]; ! 428: { ! 429: int loc = 0; ! 430: ! 431: if (argc == 2) { ! 432: argc++; ! 433: argv[2] = argv[1]; ! 434: loc++; ! 435: } ! 436: if (argc < 2) { ! 437: (void) strcat(line, " "); ! 438: printf("(remote-file) "); ! 439: (void) gets(&line[strlen(line)]); ! 440: makeargv(); ! 441: argc = margc; ! 442: argv = margv; ! 443: } ! 444: if (argc < 2) { ! 445: usage: ! 446: printf("usage: %s remote-file [ local-file ]\n", argv[0]); ! 447: code = -1; ! 448: return; ! 449: } ! 450: if (argc < 3) { ! 451: (void) strcat(line, " "); ! 452: printf("(local-file) "); ! 453: (void) gets(&line[strlen(line)]); ! 454: makeargv(); ! 455: argc = margc; ! 456: argv = margv; ! 457: } ! 458: if (argc < 3) ! 459: goto usage; ! 460: if (!globulize(&argv[2])) { ! 461: code = -1; ! 462: return; ! 463: } ! 464: if (loc && mcase) { ! 465: char *tp = argv[1], *tp2, tmpbuf[MAXPATHLEN]; ! 466: ! 467: while (*tp && !islower(*tp)) { ! 468: tp++; ! 469: } ! 470: if (!*tp) { ! 471: tp = argv[2]; ! 472: tp2 = tmpbuf; ! 473: while ((*tp2 = *tp) != NULL) { ! 474: if (isupper(*tp2)) { ! 475: *tp2 = 'a' + *tp2 - 'A'; ! 476: } ! 477: tp++; ! 478: tp2++; ! 479: } ! 480: argv[2] = tmpbuf; ! 481: } ! 482: } ! 483: if (loc && ntflag) { ! 484: argv[2] = dotrans(argv[2]); ! 485: } ! 486: if (loc && mapflag) { ! 487: argv[2] = domap(argv[2]); ! 488: } ! 489: recvrequest("RETR", argv[2], argv[1], "w"); ! 490: } ! 491: ! 492: mabort() ! 493: { ! 494: int ointer; ! 495: extern jmp_buf jabort; ! 496: ! 497: printf("\n"); ! 498: (void) fflush(stdout); ! 499: if (mflag && fromatty) { ! 500: ointer = interactive; ! 501: interactive = 1; ! 502: if (confirm("Continue with", mname)) { ! 503: interactive = ointer; ! 504: longjmp(jabort,0); ! 505: } ! 506: interactive = ointer; ! 507: } ! 508: mflag = 0; ! 509: longjmp(jabort,0); ! 510: } ! 511: ! 512: /* ! 513: * Get multiple files. ! 514: */ ! 515: mget(argc, argv) ! 516: char *argv[]; ! 517: { ! 518: char *cp, *tp, *tp2, tmpbuf[MAXPATHLEN]; ! 519: int ointer, (*oldintr)(), mabort(); ! 520: extern jmp_buf jabort; ! 521: ! 522: if (argc < 2) { ! 523: (void) strcat(line, " "); ! 524: printf("(remote-files) "); ! 525: (void) gets(&line[strlen(line)]); ! 526: makeargv(); ! 527: argc = margc; ! 528: argv = margv; ! 529: } ! 530: if (argc < 2) { ! 531: printf("usage:%s remote-files\n", argv[0]); ! 532: code = -1; ! 533: return; ! 534: } ! 535: mname = argv[0]; ! 536: mflag = 1; ! 537: oldintr = signal(SIGINT,mabort); ! 538: (void) setjmp(jabort); ! 539: while ((cp = remglob(argv,proxy)) != NULL) { ! 540: if (*cp == '\0') { ! 541: mflag = 0; ! 542: continue; ! 543: } ! 544: if (mflag && confirm(argv[0], cp)) { ! 545: tp = cp; ! 546: if (mcase) { ! 547: while (*tp && !islower(*tp)) { ! 548: tp++; ! 549: } ! 550: if (!*tp) { ! 551: tp = cp; ! 552: tp2 = tmpbuf; ! 553: while ((*tp2 = *tp) != NULL) { ! 554: if (isupper(*tp2)) { ! 555: *tp2 = 'a' + *tp2 - 'A'; ! 556: } ! 557: tp++; ! 558: tp2++; ! 559: } ! 560: } ! 561: tp = tmpbuf; ! 562: } ! 563: if (ntflag) { ! 564: tp = dotrans(tp); ! 565: } ! 566: if (mapflag) { ! 567: tp = domap(tp); ! 568: } ! 569: recvrequest("RETR", tp, cp, "w"); ! 570: if (!mflag && fromatty) { ! 571: ointer = interactive; ! 572: interactive = 1; ! 573: if (confirm("Continue with","mget")) { ! 574: mflag++; ! 575: } ! 576: interactive = ointer; ! 577: } ! 578: } ! 579: } ! 580: (void) signal(SIGINT,oldintr); ! 581: mflag = 0; ! 582: } ! 583: ! 584: char * ! 585: remglob(argv,doswitch) ! 586: char *argv[]; ! 587: int doswitch; ! 588: { ! 589: char temp[16]; ! 590: static char buf[MAXPATHLEN]; ! 591: static FILE *ftemp = NULL; ! 592: static char **args; ! 593: int oldverbose, oldhash; ! 594: char *cp, *mode; ! 595: ! 596: if (!mflag) { ! 597: if (!doglob) { ! 598: args = NULL; ! 599: } ! 600: else { ! 601: if (ftemp) { ! 602: (void) fclose(ftemp); ! 603: ftemp = NULL; ! 604: } ! 605: } ! 606: return(NULL); ! 607: } ! 608: if (!doglob) { ! 609: if (args == NULL) ! 610: args = argv; ! 611: if ((cp = *++args) == NULL) ! 612: args = NULL; ! 613: return (cp); ! 614: } ! 615: if (ftemp == NULL) { ! 616: (void) strcpy(temp, "/tmp/ftpXXXXXX"); ! 617: (void) mktemp(temp); ! 618: oldverbose = verbose, verbose = 0; ! 619: oldhash = hash, hash = 0; ! 620: if (doswitch) { ! 621: pswitch(!proxy); ! 622: } ! 623: for (mode = "w"; *++argv != NULL; mode = "a") ! 624: recvrequest ("NLST", temp, *argv, mode); ! 625: if (doswitch) { ! 626: pswitch(!proxy); ! 627: } ! 628: verbose = oldverbose; hash = oldhash; ! 629: ftemp = fopen(temp, "r"); ! 630: (void) unlink(temp); ! 631: if (ftemp == NULL) { ! 632: printf("can't find list of remote files, oops\n"); ! 633: return (NULL); ! 634: } ! 635: } ! 636: if (fgets(buf, sizeof (buf), ftemp) == NULL) { ! 637: (void) fclose(ftemp), ftemp = NULL; ! 638: return (NULL); ! 639: } ! 640: if ((cp = index(buf, '\n')) != NULL) ! 641: *cp = '\0'; ! 642: return (buf); ! 643: } ! 644: ! 645: char * ! 646: onoff(bool) ! 647: int bool; ! 648: { ! 649: ! 650: return (bool ? "on" : "off"); ! 651: } ! 652: ! 653: /* ! 654: * Show status. ! 655: */ ! 656: /*ARGSUSED*/ ! 657: status(argc, argv) ! 658: char *argv[]; ! 659: { ! 660: int i; ! 661: ! 662: if (connected) ! 663: printf("Connected to %s.\n", hostname); ! 664: else ! 665: printf("Not connected.\n"); ! 666: if (!proxy) { ! 667: pswitch(1); ! 668: if (connected) { ! 669: printf("Connected for proxy commands to %s.\n", hostname); ! 670: } ! 671: else { ! 672: printf("No proxy connection.\n"); ! 673: } ! 674: pswitch(0); ! 675: } ! 676: printf("Mode: %s; Type: %s; Form: %s; Structure: %s\n", ! 677: modename, typename, formname, structname); ! 678: printf("Verbose: %s; Bell: %s; Prompting: %s; Globbing: %s\n", ! 679: onoff(verbose), onoff(bell), onoff(interactive), ! 680: onoff(doglob)); ! 681: printf("Store unique: %s; Receive unique: %s\n", onoff(sunique), ! 682: onoff(runique)); ! 683: printf("Case: %s; CR stripping: %s\n",onoff(mcase),onoff(crflag)); ! 684: if (ntflag) { ! 685: printf("Ntrans: (in) %s (out) %s\n", ntin,ntout); ! 686: } ! 687: else { ! 688: printf("Ntrans: off\n"); ! 689: } ! 690: if (mapflag) { ! 691: printf("Nmap: (in) %s (out) %s\n", mapin, mapout); ! 692: } ! 693: else { ! 694: printf("Nmap: off\n"); ! 695: } ! 696: printf("Hash mark printing: %s; Use of PORT cmds: %s\n", ! 697: onoff(hash), onoff(sendport)); ! 698: if (macnum > 0) { ! 699: printf("Macros:\n"); ! 700: for (i=0; i<macnum; i++) { ! 701: printf("\t%s\n",macros[i].mac_name); ! 702: } ! 703: } ! 704: code = 0; ! 705: } ! 706: ! 707: /* ! 708: * Set beep on cmd completed mode. ! 709: */ ! 710: /*VARARGS*/ ! 711: setbell() ! 712: { ! 713: ! 714: bell = !bell; ! 715: printf("Bell mode %s.\n", onoff(bell)); ! 716: code = bell; ! 717: } ! 718: ! 719: /* ! 720: * Turn on packet tracing. ! 721: */ ! 722: /*VARARGS*/ ! 723: settrace() ! 724: { ! 725: ! 726: trace = !trace; ! 727: printf("Packet tracing %s.\n", onoff(trace)); ! 728: code = trace; ! 729: } ! 730: ! 731: /* ! 732: * Toggle hash mark printing during transfers. ! 733: */ ! 734: /*VARARGS*/ ! 735: sethash() ! 736: { ! 737: ! 738: hash = !hash; ! 739: printf("Hash mark printing %s", onoff(hash)); ! 740: code = hash; ! 741: if (hash) ! 742: printf(" (%d bytes/hash mark)", BUFSIZ); ! 743: printf(".\n"); ! 744: } ! 745: ! 746: /* ! 747: * Turn on printing of server echo's. ! 748: */ ! 749: /*VARARGS*/ ! 750: setverbose() ! 751: { ! 752: ! 753: verbose = !verbose; ! 754: printf("Verbose mode %s.\n", onoff(verbose)); ! 755: code = verbose; ! 756: } ! 757: ! 758: /* ! 759: * Toggle PORT cmd use before each data connection. ! 760: */ ! 761: /*VARARGS*/ ! 762: setport() ! 763: { ! 764: ! 765: sendport = !sendport; ! 766: printf("Use of PORT cmds %s.\n", onoff(sendport)); ! 767: code = sendport; ! 768: } ! 769: ! 770: /* ! 771: * Turn on interactive prompting ! 772: * during mget, mput, and mdelete. ! 773: */ ! 774: /*VARARGS*/ ! 775: setprompt() ! 776: { ! 777: ! 778: interactive = !interactive; ! 779: printf("Interactive mode %s.\n", onoff(interactive)); ! 780: code = interactive; ! 781: } ! 782: ! 783: /* ! 784: * Toggle metacharacter interpretation ! 785: * on local file names. ! 786: */ ! 787: /*VARARGS*/ ! 788: setglob() ! 789: { ! 790: ! 791: doglob = !doglob; ! 792: printf("Globbing %s.\n", onoff(doglob)); ! 793: code = doglob; ! 794: } ! 795: ! 796: /* ! 797: * Set debugging mode on/off and/or ! 798: * set level of debugging. ! 799: */ ! 800: /*VARARGS*/ ! 801: setdebug(argc, argv) ! 802: char *argv[]; ! 803: { ! 804: int val; ! 805: ! 806: if (argc > 1) { ! 807: val = atoi(argv[1]); ! 808: if (val < 0) { ! 809: printf("%s: bad debugging value.\n", argv[1]); ! 810: code = -1; ! 811: return; ! 812: } ! 813: } else ! 814: val = !debug; ! 815: debug = val; ! 816: if (debug) ! 817: options |= SO_DEBUG; ! 818: else ! 819: options &= ~SO_DEBUG; ! 820: printf("Debugging %s (debug=%d).\n", onoff(debug), debug); ! 821: code = debug > 0; ! 822: } ! 823: ! 824: /* ! 825: * Set current working directory ! 826: * on remote machine. ! 827: */ ! 828: cd(argc, argv) ! 829: char *argv[]; ! 830: { ! 831: ! 832: if (argc < 2) { ! 833: (void) strcat(line, " "); ! 834: printf("(remote-directory) "); ! 835: (void) gets(&line[strlen(line)]); ! 836: makeargv(); ! 837: argc = margc; ! 838: argv = margv; ! 839: } ! 840: if (argc < 2) { ! 841: printf("usage:%s remote-directory\n", argv[0]); ! 842: code = -1; ! 843: return; ! 844: } ! 845: (void) command("CWD %s", argv[1]); ! 846: } ! 847: ! 848: /* ! 849: * Set current working directory ! 850: * on local machine. ! 851: */ ! 852: lcd(argc, argv) ! 853: char *argv[]; ! 854: { ! 855: char buf[MAXPATHLEN]; ! 856: ! 857: if (argc < 2) ! 858: argc++, argv[1] = home; ! 859: if (argc != 2) { ! 860: printf("usage:%s local-directory\n", argv[0]); ! 861: code = -1; ! 862: return; ! 863: } ! 864: if (!globulize(&argv[1])) { ! 865: code = -1; ! 866: return; ! 867: } ! 868: if (chdir(argv[1]) < 0) { ! 869: perror(argv[1]); ! 870: code = -1; ! 871: return; ! 872: } ! 873: printf("Local directory now %s\n", getwd(buf)); ! 874: code = 0; ! 875: } ! 876: ! 877: /* ! 878: * Delete a single file. ! 879: */ ! 880: delete(argc, argv) ! 881: char *argv[]; ! 882: { ! 883: ! 884: if (argc < 2) { ! 885: (void) strcat(line, " "); ! 886: printf("(remote-file) "); ! 887: (void) gets(&line[strlen(line)]); ! 888: makeargv(); ! 889: argc = margc; ! 890: argv = margv; ! 891: } ! 892: if (argc < 2) { ! 893: printf("usage:%s remote-file\n", argv[0]); ! 894: code = -1; ! 895: return; ! 896: } ! 897: (void) command("DELE %s", argv[1]); ! 898: } ! 899: ! 900: /* ! 901: * Delete multiple files. ! 902: */ ! 903: mdelete(argc, argv) ! 904: char *argv[]; ! 905: { ! 906: char *cp; ! 907: int ointer, (*oldintr)(), mabort(); ! 908: extern jmp_buf jabort; ! 909: ! 910: if (argc < 2) { ! 911: (void) strcat(line, " "); ! 912: printf("(remote-files) "); ! 913: (void) gets(&line[strlen(line)]); ! 914: makeargv(); ! 915: argc = margc; ! 916: argv = margv; ! 917: } ! 918: if (argc < 2) { ! 919: printf("usage:%s remote-files\n", argv[0]); ! 920: code = -1; ! 921: return; ! 922: } ! 923: mname = argv[0]; ! 924: mflag = 1; ! 925: oldintr = signal(SIGINT, mabort); ! 926: (void) setjmp(jabort); ! 927: while ((cp = remglob(argv,0)) != NULL) { ! 928: if (*cp == '\0') { ! 929: mflag = 0; ! 930: continue; ! 931: } ! 932: if (mflag && confirm(argv[0], cp)) { ! 933: (void) command("DELE %s", cp); ! 934: if (!mflag && fromatty) { ! 935: ointer = interactive; ! 936: interactive = 1; ! 937: if (confirm("Continue with", "mdelete")) { ! 938: mflag++; ! 939: } ! 940: interactive = ointer; ! 941: } ! 942: } ! 943: } ! 944: (void) signal(SIGINT, oldintr); ! 945: mflag = 0; ! 946: } ! 947: ! 948: /* ! 949: * Rename a remote file. ! 950: */ ! 951: renamefile(argc, argv) ! 952: char *argv[]; ! 953: { ! 954: ! 955: if (argc < 2) { ! 956: (void) strcat(line, " "); ! 957: printf("(from-name) "); ! 958: (void) gets(&line[strlen(line)]); ! 959: makeargv(); ! 960: argc = margc; ! 961: argv = margv; ! 962: } ! 963: if (argc < 2) { ! 964: usage: ! 965: printf("%s from-name to-name\n", argv[0]); ! 966: code = -1; ! 967: return; ! 968: } ! 969: if (argc < 3) { ! 970: (void) strcat(line, " "); ! 971: printf("(to-name) "); ! 972: (void) gets(&line[strlen(line)]); ! 973: makeargv(); ! 974: argc = margc; ! 975: argv = margv; ! 976: } ! 977: if (argc < 3) ! 978: goto usage; ! 979: if (command("RNFR %s", argv[1]) == CONTINUE) ! 980: (void) command("RNTO %s", argv[2]); ! 981: } ! 982: ! 983: /* ! 984: * Get a directory listing ! 985: * of remote files. ! 986: */ ! 987: ls(argc, argv) ! 988: char *argv[]; ! 989: { ! 990: char *cmd; ! 991: ! 992: if (argc < 2) ! 993: argc++, argv[1] = NULL; ! 994: if (argc < 3) ! 995: argc++, argv[2] = "-"; ! 996: if (argc > 3) { ! 997: printf("usage: %s remote-directory local-file\n", argv[0]); ! 998: code = -1; ! 999: return; ! 1000: } ! 1001: cmd = argv[0][0] == 'l' ? "NLST" : "LIST"; ! 1002: if (strcmp(argv[2], "-") && !globulize(&argv[2])) { ! 1003: code = -1; ! 1004: return; ! 1005: } ! 1006: if (strcmp(argv[2], "-") && *argv[2] != '|') ! 1007: if (!globulize(&argv[2]) || !confirm("output to local-file:", argv[2])) { ! 1008: code = -1; ! 1009: return; ! 1010: } ! 1011: recvrequest(cmd, argv[2], argv[1], "w"); ! 1012: } ! 1013: ! 1014: /* ! 1015: * Get a directory listing ! 1016: * of multiple remote files. ! 1017: */ ! 1018: mls(argc, argv) ! 1019: char *argv[]; ! 1020: { ! 1021: char *cmd, mode[1], *dest; ! 1022: int ointer, i, (*oldintr)(), mabort(); ! 1023: extern jmp_buf jabort; ! 1024: ! 1025: if (argc < 2) { ! 1026: (void) strcat(line, " "); ! 1027: printf("(remote-files) "); ! 1028: (void) gets(&line[strlen(line)]); ! 1029: makeargv(); ! 1030: argc = margc; ! 1031: argv = margv; ! 1032: } ! 1033: if (argc < 3) { ! 1034: (void) strcat(line, " "); ! 1035: printf("(local-file) "); ! 1036: (void) gets(&line[strlen(line)]); ! 1037: makeargv(); ! 1038: argc = margc; ! 1039: argv = margv; ! 1040: } ! 1041: if (argc < 3) { ! 1042: printf("usage:%s remote-files local-file\n", argv[0]); ! 1043: code = -1; ! 1044: return; ! 1045: } ! 1046: dest = argv[argc - 1]; ! 1047: argv[argc - 1] = NULL; ! 1048: if (strcmp(dest, "-") && *dest != '|') ! 1049: if (!globulize(&dest) || !confirm("output to local-file:", dest)) { ! 1050: code = -1; ! 1051: return; ! 1052: } ! 1053: cmd = argv[0][1] == 'l' ? "NLST" : "LIST"; ! 1054: mname = argv[0]; ! 1055: mflag = 1; ! 1056: oldintr = signal(SIGINT, mabort); ! 1057: (void) setjmp(jabort); ! 1058: for (i = 1; mflag && i < argc-1; ++i) { ! 1059: *mode = (i == 1) ? 'w' : 'a'; ! 1060: recvrequest(cmd, dest, argv[i], mode); ! 1061: if (!mflag && fromatty) { ! 1062: ointer = interactive; ! 1063: interactive = 1; ! 1064: if (confirm("Continue with", argv[0])) { ! 1065: mflag ++; ! 1066: } ! 1067: interactive = ointer; ! 1068: } ! 1069: } ! 1070: (void) signal(SIGINT, oldintr); ! 1071: mflag = 0; ! 1072: } ! 1073: ! 1074: /* ! 1075: * Do a shell escape ! 1076: */ ! 1077: /*ARGSUSED*/ ! 1078: shell(argc, argv) ! 1079: char *argv[]; ! 1080: { ! 1081: int pid, (*old1)(), (*old2)(); ! 1082: char shellnam[40], *shell, *namep; ! 1083: union wait status; ! 1084: ! 1085: old1 = signal (SIGINT, SIG_IGN); ! 1086: old2 = signal (SIGQUIT, SIG_IGN); ! 1087: if ((pid = fork()) == 0) { ! 1088: for (pid = 3; pid < 20; pid++) ! 1089: (void) close(pid); ! 1090: (void) signal(SIGINT, SIG_DFL); ! 1091: (void) signal(SIGQUIT, SIG_DFL); ! 1092: shell = getenv("SHELL"); ! 1093: if (shell == NULL) ! 1094: shell = "/bin/sh"; ! 1095: namep = rindex(shell,'/'); ! 1096: if (namep == NULL) ! 1097: namep = shell; ! 1098: (void) strcpy(shellnam,"-"); ! 1099: (void) strcat(shellnam, ++namep); ! 1100: if (strcmp(namep, "sh") != 0) ! 1101: shellnam[0] = '+'; ! 1102: if (debug) { ! 1103: printf ("%s\n", shell); ! 1104: (void) fflush (stdout); ! 1105: } ! 1106: if (argc > 1) { ! 1107: execl(shell,shellnam,"-c",altarg,(char *)0); ! 1108: } ! 1109: else { ! 1110: execl(shell,shellnam,(char *)0); ! 1111: } ! 1112: perror(shell); ! 1113: code = -1; ! 1114: exit(1); ! 1115: } ! 1116: if (pid > 0) ! 1117: while (wait(&status) != pid) ! 1118: ; ! 1119: (void) signal(SIGINT, old1); ! 1120: (void) signal(SIGQUIT, old2); ! 1121: if (pid == -1) { ! 1122: perror("Try again later"); ! 1123: code = -1; ! 1124: } ! 1125: else { ! 1126: code = 0; ! 1127: } ! 1128: return (0); ! 1129: } ! 1130: ! 1131: /* ! 1132: * Send new user information (re-login) ! 1133: */ ! 1134: user(argc, argv) ! 1135: int argc; ! 1136: char **argv; ! 1137: { ! 1138: char acct[80], *mygetpass(); ! 1139: int n, aflag = 0; ! 1140: ! 1141: if (argc < 2) { ! 1142: (void) strcat(line, " "); ! 1143: printf("(username) "); ! 1144: (void) gets(&line[strlen(line)]); ! 1145: makeargv(); ! 1146: argc = margc; ! 1147: argv = margv; ! 1148: } ! 1149: if (argc > 4) { ! 1150: printf("usage: %s username [password] [account]\n", argv[0]); ! 1151: code = -1; ! 1152: return (0); ! 1153: } ! 1154: n = command("USER %s", argv[1]); ! 1155: if (n == CONTINUE) { ! 1156: if (argc < 3 ) ! 1157: argv[2] = mygetpass("Password: "), argc++; ! 1158: n = command("PASS %s", argv[2]); ! 1159: } ! 1160: if (n == CONTINUE) { ! 1161: if (argc < 4) { ! 1162: printf("Account: "); (void) fflush(stdout); ! 1163: (void) fgets(acct, sizeof(acct) - 1, stdin); ! 1164: acct[strlen(acct) - 1] = '\0'; ! 1165: argv[3] = acct; argc++; ! 1166: } ! 1167: n = command("ACCT %s", argv[3]); ! 1168: aflag++; ! 1169: } ! 1170: if (n != COMPLETE) { ! 1171: fprintf(stdout, "Login failed.\n"); ! 1172: return (0); ! 1173: } ! 1174: if (!aflag && argc == 4) { ! 1175: (void) command("ACCT %s", argv[3]); ! 1176: } ! 1177: return (1); ! 1178: } ! 1179: ! 1180: /* ! 1181: * Print working directory. ! 1182: */ ! 1183: /*VARARGS*/ ! 1184: pwd() ! 1185: { ! 1186: ! 1187: (void) command("PWD"); ! 1188: } ! 1189: ! 1190: /* ! 1191: * Make a directory. ! 1192: */ ! 1193: makedir(argc, argv) ! 1194: char *argv[]; ! 1195: { ! 1196: ! 1197: if (argc < 2) { ! 1198: (void) strcat(line, " "); ! 1199: printf("(directory-name) "); ! 1200: (void) gets(&line[strlen(line)]); ! 1201: makeargv(); ! 1202: argc = margc; ! 1203: argv = margv; ! 1204: } ! 1205: if (argc < 2) { ! 1206: printf("usage: %s directory-name\n", argv[0]); ! 1207: code = -1; ! 1208: return; ! 1209: } ! 1210: (void) command("MKD %s", argv[1]); ! 1211: } ! 1212: ! 1213: /* ! 1214: * Remove a directory. ! 1215: */ ! 1216: removedir(argc, argv) ! 1217: char *argv[]; ! 1218: { ! 1219: ! 1220: if (argc < 2) { ! 1221: (void) strcat(line, " "); ! 1222: printf("(directory-name) "); ! 1223: (void) gets(&line[strlen(line)]); ! 1224: makeargv(); ! 1225: argc = margc; ! 1226: argv = margv; ! 1227: } ! 1228: if (argc < 2) { ! 1229: printf("usage: %s directory-name\n", argv[0]); ! 1230: code = -1; ! 1231: return; ! 1232: } ! 1233: (void) command("RMD %s", argv[1]); ! 1234: } ! 1235: ! 1236: /* ! 1237: * Send a line, verbatim, to the remote machine. ! 1238: */ ! 1239: quote(argc, argv) ! 1240: char *argv[]; ! 1241: { ! 1242: int i; ! 1243: char buf[BUFSIZ]; ! 1244: ! 1245: if (argc < 2) { ! 1246: (void) strcat(line, " "); ! 1247: printf("(command line to send) "); ! 1248: (void) gets(&line[strlen(line)]); ! 1249: makeargv(); ! 1250: argc = margc; ! 1251: argv = margv; ! 1252: } ! 1253: if (argc < 2) { ! 1254: printf("usage: %s line-to-send\n", argv[0]); ! 1255: code = -1; ! 1256: return; ! 1257: } ! 1258: (void) strcpy(buf, argv[1]); ! 1259: for (i = 2; i < argc; i++) { ! 1260: (void) strcat(buf, " "); ! 1261: (void) strcat(buf, argv[i]); ! 1262: } ! 1263: if (command(buf) == PRELIM) { ! 1264: while (getreply(0) == PRELIM); ! 1265: } ! 1266: } ! 1267: ! 1268: /* ! 1269: * Ask the other side for help. ! 1270: */ ! 1271: rmthelp(argc, argv) ! 1272: char *argv[]; ! 1273: { ! 1274: int oldverbose = verbose; ! 1275: ! 1276: verbose = 1; ! 1277: (void) command(argc == 1 ? "HELP" : "HELP %s", argv[1]); ! 1278: verbose = oldverbose; ! 1279: } ! 1280: ! 1281: /* ! 1282: * Terminate session and exit. ! 1283: */ ! 1284: /*VARARGS*/ ! 1285: quit() ! 1286: { ! 1287: ! 1288: if (connected) ! 1289: disconnect(); ! 1290: pswitch(1); ! 1291: if (connected) { ! 1292: disconnect(); ! 1293: } ! 1294: exit(0); ! 1295: } ! 1296: ! 1297: /* ! 1298: * Terminate session, but don't exit. ! 1299: */ ! 1300: disconnect() ! 1301: { ! 1302: extern FILE *cout; ! 1303: extern int data; ! 1304: ! 1305: if (!connected) ! 1306: return; ! 1307: (void) command("QUIT"); ! 1308: if (cout) { ! 1309: (void) fclose(cout); ! 1310: } ! 1311: cout = NULL; ! 1312: connected = 0; ! 1313: data = -1; ! 1314: if (!proxy) { ! 1315: macnum = 0; ! 1316: } ! 1317: } ! 1318: ! 1319: confirm(cmd, file) ! 1320: char *cmd, *file; ! 1321: { ! 1322: char line[BUFSIZ]; ! 1323: ! 1324: if (!interactive) ! 1325: return (1); ! 1326: printf("%s %s? ", cmd, file); ! 1327: (void) fflush(stdout); ! 1328: (void) gets(line); ! 1329: return (*line != 'n' && *line != 'N'); ! 1330: } ! 1331: ! 1332: fatal(msg) ! 1333: char *msg; ! 1334: { ! 1335: ! 1336: fprintf(stderr, "ftp: %s\n", msg); ! 1337: exit(1); ! 1338: } ! 1339: ! 1340: /* ! 1341: * Glob a local file name specification with ! 1342: * the expectation of a single return value. ! 1343: * Can't control multiple values being expanded ! 1344: * from the expression, we return only the first. ! 1345: */ ! 1346: globulize(cpp) ! 1347: char **cpp; ! 1348: { ! 1349: char **globbed; ! 1350: ! 1351: if (!doglob) ! 1352: return (1); ! 1353: globbed = glob(*cpp); ! 1354: if (globerr != NULL) { ! 1355: printf("%s: %s\n", *cpp, globerr); ! 1356: if (globbed) ! 1357: blkfree(globbed); ! 1358: return (0); ! 1359: } ! 1360: if (globbed) { ! 1361: *cpp = *globbed++; ! 1362: /* don't waste too much memory */ ! 1363: if (*globbed) ! 1364: blkfree(globbed); ! 1365: } ! 1366: return (1); ! 1367: } ! 1368: ! 1369: account(argc,argv) ! 1370: ! 1371: int argc; ! 1372: char **argv; ! 1373: { ! 1374: char acct[50], *mygetpass(), *ap; ! 1375: ! 1376: if (argc > 1) { ! 1377: ++argv; ! 1378: --argc; ! 1379: (void) strncpy(acct,*argv,49); ! 1380: acct[50] = '\0'; ! 1381: while (argc > 1) { ! 1382: --argc; ! 1383: ++argv; ! 1384: (void) strncat(acct,*argv, 49-strlen(acct)); ! 1385: } ! 1386: ap = acct; ! 1387: } ! 1388: else { ! 1389: ap = mygetpass("Account:"); ! 1390: } ! 1391: (void) command("ACCT %s", ap); ! 1392: } ! 1393: ! 1394: jmp_buf abortprox; ! 1395: ! 1396: proxabort() ! 1397: { ! 1398: extern int proxy; ! 1399: ! 1400: if (!proxy) { ! 1401: pswitch(1); ! 1402: } ! 1403: if (connected) { ! 1404: proxflag = 1; ! 1405: } ! 1406: else { ! 1407: proxflag = 0; ! 1408: } ! 1409: pswitch(0); ! 1410: longjmp(abortprox,1); ! 1411: } ! 1412: ! 1413: doproxy(argc,argv) ! 1414: int argc; ! 1415: char *argv[]; ! 1416: { ! 1417: int (*oldintr)(), proxabort(); ! 1418: register struct cmd *c; ! 1419: struct cmd *getcmd(); ! 1420: extern struct cmd cmdtab[]; ! 1421: extern jmp_buf abortprox; ! 1422: ! 1423: if (argc < 2) { ! 1424: (void) strcat(line, " "); ! 1425: printf("(command) "); ! 1426: (void) gets(&line[strlen(line)]); ! 1427: makeargv(); ! 1428: argc = margc; ! 1429: argv = margv; ! 1430: } ! 1431: if (argc < 2) { ! 1432: printf("usage:%s command\n", argv[0]); ! 1433: code = -1; ! 1434: return; ! 1435: } ! 1436: c = getcmd(argv[1]); ! 1437: if (c == (struct cmd *) -1) { ! 1438: printf("?Ambiguous command\n"); ! 1439: (void) fflush(stdout); ! 1440: code = -1; ! 1441: return; ! 1442: } ! 1443: if (c == 0) { ! 1444: printf("?Invalid command\n"); ! 1445: (void) fflush(stdout); ! 1446: code = -1; ! 1447: return; ! 1448: } ! 1449: if (!c->c_proxy) { ! 1450: printf("?Invalid proxy command\n"); ! 1451: (void) fflush(stdout); ! 1452: code = -1; ! 1453: return; ! 1454: } ! 1455: if (setjmp(abortprox)) { ! 1456: code = -1; ! 1457: return; ! 1458: } ! 1459: oldintr = signal(SIGINT, proxabort); ! 1460: pswitch(1); ! 1461: if (c->c_conn && !connected) { ! 1462: printf("Not connected\n"); ! 1463: (void) fflush(stdout); ! 1464: pswitch(0); ! 1465: (void) signal(SIGINT, oldintr); ! 1466: code = -1; ! 1467: return; ! 1468: } ! 1469: (*c->c_handler)(argc-1, argv+1); ! 1470: if (connected) { ! 1471: proxflag = 1; ! 1472: } ! 1473: else { ! 1474: proxflag = 0; ! 1475: } ! 1476: pswitch(0); ! 1477: (void) signal(SIGINT, oldintr); ! 1478: } ! 1479: ! 1480: setcase() ! 1481: { ! 1482: mcase = !mcase; ! 1483: printf("Case mapping %s.\n", onoff(mcase)); ! 1484: code = mcase; ! 1485: } ! 1486: ! 1487: setcr() ! 1488: { ! 1489: crflag = !crflag; ! 1490: printf("Carriage Return stripping %s.\n", onoff(crflag)); ! 1491: code = crflag; ! 1492: } ! 1493: ! 1494: setntrans(argc,argv) ! 1495: int argc; ! 1496: char *argv[]; ! 1497: { ! 1498: if (argc == 1) { ! 1499: ntflag = 0; ! 1500: printf("Ntrans off.\n"); ! 1501: code = ntflag; ! 1502: return; ! 1503: } ! 1504: ntflag++; ! 1505: code = ntflag; ! 1506: (void) strncpy(ntin, argv[1], 16); ! 1507: ntin[16] = '\0'; ! 1508: if (argc == 2) { ! 1509: ntout[0] = '\0'; ! 1510: return; ! 1511: } ! 1512: (void) strncpy(ntout, argv[2], 16); ! 1513: ntout[16] = '\0'; ! 1514: } ! 1515: ! 1516: char * ! 1517: dotrans(name) ! 1518: char *name; ! 1519: { ! 1520: static char new[MAXPATHLEN]; ! 1521: char *cp1, *cp2 = new; ! 1522: register int i, ostop, found; ! 1523: ! 1524: for (ostop = 0; *(ntout + ostop) && ostop < 16; ostop++); ! 1525: for (cp1 = name; *cp1; cp1++) { ! 1526: found = 0; ! 1527: for (i = 0; *(ntin + i) && i < 16; i++) { ! 1528: if (*cp1 == *(ntin + i)) { ! 1529: found++; ! 1530: if (i < ostop) { ! 1531: *cp2++ = *(ntout + i); ! 1532: } ! 1533: break; ! 1534: } ! 1535: } ! 1536: if (!found) { ! 1537: *cp2++ = *cp1; ! 1538: } ! 1539: } ! 1540: *cp2 = '\0'; ! 1541: return(new); ! 1542: } ! 1543: ! 1544: setnmap(argc, argv) ! 1545: int argc; ! 1546: char *argv[]; ! 1547: { ! 1548: char *cp; ! 1549: ! 1550: if (argc == 1) { ! 1551: mapflag = 0; ! 1552: printf("Nmap off.\n"); ! 1553: code = mapflag; ! 1554: return; ! 1555: } ! 1556: if (argc < 3) { ! 1557: (void) strcat(line, " "); ! 1558: printf("(mapout) "); ! 1559: (void) gets(&line[strlen(line)]); ! 1560: makeargv(); ! 1561: argc = margc; ! 1562: argv = margv; ! 1563: } ! 1564: if (argc < 3) { ! 1565: printf("Usage: %s [mapin mapout]\n",argv[0]); ! 1566: code = -1; ! 1567: return; ! 1568: } ! 1569: mapflag = 1; ! 1570: code = 1; ! 1571: cp = index(altarg, ' '); ! 1572: if (proxy) { ! 1573: while(*++cp == ' '); ! 1574: altarg = cp; ! 1575: cp = index(altarg, ' '); ! 1576: } ! 1577: *cp = '\0'; ! 1578: (void) strncpy(mapin, altarg, MAXPATHLEN - 1); ! 1579: while (*++cp == ' '); ! 1580: (void) strncpy(mapout, cp, MAXPATHLEN - 1); ! 1581: } ! 1582: ! 1583: char * ! 1584: domap(name) ! 1585: char *name; ! 1586: { ! 1587: static char new[MAXPATHLEN]; ! 1588: register char *cp1 = name, *cp2 = mapin; ! 1589: char *tp[9], *te[9]; ! 1590: int i, toks[9], toknum, match = 1; ! 1591: ! 1592: for (i=0; i < 9; ++i) { ! 1593: toks[i] = 0; ! 1594: } ! 1595: while (match && *cp1 && *cp2) { ! 1596: switch (*cp2) { ! 1597: case '\\': ! 1598: if (*++cp2 != *cp1) { ! 1599: match = 0; ! 1600: } ! 1601: break; ! 1602: case '$': ! 1603: if (*(cp2+1) >= '1' && (*cp2+1) <= '9') { ! 1604: if (*cp1 != *(++cp2+1)) { ! 1605: toks[toknum = *cp2 - '1']++; ! 1606: tp[toknum] = cp1; ! 1607: while (*++cp1 && *(cp2+1) ! 1608: != *cp1); ! 1609: te[toknum] = cp1; ! 1610: } ! 1611: cp2++; ! 1612: break; ! 1613: } ! 1614: /* intentional drop through */ ! 1615: default: ! 1616: if (*cp2 != *cp1) { ! 1617: match = 0; ! 1618: } ! 1619: break; ! 1620: } ! 1621: if (*cp1) { ! 1622: cp1++; ! 1623: } ! 1624: if (*cp2) { ! 1625: cp2++; ! 1626: } ! 1627: } ! 1628: cp1 = new; ! 1629: *cp1 = '\0'; ! 1630: cp2 = mapout; ! 1631: while (*cp2) { ! 1632: match = 0; ! 1633: switch (*cp2) { ! 1634: case '\\': ! 1635: if (*(cp2 + 1)) { ! 1636: *cp1++ = *++cp2; ! 1637: } ! 1638: break; ! 1639: case '[': ! 1640: LOOP: ! 1641: if (*++cp2 == '$' && isdigit(*(cp2+1))) { ! 1642: if (*++cp2 == '0') { ! 1643: char *cp3 = name; ! 1644: ! 1645: while (*cp3) { ! 1646: *cp1++ = *cp3++; ! 1647: } ! 1648: match = 1; ! 1649: } ! 1650: else if (toks[toknum = *cp2 - '1']) { ! 1651: char *cp3 = tp[toknum]; ! 1652: ! 1653: while (cp3 != te[toknum]) { ! 1654: *cp1++ = *cp3++; ! 1655: } ! 1656: match = 1; ! 1657: } ! 1658: } ! 1659: else { ! 1660: while (*cp2 && *cp2 != ',' && ! 1661: *cp2 != ']') { ! 1662: if (*cp2 == '\\') { ! 1663: cp2++; ! 1664: } ! 1665: else if (*cp2 == '$' && ! 1666: isdigit(*(cp2+1))) { ! 1667: if (*++cp2 == '0') { ! 1668: char *cp3 = name; ! 1669: ! 1670: while (*cp3) { ! 1671: *cp1++ = *cp3++; ! 1672: } ! 1673: } ! 1674: else if (toks[toknum = ! 1675: *cp2 - '1']) { ! 1676: char *cp3=tp[toknum]; ! 1677: ! 1678: while (cp3 != ! 1679: te[toknum]) { ! 1680: *cp1++ = *cp3++; ! 1681: } ! 1682: } ! 1683: } ! 1684: else if (*cp2) { ! 1685: *cp1++ = *cp2++; ! 1686: } ! 1687: } ! 1688: if (!*cp2) { ! 1689: printf("nmap: unbalanced brackets\n"); ! 1690: return(name); ! 1691: } ! 1692: match = 1; ! 1693: cp2--; ! 1694: } ! 1695: if (match) { ! 1696: while (*++cp2 && *cp2 != ']') { ! 1697: if (*cp2 == '\\' && *(cp2 + 1)) { ! 1698: cp2++; ! 1699: } ! 1700: } ! 1701: if (!*cp2) { ! 1702: printf("nmap: unbalanced brackets\n"); ! 1703: return(name); ! 1704: } ! 1705: break; ! 1706: } ! 1707: switch (*++cp2) { ! 1708: case ',': ! 1709: goto LOOP; ! 1710: case ']': ! 1711: break; ! 1712: default: ! 1713: cp2--; ! 1714: goto LOOP; ! 1715: } ! 1716: break; ! 1717: case '$': ! 1718: if (isdigit(*(cp2 + 1))) { ! 1719: if (*++cp2 == '0') { ! 1720: char *cp3 = name; ! 1721: ! 1722: while (*cp3) { ! 1723: *cp1++ = *cp3++; ! 1724: } ! 1725: } ! 1726: else if (toks[toknum = *cp2 - '1']) { ! 1727: char *cp3 = tp[toknum]; ! 1728: ! 1729: while (cp3 != te[toknum]) { ! 1730: *cp1++ = *cp3++; ! 1731: } ! 1732: } ! 1733: break; ! 1734: } ! 1735: /* intentional drop through */ ! 1736: default: ! 1737: *cp1++ = *cp2; ! 1738: break; ! 1739: } ! 1740: cp2++; ! 1741: } ! 1742: *cp1 = '\0'; ! 1743: if (!*new) { ! 1744: return(name); ! 1745: } ! 1746: return(new); ! 1747: } ! 1748: ! 1749: setsunique() ! 1750: { ! 1751: sunique = !sunique; ! 1752: printf("Store unique %s.\n", onoff(sunique)); ! 1753: code = sunique; ! 1754: } ! 1755: ! 1756: setrunique() ! 1757: { ! 1758: runique = !runique; ! 1759: printf("Receive unique %s.\n", onoff(runique)); ! 1760: code = runique; ! 1761: } ! 1762: ! 1763: /* change directory to perent directory */ ! 1764: cdup() ! 1765: { ! 1766: (void) command("CDUP"); ! 1767: } ! 1768: ! 1769: macdef(argc, argv) ! 1770: int argc; ! 1771: char *argv[]; ! 1772: { ! 1773: char *tmp; ! 1774: int c; ! 1775: ! 1776: if (macnum == 16) { ! 1777: printf("Limit of 16 macros have already been defined\n"); ! 1778: code = -1; ! 1779: return; ! 1780: } ! 1781: if (argc < 2) { ! 1782: (void) strcat(line, " "); ! 1783: printf("(macro name) "); ! 1784: (void) gets(&line[strlen(line)]); ! 1785: makeargv(); ! 1786: argc = margc; ! 1787: argv = margv; ! 1788: } ! 1789: if (argc != 2) { ! 1790: printf("Usage: %s macro_name\n",argv[0]); ! 1791: code = -1; ! 1792: return; ! 1793: } ! 1794: if (interactive) { ! 1795: printf("Enter macro line by line, terminating it with a null line\n"); ! 1796: } ! 1797: (void) strncpy(macros[macnum].mac_name, argv[1], 8); ! 1798: if (macnum == 0) { ! 1799: macros[macnum].mac_start = macbuf; ! 1800: } ! 1801: else { ! 1802: macros[macnum].mac_start = macros[macnum - 1].mac_end + 1; ! 1803: } ! 1804: tmp = macros[macnum].mac_start; ! 1805: while (tmp != macbuf+4096) { ! 1806: if ((c = getchar()) == EOF) { ! 1807: printf("macdef:end of file encountered\n"); ! 1808: code = -1; ! 1809: return; ! 1810: } ! 1811: if ((*tmp = c) == '\n') { ! 1812: if (tmp == macros[macnum].mac_start) { ! 1813: macros[macnum++].mac_end = tmp; ! 1814: code = 0; ! 1815: return; ! 1816: } ! 1817: if (*(tmp-1) == '\0') { ! 1818: macros[macnum++].mac_end = tmp - 1; ! 1819: code = 0; ! 1820: return; ! 1821: } ! 1822: *tmp = '\0'; ! 1823: } ! 1824: tmp++; ! 1825: } ! 1826: while (1) { ! 1827: while ((c = getchar()) != '\n' && c != EOF); ! 1828: if (c == EOF || getchar() == '\n') { ! 1829: printf("Macro not defined - 4k buffer exceeded\n"); ! 1830: code = -1; ! 1831: return; ! 1832: } ! 1833: } ! 1834: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.