diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/easy.c | 2 | ||||
-rw-r--r-- | lib/file.c | 17 | ||||
-rw-r--r-- | lib/ssh.c | 36 | ||||
-rw-r--r-- | lib/url.c | 17 | ||||
-rw-r--r-- | lib/urldata.h | 2 |
5 files changed, 47 insertions, 27 deletions
diff --git a/lib/easy.c b/lib/easy.c index d5816bc48..5c8d6bb3e 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -731,6 +731,8 @@ void curl_easy_reset(CURL *curl) data->set.ssh_auth_types = CURLSSH_AUTH_DEFAULT; /* defaults to any auth type */ + data->set.new_file_perms = 0644; /* Default permissions */ + data->set.new_directory_perms = 0755; /* Default permissions */ } #ifdef CURL_DOES_CONVERSIONS diff --git a/lib/file.c b/lib/file.c index 96f53f779..cec98986b 100644 --- a/lib/file.c +++ b/lib/file.c @@ -217,8 +217,23 @@ static CURLcode file_upload(struct connectdata *conn) if(data->reqdata.resume_from) fp = fopen( file->path, "ab" ); - else + else { + int fd; + +#if defined(WIN32) || defined(MSDOS) || defined(__EMX__) + fd = open(file->path, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, + conn->data->set.new_file_perms); +#else /* !(WIN32 || MSDOS || __EMX__) */ + fd = open(file->path, O_WRONLY|O_CREAT|O_TRUNC, + conn->data->set.new_file_perms); +#endif /* !(WIN32 || MSDOS || __EMX__) */ + if (fd < 0) { + failf(data, "Can't open %s for writing", file->path); + return CURLE_WRITE_ERROR; + } + close(fd); fp = fopen(file->path, "wb"); + } if(!fp) { failf(data, "Can't open %s for writing", file->path); @@ -1137,10 +1137,7 @@ CURLcode Curl_scp_do(struct connectdata *conn, bool *done) #if (LIBSSH2_APINO >= 200706012030) do { scp->ssh_channel = libssh2_scp_send_ex(scp->ssh_session, scp->path, - LIBSSH2_SFTP_S_IRUSR| - LIBSSH2_SFTP_S_IWUSR| - LIBSSH2_SFTP_S_IRGRP| - LIBSSH2_SFTP_S_IROTH, + conn->data->set.new_file_perms, conn->data->set.infilesize, 0, 0); if (!scp->ssh_channel && (libssh2_session_last_errno(scp->ssh_session) != @@ -1150,10 +1147,7 @@ CURLcode Curl_scp_do(struct connectdata *conn, bool *done) } while (!scp->ssh_channel); #else /* !(LIBSSH2_APINO >= 200706012030) */ scp->ssh_channel = libssh2_scp_send_ex(scp->ssh_session, scp->path, - LIBSSH2_SFTP_S_IRUSR| - LIBSSH2_SFTP_S_IWUSR| - LIBSSH2_SFTP_S_IRGRP| - LIBSSH2_SFTP_S_IROTH, + conn->data->set.new_file_perms, conn->data->set.infilesize, 0, 0); if (!scp->ssh_channel) return CURLE_FAILED_INIT; @@ -1363,8 +1357,7 @@ CURLcode Curl_sftp_do(struct connectdata *conn, bool *done) sftp->sftp_handle = libssh2_sftp_open(sftp->sftp_session, sftp->path, LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC, - LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR| - LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH); + data->set.new_file_perms); if (!sftp->sftp_handle && (libssh2_session_last_errno(sftp->ssh_session) != LIBSSH2_ERROR_EAGAIN)) { @@ -1381,8 +1374,7 @@ CURLcode Curl_sftp_do(struct connectdata *conn, bool *done) sftp->sftp_handle = libssh2_sftp_open(sftp->sftp_session, sftp->path, LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC, - LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR| - LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH); + data->set.new_file_perms); if (!sftp->sftp_handle && (libssh2_session_last_errno(sftp->ssh_session) != LIBSSH2_ERROR_EAGAIN)) { @@ -1406,8 +1398,7 @@ CURLcode Curl_sftp_do(struct connectdata *conn, bool *done) sftp->sftp_handle = libssh2_sftp_open(sftp->sftp_session, sftp->path, LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC, - LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR| - LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH); + data->set.new_file_perms); if (!sftp->sftp_handle) { err = libssh2_sftp_last_error(sftp->sftp_session); if (((err == LIBSSH2_FX_NO_SUCH_FILE) || @@ -1420,8 +1411,7 @@ CURLcode Curl_sftp_do(struct connectdata *conn, bool *done) if (res == 0) { sftp->sftp_handle = libssh2_sftp_open(sftp->sftp_session, sftp->path, LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC, - LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR| - LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH); + data->set.new_file_perms); } } if (!sftp->sftp_handle) { @@ -1636,8 +1626,7 @@ CURLcode Curl_sftp_do(struct connectdata *conn, bool *done) do { sftp->sftp_handle = libssh2_sftp_open(sftp->sftp_session, sftp->path, LIBSSH2_FXF_READ, - LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR| - LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH); + data->set.new_file_perms); if (!sftp->sftp_handle && (libssh2_session_last_errno(sftp->ssh_session) != LIBSSH2_ERROR_EAGAIN)) { @@ -1650,8 +1639,7 @@ CURLcode Curl_sftp_do(struct connectdata *conn, bool *done) #else /* !(LIBSSH2_APINO >= 200706012030) */ sftp->sftp_handle = libssh2_sftp_open(sftp->sftp_session, sftp->path, LIBSSH2_FXF_READ, - LIBSSH2_SFTP_S_IRUSR|LIBSSH2_SFTP_S_IWUSR| - LIBSSH2_SFTP_S_IRGRP|LIBSSH2_SFTP_S_IROTH); + data->set.new_file_perms); if (!sftp->sftp_handle) { err = libssh2_sftp_last_error(sftp->sftp_session); failf(conn->data, "Could not open remote file for reading: %s", @@ -2304,15 +2292,11 @@ static CURLcode sftp_create_dirs(struct connectdata *conn) { /* 'mode' - parameter is preliminary - default to 0644 */ #if (LIBSSH2_APINO >= 200706012030) while ((rc = libssh2_sftp_mkdir(sftp->sftp_session, sftp->path, - LIBSSH2_SFTP_S_IRWXU | - LIBSSH2_SFTP_S_IRGRP | LIBSSH2_SFTP_S_IXGRP | - LIBSSH2_SFTP_S_IROTH | LIBSSH2_SFTP_S_IXOTH)) == + conn->data->set.new_directory_perms)) == LIBSSH2_ERROR_EAGAIN); #else /* !(LIBSSH2_APINO >= 200706012030) */ rc = libssh2_sftp_mkdir(sftp->sftp_session, sftp->path, - LIBSSH2_SFTP_S_IRWXU | - LIBSSH2_SFTP_S_IRGRP | LIBSSH2_SFTP_S_IXGRP | - LIBSSH2_SFTP_S_IROTH | LIBSSH2_SFTP_S_IXOTH); + conn->data->set.new_directory_perms); #endif /* !(LIBSSH2_APINO >= 200706012030) */ *slash_pos = '/'; ++slash_pos; @@ -595,6 +595,8 @@ CURLcode Curl_open(struct SessionHandle **curl) data->set.ssh_auth_types = CURLSSH_AUTH_DEFAULT; /* defaults to any auth type */ + data->set.new_file_perms = 0644; /* Default permissions */ + data->set.new_directory_perms = 0755; /* Default permissions */ /* most recent connection is not yet defined */ data->state.lastconnect = -1; @@ -1759,6 +1761,21 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, */ data->set.http_ce_skip = (bool)(0 == va_arg(param, long)); break; + + case CURLOPT_NEW_FILE_PERMS: + /* + * Uses these permissions instead of 0644 + */ + data->set.new_file_perms = va_arg(param, long); + break; + + case CURLOPT_NEW_DIRECTORY_PERMS: + /* + * Uses these permissions instead of 0755 + */ + data->set.new_directory_perms = va_arg(param, long); + break; + default: /* unknown tag and its companion, just ignore: */ result = CURLE_FAILED_INIT; /* correct this */ diff --git a/lib/urldata.h b/lib/urldata.h index f52f96fbd..bd012b817 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -1356,6 +1356,8 @@ struct UserDefined { transfer-encoded (chunked, compressed) */ bool http_ce_skip; /* pass the raw body data to the user, even when content-encoded (chunked, compressed) */ + long new_file_perms; /* Permissions to use when creating remote files */ + long new_directory_perms; /* Permissions to use when creating remote dirs */ }; struct Names { |