diff options
author | Andreas Schneider <mail@cynapses.org> | 2009-04-27 10:37:54 +0000 |
---|---|---|
committer | Andreas Schneider <mail@cynapses.org> | 2009-04-27 10:37:54 +0000 |
commit | c1cd3b29745e1ab757a55ee255dd94e687c47026 (patch) | |
tree | 4f774549c12525321b285443eda590f78c3aa6cb /libssh/sftp.c | |
parent | 2b4efa171e746bfe3b63a1b0568d4767dbdbbffe (diff) | |
download | libssh-c1cd3b29745e1ab757a55ee255dd94e687c47026.tar.gz libssh-c1cd3b29745e1ab757a55ee255dd94e687c47026.tar.xz libssh-c1cd3b29745e1ab757a55ee255dd94e687c47026.zip |
Improve sftp_xstat().
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@615 7dcaeef0-15fb-0310-b436-a5af3365683c
Diffstat (limited to 'libssh/sftp.c')
-rw-r--r-- | libssh/sftp.c | 82 |
1 files changed, 51 insertions, 31 deletions
diff --git a/libssh/sftp.c b/libssh/sftp.c index 12a3bf32..9bcdf611 100644 --- a/libssh/sftp.c +++ b/libssh/sftp.c @@ -2273,42 +2273,62 @@ char *sftp_canonicalize_path(SFTP_SESSION *sftp, const char *path) { return NULL; } -static SFTP_ATTRIBUTES *sftp_xstat(SFTP_SESSION *sftp, const char *path, int param){ - u32 id=sftp_get_new_id(sftp); - BUFFER *buffer=buffer_new(); - STRING *pathstr= string_from_char(path); - SFTP_MESSAGE *msg=NULL; - STATUS_MESSAGE *status=NULL; - SFTP_ATTRIBUTES *pattr=NULL; +static SFTP_ATTRIBUTES *sftp_xstat(SFTP_SESSION *sftp, const char *path, + int param) { + STATUS_MESSAGE *status = NULL; + SFTP_MESSAGE *msg = NULL; + STRING *pathstr; + BUFFER *buffer; + u32 id; - buffer_add_u32(buffer,id); - buffer_add_ssh_string(buffer,pathstr); - free(pathstr); - sftp_packet_write(sftp,param,buffer); + buffer = buffer_new(); + if (buffer == NULL) { + return NULL; + } + + pathstr = string_from_char(path); + if (pathstr == NULL) { buffer_free(buffer); - while(!msg){ - if(sftp_read_and_dispatch(sftp)) - return NULL; - msg=sftp_dequeue(sftp,id); - } - if(msg->packet_type==SSH_FXP_ATTRS){ - pattr=sftp_parse_attr(sftp,msg->payload,0); - return pattr; - } - if(msg->packet_type== SSH_FXP_STATUS){ - status=parse_status_msg(msg); - sftp_message_free(msg); - if(!status) - return NULL; - sftp_set_error(sftp, status->status); - ssh_set_error(sftp->session,SSH_REQUEST_DENIED,"sftp server: %s",status->errormsg); - status_msg_free(status); - return NULL; + return NULL; + } + + id = sftp_get_new_id(sftp); + if (buffer_add_u32(buffer, id) < 0 || + buffer_add_ssh_string(buffer, pathstr) < 0 || + sftp_packet_write(sftp, param, buffer) < 0) { + buffer_free(buffer); + string_free(pathstr); + return NULL; + } + buffer_free(buffer); + string_free(pathstr); + + while (msg == NULL) { + if (sftp_read_and_dispatch(sftp) < 0) { + return NULL; } - ssh_set_error(sftp->session, SSH_FATAL, - "Received mesg %d during stat()", msg->packet_type); + msg = sftp_dequeue(sftp, id); + } + + if (msg->packet_type == SSH_FXP_ATTRS) { + return sftp_parse_attr(sftp, msg->payload, 0); + } else if (msg->packet_type == SSH_FXP_STATUS) { + status = parse_status_msg(msg); sftp_message_free(msg); + if (status == NULL) { + return NULL; + } + sftp_set_error(sftp, status->status); + ssh_set_error(sftp->session, SSH_REQUEST_DENIED, + "SFTP server: %s", status->errormsg); + status_msg_free(status); return NULL; + } + ssh_set_error(sftp->session, SSH_FATAL, + "Received mesg %d during stat()", msg->packet_type); + sftp_message_free(msg); + + return NULL; } SFTP_ATTRIBUTES *sftp_stat(SFTP_SESSION *session, const char *path){ |