|
Lines 88-93
int showprogress = 1;
Link Here
|
| 88 |
/* When this option is set, we always recursively download/upload directories */ |
88 |
/* When this option is set, we always recursively download/upload directories */ |
| 89 |
int global_rflag = 0; |
89 |
int global_rflag = 0; |
| 90 |
|
90 |
|
|
|
91 |
/* When this option is set, we resume download if possible */ |
| 92 |
int cresume = 0; |
| 93 |
|
| 91 |
/* When this option is set, the file transfers will always preserve times */ |
94 |
/* When this option is set, the file transfers will always preserve times */ |
| 92 |
int global_pflag = 0; |
95 |
int global_pflag = 0; |
| 93 |
|
96 |
|
|
Lines 151-156
extern char *__progname;
Link Here
|
| 151 |
#define I_SYMLINK 21 |
154 |
#define I_SYMLINK 21 |
| 152 |
#define I_VERSION 22 |
155 |
#define I_VERSION 22 |
| 153 |
#define I_PROGRESS 23 |
156 |
#define I_PROGRESS 23 |
|
|
157 |
#define I_REGET 26 |
| 154 |
|
158 |
|
| 155 |
struct CMD { |
159 |
struct CMD { |
| 156 |
const char *c; |
160 |
const char *c; |
|
Lines 190-195
static const struct CMD cmds[] = {
Link Here
|
| 190 |
{ "put", I_PUT, LOCAL }, |
194 |
{ "put", I_PUT, LOCAL }, |
| 191 |
{ "pwd", I_PWD, REMOTE }, |
195 |
{ "pwd", I_PWD, REMOTE }, |
| 192 |
{ "quit", I_QUIT, NOARGS }, |
196 |
{ "quit", I_QUIT, NOARGS }, |
|
|
197 |
{ "reget", I_REGET, REMOTE }, |
| 193 |
{ "rename", I_RENAME, REMOTE }, |
198 |
{ "rename", I_RENAME, REMOTE }, |
| 194 |
{ "rm", I_RM, REMOTE }, |
199 |
{ "rm", I_RM, REMOTE }, |
| 195 |
{ "rmdir", I_RMDIR, REMOTE }, |
200 |
{ "rmdir", I_RMDIR, REMOTE }, |
|
Lines 239-244
help(void)
Link Here
|
| 239 |
" filesystem containing 'path'\n" |
244 |
" filesystem containing 'path'\n" |
| 240 |
"exit Quit sftp\n" |
245 |
"exit Quit sftp\n" |
| 241 |
"get [-Ppr] remote [local] Download file\n" |
246 |
"get [-Ppr] remote [local] Download file\n" |
|
|
247 |
"reget remote [local] Resume download file\n" |
| 242 |
"help Display this help text\n" |
248 |
"help Display this help text\n" |
| 243 |
"lcd path Change local directory to 'path'\n" |
249 |
"lcd path Change local directory to 'path'\n" |
| 244 |
"lls [ls-options [path]] Display local directory listing\n" |
250 |
"lls [ls-options [path]] Display local directory listing\n" |
|
Lines 519-525
pathname_is_dir(char *pathname)
Link Here
|
| 519 |
|
525 |
|
| 520 |
static int |
526 |
static int |
| 521 |
process_get(struct sftp_conn *conn, char *src, char *dst, char *pwd, |
527 |
process_get(struct sftp_conn *conn, char *src, char *dst, char *pwd, |
| 522 |
int pflag, int rflag) |
528 |
int pflag, int rflag, int resume) |
| 523 |
{ |
529 |
{ |
| 524 |
char *abs_src = NULL; |
530 |
char *abs_src = NULL; |
| 525 |
char *abs_dst = NULL; |
531 |
char *abs_dst = NULL; |
|
Lines 571-577
process_get(struct sftp_conn *conn, char
Link Here
|
| 571 |
} |
577 |
} |
| 572 |
free(tmp); |
578 |
free(tmp); |
| 573 |
|
579 |
|
| 574 |
if (!quiet) |
580 |
if (cresume) |
|
|
581 |
resume = cresume; |
| 582 |
if (!quiet && resume) |
| 583 |
printf("Resuming %s to %s\n", g.gl_pathv[i], abs_dst); |
| 584 |
else if (!quiet && !resume) |
| 575 |
printf("Fetching %s to %s\n", g.gl_pathv[i], abs_dst); |
585 |
printf("Fetching %s to %s\n", g.gl_pathv[i], abs_dst); |
| 576 |
if (pathname_is_dir(g.gl_pathv[i]) && (rflag || global_rflag)) { |
586 |
if (pathname_is_dir(g.gl_pathv[i]) && (rflag || global_rflag)) { |
| 577 |
if (download_dir(conn, g.gl_pathv[i], abs_dst, NULL, |
587 |
if (download_dir(conn, g.gl_pathv[i], abs_dst, NULL, |
|
Lines 579-585
process_get(struct sftp_conn *conn, char
Link Here
|
| 579 |
err = -1; |
589 |
err = -1; |
| 580 |
} else { |
590 |
} else { |
| 581 |
if (do_download(conn, g.gl_pathv[i], abs_dst, NULL, |
591 |
if (do_download(conn, g.gl_pathv[i], abs_dst, NULL, |
| 582 |
pflag || global_pflag) == -1) |
592 |
pflag || global_pflag, resume) == -1) |
| 583 |
err = -1; |
593 |
err = -1; |
| 584 |
} |
594 |
} |
| 585 |
free(abs_dst); |
595 |
free(abs_dst); |
|
Lines 1168-1173
parse_args(const char **cpp, int *pflag,
Link Here
|
| 1168 |
optidx = 1; |
1178 |
optidx = 1; |
| 1169 |
switch (cmdnum) { |
1179 |
switch (cmdnum) { |
| 1170 |
case I_GET: |
1180 |
case I_GET: |
|
|
1181 |
case I_REGET: |
| 1171 |
case I_PUT: |
1182 |
case I_PUT: |
| 1172 |
if ((optidx = parse_getput_flags(cmd, argv, argc, |
1183 |
if ((optidx = parse_getput_flags(cmd, argv, argc, |
| 1173 |
pflag, rflag)) == -1) |
1184 |
pflag, rflag)) == -1) |
|
Lines 1294-1299
parse_dispatch_command(struct sftp_conn
Link Here
|
| 1294 |
{ |
1305 |
{ |
| 1295 |
char *path1, *path2, *tmp; |
1306 |
char *path1, *path2, *tmp; |
| 1296 |
int pflag = 0, rflag = 0, lflag = 0, iflag = 0, hflag = 0, sflag = 0; |
1307 |
int pflag = 0, rflag = 0, lflag = 0, iflag = 0, hflag = 0, sflag = 0; |
|
|
1308 |
int resume = 0; |
| 1297 |
int cmdnum, i; |
1309 |
int cmdnum, i; |
| 1298 |
unsigned long n_arg = 0; |
1310 |
unsigned long n_arg = 0; |
| 1299 |
Attrib a, *aa; |
1311 |
Attrib a, *aa; |
|
Lines 1320-1327
parse_dispatch_command(struct sftp_conn
Link Here
|
| 1320 |
err = -1; |
1332 |
err = -1; |
| 1321 |
break; |
1333 |
break; |
| 1322 |
case I_GET: |
1334 |
case I_GET: |
| 1323 |
err = process_get(conn, path1, path2, *pwd, pflag, rflag); |
1335 |
resume = 0; |
| 1324 |
break; |
1336 |
err = process_get(conn, path1, path2, *pwd, pflag, rflag, |
|
|
1337 |
resume); |
| 1338 |
break; |
| 1339 |
case I_REGET: |
| 1340 |
resume = 1; |
| 1341 |
err = process_get(conn, path1, path2, *pwd, pflag, rflag, |
| 1342 |
resume); |
| 1343 |
break; |
| 1325 |
case I_PUT: |
1344 |
case I_PUT: |
| 1326 |
err = process_put(conn, path1, path2, *pwd, pflag, rflag); |
1345 |
err = process_put(conn, path1, path2, *pwd, pflag, rflag); |
| 1327 |
break; |
1346 |
break; |
|
Lines 1950-1958
interactive_loop(struct sftp_conn *conn,
Link Here
|
| 1950 |
/* XXX this is wrong wrt quoting */ |
1969 |
/* XXX this is wrong wrt quoting */ |
| 1951 |
if (file2 == NULL) |
1970 |
if (file2 == NULL) |
| 1952 |
snprintf(cmd, sizeof cmd, "get %s", dir); |
1971 |
snprintf(cmd, sizeof cmd, "get %s", dir); |
| 1953 |
else |
1972 |
else { |
| 1954 |
snprintf(cmd, sizeof cmd, "get %s %s", dir, |
1973 |
if (cresume) |
| 1955 |
file2); |
1974 |
snprintf(cmd, sizeof cmd, |
|
|
1975 |
"reget %s %s", dir, file2); |
| 1976 |
else |
| 1977 |
snprintf(cmd, sizeof cmd, |
| 1978 |
"get %s %s", dir, file2); |
| 1979 |
} |
| 1980 |
|
| 1956 |
|
1981 |
|
| 1957 |
err = parse_dispatch_command(conn, cmd, |
1982 |
err = parse_dispatch_command(conn, cmd, |
| 1958 |
&remote_path, 1); |
1983 |
&remote_path, 1); |
|
Lines 2142-2148
main(int argc, char **argv)
Link Here
|
| 2142 |
infile = stdin; |
2167 |
infile = stdin; |
| 2143 |
|
2168 |
|
| 2144 |
while ((ch = getopt(argc, argv, |
2169 |
while ((ch = getopt(argc, argv, |
| 2145 |
"1246hpqrvCc:D:i:l:o:s:S:b:B:F:P:R:")) != -1) { |
2170 |
"1246ahpqrvCc:D:i:l:o:s:S:b:B:F:P:R:")) != -1) { |
| 2146 |
switch (ch) { |
2171 |
switch (ch) { |
| 2147 |
/* Passed through to ssh(1) */ |
2172 |
/* Passed through to ssh(1) */ |
| 2148 |
case '4': |
2173 |
case '4': |
|
Lines 2181-2186
main(int argc, char **argv)
Link Here
|
| 2181 |
break; |
2206 |
break; |
| 2182 |
case '2': |
2207 |
case '2': |
| 2183 |
sshver = 2; |
2208 |
sshver = 2; |
|
|
2209 |
break; |
| 2210 |
case 'a': |
| 2211 |
cresume = 1; |
| 2184 |
break; |
2212 |
break; |
| 2185 |
case 'B': |
2213 |
case 'B': |
| 2186 |
copy_buffer_len = strtol(optarg, &cp, 10); |
2214 |
copy_buffer_len = strtol(optarg, &cp, 10); |