version 1.155, 2013/08/31 00:13:54 |
version 1.156, 2013/10/17 00:30:13 |
|
|
/* When this option is set, the file transfers will always preserve times */ |
/* When this option is set, the file transfers will always preserve times */ |
int global_pflag = 0; |
int global_pflag = 0; |
|
|
|
/* When this option is set, transfers will have fsync() called on each file */ |
|
int global_fflag = 0; |
|
|
/* SIGINT received during command processing */ |
/* SIGINT received during command processing */ |
volatile sig_atomic_t interrupted = 0; |
volatile sig_atomic_t interrupted = 0; |
|
|
|
|
|
|
static int |
static int |
parse_getput_flags(const char *cmd, char **argv, int argc, |
parse_getput_flags(const char *cmd, char **argv, int argc, |
int *aflag, int *pflag, int *rflag) |
int *aflag, int *fflag, int *pflag, int *rflag) |
{ |
{ |
extern int opterr, optind, optopt, optreset; |
extern int opterr, optind, optopt, optreset; |
int ch; |
int ch; |
|
|
optind = optreset = 1; |
optind = optreset = 1; |
opterr = 0; |
opterr = 0; |
|
|
*aflag = *rflag = *pflag = 0; |
*aflag = *fflag = *rflag = *pflag = 0; |
while ((ch = getopt(argc, argv, "aPpRr")) != -1) { |
while ((ch = getopt(argc, argv, "afPpRr")) != -1) { |
switch (ch) { |
switch (ch) { |
case 'a': |
case 'a': |
*aflag = 1; |
*aflag = 1; |
break; |
break; |
|
case 'f': |
|
*fflag = 1; |
|
break; |
case 'p': |
case 'p': |
case 'P': |
case 'P': |
*pflag = 1; |
*pflag = 1; |
|
|
|
|
static int |
static int |
process_get(struct sftp_conn *conn, char *src, char *dst, char *pwd, |
process_get(struct sftp_conn *conn, char *src, char *dst, char *pwd, |
int pflag, int rflag, int resume) |
int pflag, int rflag, int resume, int fflag) |
{ |
{ |
char *abs_src = NULL; |
char *abs_src = NULL; |
char *abs_dst = NULL; |
char *abs_dst = NULL; |
|
|
printf("Fetching %s to %s\n", g.gl_pathv[i], abs_dst); |
printf("Fetching %s to %s\n", g.gl_pathv[i], abs_dst); |
if (pathname_is_dir(g.gl_pathv[i]) && (rflag || global_rflag)) { |
if (pathname_is_dir(g.gl_pathv[i]) && (rflag || global_rflag)) { |
if (download_dir(conn, g.gl_pathv[i], abs_dst, NULL, |
if (download_dir(conn, g.gl_pathv[i], abs_dst, NULL, |
pflag || global_pflag, 1, resume) == -1) |
pflag || global_pflag, 1, resume, |
|
fflag || global_fflag) == -1) |
err = -1; |
err = -1; |
} else { |
} else { |
if (do_download(conn, g.gl_pathv[i], abs_dst, NULL, |
if (do_download(conn, g.gl_pathv[i], abs_dst, NULL, |
pflag || global_pflag, resume) == -1) |
pflag || global_pflag, resume, |
|
fflag || global_fflag) == -1) |
err = -1; |
err = -1; |
} |
} |
free(abs_dst); |
free(abs_dst); |
|
|
|
|
static int |
static int |
process_put(struct sftp_conn *conn, char *src, char *dst, char *pwd, |
process_put(struct sftp_conn *conn, char *src, char *dst, char *pwd, |
int pflag, int rflag) |
int pflag, int rflag, int fflag) |
{ |
{ |
char *tmp_dst = NULL; |
char *tmp_dst = NULL; |
char *abs_dst = NULL; |
char *abs_dst = NULL; |
|
|
printf("Uploading %s to %s\n", g.gl_pathv[i], abs_dst); |
printf("Uploading %s to %s\n", g.gl_pathv[i], abs_dst); |
if (pathname_is_dir(g.gl_pathv[i]) && (rflag || global_rflag)) { |
if (pathname_is_dir(g.gl_pathv[i]) && (rflag || global_rflag)) { |
if (upload_dir(conn, g.gl_pathv[i], abs_dst, |
if (upload_dir(conn, g.gl_pathv[i], abs_dst, |
pflag || global_pflag, 1) == -1) |
pflag || global_pflag, 1, |
|
fflag || global_fflag) == -1) |
err = -1; |
err = -1; |
} else { |
} else { |
if (do_upload(conn, g.gl_pathv[i], abs_dst, |
if (do_upload(conn, g.gl_pathv[i], abs_dst, |
pflag || global_pflag) == -1) |
pflag || global_pflag, |
|
fflag || global_fflag) == -1) |
err = -1; |
err = -1; |
} |
} |
} |
} |
|
|
} |
} |
|
|
static int |
static int |
parse_args(const char **cpp, int *aflag, int *hflag, int *iflag, int *lflag, |
parse_args(const char **cpp, int *ignore_errors, int *aflag, int *fflag, |
int *pflag, int *rflag, int *sflag, unsigned long *n_arg, |
int *hflag, int *iflag, int *lflag, int *pflag, int *rflag, int *sflag, |
char **path1, char **path2) |
unsigned long *n_arg, char **path1, char **path2) |
{ |
{ |
const char *cmd, *cp = *cpp; |
const char *cmd, *cp = *cpp; |
char *cp2, **argv; |
char *cp2, **argv; |
|
|
cp = cp + strspn(cp, WHITESPACE); |
cp = cp + strspn(cp, WHITESPACE); |
|
|
/* Check for leading '-' (disable error processing) */ |
/* Check for leading '-' (disable error processing) */ |
*iflag = 0; |
*ignore_errors = 0; |
if (*cp == '-') { |
if (*cp == '-') { |
*iflag = 1; |
*ignore_errors = 1; |
cp++; |
cp++; |
cp = cp + strspn(cp, WHITESPACE); |
cp = cp + strspn(cp, WHITESPACE); |
} |
} |
|
|
} |
} |
|
|
/* Get arguments and parse flags */ |
/* Get arguments and parse flags */ |
*aflag = *lflag = *pflag = *rflag = *hflag = *n_arg = 0; |
*aflag = *fflag = *hflag = *iflag = *lflag = *pflag = 0; |
|
*rflag = *sflag = 0; |
*path1 = *path2 = NULL; |
*path1 = *path2 = NULL; |
optidx = 1; |
optidx = 1; |
switch (cmdnum) { |
switch (cmdnum) { |
|
|
case I_REGET: |
case I_REGET: |
case I_PUT: |
case I_PUT: |
if ((optidx = parse_getput_flags(cmd, argv, argc, |
if ((optidx = parse_getput_flags(cmd, argv, argc, |
aflag, pflag, rflag)) == -1) |
aflag, fflag, pflag, rflag)) == -1) |
return -1; |
return -1; |
/* Get first pathname (mandatory) */ |
/* Get first pathname (mandatory) */ |
if (argc - optidx < 1) { |
if (argc - optidx < 1) { |
|
|
int err_abort) |
int err_abort) |
{ |
{ |
char *path1, *path2, *tmp; |
char *path1, *path2, *tmp; |
int aflag = 0, hflag = 0, iflag = 0, lflag = 0, pflag = 0; |
int ignore_errors = 0, aflag = 0, fflag = 0, hflag = 0, iflag = 0; |
int rflag = 0, sflag = 0; |
int lflag = 0, pflag = 0, rflag = 0, sflag = 0; |
int cmdnum, i; |
int cmdnum, i; |
unsigned long n_arg = 0; |
unsigned long n_arg = 0; |
Attrib a, *aa; |
Attrib a, *aa; |
|
|
glob_t g; |
glob_t g; |
|
|
path1 = path2 = NULL; |
path1 = path2 = NULL; |
cmdnum = parse_args(&cmd, &aflag, &hflag, &iflag, &lflag, &pflag, |
cmdnum = parse_args(&cmd, &ignore_errors, &aflag, &fflag, &hflag, |
&rflag, &sflag, &n_arg, &path1, &path2); |
&iflag, &lflag, &pflag, &rflag, &sflag, &n_arg, &path1, &path2); |
if (iflag != 0) |
if (ignore_errors != 0) |
err_abort = 0; |
err_abort = 0; |
|
|
memset(&g, 0, sizeof(g)); |
memset(&g, 0, sizeof(g)); |
|
|
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case I_GET: |
case I_GET: |
err = process_get(conn, path1, path2, *pwd, pflag, |
err = process_get(conn, path1, path2, *pwd, pflag, |
rflag, aflag); |
rflag, aflag, fflag); |
break; |
break; |
case I_PUT: |
case I_PUT: |
err = process_put(conn, path1, path2, *pwd, pflag, rflag); |
err = process_put(conn, path1, path2, *pwd, pflag, |
|
rflag, fflag); |
break; |
break; |
case I_RENAME: |
case I_RENAME: |
path1 = make_absolute(path1, *pwd); |
path1 = make_absolute(path1, *pwd); |
|
|
infile = stdin; |
infile = stdin; |
|
|
while ((ch = getopt(argc, argv, |
while ((ch = getopt(argc, argv, |
"1246ahpqrvCc:D:i:l:o:s:S:b:B:F:P:R:")) != -1) { |
"1246afhpqrvCc:D:i:l:o:s:S:b:B:F:P:R:")) != -1) { |
switch (ch) { |
switch (ch) { |
/* Passed through to ssh(1) */ |
/* Passed through to ssh(1) */ |
case '4': |
case '4': |
|
|
showprogress = 0; |
showprogress = 0; |
quiet = batchmode = 1; |
quiet = batchmode = 1; |
addargs(&args, "-obatchmode yes"); |
addargs(&args, "-obatchmode yes"); |
|
break; |
|
case 'f': |
|
global_fflag = 1; |
break; |
break; |
case 'p': |
case 'p': |
global_pflag = 1; |
global_pflag = 1; |