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
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 -p -r1.81 ftp.1
--- ftp.1 26 Jul 2010 21:31:34 -0000 1.81
+++ ftp.1 12 Jan 2012 20:36:36 -0000
@@ -652,7 +652,8 @@ on the remote machine.
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
@@ -674,6 +675,14 @@ flag is specified then
.Ic reput
is used instead of
.Ic put .
+.Pp
+If the
+.Fl r
+flag is specified then all diretories recursivley copied.
+.Pp
+The
+.Ic depth
+option sets the recursiv depth.
.It Xo Ic msend
.Op Fl c
.Ar local-files