version 1.13, 2001/03/14 08:57:14 |
version 1.14, 2001/03/16 08:16:17 |
|
|
} |
} |
|
|
Attrib * |
Attrib * |
get_decode_stat(int fd, u_int expected_id) |
get_decode_stat(int fd, u_int expected_id, int quiet) |
{ |
{ |
Buffer msg; |
Buffer msg; |
u_int type, id; |
u_int type, id; |
|
|
if (type == SSH2_FXP_STATUS) { |
if (type == SSH2_FXP_STATUS) { |
int status = buffer_get_int(&msg); |
int status = buffer_get_int(&msg); |
|
|
error("Couldn't stat remote file: %s", fx2txt(status)); |
if (quiet) |
|
debug("Couldn't stat remote file: %s", fx2txt(status)); |
|
else |
|
error("Couldn't stat remote file: %s", fx2txt(status)); |
return(NULL); |
return(NULL); |
} else if (type != SSH2_FXP_ATTRS) { |
} else if (type != SSH2_FXP_ATTRS) { |
fatal("Expected SSH2_FXP_ATTRS(%d) packet, got %d", |
fatal("Expected SSH2_FXP_ATTRS(%d) packet, got %d", |
|
|
} |
} |
|
|
Attrib * |
Attrib * |
do_stat(int fd_in, int fd_out, char *path) |
do_stat(int fd_in, int fd_out, char *path, int quiet) |
{ |
{ |
u_int id; |
u_int id; |
|
|
id = msg_id++; |
id = msg_id++; |
send_string_request(fd_out, id, SSH2_FXP_STAT, path, strlen(path)); |
send_string_request(fd_out, id, SSH2_FXP_STAT, path, strlen(path)); |
return(get_decode_stat(fd_in, id)); |
return(get_decode_stat(fd_in, id, quiet)); |
} |
} |
|
|
Attrib * |
Attrib * |
do_lstat(int fd_in, int fd_out, char *path) |
do_lstat(int fd_in, int fd_out, char *path, int quiet) |
{ |
{ |
u_int id; |
u_int id; |
|
|
id = msg_id++; |
id = msg_id++; |
send_string_request(fd_out, id, SSH2_FXP_LSTAT, path, strlen(path)); |
send_string_request(fd_out, id, SSH2_FXP_LSTAT, path, strlen(path)); |
return(get_decode_stat(fd_in, id)); |
return(get_decode_stat(fd_in, id, quiet)); |
} |
} |
|
|
Attrib * |
Attrib * |
do_fstat(int fd_in, int fd_out, char *handle, |
do_fstat(int fd_in, int fd_out, char *handle, u_int handle_len, int quiet) |
u_int handle_len) |
|
{ |
{ |
u_int id; |
u_int id; |
|
|
id = msg_id++; |
id = msg_id++; |
send_string_request(fd_out, id, SSH2_FXP_FSTAT, handle, handle_len); |
send_string_request(fd_out, id, SSH2_FXP_FSTAT, handle, handle_len); |
return(get_decode_stat(fd_in, id)); |
return(get_decode_stat(fd_in, id, quiet)); |
} |
} |
|
|
int |
int |
|
|
Attrib junk, *a; |
Attrib junk, *a; |
int status; |
int status; |
|
|
a = do_stat(fd_in, fd_out, remote_path); |
a = do_stat(fd_in, fd_out, remote_path, 0); |
if (a == NULL) |
if (a == NULL) |
return(-1); |
return(-1); |
|
|
|
|
else |
else |
mode = 0666; |
mode = 0666; |
|
|
|
if ((a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) && |
|
(a->perm & S_IFDIR)) { |
|
error("Cannot download a directory: %s", remote_path); |
|
return(-1); |
|
} |
|
|
local_fd = open(local_path, O_WRONLY | O_CREAT | O_TRUNC, mode); |
local_fd = open(local_path, O_WRONLY | O_CREAT | O_TRUNC, mode); |
if (local_fd == -1) { |
if (local_fd == -1) { |
error("Couldn't open local file \"%s\" for writing: %s", |
error("Couldn't open local file \"%s\" for writing: %s", |
local_path, strerror(errno)); |
local_path, strerror(errno)); |
return(errno); |
return(-1); |
} |
} |
|
|
buffer_init(&msg); |
buffer_init(&msg); |