On Thu, Jan 12, 2012 at 09:40:19PM +0100, Jan Klemkow wrote:
> Hello,
> 
> this is my diff for recursive upload for ftp(1).
> It modifies the mput command for doing this.
> Please test it and tell me everything that is
> wrong with it.
> 
> bye,
> Jan
> 

I test this patch on OpenBSD 5.0 sparc64.
Man diff is improved by jmc.

Index: cmds.c
===================================================================
RCS file: /cvs/src/usr.bin/ftp/cmds.c,v
retrieving revision 1.70
diff -u -p -r1.70 cmds.c
--- cmds.c      5 May 2009 19:35:30 -0000       1.70
+++ cmds.c      12 Jan 2012 20:36:32 -0000
@@ -229,17 +229,30 @@ void
 mput(int argc, char *argv[])
 {
        extern int optind, optreset;
-       int ch, i, restartit = 0;
+       int ch, i, restartit = 0, recursiv = 0;
        sig_t oldintr;
        char *cmd, *tp;
-
+       const char *errstr;
+       static int depth = 0, max_depth = 0;
        optind = optreset = 1;
 
-       while ((ch = getopt(argc, argv, "c")) != -1) {
+       while ((ch = getopt(argc, argv, "cd:r")) != -1) {
                switch(ch) {
                case 'c':
                        restartit = 1;
                        break;
+               case 'd':
+                       max_depth = strtonum(optarg, 0, INT_MAX, &errstr);
+                       if (errstr != NULL) {
+                               fprintf(ttyout, "bad depth value, %s: %s",
+                                   errstr, optarg);
+                               code = -1;
+                               return;
+                       }
+                       break;
+               case 'r':
+                       depth = 1;
+                       break;
                default:
                        goto usage;
                }
@@ -247,7 +260,8 @@ mput(int argc, char *argv[])
 
        if (argc - optind < 1 && !another(&argc, &argv, "local-files")) {
 usage:
-               fprintf(ttyout, "usage: %s [-c] local-files\n", argv[0]);
+               fprintf(ttyout, "usage: %s [-cr] [-d depth] local-files\n",
+                   argv[0]);
                code = -1;
                return;
        }
@@ -318,11 +332,16 @@ usage:
                mflag = 0;
                return;
        }
+
+       if (depth)
+               depth++;
+
        for (i = 1; i < argc; i++) {
                char **cpp;
                glob_t gl;
                int flags;
 
+               /* Copy files without word expantion */
                if (!doglob) {
                        if (mflag && confirm(argv[0], argv[i])) {
                                tp = (ntflag) ? dotrans(argv[i]) : argv[i];
@@ -348,6 +367,7 @@ usage:
                        continue;
                }
 
+               /* expanding file names */
                memset(&gl, 0, sizeof(gl));
                flags = GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE;
                if (glob(argv[i], flags, NULL, &gl) || gl.gl_pathc == 0) {
@@ -355,8 +375,58 @@ usage:
                        globfree(&gl);
                        continue;
                }
+
+               /* traverse all expanded file names */
                for (cpp = gl.gl_pathv; cpp && *cpp != NULL; cpp++) {
+                       struct stat filestat;
+
                        if (mflag && confirm(argv[0], *cpp)) {
+
+                               /* 
+                                * If file is a directory then create a new one
+                                * at the remote machine.
+                                */
+                               stat(*cpp, &filestat);
+
+                               if (S_ISDIR(filestat.st_mode)) {
+                                       char* xargv[] = {argv[0], *cpp};
+
+                                       if (depth == max_depth) {
+                                               continue;
+                                       }
+
+                                       makedir(2, xargv);
+
+                                       /*
+                                        * Copy the hole directory recursivly.
+                                        */
+                                       if (chdir(*cpp) != 0) {
+                                               warn("local: %s", *cpp);
+                                               continue;
+                                       }
+
+                                       xargv[1] = *cpp;
+                                       cd(2, xargv);
+                                       if (dirchange != 1) {
+                                               mflag = 0;
+                                               goto out;
+                                       }
+
+                                       xargv[1] = "*";
+                                       mput(2, xargv);
+
+                                       xargv[1] = "..";
+                                       cd(2, xargv);
+                                       if (dirchange != 1) {
+                                               mflag = 0;
+                                       }
+ out:
+                                       if (chdir("..") != 0) {
+                                               warn("local: %s", *cpp);
+                                       }
+                                       continue;
+                               }
+
                                tp = (ntflag) ? dotrans(*cpp) : *cpp;
                                tp = (mapflag) ? domap(tp) : tp;
                                if (restartit == 1) {
@@ -380,8 +450,14 @@ usage:
                }
                globfree(&gl);
        }
+
        (void)signal(SIGINT, oldintr);
-       mflag = 0;
+
+       if (depth)
+               depth--;
+
+       if (depth == 0 || mflag == 0)
+               depth = max_depth = mflag = 0;
 }
 
 void
Index: ftp.1
===================================================================
RCS file: /cvs/src/usr.bin/ftp/ftp.1,v
retrieving revision 1.81
diff -u -r1.81 ftp.1
--- ftp.1       26 Jul 2010 21:31:34 -0000      1.81
+++ ftp.1       12 Jan 2012 21:27:13 -0000
@@ -652,7 +652,8 @@
 A synonym for
 .Ic page .
 .It Xo Ic mput
-.Op Fl c
+.Op Fl cr
+.Op Fl d Ar depth
 .Ar local-files
 .Xc
 Expand wild cards in the list of local files given as arguments
@@ -668,12 +669,21 @@
 .Ic nmap
 settings.
 .Pp
-If the
-.Fl c
-flag is specified then
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl c
+Use
 .Ic reput
-is used instead of
+instead of
 .Ic put .
+.It Fl d Ar depth
+Specify the maximum recursion level
+.Ar depth .
+The default is 0, which means unlimited.
+.It Fl r
+Recursively descend the directory tree, transferring all files and
+directories.
+.El
 .It Xo Ic msend
 .Op Fl c
 .Ar local-files

Reply via email to