diff options
author | Darren Tucker <dtucker@zip.com.au> | 2009-10-07 18:56:10 +1100 |
---|---|---|
committer | Darren Tucker <dtucker@zip.com.au> | 2009-10-07 18:56:10 +1100 |
commit | 538738d861cefb25d78615b1c299d7b618db870c (patch) | |
tree | 91c08e223cf51d20a369af1e0711f3559ae9bd9e /sftp-client.c | |
parent | 4adeac764e110e12ab481dc72c7c67dbf4b7110a (diff) | |
download | openssh-git-538738d861cefb25d78615b1c299d7b618db870c.tar.gz |
- (dtucker) d_type is not mandated by POSIX, so add fallback code using
stat(), needed on at least cygwin.
Diffstat (limited to 'sftp-client.c')
-rw-r--r-- | sftp-client.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/sftp-client.c b/sftp-client.c index b49e81b9..a9c895a0 100644 --- a/sftp-client.c +++ b/sftp-client.c @@ -1454,6 +1454,20 @@ do_upload(struct sftp_conn *conn, char *local_path, char *remote_path, return status; } +static mode_t +dirent_to_mode(struct dirent *dp) +{ +#if defined(HAVE_STRUCT_DIRENT_D_TYPE) && defined(DTTOIF) + return DTTOIF(dp->d_type); +#else + struct stat sb; + + if (stat(dp->d_name, &sb) == -1) + return 0; + return sb.st_mode; +#endif +} + static int upload_dir_internal(struct sftp_conn *conn, char *src, char *dst, int pflag, int printflag, int depth) @@ -1515,7 +1529,7 @@ upload_dir_internal(struct sftp_conn *conn, char *src, char *dst, new_dst = path_append(dst, filename); new_src = path_append(src, filename); - if (S_ISDIR(DTTOIF(dp->d_type))) { + if (S_ISDIR(dirent_to_mode(dp))) { if (strcmp(filename, ".") == 0 || strcmp(filename, "..") == 0) continue; @@ -1523,7 +1537,7 @@ upload_dir_internal(struct sftp_conn *conn, char *src, char *dst, if (upload_dir_internal(conn, new_src, new_dst, pflag, depth + 1, printflag) == -1) ret = -1; - } else if (S_ISREG(DTTOIF(dp->d_type)) ) { + } else if (S_ISREG(dirent_to_mode(dp))) { if (do_upload(conn, new_src, new_dst, pflag) == -1) { error("Uploading of file %s to %s failed!", new_src, new_dst); |