version 1.56.2.3, 2005/09/02 03:45:00 |
version 1.57, 2004/11/05 12:19:56 |
|
|
static void |
static void |
killchild(int signo) |
killchild(int signo) |
{ |
{ |
if (sshpid > 1) { |
if (sshpid > 1) |
kill(sshpid, SIGTERM); |
kill(sshpid, SIGTERM); |
waitpid(sshpid, NULL, 0); |
|
} |
|
|
|
_exit(1); |
_exit(1); |
} |
} |
|
|
cmd_interrupt(int signo) |
cmd_interrupt(int signo) |
{ |
{ |
const char msg[] = "\rInterrupt \n"; |
const char msg[] = "\rInterrupt \n"; |
int olderrno = errno; |
|
|
|
write(STDERR_FILENO, msg, sizeof(msg) - 1); |
write(STDERR_FILENO, msg, sizeof(msg) - 1); |
interrupted = 1; |
interrupted = 1; |
errno = olderrno; |
|
} |
} |
|
|
static void |
static void |
|
|
return (xstrdup(path)); |
return (xstrdup(path)); |
|
|
len = strlen(strip); |
len = strlen(strip); |
if (strncmp(path, strip, len) == 0) { |
if (strip != NULL && strncmp(path, strip, len) == 0) { |
if (strip[len - 1] != '/' && path[len] == '/') |
if (strip[len - 1] != '/' && path[len] == '/') |
len++; |
len++; |
return (xstrdup(path + len)); |
return (xstrdup(path + len)); |
|
|
|
|
/* Check for flags */ |
/* Check for flags */ |
if (cp++[0] == '-') { |
if (cp++[0] == '-') { |
for (; strchr(WHITESPACE, *cp) == NULL; cp++) { |
for(; strchr(WHITESPACE, *cp) == NULL; cp++) { |
switch (*cp) { |
switch (*cp) { |
case 'l': |
case 'l': |
*lflag &= ~VIEW_FLAGS; |
*lflag &= ~VIEW_FLAGS; |
|
|
{ |
{ |
const char *cp = *cpp, *end; |
const char *cp = *cpp, *end; |
char quot; |
char quot; |
u_int i, j; |
int i, j; |
|
|
cp += strspn(cp, WHITESPACE); |
cp += strspn(cp, WHITESPACE); |
if (!*cp) { |
if (!*cp) { |
|
|
static int |
static int |
do_ls_dir(struct sftp_conn *conn, char *path, char *strip_path, int lflag) |
do_ls_dir(struct sftp_conn *conn, char *path, char *strip_path, int lflag) |
{ |
{ |
int n; |
int n, c = 1, colspace = 0, columns = 1; |
u_int c = 1, colspace = 0, columns = 1; |
|
SFTP_DIRENT **d; |
SFTP_DIRENT **d; |
|
|
if ((n = do_readdir(conn, path, &d)) != 0) |
if ((n = do_readdir(conn, path, &d)) != 0) |
return (n); |
return (n); |
|
|
if (!(lflag & LS_SHORT_VIEW)) { |
if (!(lflag & LS_SHORT_VIEW)) { |
u_int m = 0, width = 80; |
int m = 0, width = 80; |
struct winsize ws; |
struct winsize ws; |
char *tmp; |
char *tmp; |
|
|
|
|
int lflag) |
int lflag) |
{ |
{ |
glob_t g; |
glob_t g; |
u_int i, c = 1, colspace = 0, columns = 1; |
int i, c = 1, colspace = 0, columns = 1; |
Attrib *a = NULL; |
Attrib *a; |
|
|
memset(&g, 0, sizeof(g)); |
memset(&g, 0, sizeof(g)); |
|
|
if (remote_glob(conn, path, GLOB_MARK|GLOB_NOCHECK|GLOB_BRACE, |
if (remote_glob(conn, path, GLOB_MARK|GLOB_NOCHECK|GLOB_BRACE, |
NULL, &g) || (g.gl_pathc && !g.gl_matchc)) { |
NULL, &g)) { |
if (g.gl_pathc) |
|
globfree(&g); |
|
error("Can't ls: \"%s\" not found", path); |
error("Can't ls: \"%s\" not found", path); |
return (-1); |
return (-1); |
} |
} |
|
|
goto out; |
goto out; |
|
|
/* |
/* |
* If the glob returns a single match and it is a directory, |
* If the glob returns a single match, which is the same as the |
* then just list its contents. |
* input glob, and it is a directory, then just list its contents |
*/ |
*/ |
if (g.gl_matchc == 1) { |
if (g.gl_pathc == 1 && |
if ((a = do_lstat(conn, g.gl_pathv[0], 1)) == NULL) { |
strncmp(path, g.gl_pathv[0], strlen(g.gl_pathv[0]) - 1) == 0) { |
|
if ((a = do_lstat(conn, path, 1)) == NULL) { |
globfree(&g); |
globfree(&g); |
return (-1); |
return (-1); |
} |
} |
if ((a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) && |
if ((a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) && |
S_ISDIR(a->perm)) { |
S_ISDIR(a->perm)) { |
int err; |
|
|
|
err = do_ls_dir(conn, g.gl_pathv[0], strip_path, lflag); |
|
globfree(&g); |
globfree(&g); |
return (err); |
return (do_ls_dir(conn, path, strip_path, lflag)); |
} |
} |
} |
} |
|
|
if (!(lflag & LS_SHORT_VIEW)) { |
if (!(lflag & LS_SHORT_VIEW)) { |
u_int m = 0, width = 80; |
int m = 0, width = 80; |
struct winsize ws; |
struct winsize ws; |
|
|
/* Count entries for sort and find longest filename */ |
/* Count entries for sort and find longest filename */ |
|
|
colspace = width / columns; |
colspace = width / columns; |
} |
} |
|
|
for (i = 0; g.gl_pathv[i] && !interrupted; i++, a = NULL) { |
for (i = 0; g.gl_pathv[i] && !interrupted; i++) { |
char *fname; |
char *fname; |
|
|
fname = path_strip(g.gl_pathv[i], strip_path); |
fname = path_strip(g.gl_pathv[i], strip_path); |
|
|
* that the server returns as well as the filenames. |
* that the server returns as well as the filenames. |
*/ |
*/ |
memset(&sb, 0, sizeof(sb)); |
memset(&sb, 0, sizeof(sb)); |
if (a == NULL) |
a = do_lstat(conn, g.gl_pathv[i], 1); |
a = do_lstat(conn, g.gl_pathv[i], 1); |
|
if (a != NULL) |
if (a != NULL) |
attrib_to_stat(a, &sb); |
attrib_to_stat(a, &sb); |
lname = ls_file(fname, &sb, 1); |
lname = ls_file(fname, &sb, 1); |
|
|
char *dir = NULL; |
char *dir = NULL; |
char cmd[2048]; |
char cmd[2048]; |
struct sftp_conn *conn; |
struct sftp_conn *conn; |
int err, interactive; |
int err; |
EditLine *el = NULL; |
EditLine *el = NULL; |
History *hl = NULL; |
History *hl = NULL; |
HistEvent hev; |
HistEvent hev; |
|
|
if (remote_is_dir(conn, dir) && file2 == NULL) { |
if (remote_is_dir(conn, dir) && file2 == NULL) { |
printf("Changing to: %s\n", dir); |
printf("Changing to: %s\n", dir); |
snprintf(cmd, sizeof cmd, "cd \"%s\"", dir); |
snprintf(cmd, sizeof cmd, "cd \"%s\"", dir); |
if (parse_dispatch_command(conn, cmd, &pwd, 1) != 0) { |
if (parse_dispatch_command(conn, cmd, &pwd, 1) != 0) |
xfree(dir); |
|
xfree(pwd); |
|
return (-1); |
return (-1); |
} |
|
} else { |
} else { |
if (file2 == NULL) |
if (file2 == NULL) |
snprintf(cmd, sizeof cmd, "get %s", dir); |
snprintf(cmd, sizeof cmd, "get %s", dir); |
|
|
setvbuf(stdout, NULL, _IOLBF, 0); |
setvbuf(stdout, NULL, _IOLBF, 0); |
setvbuf(infile, NULL, _IOLBF, 0); |
setvbuf(infile, NULL, _IOLBF, 0); |
|
|
interactive = !batchmode && isatty(STDIN_FILENO); |
|
err = 0; |
err = 0; |
for (;;) { |
for (;;) { |
char *cp; |
char *cp; |
|
|
signal(SIGINT, SIG_IGN); |
signal(SIGINT, SIG_IGN); |
|
|
if (el == NULL) { |
if (el == NULL) { |
if (interactive) |
printf("sftp> "); |
printf("sftp> "); |
|
if (fgets(cmd, sizeof(cmd), infile) == NULL) { |
if (fgets(cmd, sizeof(cmd), infile) == NULL) { |
if (interactive) |
printf("\n"); |
printf("\n"); |
|
break; |
break; |
} |
} |
if (!interactive) { /* Echo command */ |
if (batchmode) /* Echo command */ |
printf("sftp> %s", cmd); |
printf("%s", cmd); |
if (strlen(cmd) > 0 && |
|
cmd[strlen(cmd) - 1] != '\n') |
|
printf("\n"); |
|
} |
|
} else { |
} else { |
if ((line = el_gets(el, &count)) == NULL || count <= 0) { |
if ((line = el_gets(el, &count)) == NULL || count <= 0) |
printf("\n"); |
|
break; |
break; |
} |
|
history(hl, &hev, H_ENTER, line); |
history(hl, &hev, H_ENTER, line); |
if (strlcpy(cmd, line, sizeof(cmd)) >= sizeof(cmd)) { |
if (strlcpy(cmd, line, sizeof(cmd)) >= sizeof(cmd)) { |
fprintf(stderr, "Error: input line too long\n"); |
fprintf(stderr, "Error: input line too long\n"); |
|
|
} |
} |
xfree(pwd); |
xfree(pwd); |
|
|
if (el != NULL) |
|
el_end(el); |
|
|
|
/* err == 1 signifies normal "quit" exit */ |
/* err == 1 signifies normal "quit" exit */ |
return (err >= 0 ? 0 : -1); |
return (err >= 0 ? 0 : -1); |
} |
} |
|
|
|
|
/* Allow "-" as stdin */ |
/* Allow "-" as stdin */ |
if (strcmp(optarg, "-") != 0 && |
if (strcmp(optarg, "-") != 0 && |
(infile = fopen(optarg, "r")) == NULL) |
(infile = fopen(optarg, "r")) == NULL) |
fatal("%s (%s).", strerror(errno), optarg); |
fatal("%s (%s).", strerror(errno), optarg); |
showprogress = 0; |
showprogress = 0; |
batchmode = 1; |
batchmode = 1; |
addargs(&args, "-obatchmode yes"); |
|
break; |
break; |
case 'P': |
case 'P': |
sftp_direct = optarg; |
sftp_direct = optarg; |