version 1.137, 2020/10/18 11:32:02 |
version 1.138, 2020/11/20 03:16:56 |
|
|
int i, ret = 0; |
int i, ret = 0; |
SFTP_DIRENT **dir_entries; |
SFTP_DIRENT **dir_entries; |
char *filename, *new_src = NULL, *new_dst = NULL; |
char *filename, *new_src = NULL, *new_dst = NULL; |
mode_t mode = 0777; |
mode_t mode = 0777, tmpmode = mode; |
|
|
if (depth >= MAX_DIR_DEPTH) { |
if (depth >= MAX_DIR_DEPTH) { |
error("Maximum directory depth exceeded: %d levels", depth); |
error("Maximum directory depth exceeded: %d levels", depth); |
|
|
if (print_flag) |
if (print_flag) |
mprintf("Retrieving %s\n", src); |
mprintf("Retrieving %s\n", src); |
|
|
if (dirattrib->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) |
if (dirattrib->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) { |
mode = dirattrib->perm & 01777; |
mode = dirattrib->perm & 01777; |
else { |
tmpmode = mode | (S_IWUSR|S_IXUSR); |
|
} else { |
debug("Server did not send permissions for " |
debug("Server did not send permissions for " |
"directory \"%s\"", dst); |
"directory \"%s\"", dst); |
} |
} |
|
|
if (mkdir(dst, mode) == -1 && errno != EEXIST) { |
if (mkdir(dst, tmpmode) == -1 && errno != EEXIST) { |
error("mkdir %s: %s", dst, strerror(errno)); |
error("mkdir %s: %s", dst, strerror(errno)); |
return -1; |
return -1; |
} |
} |
|
|
"\"%s\"", dst); |
"\"%s\"", dst); |
} |
} |
|
|
|
if (mode != tmpmode && chmod(dst, mode) == -1) |
|
error("Can't set final mode on \"%s\": %s", dst, |
|
strerror(errno)); |
|
|
free_sftp_dirents(dir_entries); |
free_sftp_dirents(dir_entries); |
|
|
return ret; |
return ret; |
|
|
char *filename, *new_src = NULL, *new_dst = NULL; |
char *filename, *new_src = NULL, *new_dst = NULL; |
struct stat sb; |
struct stat sb; |
Attrib a, *dirattrib; |
Attrib a, *dirattrib; |
|
u_int32_t saved_perm; |
|
|
if (depth >= MAX_DIR_DEPTH) { |
if (depth >= MAX_DIR_DEPTH) { |
error("Maximum directory depth exceeded: %d levels", depth); |
error("Maximum directory depth exceeded: %d levels", depth); |
|
|
/* |
/* |
* sftp lacks a portable status value to match errno EEXIST, |
* sftp lacks a portable status value to match errno EEXIST, |
* so if we get a failure back then we must check whether |
* so if we get a failure back then we must check whether |
* the path already existed and is a directory. |
* the path already existed and is a directory. Ensure we can |
|
* write to the directory we create for the duration of the transfer. |
*/ |
*/ |
|
saved_perm = a.perm; |
|
a.perm |= (S_IWUSR|S_IXUSR); |
if (do_mkdir(conn, dst, &a, 0) != 0) { |
if (do_mkdir(conn, dst, &a, 0) != 0) { |
if ((dirattrib = do_stat(conn, dst, 0)) == NULL) |
if ((dirattrib = do_stat(conn, dst, 0)) == NULL) |
return -1; |
return -1; |
|
|
return -1; |
return -1; |
} |
} |
} |
} |
|
a.perm = saved_perm; |
|
|
if ((dirp = opendir(src)) == NULL) { |
if ((dirp = opendir(src)) == NULL) { |
error("Failed to open dir \"%s\": %s", src, strerror(errno)); |
error("Failed to open dir \"%s\": %s", src, strerror(errno)); |