diff options
author | Andreas Schneider <mail@cynapses.org> | 2009-04-27 10:14:59 +0000 |
---|---|---|
committer | Andreas Schneider <mail@cynapses.org> | 2009-04-27 10:14:59 +0000 |
commit | 387f6473f72e710e7ca7fde14df52b1d7a597683 (patch) | |
tree | ea42de59b14589d92fbee838b22413d1fca22bfa | |
parent | 4d80a1559a444f709269b58d4f870c0cfb1e3f07 (diff) | |
download | libssh-387f6473f72e710e7ca7fde14df52b1d7a597683.tar.gz libssh-387f6473f72e710e7ca7fde14df52b1d7a597683.tar.xz libssh-387f6473f72e710e7ca7fde14df52b1d7a597683.zip |
Improve sftp_mkdir().
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@610 7dcaeef0-15fb-0310-b436-a5af3365683c
-rw-r--r-- | libssh/sftp.c | 133 |
1 files changed, 78 insertions, 55 deletions
diff --git a/libssh/sftp.c b/libssh/sftp.c index 65894ce..965161f 100644 --- a/libssh/sftp.c +++ b/libssh/sftp.c @@ -1873,11 +1873,11 @@ int sftp_rmdir(SFTP_SESSION *sftp, const char *directory) { buffer_add_ssh_string(buffer, filename) < 0 || sftp_packet_write(sftp, SSH_FXP_RMDIR, buffer) < 0) { buffer_free(buffer); - string_free(filname); + string_free(filename); return -1; } buffer_free(buffer); - string_free(filname); + string_free(filename); while (msg == NULL) { if (sftp_read_and_dispatch(sftp) < 0) { @@ -1918,68 +1918,91 @@ int sftp_rmdir(SFTP_SESSION *sftp, const char *directory) { /* Code written by Nick */ int sftp_mkdir(SFTP_SESSION *sftp, const char *directory, mode_t mode) { - u32 id = sftp_get_new_id(sftp); - BUFFER *buffer = buffer_new(); - STRING *path = string_from_char(directory); - SFTP_MESSAGE *msg = NULL; - STATUS_MESSAGE *status = NULL; - SFTP_ATTRIBUTES attr; - SFTP_ATTRIBUTES *errno_attr = NULL; + STATUS_MESSAGE *status = NULL; + SFTP_MESSAGE *msg = NULL; + SFTP_ATTRIBUTES *errno_attr = NULL; + SFTP_ATTRIBUTES attr; + BUFFER *buffer; + STRING *path; + u32 id; - ZERO_STRUCT(attr); - attr.permissions = mode; - attr.flags = SSH_FILEXFER_ATTR_PERMISSIONS; + buffer = buffer_new(); + if (buffer == NULL) { + return -1; + } - buffer_add_u32(buffer, id); - buffer_add_ssh_string(buffer, path); - free(path); - if (buffer_add_attributes(buffer, &attr) < 0) { - buffer_free(buffer); + path = string_from_char(directory); + if (path == NULL) { + buffer_free(buffer); + return -1; + } + + ZERO_STRUCT(attr); + attr.permissions = mode; + attr.flags = SSH_FILEXFER_ATTR_PERMISSIONS; + + id = sftp_get_new_id(sftp); + if (buffer_add_u32(buffer, id) < 0 || + buffer_add_ssh_string(buffer, path) < 0 || + buffer_add_attributes(buffer, &attr) < 0 || + sftp_packet_write(sftp, SSH_FXP_MKDIR, buffer) < 0) { + buffer_free(buffer); + string_free(path); + } + buffer_free(buffer); + string_free(path); + + while (msg == NULL) { + if (sftp_read_and_dispatch(sftp) < 0) { return -1; } - sftp_packet_write(sftp, SSH_FXP_MKDIR, buffer); - buffer_free(buffer); - while (!msg) { - if (sftp_read_and_dispatch(sftp)) - return -1; - msg = sftp_dequeue(sftp, id); + msg = sftp_dequeue(sftp, id); + } + + /* By specification, this command only returns SSH_FXP_STATUS */ + if (msg->packet_type == SSH_FXP_STATUS) { + status = parse_status_msg(msg); + sftp_message_free(msg); + if (status == NULL) { + return -1; } - if (msg->packet_type == SSH_FXP_STATUS) { - /* by specification, this command's only supposed to return SSH_FXP_STATUS */ - status = parse_status_msg(msg); - sftp_message_free(msg); - if (status == NULL) { - return -1; - } - sftp_set_error(sftp, status->status); - switch (status->status) { - case SSH_FX_FAILURE: - /* - * mkdir always returns a failure, even if the path already exists. - * To be POSIX conform and to be able to map it to EEXIST a stat - * call should be issued here - */ - errno_attr = sftp_lstat(sftp, directory); - if (errno_attr != NULL) { - sftp_set_error(sftp, SSH_FX_FILE_ALREADY_EXISTS); - } - break; - case SSH_FX_OK: - status_msg_free(status); - return 0; - break; - default: - break; + sftp_set_error(sftp, status->status); + switch (status->status) { + case SSH_FX_FAILURE: + /* + * mkdir always returns a failure, even if the path already exists. + * To be POSIX conform and to be able to map it to EEXIST a stat + * call is needed here. + */ + errno_attr = sftp_lstat(sftp, directory); + if (errno_attr != NULL) { + SAFE_FREE(errno_attr); + sftp_set_error(sftp, SSH_FX_FILE_ALREADY_EXISTS); } - /* status should be SSH_FX_OK if the command was successful, if it didn't, then there was an error */ - ssh_set_error(sftp->session,SSH_REQUEST_DENIED, "sftp server: %s", status->errormsg); + break; + case SSH_FX_OK: status_msg_free(status); - return -1; - } else { - ssh_set_error(sftp->session,SSH_FATAL, "Received message %d when attempting to make directory", msg->packet_type); - sftp_message_free(msg); + return 0; + break; + default: + break; } + /* + * The status should be SSH_FX_OK if the command was successful, if it + * didn't, then there was an error + */ + ssh_set_error(sftp->session, SSH_REQUEST_DENIED, + "SFTP server: %s", status->errormsg); + status_msg_free(status); return -1; + } else { + ssh_set_error(sftp->session, SSH_FATAL, + "Received message %d when attempting to make directory", + msg->packet_type); + sftp_message_free(msg); + } + + return -1; } /* code written by nick */ |