From 9072bd8a494c454d0d9621b8c9e0948f27ea8a08 Mon Sep 17 00:00:00 2001 From: Sam Leffler Date: Tue, 29 Mar 1983 18:25:05 -0800 Subject: [PATCH] from jsq@utexas-11 (mls, mdir and random cleanups after me) SCCS-vsn: usr.bin/ftp/cmds.c 4.5 SCCS-vsn: usr.bin/ftp/cmdtab.c 4.5 SCCS-vsn: libexec/ftpd/ftpd.c 4.19 --- usr/src/libexec/ftpd/ftpd.c | 25 ++++-- usr/src/usr.bin/ftp/cmds.c | 154 +++++++++++++++++++++++++---------- usr/src/usr.bin/ftp/cmdtab.c | 10 ++- 3 files changed, 137 insertions(+), 52 deletions(-) diff --git a/usr/src/libexec/ftpd/ftpd.c b/usr/src/libexec/ftpd/ftpd.c index e0eaa8c963..b760a9ed71 100644 --- a/usr/src/libexec/ftpd/ftpd.c +++ b/usr/src/libexec/ftpd/ftpd.c @@ -1,5 +1,5 @@ #ifndef lint -static char sccsid[] = "@(#)ftpd.c 4.18 (Berkeley) %G%"; +static char sccsid[] = "@(#)ftpd.c 4.19 (Berkeley) %G%"; #endif /* @@ -50,7 +50,7 @@ int logged_in; struct passwd *pw; int debug; int timeout; -int logging = 1; +int logging; int guest; int type; int form; @@ -106,6 +106,10 @@ main(argc, argv) options |= SO_DEBUG; break; + case 'l': + logging = 1; + break; + case 't': timeout = atoi(++cp); goto nextopt; @@ -124,7 +128,6 @@ nextopt: for (s = 0; s < 10; s++) if (!logging || (s != 2)) (void) close(s); - (void) close(s); (void) open("/", 0); (void) dup2(0, 1); if (!logging) @@ -713,7 +716,7 @@ dolog(sin) else remotehost = "UNKNOWNHOST"; t = time(0); - fprintf(stderr,"FTP: connection from %s at %s", remotehost, ctime(&t)); + fprintf(stderr,"FTPD: connection from %s at %s", remotehost, ctime(&t)); fflush(stderr); } @@ -754,7 +757,9 @@ popen(cmd, mode) { int p[2], ac; register myside, hisside, pid; - char *av[10]; + char *av[512]; + char **pop, **popargs = NULL; + extern char **glob(); register char *cp; if (pipe(p) < 0) @@ -765,6 +770,14 @@ popen(cmd, mode) cp = nextarg(cp); } while (cp && *cp); av[ac] = (char *)0; + if (ac > 1) { + popargs = glob(&av[1]); + if (popargs == NULL) + return (NULL); + for (ac = 1, pop = popargs; *pop;) + av[ac++] = *pop++; + } + av[ac] = (char *)0; myside = tst(p[WTR], p[RDR]); hisside = tst(p[RDR], p[WTR]); if ((pid = fork()) == 0) { @@ -775,6 +788,8 @@ popen(cmd, mode) execv(av[0], av); _exit(1); } + if (popargs != NULL) + blkfree(popargs); if (pid == -1) return (NULL); popen_pid[myside] = pid; diff --git a/usr/src/usr.bin/ftp/cmds.c b/usr/src/usr.bin/ftp/cmds.c index 770be33c4e..3147d56565 100644 --- a/usr/src/usr.bin/ftp/cmds.c +++ b/usr/src/usr.bin/ftp/cmds.c @@ -1,5 +1,5 @@ #ifndef lint -static char sccsid[] = "@(#)cmds.c 4.4 (Berkeley) %G%"; +static char sccsid[] = "@(#)cmds.c 4.5 (Berkeley) %G%"; #endif /* @@ -19,7 +19,12 @@ static char sccsid[] = "@(#)cmds.c 4.4 (Berkeley) %G%"; extern char *globerr; extern char **glob(); +extern char *home; extern short gflag; +extern char *remglob(); +extern char *getenv(); +extern char *index(); +extern char *rindex(); /* * Connect to peer server and @@ -194,28 +199,11 @@ setstruct(argc, argv) printf("We only support %s structure, sorry.\n", structname); } -/* - * Send a single file. - */ -append(argc, argv) - char *argv[]; -{ - - return (put1("APPE", argc, argv)); -} - put(argc, argv) - char *argv[]; -{ - - return (put1("STOR", argc, argv)); -} - -put1(cmd, argc, argv) - char *cmd; int argc; char *argv[]; { + char *cmd; if (argc == 2) argc++, argv[2] = argv[1]; @@ -244,17 +232,17 @@ usage: goto usage; if (!globulize(&argv[1])) return; + cmd = (argv[0][0] == 'a') ? "APPE" : "STOR"; sendrequest(cmd, argv[1], argv[2]); } /* - * Send one or more files. + * Send multiple files. */ mput(argc, argv) char *argv[]; { char **cpp, **gargs = NULL; - int i; if (argc < 2) { strcat(line, " "); @@ -330,11 +318,11 @@ usage: mget(argc, argv) char *argv[]; { - register char *cp; + char *cp; if (argc < 2) { strcat(line, " "); - printf("(remote-directory) "); + printf("(remote-files) "); gets(&line[strlen(line)]); makeargv(); argc = margc; @@ -353,14 +341,15 @@ char * remglob(argc, argv) char *argv[]; { - char temp[16], *cp; + char temp[16]; static char buf[MAXPATHLEN]; static FILE *ftemp = NULL; static char **args; int oldverbose; + char *cp, *mode; if (!doglob) { - if (argc == NULL) + if (args == NULL) args = argv; if ((cp = *++args) == NULL) args = NULL; @@ -370,13 +359,14 @@ remglob(argc, argv) strcpy(temp, "/tmp/ftpXXXXXX"); mktemp(temp); oldverbose = verbose, verbose = 0; - recvrequest("NLST", temp, argv[1], "w"); + for (mode = "w"; *++argv != NULL; mode = "a") + recvrequest ("NLST", temp, *argv, mode); verbose = oldverbose; ftemp = fopen(temp, "r"); unlink(temp); if (ftemp == NULL) { printf("can't find list of remote files, oops\n"); - return; + return (NULL); } } if (fgets(buf, sizeof (buf), ftemp) == NULL) { @@ -502,6 +492,7 @@ setglob() * Set debugging mode on/off and/or * set level of debugging. */ +/*VARARGS*/ setdebug(argc, argv) char *argv[]; { @@ -531,10 +522,6 @@ cd(argc, argv) char *argv[]; { - if (!connected) { - printf("Not connected.\n"); - return; - } if (argc < 2) { strcat(line, " "); printf("(remote-directory) "); @@ -558,7 +545,6 @@ lcd(argc, argv) char *argv[]; { char buf[MAXPATHLEN]; - extern char *home; if (argc < 2) argc++, argv[1] = home; @@ -621,6 +607,7 @@ mdelete(argc, argv) if (confirm(argv[0], cp)) (void) command("DELE %s", cp); } + /* * Rename a remote file. */ @@ -662,19 +649,43 @@ usage: ls(argc, argv) char *argv[]; { - char *cmd, *mode; - int i; + char *cmd; if (argc < 2) argc++, argv[1] = NULL; if (argc < 3) argc++, argv[2] = "-"; + if (argc > 3) { + printf("usage: %s remote-directory local-file\n", argv[0]); + return; + } cmd = argv[0][0] == 'l' ? "NLST" : "LIST"; if (strcmp(argv[2], "-") && !globulize(&argv[2])) return; - mode = argc > 3 ? "a" : "w"; - for (i = 1; i < argc - 1; i++) - recvrequest(cmd, argv[argc - 1], argv[i], mode); + recvrequest(cmd, argv[2], argv[1], "w"); +} + +/* + * Get a directory listing + * of multiple remote files. + */ +mls(argc, argv) + char *argv[]; +{ + char *cmd, *mode; + int i, dest; + + if (argc < 2) + argc++, argv[1] = NULL; + if (argc < 3) + argc++, argv[2] = "-"; + dest = argc - 1; + cmd = argv[0][1] == 'l' ? "NLST" : "LIST"; + if (strcmp(argv[dest], "-") != 0) + if (globulize(&argv[dest]) && confirm("local-file", argv[dest])) + return; + for (i = 1, mode = "w"; i < dest; i++, mode = "a") + recvrequest(cmd, argv[dest], argv[i], mode); } /* @@ -683,8 +694,66 @@ ls(argc, argv) shell(argc, argv) char *argv[]; { - - printf("Sorry, this function is unimplemented.\n"); + int pid, status, (*old1)(), (*old2)(); + char shellnam[40], *shell, *namep; + char **cpp, **gargs; + + old1 = signal (SIGINT, SIG_IGN); + old2 = signal (SIGQUIT, SIG_IGN); + if ((pid = fork()) == 0) { + for (pid = 3; pid < 20; pid++) + close(pid); + signal(SIGINT, SIG_DFL); + signal(SIGQUIT, SIG_DFL); + if (argc <= 1) { + shell = getenv("SHELL"); + if (shell == NULL) + shell = "/bin/sh"; + namep = rindex(shell,'/'); + if (namep == NULL) + namep = shell; + strcpy(shellnam,"-"); + strcat(shellnam, ++namep); + if (strcmp(namep, "sh") != 0) + shellnam[0] = '+'; + if (debug) { + printf ("%s\n", shell); + fflush (stdout); + } + execl(shell, shellnam, 0); + perror(shell); + exit(1); + } + cpp = &argv[1]; + if (argc > 2) { + if ((gargs = glob(cpp)) != NULL) + cpp = gargs; + if (globerr != NULL) { + printf("%s\n", globerr); + exit(1); + } + } + if (debug) { + register char **zip = cpp; + + printf("%s", *zip); + while (*++zip != NULL) + printf(" %s", *zip); + printf("\n"); + fflush(stdout); + } + execvp(argv[1], cpp); + perror(argv[1]); + exit(1); + } + if (pid > 0) + while (wait(&status) != pid) + ; + signal(SIGINT, old1); + signal(SIGQUIT, old2); + if (pid == -1) + perror("Try again later"); + return (0); } /* @@ -707,7 +776,7 @@ user(argc, argv) } if (argc > 4) { printf("usage: %s username [password] [account]\n", argv[0]); - return; + return (0); } n = command("USER %s", argv[1]); if (n == CONTINUE) { @@ -737,10 +806,7 @@ user(argc, argv) /*VARARGS*/ pwd() { - if (!connected) { - printf("Not connected.\n"); - return; - } + (void) command("XPWD"); } diff --git a/usr/src/usr.bin/ftp/cmdtab.c b/usr/src/usr.bin/ftp/cmdtab.c index df7119a1fb..0e8492fad0 100644 --- a/usr/src/usr.bin/ftp/cmdtab.c +++ b/usr/src/usr.bin/ftp/cmdtab.c @@ -1,5 +1,5 @@ #ifndef lint -static char sccsid[] = "@(#)cmdtab.c 4.4 (Berkeley) %G%"; +static char sccsid[] = "@(#)cmdtab.c 4.5 (Berkeley) %G%"; #endif #include "ftp_var.h" @@ -13,7 +13,7 @@ int setprompt(), setstruct(); int settenex(), settrace(), settype(), setverbose(); int disconnect(); int cd(), lcd(), delete(), mdelete(), user(); -int ls(), get(), mget(), help(), append(), put(), mput(); +int ls(), mls(), get(), mget(), help(), append(), put(), mput(); int quit(), renamefile(), status(); int quote(), rmthelp(), shell(); int pwd(), makedir(), removedir(); @@ -35,8 +35,10 @@ char helphelp[] = "print local help information"; char lcdhelp[] = "change local working directory"; char lshelp[] = "nlist contents of remote directory"; char mdeletehelp[] = "delete multiple files"; +char mdirhelp[] = "list contents of multiple remote directories"; char mgethelp[] = "get multiple files"; char mkdirhelp[] = "make directory on the remote machine"; +char mlshelp[] = "nlist contents of multiple remote directories"; char modehelp[] = "set file transfer mode"; char mputhelp[] = "send multiple files"; char porthelp[] = "toggle use of PORT cmd for each data connection"; @@ -60,7 +62,7 @@ char verbosehelp[] = "toggle verbose mode"; struct cmd cmdtab[] = { { "!", shellhelp, 0, 0, shell }, - { "append", appendhelp, 1, 1, append }, + { "append", appendhelp, 1, 1, put }, { "ascii", asciihelp, 0, 1, setascii }, { "bell", beephelp, 0, 0, setbell }, { "binary", binaryhelp, 0, 1, setbinary }, @@ -78,8 +80,10 @@ struct cmd cmdtab[] = { { "lcd", lcdhelp, 0, 0, lcd }, { "ls", lshelp, 1, 1, ls }, { "mdelete", mdeletehelp, 1, 1, mdelete }, + { "mdir", mdirhelp, 1, 1, mls }, { "mget", mgethelp, 1, 1, mget }, { "mkdir", mkdirhelp, 0, 1, makedir }, + { "mls", mlshelp, 1, 1, mls }, { "mode", modehelp, 0, 1, setmode }, { "mput", mputhelp, 1, 1, mput }, { "open", connecthelp, 0, 0, setpeer }, -- 2.20.1