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