|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1985, 1989 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 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 16: */ ! 17: ! 18: #ifndef lint ! 19: static char sccsid[] = "@(#)cmds.c 5.14.1.2 (Berkeley) 3/1/89"; ! 20: #endif /* not lint */ ! 21: ! 22: /* ! 23: * FTP User Program -- Command Routines. ! 24: */ ! 25: #include <wait.h> ! 26: ! 27: #include <stdio.h> ! 28: #include <errno.h> ! 29: #include <ctype.h> ! 30: #include <time.h> ! 31: #include <string.h> ! 32: ! 33: #include "ftp.h" ! 34: ! 35: #include "ftp_var.h" ! 36: ! 37: ! 38: extern char *globerr; ! 39: extern char **glob(); ! 40: extern char *home; ! 41: extern char *remglob(); ! 42: extern char *getenv(); ! 43: extern char reply_string[]; ! 44: ! 45: char *mname; ! 46: char *dotrans(), *domap(); ! 47: ! 48: /* ! 49: * Connect to peer server and ! 50: * auto-login, if possible. ! 51: */ ! 52: setpeer(argc, argv) ! 53: int argc; ! 54: char *argv[]; ! 55: { ! 56: char *host, *hookup(); ! 57: ! 58: if (connected) { ! 59: printf("Already connected to %s, use close first.\n", ! 60: hostname); ! 61: code = -1; ! 62: return; ! 63: } ! 64: if (argc < 2) { ! 65: (void) strcat(line, " "); ! 66: printf("(to) "); ! 67: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 68: makeargv(); ! 69: argc = margc; ! 70: argv = margv; ! 71: } ! 72: if (argc > 3) { ! 73: printf("usage: %s host-name\n", argv[0]); ! 74: code = -1; ! 75: return; ! 76: } ! 77: host = hookup(argv[1]); ! 78: if (host) { ! 79: connected = 1; ! 80: if (autologin) { ! 81: int overbose; ! 82: ! 83: (void) login(argv[1]); ! 84: #if defined(unix) && NBBY == 8 ! 85: /* ! 86: * this ifdef is to keep someone form "porting" this to an incompatible ! 87: * system and not checking this out. This way they have to think about it. ! 88: */ ! 89: overbose = verbose; ! 90: if (debug == 0) ! 91: verbose = -1; ! 92: if (command("SYST") == COMPLETE && overbose) { ! 93: register char *cp, c; ! 94: cp = strchr(reply_string+4, ' '); ! 95: if (cp == NULL) ! 96: cp = strchr(reply_string+4, '\r'); ! 97: if (cp) { ! 98: if (cp[-1] == '.') ! 99: cp--; ! 100: c = *cp; ! 101: *cp = '\0'; ! 102: } ! 103: ! 104: printf("Remote system type is %s.\n", ! 105: reply_string+4); ! 106: if (cp) ! 107: *cp = c; ! 108: } ! 109: if (!strncmp(reply_string, "215 UNIX Type: L8", 17)) { ! 110: setbinary(); ! 111: if (overbose) ! 112: printf("Using %s mode to transfer files.\n", ! 113: typename); ! 114: } else if (overbose && ! 115: !strncmp(reply_string, "215 TOPS20", 10)) { ! 116: printf( ! 117: "Remember to set tenex mode when transfering binary files from this machine.\n"); ! 118: } ! 119: verbose = overbose; ! 120: #endif /* unix */ ! 121: } ! 122: } ! 123: } ! 124: ! 125: struct types { ! 126: char *t_name; ! 127: char *t_mode; ! 128: int t_type; ! 129: char *t_arg; ! 130: } types[] = { ! 131: { "ascii", "A", TYPE_A, 0 }, ! 132: { "binary", "I", TYPE_I, 0 }, ! 133: { "image", "I", TYPE_I, 0 }, ! 134: { "ebcdic", "E", TYPE_E, 0 }, ! 135: { "tenex", "L", TYPE_L, bytename }, ! 136: 0 ! 137: }; ! 138: ! 139: /* ! 140: * Set transfer type. ! 141: */ ! 142: settype(argc, argv) ! 143: char *argv[]; ! 144: { ! 145: register struct types *p; ! 146: int comret; ! 147: ! 148: if (argc > 2) { ! 149: char *sep; ! 150: ! 151: printf("usage: %s [", argv[0]); ! 152: sep = " "; ! 153: for (p = types; p->t_name; p++) { ! 154: printf("%s%s", sep, p->t_name); ! 155: if (*sep == ' ') ! 156: sep = " | "; ! 157: } ! 158: printf(" ]\n"); ! 159: code = -1; ! 160: return; ! 161: } ! 162: if (argc < 2) { ! 163: printf("Using %s mode to transfer files.\n", typename); ! 164: code = 0; ! 165: return; ! 166: } ! 167: for (p = types; p->t_name; p++) ! 168: if (strcmp(argv[1], p->t_name) == 0) ! 169: break; ! 170: if (p->t_name == 0) { ! 171: printf("%s: unknown mode\n", argv[1]); ! 172: code = -1; ! 173: return; ! 174: } ! 175: if ((p->t_arg != NULL) && (*(p->t_arg) != '\0')) ! 176: comret = command ("TYPE %s %s", p->t_mode, p->t_arg); ! 177: else ! 178: comret = command("TYPE %s", p->t_mode); ! 179: if (comret == COMPLETE) { ! 180: (void) strcpy(typename, p->t_name); ! 181: type = p->t_type; ! 182: } ! 183: } ! 184: ! 185: /* ! 186: * Set binary transfer type. ! 187: */ ! 188: /*VARARGS*/ ! 189: setbinary() ! 190: { ! 191: ! 192: call(settype, "type", "binary", 0); ! 193: } ! 194: ! 195: /* ! 196: * Set ascii transfer type. ! 197: */ ! 198: /*VARARGS*/ ! 199: setascii() ! 200: { ! 201: ! 202: call(settype, "type", "ascii", 0); ! 203: } ! 204: ! 205: /* ! 206: * Set tenex transfer type. ! 207: */ ! 208: /*VARARGS*/ ! 209: settenex() ! 210: { ! 211: ! 212: call(settype, "type", "tenex", 0); ! 213: } ! 214: ! 215: /* ! 216: * Set ebcdic transfer type. ! 217: */ ! 218: /*VARARGS*/ ! 219: setebcdic() ! 220: { ! 221: ! 222: call(settype, "type", "ebcdic", 0); ! 223: } ! 224: ! 225: /* ! 226: * Set file transfer mode. ! 227: */ ! 228: /*ARGSUSED*/ ! 229: setmode(argc, argv) ! 230: char *argv[]; ! 231: { ! 232: ! 233: printf("We only support %s mode, sorry.\n", modename); ! 234: code = -1; ! 235: } ! 236: ! 237: /* ! 238: * Set file transfer format. ! 239: */ ! 240: /*ARGSUSED*/ ! 241: setform(argc, argv) ! 242: char *argv[]; ! 243: { ! 244: ! 245: printf("We only support %s format, sorry.\n", formname); ! 246: code = -1; ! 247: } ! 248: ! 249: /* ! 250: * Set file transfer structure. ! 251: */ ! 252: /*ARGSUSED*/ ! 253: setstruct(argc, argv) ! 254: char *argv[]; ! 255: { ! 256: ! 257: printf("We only support %s structure, sorry.\n", structname); ! 258: code = -1; ! 259: } ! 260: ! 261: /* ! 262: * Send a single file. ! 263: */ ! 264: put(argc, argv) ! 265: int argc; ! 266: char *argv[]; ! 267: { ! 268: char *cmd; ! 269: int loc = 0; ! 270: char *oldargv1; ! 271: ! 272: if (argc == 2) { ! 273: argc++; ! 274: argv[2] = argv[1]; ! 275: loc++; ! 276: } ! 277: if (argc < 2) { ! 278: (void) strcat(line, " "); ! 279: printf("(local-file) "); ! 280: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 281: makeargv(); ! 282: argc = margc; ! 283: argv = margv; ! 284: } ! 285: if (argc < 2) { ! 286: usage: ! 287: printf("usage:%s local-file remote-file\n", argv[0]); ! 288: code = -1; ! 289: return; ! 290: } ! 291: if (argc < 3) { ! 292: (void) strcat(line, " "); ! 293: printf("(remote-file) "); ! 294: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 295: makeargv(); ! 296: argc = margc; ! 297: argv = margv; ! 298: } ! 299: if (argc < 3) ! 300: goto usage; ! 301: oldargv1 = argv[1]; ! 302: if (!globulize(&argv[1])) { ! 303: code = -1; ! 304: return; ! 305: } ! 306: /* ! 307: * If "globulize" modifies argv[1], and argv[2] is a copy of ! 308: * the old argv[1], make it a copy of the new argv[1]. ! 309: */ ! 310: if (argv[1] != oldargv1 && argv[2] == oldargv1) { ! 311: argv[2] = argv[1]; ! 312: } ! 313: cmd = (argv[0][0] == 'a') ? "APPE" : ((sunique) ? "STOU" : "STOR"); ! 314: if (loc && ntflag) { ! 315: argv[2] = dotrans(argv[2]); ! 316: } ! 317: if (loc && mapflag) { ! 318: argv[2] = domap(argv[2]); ! 319: } ! 320: sendrequest(cmd, argv[1], argv[2]); ! 321: } ! 322: ! 323: /* ! 324: * Send multiple files. ! 325: */ ! 326: mput(argc, argv) ! 327: char *argv[]; ! 328: { ! 329: register int i; ! 330: char *tp; ! 331: int ointer; ! 332: ! 333: if (argc < 2) { ! 334: (void) strcat(line, " "); ! 335: printf("(local-files) "); ! 336: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 337: makeargv(); ! 338: argc = margc; ! 339: argv = margv; ! 340: } ! 341: if (argc < 2) { ! 342: printf("usage:%s local-files\n", argv[0]); ! 343: code = -1; ! 344: return; ! 345: } ! 346: mname = argv[0]; ! 347: mflag = 1; ! 348: if (proxy) { ! 349: char *cp, *tp2, tmpbuf[MAXPATHLEN]; ! 350: ! 351: while ((cp = remglob(argv,0)) != NULL) { ! 352: if (*cp == 0) { ! 353: mflag = 0; ! 354: continue; ! 355: } ! 356: if (mflag && confirm(argv[0], cp)) { ! 357: tp = cp; ! 358: if (mcase) { ! 359: while (*tp && !islower(*tp)) { ! 360: tp++; ! 361: } ! 362: if (!*tp) { ! 363: tp = cp; ! 364: tp2 = tmpbuf; ! 365: while ((*tp2 = *tp) != NULL) { ! 366: if (isupper(*tp2)) { ! 367: *tp2 = 'a' + *tp2 - 'A'; ! 368: } ! 369: tp++; ! 370: tp2++; ! 371: } ! 372: } ! 373: tp = tmpbuf; ! 374: } ! 375: if (ntflag) { ! 376: tp = dotrans(tp); ! 377: } ! 378: if (mapflag) { ! 379: tp = domap(tp); ! 380: } ! 381: sendrequest((sunique) ? "STOU" : "STOR", cp,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: } ! 392: mflag = 0; ! 393: return; ! 394: } ! 395: for (i = 1; i < argc; i++) { ! 396: register char **cpp, **gargs; ! 397: ! 398: if (!doglob) { ! 399: if (mflag && confirm(argv[0], argv[i])) { ! 400: tp = (ntflag) ? dotrans(argv[i]) : argv[i]; ! 401: tp = (mapflag) ? domap(tp) : tp; ! 402: sendrequest((sunique) ? "STOU" : "STOR", ! 403: argv[i], tp); ! 404: if (!mflag && fromatty) { ! 405: ointer = interactive; ! 406: interactive = 1; ! 407: if (confirm("Continue with","mput")) { ! 408: mflag++; ! 409: } ! 410: interactive = ointer; ! 411: } ! 412: } ! 413: continue; ! 414: } ! 415: gargs = glob(argv[i]); ! 416: if (globerr != NULL) { ! 417: printf("%s\n", globerr); ! 418: if (gargs) { ! 419: blkfree(gargs); ! 420: free(gargs); ! 421: } ! 422: continue; ! 423: } ! 424: for (cpp = gargs; cpp && *cpp != NULL; cpp++) { ! 425: if (mflag && confirm(argv[0], *cpp)) { ! 426: tp = (ntflag) ? dotrans(*cpp) : *cpp; ! 427: tp = (mapflag) ? domap(tp) : tp; ! 428: sendrequest((sunique) ? "STOU" : "STOR", ! 429: *cpp, tp); ! 430: if (!mflag && fromatty) { ! 431: ointer = interactive; ! 432: interactive = 1; ! 433: if (confirm("Continue with","mput")) { ! 434: mflag++; ! 435: } ! 436: interactive = ointer; ! 437: } ! 438: } ! 439: } ! 440: if (gargs != NULL) { ! 441: blkfree(gargs); ! 442: free(gargs); ! 443: } ! 444: } ! 445: mflag = 0; ! 446: } ! 447: ! 448: ! 449: /* ! 450: * Receive one file. ! 451: */ ! 452: get(argc, argv) ! 453: char *argv[]; ! 454: { ! 455: int loc = 0; ! 456: ! 457: if (argc == 2) { ! 458: argc++; ! 459: argv[2] = argv[1]; ! 460: loc++; ! 461: } ! 462: if (argc < 2) { ! 463: (void) strcat(line, " "); ! 464: printf("(remote-file) "); ! 465: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 466: makeargv(); ! 467: argc = margc; ! 468: argv = margv; ! 469: } ! 470: if (argc < 2) { ! 471: usage: ! 472: printf("usage: %s remote-file [ local-file ]\n", argv[0]); ! 473: code = -1; ! 474: return; ! 475: } ! 476: if (argc < 3) { ! 477: (void) strcat(line, " "); ! 478: printf("(local-file) "); ! 479: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 480: makeargv(); ! 481: argc = margc; ! 482: argv = margv; ! 483: } ! 484: if (argc < 3) ! 485: goto usage; ! 486: if (!globulize(&argv[2])) { ! 487: code = -1; ! 488: return; ! 489: } ! 490: if (loc && mcase) { ! 491: char *tp = argv[1], *tp2, tmpbuf[MAXPATHLEN]; ! 492: ! 493: while (*tp && !islower(*tp)) { ! 494: tp++; ! 495: } ! 496: if (!*tp) { ! 497: tp = argv[2]; ! 498: tp2 = tmpbuf; ! 499: while ((*tp2 = *tp) != NULL) { ! 500: if (isupper(*tp2)) { ! 501: *tp2 = 'a' + *tp2 - 'A'; ! 502: } ! 503: tp++; ! 504: tp2++; ! 505: } ! 506: argv[2] = tmpbuf; ! 507: } ! 508: } ! 509: if (loc && ntflag) ! 510: argv[2] = dotrans(argv[2]); ! 511: if (loc && mapflag) ! 512: argv[2] = domap(argv[2]); ! 513: recvrequest("RETR", argv[2], argv[1], "w"); ! 514: } ! 515: ! 516: /* ! 517: * Get multiple files. ! 518: */ ! 519: mget(argc, argv) ! 520: char *argv[]; ! 521: { ! 522: char *cp, *tp, *tp2, tmpbuf[MAXPATHLEN]; ! 523: int ointer; ! 524: ! 525: if (argc < 2) { ! 526: (void) strcat(line, " "); ! 527: printf("(remote-files) "); ! 528: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 529: makeargv(); ! 530: argc = margc; ! 531: argv = margv; ! 532: } ! 533: if (argc < 2) { ! 534: printf("usage:%s remote-files\n", argv[0]); ! 535: code = -1; ! 536: return; ! 537: } ! 538: mname = argv[0]; ! 539: mflag = 1; ! 540: while ((cp = remglob(argv,proxy)) != NULL) { ! 541: if (*cp == '\0') { ! 542: mflag = 0; ! 543: continue; ! 544: } ! 545: if (mflag && confirm(argv[0], cp)) { ! 546: tp = cp; ! 547: if (mcase) { ! 548: while (*tp && !islower(*tp)) { ! 549: tp++; ! 550: } ! 551: if (!*tp) { ! 552: tp = cp; ! 553: tp2 = tmpbuf; ! 554: while ((*tp2 = *tp) != NULL) { ! 555: if (isupper(*tp2)) { ! 556: *tp2 = 'a' + *tp2 - 'A'; ! 557: } ! 558: tp++; ! 559: tp2++; ! 560: } ! 561: } ! 562: tp = tmpbuf; ! 563: } ! 564: if (ntflag) { ! 565: tp = dotrans(tp); ! 566: } ! 567: if (mapflag) { ! 568: tp = domap(tp); ! 569: } ! 570: recvrequest("RETR", tp, cp, "w"); ! 571: if (!mflag && fromatty) { ! 572: ointer = interactive; ! 573: interactive = 1; ! 574: if (confirm("Continue with","mget")) { ! 575: mflag++; ! 576: } ! 577: interactive = ointer; ! 578: } ! 579: } ! 580: } ! 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 = strchr(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: #ifdef REMOVE ! 817: if (debug) ! 818: options |= SO_DEBUG; ! 819: else ! 820: options &= ~SO_DEBUG; ! 821: #endif ! 822: printf("Debugging %s (debug=%d).\n", onoff(debug), debug); ! 823: code = debug > 0; ! 824: } ! 825: ! 826: /* ! 827: * Set current working directory ! 828: * on remote machine. ! 829: */ ! 830: cd(argc, argv) ! 831: char *argv[]; ! 832: { ! 833: ! 834: if (argc < 2) { ! 835: (void) strcat(line, " "); ! 836: printf("(remote-directory) "); ! 837: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 838: makeargv(); ! 839: argc = margc; ! 840: argv = margv; ! 841: } ! 842: if (argc < 2) { ! 843: printf("usage:%s remote-directory\n", argv[0]); ! 844: code = -1; ! 845: return; ! 846: } ! 847: (void) command("CWD %s", argv[1]); ! 848: } ! 849: ! 850: /* ! 851: * Set current working directory ! 852: * on local machine. ! 853: */ ! 854: lcd(argc, argv) ! 855: char *argv[]; ! 856: { ! 857: char buf[MAXPATHLEN]; ! 858: ! 859: if (argc < 2) ! 860: argc++, argv[1] = home; ! 861: if (argc != 2) { ! 862: printf("usage:%s local-directory\n", argv[0]); ! 863: code = -1; ! 864: return; ! 865: } ! 866: if (!globulize(&argv[1])) { ! 867: code = -1; ! 868: return; ! 869: } ! 870: if (chdir(argv[1]) < 0) { ! 871: perror(argv[1]); ! 872: code = -1; ! 873: return; ! 874: } ! 875: printf("Local directory now %s\n", getwd(buf)); ! 876: code = 0; ! 877: } ! 878: ! 879: /* ! 880: * Delete a single file. ! 881: */ ! 882: delete(argc, argv) ! 883: char *argv[]; ! 884: { ! 885: ! 886: if (argc < 2) { ! 887: (void) strcat(line, " "); ! 888: printf("(remote-file) "); ! 889: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 890: makeargv(); ! 891: argc = margc; ! 892: argv = margv; ! 893: } ! 894: if (argc < 2) { ! 895: printf("usage:%s remote-file\n", argv[0]); ! 896: code = -1; ! 897: return; ! 898: } ! 899: (void) command("DELE %s", argv[1]); ! 900: } ! 901: ! 902: /* ! 903: * Delete multiple files. ! 904: */ ! 905: mdelete(argc, argv) ! 906: char *argv[]; ! 907: { ! 908: char *cp; ! 909: int ointer; ! 910: ! 911: if (argc < 2) { ! 912: (void) strcat(line, " "); ! 913: printf("(remote-files) "); ! 914: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 915: makeargv(); ! 916: argc = margc; ! 917: argv = margv; ! 918: } ! 919: if (argc < 2) { ! 920: printf("usage:%s remote-files\n", argv[0]); ! 921: code = -1; ! 922: return; ! 923: } ! 924: mname = argv[0]; ! 925: mflag = 1; ! 926: while ((cp = remglob(argv,0)) != NULL) { ! 927: if (*cp == '\0') { ! 928: mflag = 0; ! 929: continue; ! 930: } ! 931: if (mflag && confirm(argv[0], cp)) { ! 932: (void) command("DELE %s", cp); ! 933: if (!mflag && fromatty) { ! 934: ointer = interactive; ! 935: interactive = 1; ! 936: if (confirm("Continue with", "mdelete")) { ! 937: mflag++; ! 938: } ! 939: interactive = ointer; ! 940: } ! 941: } ! 942: } ! 943: mflag = 0; ! 944: } ! 945: ! 946: /* ! 947: * Rename a remote file. ! 948: */ ! 949: renamefile(argc, argv) ! 950: char *argv[]; ! 951: { ! 952: ! 953: if (argc < 2) { ! 954: (void) strcat(line, " "); ! 955: printf("(from-name) "); ! 956: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 957: makeargv(); ! 958: argc = margc; ! 959: argv = margv; ! 960: } ! 961: if (argc < 2) { ! 962: usage: ! 963: printf("%s from-name to-name\n", argv[0]); ! 964: code = -1; ! 965: return; ! 966: } ! 967: if (argc < 3) { ! 968: (void) strcat(line, " "); ! 969: printf("(to-name) "); ! 970: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 971: makeargv(); ! 972: argc = margc; ! 973: argv = margv; ! 974: } ! 975: if (argc < 3) ! 976: goto usage; ! 977: if (command("RNFR %s", argv[1]) == CONTINUE) ! 978: (void) command("RNTO %s", argv[2]); ! 979: } ! 980: ! 981: /* ! 982: * Get a directory listing ! 983: * of remote files. ! 984: */ ! 985: ls(argc, argv) ! 986: char *argv[]; ! 987: { ! 988: char *cmd; ! 989: ! 990: if (argc < 2) ! 991: argc++, argv[1] = NULL; ! 992: if (argc < 3) ! 993: argc++, argv[2] = "-"; ! 994: if (argc > 3) { ! 995: printf("usage: %s remote-directory local-file\n", argv[0]); ! 996: code = -1; ! 997: return; ! 998: } ! 999: cmd = argv[0][0] != 'n' ? "NLST" : "LIST"; /* stub: this is wrong*/ ! 1000: if (strcmp(argv[2], "-") && !globulize(&argv[2])) { ! 1001: code = -1; ! 1002: return; ! 1003: } ! 1004: if (strcmp(argv[2], "-") && *argv[2] != '|') ! 1005: if (!globulize(&argv[2]) || !confirm("output to local-file:", argv[2])) { ! 1006: code = -1; ! 1007: return; ! 1008: } ! 1009: recvrequest(cmd, argv[2], argv[1], "w"); ! 1010: } ! 1011: ! 1012: /* ! 1013: * Get a directory listing ! 1014: * of multiple remote files. ! 1015: */ ! 1016: mls(argc, argv) ! 1017: char *argv[]; ! 1018: { ! 1019: char *cmd, mode[1], *dest; ! 1020: int ointer, i; ! 1021: ! 1022: if (argc < 2) { ! 1023: (void) strcat(line, " "); ! 1024: printf("(remote-files) "); ! 1025: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 1026: makeargv(); ! 1027: argc = margc; ! 1028: argv = margv; ! 1029: } ! 1030: if (argc < 3) { ! 1031: (void) strcat(line, " "); ! 1032: printf("(local-file) "); ! 1033: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 1034: makeargv(); ! 1035: argc = margc; ! 1036: argv = margv; ! 1037: } ! 1038: if (argc < 3) { ! 1039: printf("usage:%s remote-files local-file\n", argv[0]); ! 1040: code = -1; ! 1041: return; ! 1042: } ! 1043: dest = argv[argc - 1]; ! 1044: argv[argc - 1] = NULL; ! 1045: if (strcmp(dest, "-") && *dest != '|') ! 1046: if (!globulize(&dest) || !confirm("output to local-file:", dest)) { ! 1047: code = -1; ! 1048: return; ! 1049: } ! 1050: cmd = argv[0][1] == 'l' ? "NLST" : "LIST"; ! 1051: mname = argv[0]; ! 1052: mflag = 1; ! 1053: for (i = 1; mflag && i < argc-1; ++i) { ! 1054: *mode = (i == 1) ? 'w' : 'a'; ! 1055: recvrequest(cmd, dest, argv[i], mode); ! 1056: if (!mflag && fromatty) { ! 1057: ointer = interactive; ! 1058: interactive = 1; ! 1059: if (confirm("Continue with", argv[0])) { ! 1060: mflag ++; ! 1061: } ! 1062: interactive = ointer; ! 1063: } ! 1064: } ! 1065: mflag = 0; ! 1066: } ! 1067: ! 1068: /* ! 1069: * Do a shell escape ! 1070: */ ! 1071: /*ARGSUSED*/ ! 1072: shell(argc, argv) ! 1073: char *argv[]; ! 1074: { ! 1075: int pid; ! 1076: char shellnam[40], *shell, *namep; ! 1077: union wait status; ! 1078: ! 1079: if ((pid = fork()) == 0) { ! 1080: for (pid = 3; pid < 20; pid++) ! 1081: (void) close(pid); ! 1082: shell = getenv("SHELL"); ! 1083: if (shell == NULL) ! 1084: shell = "/bin/sh"; ! 1085: namep = strrchr(shell,'/'); ! 1086: if (namep == NULL) ! 1087: namep = shell; ! 1088: (void) strcpy(shellnam,"-"); ! 1089: (void) strcat(shellnam, ++namep); ! 1090: if (strcmp(namep, "sh") != 0) ! 1091: shellnam[0] = '+'; ! 1092: if (debug) { ! 1093: printf ("%s\n", shell); ! 1094: (void) fflush (stdout); ! 1095: } ! 1096: if (argc > 1) { ! 1097: execl(shell,shellnam,"-c",altarg,(char *)0); ! 1098: } ! 1099: else { ! 1100: execl(shell,shellnam,(char *)0); ! 1101: } ! 1102: perror(shell); ! 1103: code = -1; ! 1104: exit(1); ! 1105: } ! 1106: if (pid > 0) ! 1107: while (wait(&status) != pid) ! 1108: ; ! 1109: if (pid == -1) { ! 1110: perror("Try again later"); ! 1111: code = -1; ! 1112: } ! 1113: else { ! 1114: code = 0; ! 1115: } ! 1116: return (0); ! 1117: } ! 1118: ! 1119: /* ! 1120: * Send new user information (re-login) ! 1121: */ ! 1122: user(argc, argv) ! 1123: int argc; ! 1124: char **argv; ! 1125: { ! 1126: char acct[80], *getpass(); ! 1127: int n, aflag = 0; ! 1128: ! 1129: if (argc < 2) { ! 1130: (void) strcat(line, " "); ! 1131: printf("(username) "); ! 1132: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 1133: makeargv(); ! 1134: argc = margc; ! 1135: argv = margv; ! 1136: } ! 1137: if (argc > 4) { ! 1138: printf("usage: %s username [password] [account]\n", argv[0]); ! 1139: code = -1; ! 1140: return (0); ! 1141: } ! 1142: n = command("USER %s", argv[1]); ! 1143: if (n == CONTINUE) { ! 1144: if (argc < 3 ) ! 1145: argv[2] = getpass("Password: "), argc++; ! 1146: n = command("PASS %s", argv[2]); ! 1147: } ! 1148: if (n == CONTINUE) { ! 1149: if (argc < 4) { ! 1150: printf("Account: "); (void) fflush(stdout); ! 1151: (void) fgets(acct, sizeof(acct) - 1, stdin); ! 1152: acct[strlen(acct) - 1] = '\0'; ! 1153: argv[3] = acct; argc++; ! 1154: } ! 1155: n = command("ACCT %s", argv[3]); ! 1156: aflag++; ! 1157: } ! 1158: if (n != COMPLETE) { ! 1159: fprintf(stdout, "Login failed.\n"); ! 1160: return (0); ! 1161: } ! 1162: if (!aflag && argc == 4) { ! 1163: (void) command("ACCT %s", argv[3]); ! 1164: } ! 1165: return (1); ! 1166: } ! 1167: ! 1168: /* ! 1169: * Print working directory. ! 1170: */ ! 1171: /*VARARGS*/ ! 1172: pwd() ! 1173: { ! 1174: ! 1175: (void) command("PWD"); ! 1176: } ! 1177: ! 1178: /* ! 1179: * Make a directory. ! 1180: */ ! 1181: makedir(argc, argv) ! 1182: char *argv[]; ! 1183: { ! 1184: ! 1185: if (argc < 2) { ! 1186: (void) strcat(line, " "); ! 1187: printf("(directory-name) "); ! 1188: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 1189: makeargv(); ! 1190: argc = margc; ! 1191: argv = margv; ! 1192: } ! 1193: if (argc < 2) { ! 1194: printf("usage: %s directory-name\n", argv[0]); ! 1195: code = -1; ! 1196: return; ! 1197: } ! 1198: (void) command("MKD %s", argv[1]); ! 1199: } ! 1200: ! 1201: /* ! 1202: * Remove a directory. ! 1203: */ ! 1204: removedir(argc, argv) ! 1205: char *argv[]; ! 1206: { ! 1207: ! 1208: if (argc < 2) { ! 1209: (void) strcat(line, " "); ! 1210: printf("(directory-name) "); ! 1211: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 1212: makeargv(); ! 1213: argc = margc; ! 1214: argv = margv; ! 1215: } ! 1216: if (argc < 2) { ! 1217: printf("usage: %s directory-name\n", argv[0]); ! 1218: code = -1; ! 1219: return; ! 1220: } ! 1221: (void) command("RMD %s", argv[1]); ! 1222: } ! 1223: ! 1224: /* ! 1225: * Send a line, verbatim, to the remote machine. ! 1226: */ ! 1227: quote(argc, argv) ! 1228: char *argv[]; ! 1229: { ! 1230: int i; ! 1231: char buf[BUFSIZ]; ! 1232: ! 1233: if (argc < 2) { ! 1234: (void) strcat(line, " "); ! 1235: printf("(command line to send) "); ! 1236: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 1237: makeargv(); ! 1238: argc = margc; ! 1239: argv = margv; ! 1240: } ! 1241: if (argc < 2) { ! 1242: printf("usage: %s line-to-send\n", argv[0]); ! 1243: code = -1; ! 1244: return; ! 1245: } ! 1246: (void) strcpy(buf, argv[1]); ! 1247: for (i = 2; i < argc; i++) { ! 1248: (void) strcat(buf, " "); ! 1249: (void) strcat(buf, argv[i]); ! 1250: } ! 1251: if (command(buf) == PRELIM) { ! 1252: while (getreply(0) == PRELIM); ! 1253: } ! 1254: } ! 1255: ! 1256: /* ! 1257: * Ask the other side for help. ! 1258: */ ! 1259: rmthelp(argc, argv) ! 1260: char *argv[]; ! 1261: { ! 1262: int oldverbose = verbose; ! 1263: ! 1264: verbose = 1; ! 1265: (void) command(argc == 1 ? "HELP" : "HELP %s", argv[1]); ! 1266: verbose = oldverbose; ! 1267: } ! 1268: ! 1269: /* ! 1270: * Terminate session and exit. ! 1271: */ ! 1272: /*VARARGS*/ ! 1273: quit() ! 1274: { ! 1275: ! 1276: if (connected) ! 1277: disconnect(); ! 1278: pswitch(1); ! 1279: if (connected) { ! 1280: disconnect(); ! 1281: } ! 1282: exit(0); ! 1283: } ! 1284: ! 1285: /* ! 1286: * Terminate session, but don't exit. ! 1287: */ ! 1288: disconnect() ! 1289: { ! 1290: extern FILE *cout; ! 1291: extern int data; ! 1292: ! 1293: if (!connected) ! 1294: return; ! 1295: (void) command("QUIT"); ! 1296: if (cout) { ! 1297: (void) fclose(cout); ! 1298: } ! 1299: cout = NULL; ! 1300: connected = 0; ! 1301: data = -1; ! 1302: if (!proxy) { ! 1303: macnum = 0; ! 1304: } ! 1305: } ! 1306: ! 1307: confirm(cmd, file) ! 1308: char *cmd, *file; ! 1309: { ! 1310: char line[BUFSIZ]; ! 1311: ! 1312: if (!interactive) ! 1313: return (1); ! 1314: printf("%s %s? ", cmd, file); ! 1315: (void) fflush(stdout); ! 1316: safegets(line, sizeof(line)); ! 1317: return (*line != 'n' && *line != 'N'); ! 1318: } ! 1319: ! 1320: fatal(msg) ! 1321: char *msg; ! 1322: { ! 1323: ! 1324: fprintf(stderr, "ftp: %s\n", msg); ! 1325: exit(1); ! 1326: } ! 1327: ! 1328: /* ! 1329: * Glob a local file name specification with ! 1330: * the expectation of a single return value. ! 1331: * Can't control multiple values being expanded ! 1332: * from the expression, we return only the first. ! 1333: */ ! 1334: globulize(cpp) ! 1335: char **cpp; ! 1336: { ! 1337: char **globbed; ! 1338: ! 1339: if (!doglob) ! 1340: return (1); ! 1341: globbed = glob(*cpp); ! 1342: if (globerr != NULL) { ! 1343: printf("%s: %s\n", *cpp, globerr); ! 1344: if (globbed) { ! 1345: blkfree(globbed); ! 1346: free(globbed); ! 1347: } ! 1348: return (0); ! 1349: } ! 1350: if (globbed) { ! 1351: *cpp = *globbed++; ! 1352: /* don't waste too much memory */ ! 1353: if (*globbed) { ! 1354: blkfree(globbed); ! 1355: free(globbed); ! 1356: } ! 1357: } ! 1358: return (1); ! 1359: } ! 1360: ! 1361: account(argc,argv) ! 1362: int argc; ! 1363: char **argv; ! 1364: { ! 1365: char acct[50], *getpass(), *ap; ! 1366: ! 1367: if (argc > 1) { ! 1368: ++argv; ! 1369: --argc; ! 1370: (void) strncpy(acct,*argv,49); ! 1371: acct[49] = '\0'; ! 1372: while (argc > 1) { ! 1373: --argc; ! 1374: ++argv; ! 1375: (void) strncat(acct,*argv, 49-strlen(acct)); ! 1376: } ! 1377: ap = acct; ! 1378: } ! 1379: else { ! 1380: ap = getpass("Account:"); ! 1381: } ! 1382: (void) command("ACCT %s", ap); ! 1383: } ! 1384: ! 1385: proxabort() ! 1386: { ! 1387: extern int proxy; ! 1388: ! 1389: if (!proxy) { ! 1390: pswitch(1); ! 1391: } ! 1392: if (connected) { ! 1393: proxflag = 1; ! 1394: } ! 1395: else { ! 1396: proxflag = 0; ! 1397: } ! 1398: pswitch(0); ! 1399: } ! 1400: ! 1401: doproxy(argc,argv) ! 1402: int argc; ! 1403: char *argv[]; ! 1404: { ! 1405: register struct cmd *c; ! 1406: struct cmd *getcmd(); ! 1407: extern struct cmd cmdtab[]; ! 1408: ! 1409: if (argc < 2) { ! 1410: (void) strcat(line, " "); ! 1411: printf("(command) "); ! 1412: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 1413: makeargv(); ! 1414: argc = margc; ! 1415: argv = margv; ! 1416: } ! 1417: if (argc < 2) { ! 1418: printf("usage:%s command\n", argv[0]); ! 1419: code = -1; ! 1420: return; ! 1421: } ! 1422: c = getcmd(argv[1]); ! 1423: if (c == (struct cmd *) -1) { ! 1424: printf("?Ambiguous command\n"); ! 1425: (void) fflush(stdout); ! 1426: code = -1; ! 1427: return; ! 1428: } ! 1429: if (c == 0) { ! 1430: printf("?Invalid command\n"); ! 1431: (void) fflush(stdout); ! 1432: code = -1; ! 1433: return; ! 1434: } ! 1435: if (!c->c_proxy) { ! 1436: printf("?Invalid proxy command\n"); ! 1437: (void) fflush(stdout); ! 1438: code = -1; ! 1439: return; ! 1440: } ! 1441: pswitch(1); ! 1442: if (c->c_conn && !connected) { ! 1443: printf("Not connected\n"); ! 1444: (void) fflush(stdout); ! 1445: pswitch(0); ! 1446: code = -1; ! 1447: return; ! 1448: } ! 1449: (*c->c_handler)(argc-1, argv+1); ! 1450: if (connected) { ! 1451: proxflag = 1; ! 1452: } ! 1453: else { ! 1454: proxflag = 0; ! 1455: } ! 1456: pswitch(0); ! 1457: } ! 1458: ! 1459: setcase() ! 1460: { ! 1461: mcase = !mcase; ! 1462: printf("Case mapping %s.\n", onoff(mcase)); ! 1463: code = mcase; ! 1464: } ! 1465: ! 1466: setcr() ! 1467: { ! 1468: crflag = !crflag; ! 1469: printf("Carriage Return stripping %s.\n", onoff(crflag)); ! 1470: code = crflag; ! 1471: } ! 1472: ! 1473: setntrans(argc,argv) ! 1474: int argc; ! 1475: char *argv[]; ! 1476: { ! 1477: if (argc == 1) { ! 1478: ntflag = 0; ! 1479: printf("Ntrans off.\n"); ! 1480: code = ntflag; ! 1481: return; ! 1482: } ! 1483: ntflag++; ! 1484: code = ntflag; ! 1485: (void) strncpy(ntin, argv[1], 16); ! 1486: ntin[16] = '\0'; ! 1487: if (argc == 2) { ! 1488: ntout[0] = '\0'; ! 1489: return; ! 1490: } ! 1491: (void) strncpy(ntout, argv[2], 16); ! 1492: ntout[16] = '\0'; ! 1493: } ! 1494: ! 1495: char * ! 1496: dotrans(name) ! 1497: char *name; ! 1498: { ! 1499: static char new[MAXPATHLEN]; ! 1500: char *cp1, *cp2 = new; ! 1501: register int i, ostop, found; ! 1502: ! 1503: for (ostop = 0; *(ntout + ostop) && ostop < 16; ostop++); ! 1504: for (cp1 = name; *cp1; cp1++) { ! 1505: found = 0; ! 1506: for (i = 0; *(ntin + i) && i < 16; i++) { ! 1507: if (*cp1 == *(ntin + i)) { ! 1508: found++; ! 1509: if (i < ostop) { ! 1510: *cp2++ = *(ntout + i); ! 1511: } ! 1512: break; ! 1513: } ! 1514: } ! 1515: if (!found) { ! 1516: *cp2++ = *cp1; ! 1517: } ! 1518: } ! 1519: *cp2 = '\0'; ! 1520: return(new); ! 1521: } ! 1522: ! 1523: setnmap(argc, argv) ! 1524: int argc; ! 1525: char *argv[]; ! 1526: { ! 1527: char *cp; ! 1528: ! 1529: if (argc == 1) { ! 1530: mapflag = 0; ! 1531: printf("Nmap off.\n"); ! 1532: code = mapflag; ! 1533: return; ! 1534: } ! 1535: if (argc < 3) { ! 1536: (void) strcat(line, " "); ! 1537: printf("(mapout) "); ! 1538: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 1539: makeargv(); ! 1540: argc = margc; ! 1541: argv = margv; ! 1542: } ! 1543: if (argc < 3) { ! 1544: printf("Usage: %s [mapin mapout]\n",argv[0]); ! 1545: code = -1; ! 1546: return; ! 1547: } ! 1548: mapflag = 1; ! 1549: code = 1; ! 1550: cp = strchr(altarg, ' '); ! 1551: if (proxy) { ! 1552: while(*++cp == ' '); ! 1553: altarg = cp; ! 1554: cp = strchr(altarg, ' '); ! 1555: } ! 1556: *cp = '\0'; ! 1557: (void) strncpy(mapin, altarg, MAXPATHLEN - 1); ! 1558: while (*++cp == ' '); ! 1559: (void) strncpy(mapout, cp, MAXPATHLEN - 1); ! 1560: } ! 1561: ! 1562: char * ! 1563: domap(name) ! 1564: char *name; ! 1565: { ! 1566: static char new[MAXPATHLEN]; ! 1567: register char *cp1 = name, *cp2 = mapin; ! 1568: char *tp[9], *te[9]; ! 1569: int i, toks[9], toknum = 0, match = 1; ! 1570: ! 1571: for (i=0; i < 9; ++i) { ! 1572: toks[i] = 0; ! 1573: } ! 1574: while (match && *cp1 && *cp2) { ! 1575: switch (*cp2) { ! 1576: case '\\': ! 1577: if (*++cp2 != *cp1) { ! 1578: match = 0; ! 1579: } ! 1580: break; ! 1581: case '$': ! 1582: if (*(cp2+1) >= '1' && (*cp2+1) <= '9') { ! 1583: if (*cp1 != *(++cp2+1)) { ! 1584: toks[toknum = *cp2 - '1']++; ! 1585: tp[toknum] = cp1; ! 1586: while (*++cp1 && *(cp2+1) ! 1587: != *cp1); ! 1588: te[toknum] = cp1; ! 1589: } ! 1590: cp2++; ! 1591: break; ! 1592: } ! 1593: /* FALLTHROUGH */ ! 1594: default: ! 1595: if (*cp2 != *cp1) { ! 1596: match = 0; ! 1597: } ! 1598: break; ! 1599: } ! 1600: if (match && *cp1) { ! 1601: cp1++; ! 1602: } ! 1603: if (match && *cp2) { ! 1604: cp2++; ! 1605: } ! 1606: } ! 1607: if (!match && *cp1) /* last token mismatch */ ! 1608: { ! 1609: toks[toknum] = 0; ! 1610: } ! 1611: cp1 = new; ! 1612: *cp1 = '\0'; ! 1613: cp2 = mapout; ! 1614: while (*cp2) { ! 1615: match = 0; ! 1616: switch (*cp2) { ! 1617: case '\\': ! 1618: if (*(cp2 + 1)) { ! 1619: *cp1++ = *++cp2; ! 1620: } ! 1621: break; ! 1622: case '[': ! 1623: LOOP: ! 1624: if (*++cp2 == '$' && isdigit(*(cp2+1))) { ! 1625: if (*++cp2 == '0') { ! 1626: char *cp3 = name; ! 1627: ! 1628: while (*cp3) { ! 1629: *cp1++ = *cp3++; ! 1630: } ! 1631: match = 1; ! 1632: } ! 1633: else if (toks[toknum = *cp2 - '1']) { ! 1634: char *cp3 = tp[toknum]; ! 1635: ! 1636: while (cp3 != te[toknum]) { ! 1637: *cp1++ = *cp3++; ! 1638: } ! 1639: match = 1; ! 1640: } ! 1641: } ! 1642: else { ! 1643: while (*cp2 && *cp2 != ',' && ! 1644: *cp2 != ']') { ! 1645: if (*cp2 == '\\') { ! 1646: cp2++; ! 1647: } ! 1648: else if (*cp2 == '$' && ! 1649: isdigit(*(cp2+1))) { ! 1650: if (*++cp2 == '0') { ! 1651: char *cp3 = name; ! 1652: ! 1653: while (*cp3) { ! 1654: *cp1++ = *cp3++; ! 1655: } ! 1656: } ! 1657: else if (toks[toknum = ! 1658: *cp2 - '1']) { ! 1659: char *cp3=tp[toknum]; ! 1660: ! 1661: while (cp3 != ! 1662: te[toknum]) { ! 1663: *cp1++ = *cp3++; ! 1664: } ! 1665: } ! 1666: } ! 1667: else if (*cp2) { ! 1668: *cp1++ = *cp2++; ! 1669: } ! 1670: } ! 1671: if (!*cp2) { ! 1672: printf("nmap: unbalanced brackets\n"); ! 1673: return(name); ! 1674: } ! 1675: match = 1; ! 1676: cp2--; ! 1677: } ! 1678: if (match) { ! 1679: while (*++cp2 && *cp2 != ']') { ! 1680: if (*cp2 == '\\' && *(cp2 + 1)) { ! 1681: cp2++; ! 1682: } ! 1683: } ! 1684: if (!*cp2) { ! 1685: printf("nmap: unbalanced brackets\n"); ! 1686: return(name); ! 1687: } ! 1688: break; ! 1689: } ! 1690: switch (*++cp2) { ! 1691: case ',': ! 1692: goto LOOP; ! 1693: case ']': ! 1694: break; ! 1695: default: ! 1696: cp2--; ! 1697: goto LOOP; ! 1698: } ! 1699: break; ! 1700: case '$': ! 1701: if (isdigit(*(cp2 + 1))) { ! 1702: if (*++cp2 == '0') { ! 1703: char *cp3 = name; ! 1704: ! 1705: while (*cp3) { ! 1706: *cp1++ = *cp3++; ! 1707: } ! 1708: } ! 1709: else if (toks[toknum = *cp2 - '1']) { ! 1710: char *cp3 = tp[toknum]; ! 1711: ! 1712: while (cp3 != te[toknum]) { ! 1713: *cp1++ = *cp3++; ! 1714: } ! 1715: } ! 1716: break; ! 1717: } ! 1718: /* intentional drop through */ ! 1719: default: ! 1720: *cp1++ = *cp2; ! 1721: break; ! 1722: } ! 1723: cp2++; ! 1724: } ! 1725: *cp1 = '\0'; ! 1726: if (!*new) { ! 1727: return(name); ! 1728: } ! 1729: return(new); ! 1730: } ! 1731: ! 1732: setsunique() ! 1733: { ! 1734: sunique = !sunique; ! 1735: printf("Store unique %s.\n", onoff(sunique)); ! 1736: code = sunique; ! 1737: } ! 1738: ! 1739: setrunique() ! 1740: { ! 1741: runique = !runique; ! 1742: printf("Receive unique %s.\n", onoff(runique)); ! 1743: code = runique; ! 1744: } ! 1745: ! 1746: /* change directory to perent directory */ ! 1747: cdup() ! 1748: { ! 1749: (void) command("CDUP"); ! 1750: } ! 1751: ! 1752: ! 1753: /* show remote system type */ ! 1754: syst() ! 1755: { ! 1756: (void) command("SYST"); ! 1757: } ! 1758: ! 1759: macdef(argc, argv) ! 1760: int argc; ! 1761: char *argv[]; ! 1762: { ! 1763: char *tmp; ! 1764: int c; ! 1765: ! 1766: if (macnum == 16) { ! 1767: printf("Limit of 16 macros have already been defined\n"); ! 1768: code = -1; ! 1769: return; ! 1770: } ! 1771: if (argc < 2) { ! 1772: (void) strcat(line, " "); ! 1773: printf("(macro name) "); ! 1774: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 1775: makeargv(); ! 1776: argc = margc; ! 1777: argv = margv; ! 1778: } ! 1779: if (argc != 2) { ! 1780: printf("Usage: %s macro_name\n",argv[0]); ! 1781: code = -1; ! 1782: return; ! 1783: } ! 1784: if (interactive) { ! 1785: printf("Enter macro line by line, terminating it with a null line\n"); ! 1786: } ! 1787: (void) strncpy(macros[macnum].mac_name, argv[1], 8); ! 1788: if (macnum == 0) { ! 1789: macros[macnum].mac_start = macbuf; ! 1790: } ! 1791: else { ! 1792: macros[macnum].mac_start = macros[macnum - 1].mac_end + 1; ! 1793: } ! 1794: tmp = macros[macnum].mac_start; ! 1795: while (tmp != macbuf+4096) { ! 1796: if ((c = getchar()) == EOF) { ! 1797: printf("macdef:end of file encountered\n"); ! 1798: code = -1; ! 1799: return; ! 1800: } ! 1801: if ((*tmp = c) == '\n') { ! 1802: if (tmp == macros[macnum].mac_start) { ! 1803: macros[macnum++].mac_end = tmp; ! 1804: code = 0; ! 1805: return; ! 1806: } ! 1807: if (*(tmp-1) == '\0') { ! 1808: macros[macnum++].mac_end = tmp - 1; ! 1809: code = 0; ! 1810: return; ! 1811: } ! 1812: *tmp = '\0'; ! 1813: } ! 1814: tmp++; ! 1815: } ! 1816: while (1) { ! 1817: while ((c = getchar()) != '\n' && c != EOF) ! 1818: /* LOOP */; ! 1819: if (c == EOF || getchar() == '\n') { ! 1820: printf("Macro not defined - 4k buffer exceeded\n"); ! 1821: code = -1; ! 1822: return; ! 1823: } ! 1824: } ! 1825: } ! 1826: ! 1827: /* ! 1828: * get size of file on remote machine ! 1829: */ ! 1830: sizecmd(argc, argv) ! 1831: char *argv[]; ! 1832: { ! 1833: ! 1834: if (argc < 2) { ! 1835: (void) strcat(line, " "); ! 1836: printf("(filename) "); ! 1837: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 1838: makeargv(); ! 1839: argc = margc; ! 1840: argv = margv; ! 1841: } ! 1842: if (argc < 2) { ! 1843: printf("usage:%s filename\n", argv[0]); ! 1844: code = -1; ! 1845: return; ! 1846: } ! 1847: (void) command("SIZE %s", argv[1]); ! 1848: } ! 1849: ! 1850: /* ! 1851: * get last modification time of file on remote machine ! 1852: */ ! 1853: modtime(argc, argv) ! 1854: char *argv[]; ! 1855: { ! 1856: int overbose; ! 1857: ! 1858: if (argc < 2) { ! 1859: (void) strcat(line, " "); ! 1860: printf("(filename) "); ! 1861: safegets(&line[strlen(line)], sizeof(line)-strlen(line)); ! 1862: makeargv(); ! 1863: argc = margc; ! 1864: argv = margv; ! 1865: } ! 1866: if (argc < 2) { ! 1867: printf("usage:%s filename\n", argv[0]); ! 1868: code = -1; ! 1869: return; ! 1870: } ! 1871: overbose = verbose; ! 1872: if (debug == 0) ! 1873: verbose = -1; ! 1874: if (command("MDTM %s", argv[1]) == COMPLETE) { ! 1875: int yy, mo, day, hour, min, sec; ! 1876: sscanf(reply_string, "%*s %04d%02d%02d%02d%02d%02d", &yy, &mo, ! 1877: &day, &hour, &min, &sec); ! 1878: /* might want to print this in local time */ ! 1879: printf("%s\t%02d/%02d/%04d %02d:%02d:%02d GMT\n", argv[1], ! 1880: mo, day, yy, hour, min, sec); ! 1881: } else ! 1882: fputs(reply_string, stdout); ! 1883: verbose = overbose; ! 1884: } ! 1885: ! 1886: /* ! 1887: * show status on remote machine ! 1888: */ ! 1889: rmtstatus(argc, argv) ! 1890: char *argv[]; ! 1891: { ! 1892: (void) command(argc > 1 ? "STAT %s" : "STAT" , argv[1]); ! 1893: } ! 1894: ! 1895: ! 1896: /* ! 1897: * a safe version of gets ! 1898: */ ! 1899: safegets(bp, n) ! 1900: char *bp; ! 1901: int n; ! 1902: { ! 1903: char *cp; ! 1904: ! 1905: if(fgets(bp, n, stdin)==NULL) ! 1906: return NULL; ! 1907: for(cp=bp; *cp; cp++) ! 1908: if(*cp=='\r' || *cp =='\n'){ ! 1909: *cp = 0; ! 1910: break; ! 1911: } ! 1912: return bp; ! 1913: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.