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