|
|
1.1 ! root 1: #ifndef lint ! 2: static char RCSid[] = "$Header: cmds.c,v 2.5 87/04/01 09:32:37 ed Exp $"; ! 3: #endif ! 4: /* $Log: cmds.c,v $ ! 5: * Revision 2.5 87/04/01 09:32:37 ed ! 6: * Fixed bug in setpeer if no host accompanies -F (from Chris Liebman) ! 7: * ! 8: * Revision 2.4 87/01/09 16:52:00 ed ! 9: * Use FilingSubset, if rejected attempt Filing ! 10: * Allows user override with -F switch ! 11: * Maintain FilingSubset mandatory attributes ! 12: * User niceties: echo file name/type on transfer commands ! 13: * prompt on delete ! 14: * guess type which will determine file type implied by content ! 15: * New commands: (type related) Guess, Whatis ! 16: * (file transfer) Copy, Move, Rename ! 17: * ! 18: * Revision 2.3 86/12/15 11:40:49 jqj ! 19: * Added support for more ViewPoint file types (no other attributes, though) ! 20: * ! 21: * Revision 2.2 86/12/11 06:11:30 jqj ! 22: * Eliminated form, mode, and struct commands. Started adding support for ! 23: * more file types. ! 24: * ! 25: * Revision 2.1 86/06/30 12:18:56 jqj ! 26: * get proper order of args to allow mget to work right. ! 27: * ! 28: * Revision 2.0 85/11/21 07:22:41 jqj ! 29: * 4.3BSD standard release ! 30: * ! 31: * Revision 1.2 85/10/30 08:06:37 root ! 32: * if prompt=off but verbose=on, print the name of each file during ! 33: * multiplefile transfers. ! 34: * ! 35: * Revision 1.1 85/05/27 06:30:51 jqj ! 36: * Initial revision ! 37: * ! 38: * based on Berkeley tcp/ftp ! 39: */ ! 40: /* static char sccsid[] = "@(#)cmds.c 4.9 (Berkeley) 7/26/83"; */ ! 41: ! 42: /* ! 43: * FTP User Program -- Command Routines. ! 44: */ ! 45: #include <sys/param.h> ! 46: #include <sys/stat.h> ! 47: #include <sys/socket.h> ! 48: #include <sys/file.h> ! 49: ! 50: #include <signal.h> ! 51: #include <stdio.h> ! 52: #include <errno.h> ! 53: ! 54: #include "ftp_var.h" ! 55: ! 56: extern char *globerr; ! 57: extern char **glob(); ! 58: extern char *home; ! 59: extern short gflag; ! 60: extern char *remglob(); ! 61: extern char *getenv(); ! 62: extern char *index(); ! 63: extern char *rindex(); ! 64: ! 65: /* ! 66: * Connect to peer server and ! 67: * auto-login, if possible. ! 68: */ ! 69: setpeer(argc, argv) ! 70: int argc; ! 71: char *argv[]; ! 72: { ! 73: CourierConnection *hookup(); ! 74: ! 75: if (connected != (CourierConnection*)0) { ! 76: printf("Already connected to %s, use disconnect first.\n", ! 77: hostname); ! 78: return; ! 79: } ! 80: ! 81: if (argc < 2) { ! 82: strcat(line, " "); ! 83: printf("(to) "); ! 84: gets(&line[strlen(line)]); ! 85: makeargv(); ! 86: argc = margc; ! 87: argv = margv; ! 88: } else if (strcmp(argv[1], "-F") == 0) { ! 89: usefiling= 1; ! 90: if (argc < 3) { ! 91: strcat(line, " "); ! 92: printf("(to) "); ! 93: gets(&line[strlen(line)]); ! 94: makeargv(); ! 95: argc = margc; ! 96: argv = margv; ! 97: } ! 98: argc--; ! 99: argv[1]= argv[2]; ! 100: } ! 101: ! 102: if (argc > 2) { ! 103: printf("usage: %s [-F] fileservice-name\n", argv[0]); ! 104: return; ! 105: } ! 106: connected = hookup(argv[1]); ! 107: if (connected != (CourierConnection*)0) { ! 108: if (autologin) { ! 109: login(0,0); ! 110: } ! 111: } ! 112: } ! 113: ! 114: struct types { ! 115: char *t_name; ! 116: int t_type; ! 117: } types[] = { ! 118: { "ascii", TYPE_A }, ! 119: { "binary", TYPE_I }, ! 120: { "image", TYPE_I }, ! 121: { "interpress", TYPE_Interpress }, ! 122: { "viewpoint", TYPE_VP }, ! 123: { "vpcanvas", TYPE_VPCanvas }, ! 124: { "vpdictionary",TYPE_VPDictionary }, ! 125: { "vpmailnote", TYPE_VPMailNote }, ! 126: { "vpreference",TYPE_VPReference }, ! 127: { "serialized", TYPE_S }, ! 128: { "guess", TYPE_Guess }, ! 129: 0 ! 130: }; ! 131: ! 132: /* ! 133: * Set transfer type. ! 134: */ ! 135: settype(argc, argv) ! 136: char *argv[]; ! 137: { ! 138: register struct types *p; ! 139: int comret; ! 140: ! 141: if (argc > 2 || (argc == 2 && strcmp(argv[1],"?") == 0)) { ! 142: char *sep; ! 143: ! 144: printf("usage: %s [ <integer> ", argv[0]); ! 145: sep = " | "; ! 146: for (p = types; p->t_name; p++) { ! 147: printf("%s%s", sep, p->t_name); ! 148: } ! 149: printf(" ]\n"); ! 150: return; ! 151: } ! 152: if (argc < 2) { ! 153: printf("Using %s mode to transfer files.\n", typename); ! 154: return; ! 155: } ! 156: for (p = types; p->t_name; p++) ! 157: if (strcmp(argv[1], p->t_name) == 0) ! 158: break; ! 159: if (p->t_name == 0) { ! 160: int tmp = atoi(argv[1]); ! 161: if (tmp == 0 && strcmp(argv[1],"0") != 0) { ! 162: printf("%s: unknown mode (\"%s ?\" for help)\n", ! 163: argv[1], argv[0]); ! 164: return; ! 165: } ! 166: sprintf(typename,"%d",tmp); ! 167: typevalue = tmp; ! 168: return; ! 169: } ! 170: strcpy(typename, p->t_name); ! 171: typevalue = p->t_type; ! 172: } ! 173: ! 174: /* ! 175: * Set binary transfer type. ! 176: */ ! 177: /*VARARGS*/ ! 178: setbinary() ! 179: { ! 180: ! 181: call(settype, "type", "binary", 0); ! 182: } ! 183: ! 184: /* ! 185: * Set ascii transfer type. ! 186: */ ! 187: /*VARARGS*/ ! 188: setascii() ! 189: { ! 190: ! 191: call(settype, "type", "ascii", 0); ! 192: } ! 193: ! 194: /* ! 195: * Set guess transfer type. ! 196: * basically make educated guess of file type as stored ! 197: */ ! 198: /*VARARGS*/ ! 199: setguess() ! 200: { ! 201: call(settype, "type", "guess", 0); ! 202: } ! 203: ! 204: put(argc, argv) ! 205: int argc; ! 206: char *argv[]; ! 207: { ! 208: char *cmd; ! 209: ! 210: if (argc == 2) ! 211: argc++, argv[2] = argv[1]; ! 212: if (argc < 2) { ! 213: strcat(line, " "); ! 214: printf("(local-file) "); ! 215: gets(&line[strlen(line)]); ! 216: makeargv(); ! 217: argc = margc; ! 218: argv = margv; ! 219: } ! 220: if (argc < 2) { ! 221: usage: ! 222: printf("%s local-file remote-file\n", argv[0]); ! 223: return; ! 224: } ! 225: if (argc < 3) { ! 226: strcat(line, " "); ! 227: printf("(remote-file) "); ! 228: gets(&line[strlen(line)]); ! 229: makeargv(); ! 230: argc = margc; ! 231: argv = margv; ! 232: } ! 233: if (argc < 3) ! 234: goto usage; ! 235: if (!globulize(&argv[1])) ! 236: return; ! 237: cmd = (argv[0][0] == 'a') ? "APPE" : "STOR"; ! 238: ! 239: sendrequest(cmd, argv[1], argv[2]); ! 240: ! 241: } ! 242: ! 243: /* ! 244: * Send multiple files. ! 245: */ ! 246: mput(argc, argv) ! 247: char *argv[]; ! 248: { ! 249: register int i; ! 250: ! 251: if (argc < 2) { ! 252: strcat(line, " "); ! 253: printf("(local-files) "); ! 254: gets(&line[strlen(line)]); ! 255: makeargv(); ! 256: argc = margc; ! 257: argv = margv; ! 258: } ! 259: if (argc < 2) { ! 260: printf("%s local-files\n", argv[0]); ! 261: return; ! 262: } ! 263: for (i = 1; i < argc; i++) { ! 264: register char **cpp, **gargs; ! 265: ! 266: if (!doglob) { ! 267: if (confirm(argv[0], argv[i])) ! 268: sendrequest("STOR", argv[i], argv[i]); ! 269: continue; ! 270: } ! 271: gargs = glob(argv[i]); ! 272: if (globerr != NULL) { ! 273: printf("%s\n", globerr); ! 274: if (gargs) ! 275: blkfree(gargs); ! 276: continue; ! 277: } ! 278: for (cpp = gargs; cpp && *cpp != NULL; cpp++) ! 279: if (confirm(argv[0], *cpp)) ! 280: sendrequest("STOR", *cpp, *cpp); ! 281: if (gargs != NULL) ! 282: blkfree(gargs); ! 283: } ! 284: } ! 285: ! 286: /* ! 287: * Receive one file. ! 288: */ ! 289: get(argc, argv) ! 290: char *argv[]; ! 291: { ! 292: ! 293: if (argc == 2) ! 294: argc++, argv[2] = argv[1]; ! 295: if (argc < 2) { ! 296: strcat(line, " "); ! 297: printf("(remote-file) "); ! 298: gets(&line[strlen(line)]); ! 299: makeargv(); ! 300: argc = margc; ! 301: argv = margv; ! 302: } ! 303: if (argc < 2) { ! 304: usage: ! 305: printf("%s remote-file [ local-file ]\n", argv[0]); ! 306: return; ! 307: } ! 308: if (argc < 3) { ! 309: strcat(line, " "); ! 310: printf("(local-file) "); ! 311: gets(&line[strlen(line)]); ! 312: makeargv(); ! 313: argc = margc; ! 314: argv = margv; ! 315: } ! 316: if (argc < 3) ! 317: goto usage; ! 318: if (!globulize(&argv[2])) ! 319: return; ! 320: ! 321: recvrequest("RETR", argv[2], argv[1], "w"); ! 322: } ! 323: /* ! 324: * given a remote file name, strip directory path and version number ! 325: */ ! 326: char * ! 327: getlocalname(cp) ! 328: char *cp; ! 329: { ! 330: char *result; ! 331: static char buf[MAXPATHLEN]; ! 332: ! 333: result = rindex(cp,'/'); /* find last component */ ! 334: if (result == NULL) result = cp; ! 335: else result += 1; ! 336: strcpy(buf, result); ! 337: result = index(buf,'!'); /* strip version # if any */ ! 338: if (result != NULL && result != buf) *result = '\000'; ! 339: return(buf); ! 340: } ! 341: ! 342: /* ! 343: * Get multiple files. ! 344: */ ! 345: mget(argc, argv) ! 346: char *argv[]; ! 347: { ! 348: char *cp; ! 349: char *tailp; ! 350: ! 351: if (argc < 2) { ! 352: strcat(line, " "); ! 353: printf("(remote-files) "); ! 354: gets(&line[strlen(line)]); ! 355: makeargv(); ! 356: argc = margc; ! 357: argv = margv; ! 358: } ! 359: if (argc < 2) { ! 360: printf("%s remote-files\n", argv[0]); ! 361: return; ! 362: } ! 363: while ((cp = remglob(argc, argv)) != NULL) ! 364: if (confirm(argv[0], cp)) { ! 365: tailp = getlocalname(cp); ! 366: recvrequest("RETR", tailp, cp, "w"); ! 367: } ! 368: } ! 369: ! 370: /* ! 371: * Deserialize a file to file/descendants] ! 372: */ ! 373: restore(argc, argv) ! 374: int argc; ! 375: char *argv[]; ! 376: { ! 377: char *cmd; ! 378: ! 379: if (argc == 2) ! 380: argc++, argv[2] = argv[1]; ! 381: if (argc < 2) { ! 382: strcat(line, " "); ! 383: printf("(local-file) "); ! 384: gets(&line[strlen(line)]); ! 385: makeargv(); ! 386: argc = margc; ! 387: argv = margv; ! 388: } ! 389: if (argc < 2) { ! 390: usage: ! 391: printf("%s local-file remote-file\n", argv[0]); ! 392: return; ! 393: } ! 394: if (argc < 3) { ! 395: strcat(line, " "); ! 396: printf("(remote-file) "); ! 397: gets(&line[strlen(line)]); ! 398: makeargv(); ! 399: argc = margc; ! 400: argv = margv; ! 401: } ! 402: if (argc < 3) ! 403: goto usage; ! 404: if (!globulize(&argv[1])) ! 405: return; ! 406: cmd = "DSER"; ! 407: ! 408: sendrequest(cmd, argv[1], argv[2]); ! 409: ! 410: } ! 411: ! 412: /* ! 413: * Serialize a file/descendants. ! 414: */ ! 415: archive(argc, argv) ! 416: char *argv[]; ! 417: { ! 418: ! 419: if (argc == 2) ! 420: argc++, argv[2] = argv[1]; ! 421: if (argc < 2) { ! 422: strcat(line, " "); ! 423: printf("(remote-file) "); ! 424: gets(&line[strlen(line)]); ! 425: makeargv(); ! 426: argc = margc; ! 427: argv = margv; ! 428: } ! 429: if (argc < 2) { ! 430: usage: ! 431: printf("%s remote-file [ local-file ]\n", argv[0]); ! 432: return; ! 433: } ! 434: if (argc < 3) { ! 435: strcat(line, " "); ! 436: printf("(local-file) "); ! 437: gets(&line[strlen(line)]); ! 438: makeargv(); ! 439: argc = margc; ! 440: argv = margv; ! 441: } ! 442: if (argc < 3) ! 443: goto usage; ! 444: if (!globulize(&argv[2])) ! 445: return; ! 446: ! 447: recvrequest("SER", argv[2], argv[1], "w"); ! 448: } ! 449: ! 450: char * ! 451: remglob(argc, argv) ! 452: char *argv[]; ! 453: { ! 454: char temp[16]; ! 455: static char buf[MAXPATHLEN]; ! 456: static FILE *ftemp = NULL; ! 457: static char **args; ! 458: int oldverbose, oldhash; ! 459: char *cp, *mode; ! 460: ! 461: if (!doglob) { ! 462: if (args == NULL) ! 463: args = argv; ! 464: if ((cp = *++args) == NULL) ! 465: args = NULL; ! 466: return (cp); ! 467: } ! 468: if (ftemp == NULL) { ! 469: strcpy(temp, "/tmp/ftpXXXXXX"); ! 470: mktemp(temp); ! 471: oldverbose = verbose, verbose = 0; ! 472: oldhash = hash, hash = 0; ! 473: for (mode = "w"; *++argv != NULL; mode = "a") ! 474: recvrequest("NLST", temp, *argv, mode); ! 475: verbose = oldverbose; hash = oldhash; ! 476: ftemp = fopen(temp, "r"); ! 477: unlink(temp); ! 478: if (ftemp == NULL) { ! 479: printf("can't find list of remote files, oops\n"); ! 480: return (NULL); ! 481: } ! 482: } ! 483: if (fgets(buf, sizeof (buf), ftemp) == NULL) { ! 484: fclose(ftemp), ftemp = NULL; ! 485: return (NULL); ! 486: } ! 487: if ((cp = index(buf, '\n')) != NULL) ! 488: *cp = '\0'; ! 489: return (buf); ! 490: } ! 491: ! 492: char * ! 493: onoff(bool) ! 494: int bool; ! 495: { ! 496: ! 497: return (bool ? "on" : "off"); ! 498: } ! 499: ! 500: /* ! 501: * Show status. ! 502: */ ! 503: status(argc, argv) ! 504: char *argv[]; ! 505: { ! 506: ! 507: if (connected) ! 508: printf("Connected to %s.\n", hostname); ! 509: else ! 510: printf("Not connected.\n"); ! 511: printf("Type: %s\n", typename); ! 512: printf("Verbose: %s; Bell: %s; Prompting: %s; Globbing: %s\n", ! 513: onoff(verbose), onoff(bell), onoff(interactive), ! 514: onoff(doglob)); ! 515: printf("Hash mark printing: %s\n", ! 516: onoff(hash)); ! 517: } ! 518: ! 519: /* ! 520: * Set beep on cmd completed mode. ! 521: */ ! 522: /*VARARGS*/ ! 523: setbell() ! 524: { ! 525: ! 526: bell = !bell; ! 527: printf("Bell mode %s.\n", onoff(bell)); ! 528: } ! 529: ! 530: /* ! 531: * Turn on packet tracing. ! 532: */ ! 533: /*VARARGS*/ ! 534: settrace() ! 535: { ! 536: ! 537: trace = !trace; ! 538: printf("Packet tracing %s.\n", onoff(trace)); ! 539: } ! 540: ! 541: /* ! 542: * Toggle hash mark printing during transfers. ! 543: */ ! 544: /*VARARGS*/ ! 545: sethash() ! 546: { ! 547: ! 548: hash = !hash; ! 549: printf("Hash mark printing %s", onoff(hash)); ! 550: if (hash) ! 551: printf(" (1 packet/hash mark)"); ! 552: printf(".\n"); ! 553: } ! 554: ! 555: /* ! 556: * Turn on printing of server echo's. ! 557: */ ! 558: /*VARARGS*/ ! 559: setverbose() ! 560: { ! 561: ! 562: verbose = !verbose; ! 563: printf("Verbose mode %s.\n", onoff(verbose)); ! 564: } ! 565: ! 566: /* ! 567: * Turn on interactive prompting ! 568: * during mget, mput, and mdelete. ! 569: */ ! 570: /*VARARGS*/ ! 571: setprompt() ! 572: { ! 573: ! 574: interactive = !interactive; ! 575: printf("Interactive mode %s.\n", onoff(interactive)); ! 576: } ! 577: ! 578: /* ! 579: * Toggle metacharacter interpretation ! 580: * on local file names. ! 581: */ ! 582: /*VARARGS*/ ! 583: setglob() ! 584: { ! 585: ! 586: doglob = !doglob; ! 587: printf("Globbing %s.\n", onoff(doglob)); ! 588: } ! 589: ! 590: /* ! 591: * Set debugging mode on/off and/or ! 592: * set level of debugging. ! 593: */ ! 594: /*VARARGS*/ ! 595: setdebug(argc, argv) ! 596: char *argv[]; ! 597: { ! 598: int val; ! 599: ! 600: if (argc > 1) { ! 601: val = atoi(argv[1]); ! 602: if (val < 0) { ! 603: printf("%s: bad debugging value.\n", argv[1]); ! 604: return; ! 605: } ! 606: } else ! 607: val = !debug; ! 608: debug = val; ! 609: printf("Debugging %s (debug=%d).\n", onoff(debug), debug); ! 610: } ! 611: ! 612: /* ! 613: * Set current working directory ! 614: * on remote machine. ! 615: */ ! 616: cd(argc, argv) ! 617: char *argv[]; ! 618: { ! 619: ! 620: if (argc < 2) { ! 621: strcat(line, " "); ! 622: printf("(remote-directory) "); ! 623: gets(&line[strlen(line)]); ! 624: makeargv(); ! 625: argc = margc; ! 626: argv = margv; ! 627: } ! 628: if (argc < 2) { ! 629: printf("%s remote-directory\n", argv[0]); ! 630: return; ! 631: } ! 632: (void) docd(argv[1]); ! 633: } ! 634: ! 635: /* ! 636: * Set current working directory ! 637: * on local machine. ! 638: */ ! 639: lcd(argc, argv) ! 640: char *argv[]; ! 641: { ! 642: char buf[MAXPATHLEN]; ! 643: ! 644: if (argc < 2) ! 645: argc++, argv[1] = home; ! 646: if (argc != 2) { ! 647: printf("%s local-directory\n", argv[0]); ! 648: return; ! 649: } ! 650: if (!globulize(&argv[1])) ! 651: return; ! 652: if (chdir(argv[1]) < 0) { ! 653: perror(argv[1]); ! 654: return; ! 655: } ! 656: printf("Local directory now %s\n", getwd(buf)); ! 657: } ! 658: ! 659: /* ! 660: * Delete a single file. ! 661: */ ! 662: delete(argc, argv) ! 663: char *argv[]; ! 664: { ! 665: ! 666: if (argc < 2) { ! 667: strcat(line, " "); ! 668: printf("(remote-file) "); ! 669: gets(&line[strlen(line)]); ! 670: makeargv(); ! 671: argc = margc; ! 672: argv = margv; ! 673: } ! 674: if (argc < 2) { ! 675: printf("%s remote-file\n", argv[0]); ! 676: return; ! 677: } ! 678: (void) dodelete( argv[1]); ! 679: } ! 680: ! 681: /* ! 682: * Delete multiple files. ! 683: */ ! 684: mdelete(argc, argv) ! 685: char *argv[]; ! 686: { ! 687: char *cp; ! 688: ! 689: if (argc < 2) { ! 690: strcat(line, " "); ! 691: printf("(remote-files) "); ! 692: gets(&line[strlen(line)]); ! 693: makeargv(); ! 694: argc = margc; ! 695: argv = margv; ! 696: } ! 697: if (argc < 2) { ! 698: printf("%s remote-files\n", argv[0]); ! 699: return; ! 700: } ! 701: while ((cp = remglob(argc, argv)) != NULL) ! 702: if (confirm(argv[0], cp)) ! 703: (void) dodelete( cp); ! 704: } ! 705: ! 706: /* ! 707: * Rename a remote file. ! 708: */ ! 709: renamefile(argc, argv) ! 710: char *argv[]; ! 711: { ! 712: ! 713: if (argc < 2) { ! 714: strcat(line, " "); ! 715: printf("(from-name) "); ! 716: gets(&line[strlen(line)]); ! 717: makeargv(); ! 718: argc = margc; ! 719: argv = margv; ! 720: } ! 721: if (argc < 2) { ! 722: usage: ! 723: printf("%s from-name to-name\n", argv[0]); ! 724: return; ! 725: } ! 726: if (argc < 3) { ! 727: strcat(line, " "); ! 728: printf("(to-name) "); ! 729: gets(&line[strlen(line)]); ! 730: makeargv(); ! 731: argc = margc; ! 732: argv = margv; ! 733: } ! 734: if (argc < 3) ! 735: goto usage; ! 736: dorename(argv[1], argv[2]); ! 737: } ! 738: ! 739: /* ! 740: * Copy a remote file. ! 741: */ ! 742: copyfile(argc, argv) ! 743: char *argv[]; ! 744: { ! 745: ! 746: if (argc < 2) { ! 747: strcat(line, " "); ! 748: printf("(from-name) "); ! 749: gets(&line[strlen(line)]); ! 750: makeargv(); ! 751: argc = margc; ! 752: argv = margv; ! 753: } ! 754: if (argc < 2) { ! 755: usage: ! 756: printf("%s from-name to-name\n", argv[0]); ! 757: return; ! 758: } ! 759: if (argc < 3) { ! 760: strcat(line, " "); ! 761: printf("(to-name) "); ! 762: gets(&line[strlen(line)]); ! 763: makeargv(); ! 764: argc = margc; ! 765: argv = margv; ! 766: } ! 767: if (argc < 3) ! 768: goto usage; ! 769: docopy("COPY", argv[1], argv[2]); ! 770: } ! 771: ! 772: /* ! 773: * Move a remote file. ! 774: */ ! 775: movefile(argc, argv) ! 776: char *argv[]; ! 777: { ! 778: ! 779: if (argc < 2) { ! 780: strcat(line, " "); ! 781: printf("(from-name) "); ! 782: gets(&line[strlen(line)]); ! 783: makeargv(); ! 784: argc = margc; ! 785: argv = margv; ! 786: } ! 787: if (argc < 2) { ! 788: usage: ! 789: printf("%s from-name to-name\n", argv[0]); ! 790: return; ! 791: } ! 792: if (argc < 3) { ! 793: strcat(line, " "); ! 794: printf("(to-directory) "); ! 795: gets(&line[strlen(line)]); ! 796: makeargv(); ! 797: argc = margc; ! 798: argv = margv; ! 799: } ! 800: if (argc < 3) ! 801: goto usage; ! 802: docopy("MOVE", argv[1], argv[2]); ! 803: } ! 804: ! 805: /* ! 806: * Get a directory listing ! 807: * of remote files. ! 808: */ ! 809: ls(argc, argv) ! 810: char *argv[]; ! 811: { ! 812: char *cmd; ! 813: ! 814: if (argc < 2) ! 815: argc++, argv[1] = "*"; ! 816: if (argc < 3) ! 817: argc++, argv[2] = "-"; ! 818: if (argc > 3) { ! 819: printf("usage: %s remote-directory local-file\n", argv[0]); ! 820: return; ! 821: } ! 822: cmd = argv[0][0] == 'l' ? "NLST" : "LIST"; ! 823: if (strcmp(argv[2], "-") && !globulize(&argv[2])) ! 824: return; ! 825: recvrequest(cmd, argv[2], argv[1], "w"); ! 826: } ! 827: ! 828: /* ! 829: * Get a directory listing ! 830: * of multiple remote files. ! 831: */ ! 832: mls(argc, argv) ! 833: char *argv[]; ! 834: { ! 835: char *cmd, *mode, *cp, *dest; ! 836: ! 837: if (argc < 2) { ! 838: strcat(line, " "); ! 839: printf("(remote-files) "); ! 840: gets(&line[strlen(line)]); ! 841: makeargv(); ! 842: argc = margc; ! 843: argv = margv; ! 844: } ! 845: if (argc < 3) { ! 846: strcat(line, " "); ! 847: printf("(local-file) "); ! 848: gets(&line[strlen(line)]); ! 849: makeargv(); ! 850: argc = margc; ! 851: argv = margv; ! 852: } ! 853: if (argc < 3) { ! 854: printf("%s remote-files local-file\n", argv[0]); ! 855: return; ! 856: } ! 857: dest = argv[argc - 1]; ! 858: argv[argc - 1] = NULL; ! 859: if (strcmp(dest, "-")) ! 860: if (globulize(&dest) && confirm("local-file", dest)) ! 861: return; ! 862: cmd = argv[0][1] == 'l' ? "NLST" : "LIST"; ! 863: for (mode = "w"; cp = remglob(argc, argv); mode = "a") ! 864: if (confirm(argv[0], cp)) ! 865: recvrequest(cmd, argv[2], argv[1], "w"); ! 866: } ! 867: ! 868: /* ! 869: * Unify Accesslists for a single file. ! 870: */ ! 871: unify(argc, argv) ! 872: char *argv[]; ! 873: { ! 874: ! 875: if (argc < 2) { ! 876: strcat(line, " "); ! 877: printf("(remote-directory) "); ! 878: gets(&line[strlen(line)]); ! 879: makeargv(); ! 880: argc = margc; ! 881: argv = margv; ! 882: } ! 883: if (argc < 2) { ! 884: printf("%s remote-directory\n", argv[0]); ! 885: return; ! 886: } ! 887: (void) dounify( argv[1]); ! 888: } ! 889: ! 890: /* ! 891: * Do a shell escape ! 892: */ ! 893: shell(argc, argv) ! 894: char *argv[]; ! 895: { ! 896: int pid, status, (*old1)(), (*old2)(); ! 897: char shellnam[40], *shell, *namep; ! 898: char **cpp, **gargs; ! 899: ! 900: old1 = signal (SIGINT, SIG_IGN); ! 901: old2 = signal (SIGQUIT, SIG_IGN); ! 902: if ((pid = fork()) == 0) { ! 903: for (pid = 3; pid < 20; pid++) ! 904: close(pid); ! 905: signal(SIGINT, SIG_DFL); ! 906: signal(SIGQUIT, SIG_DFL); ! 907: if (argc <= 1) { ! 908: shell = getenv("SHELL"); ! 909: if (shell == NULL) ! 910: shell = "/bin/sh"; ! 911: namep = rindex(shell,'/'); ! 912: if (namep == NULL) ! 913: namep = shell; ! 914: strcpy(shellnam,"-"); ! 915: strcat(shellnam, ++namep); ! 916: if (strcmp(namep, "sh") != 0) ! 917: shellnam[0] = '+'; ! 918: if (debug) { ! 919: printf ("%s\n", shell); ! 920: fflush (stdout); ! 921: } ! 922: execl(shell, shellnam, 0); ! 923: perror(shell); ! 924: exit(1); ! 925: } ! 926: cpp = &argv[1]; ! 927: if (argc > 2) { ! 928: if ((gargs = glob(cpp)) != NULL) ! 929: cpp = gargs; ! 930: if (globerr != NULL) { ! 931: printf("%s\n", globerr); ! 932: exit(1); ! 933: } ! 934: } ! 935: if (debug) { ! 936: register char **zip = cpp; ! 937: ! 938: printf("%s", *zip); ! 939: while (*++zip != NULL) ! 940: printf(" %s", *zip); ! 941: printf("\n"); ! 942: fflush(stdout); ! 943: } ! 944: execvp(argv[1], cpp); ! 945: perror(argv[1]); ! 946: exit(1); ! 947: } ! 948: if (pid > 0) ! 949: while (wait(&status) != pid) ! 950: ; ! 951: signal(SIGINT, old1); ! 952: signal(SIGQUIT, old2); ! 953: if (pid == -1) ! 954: perror("Try again later"); ! 955: return (0); ! 956: } ! 957: ! 958: /* ! 959: * Send new user information (re-login) ! 960: */ ! 961: user(argc, argv) ! 962: int argc; ! 963: char **argv; ! 964: { ! 965: ! 966: if (argc < 2) { ! 967: login(0,0); ! 968: } ! 969: if (argc > 3) { ! 970: printf("usage: %s username [password]\n", argv[0]); ! 971: return (0); ! 972: } ! 973: login(argv[1], argv[2]); ! 974: return (1); ! 975: } ! 976: ! 977: /* ! 978: * Print working directory. ! 979: */ ! 980: /*VARARGS*/ ! 981: pwd() ! 982: { ! 983: dopwd(); ! 984: } ! 985: ! 986: /* ! 987: * Make a directory. ! 988: */ ! 989: makedir(argc, argv) ! 990: char *argv[]; ! 991: { ! 992: ! 993: if (argc < 2) { ! 994: strcat(line, " "); ! 995: printf("(directory-name) "); ! 996: gets(&line[strlen(line)]); ! 997: makeargv(); ! 998: argc = margc; ! 999: argv = margv; ! 1000: } ! 1001: if (argc < 2) { ! 1002: printf("%s directory-name\n", argv[0]); ! 1003: return; ! 1004: } ! 1005: domakedir(argv[1]); ! 1006: } ! 1007: ! 1008: /* ! 1009: * Remove a directory. ! 1010: */ ! 1011: removedir(argc, argv) ! 1012: char *argv[]; ! 1013: { ! 1014: ! 1015: if (argc < 2) { ! 1016: strcat(line, " "); ! 1017: printf("(directory-name) "); ! 1018: gets(&line[strlen(line)]); ! 1019: makeargv(); ! 1020: argc = margc; ! 1021: argv = margv; ! 1022: } ! 1023: if (argc < 2) { ! 1024: printf("%s directory-name\n", argv[0]); ! 1025: return; ! 1026: } ! 1027: doremovedir(argv[1]); ! 1028: } ! 1029: ! 1030: /* ! 1031: * Terminate session and exit. ! 1032: */ ! 1033: /*VARARGS*/ ! 1034: quit() ! 1035: { ! 1036: ! 1037: disconnect(); ! 1038: exit(0); ! 1039: } ! 1040: ! 1041: /* ! 1042: * Terminate session, but don't exit. ! 1043: */ ! 1044: disconnect() ! 1045: { ! 1046: extern FILE *cout; ! 1047: extern int data; ! 1048: ! 1049: if (!connected) ! 1050: return; ! 1051: logout(); ! 1052: CourierClose(connected); ! 1053: connected = (CourierConnection *)0; ! 1054: } ! 1055: ! 1056: confirm(cmd, file) ! 1057: char *cmd, *file; ! 1058: { ! 1059: char line[BUFSIZ]; ! 1060: ! 1061: if (!interactive) { ! 1062: if (verbose) ! 1063: printf("%s %s\n", cmd, file); ! 1064: return (1); ! 1065: } ! 1066: printf("%s %s? ", cmd, file); ! 1067: fflush(stdout); ! 1068: gets(line); ! 1069: return (*line != 'n' && *line != 'N'); ! 1070: } ! 1071: ! 1072: fatal(msg) ! 1073: char *msg; ! 1074: { ! 1075: ! 1076: fprintf(stderr, "ftp: %s\n"); ! 1077: exit(1); ! 1078: } ! 1079: ! 1080: /* ! 1081: * Glob a local file name specification with ! 1082: * the expectation of a single return value. ! 1083: * Can't control multiple values being expanded ! 1084: * from the expression, we return only the first. ! 1085: */ ! 1086: globulize(cpp) ! 1087: char **cpp; ! 1088: { ! 1089: char **globbed; ! 1090: ! 1091: if (!doglob) ! 1092: return (1); ! 1093: globbed = glob(*cpp); ! 1094: if (globerr != NULL) { ! 1095: printf("%s: %s\n", *cpp, globerr); ! 1096: if (globbed) ! 1097: blkfree(globbed); ! 1098: return (0); ! 1099: } ! 1100: if (globbed) { ! 1101: *cpp = *globbed++; ! 1102: /* don't waste too much memory */ ! 1103: if (*globbed) ! 1104: blkfree(globbed); ! 1105: } ! 1106: return (1); ! 1107: } ! 1108: ! 1109: whatis(argc, argv) ! 1110: int argc; ! 1111: char *argv[]; ! 1112: { ! 1113: FILE *fin, *fopen(); ! 1114: int type; ! 1115: char *typetostring(); ! 1116: ! 1117: if (argc < 2) { ! 1118: strcat(line, " "); ! 1119: printf("(local-file) "); ! 1120: gets(&line[strlen(line)]); ! 1121: makeargv(); ! 1122: argc = margc; ! 1123: argv = margv; ! 1124: } ! 1125: if (argc < 2) { ! 1126: usage: ! 1127: printf("%s local-file\n", argv[0]); ! 1128: return; ! 1129: } ! 1130: ! 1131: if ( access(argv[1], R_OK | F_OK ) == -1 ) { ! 1132: perror("file error: "); ! 1133: return; ! 1134: } ! 1135: ! 1136: type= get_type(argv[1]); ! 1137: ! 1138: printf("file %s is assumed to be %s\n", argv[1], typetostring(type)); ! 1139: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.