diff options
author | Andreas Schneider <mail@cynapses.org> | 2009-04-22 15:41:14 +0000 |
---|---|---|
committer | Andreas Schneider <mail@cynapses.org> | 2009-04-22 15:41:14 +0000 |
commit | 45d8248efb7996d29667ced8bd652b18d25cb9ed (patch) | |
tree | be71334484285a2661adabb7e55e10a2f854ca09 /libssh/sftp.c | |
parent | 47ff8d4679ffc9f6513b7c92b0519b810cb8ffa1 (diff) | |
download | libssh-45d8248efb7996d29667ced8bd652b18d25cb9ed.tar.gz libssh-45d8248efb7996d29667ced8bd652b18d25cb9ed.tar.xz libssh-45d8248efb7996d29667ced8bd652b18d25cb9ed.zip |
Improve sftp_init().
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@580 7dcaeef0-15fb-0310-b436-a5af3365683c
Diffstat (limited to 'libssh/sftp.c')
-rw-r--r-- | libssh/sftp.c | 110 |
1 files changed, 70 insertions, 40 deletions
diff --git a/libssh/sftp.c b/libssh/sftp.c index 6d50c75a..d26e7227 100644 --- a/libssh/sftp.c +++ b/libssh/sftp.c @@ -405,49 +405,79 @@ void sftp_packet_free(SFTP_PACKET *packet) { } /* Initialize the sftp session with the server. */ -int sftp_init(SFTP_SESSION *sftp){ - SFTP_PACKET *packet; - BUFFER *buffer=buffer_new(); - STRING *ext_name_s=NULL, *ext_data_s=NULL; - char *ext_name,*ext_data; - u32 version=htonl(LIBSFTP_VERSION); - sftp_enter_function(); - buffer_add_u32(buffer,version); - sftp_packet_write(sftp,SSH_FXP_INIT,buffer); +int sftp_init(SFTP_SESSION *sftp) { + SFTP_PACKET *packet = NULL; + BUFFER *buffer = NULL; + STRING *ext_name_s = NULL; + STRING *ext_data_s = NULL; + char *ext_name = NULL; + char *ext_data = NULL; + u32 version = htonl(LIBSFTP_VERSION); + + sftp_enter_function(); + + buffer = buffer_new(); + if (buffer == NULL) { + sftp_leave_function(); + return -1; + } + + if ((buffer_add_u32(buffer, version) < 0) || + sftp_packet_write(sftp, SSH_FXP_INIT, buffer) < 0) { buffer_free(buffer); - packet=sftp_packet_read(sftp); - if(!packet){ - sftp_leave_function(); - return -1; - } - if(packet->type != SSH_FXP_VERSION){ - ssh_set_error(sftp->session,SSH_FATAL,"Received a %d messages instead of SSH_FXP_VERSION",packet->type); - sftp_packet_free(packet); - sftp_leave_function(); - return -1; - } - buffer_get_u32(packet->payload,&version); - version=ntohl(version); - if(!(ext_name_s=buffer_get_ssh_string(packet->payload))||!(ext_data_s=buffer_get_ssh_string(packet->payload))) - ssh_log(sftp->session, SSH_LOG_RARE, - "sftp server version %d", version); - else{ - ext_name=string_to_char(ext_name_s); - ext_data=string_to_char(ext_data_s); - ssh_log(sftp->session, SSH_LOG_RARE, - "sftp server version %d (%s,%s)", - version, ext_name, ext_data); - free(ext_name); - free(ext_data); - } - if(ext_name_s) - free(ext_name_s); - if(ext_data_s) - free(ext_data_s); + sftp_leave_function(); + return -1; + } + buffer_free(buffer); + + packet = sftp_packet_read(sftp); + if (packet == NULL) { + sftp_leave_function(); + return -1; + } + + if (packet->type != SSH_FXP_VERSION) { + ssh_set_error(sftp->session, SSH_FATAL, + "Received a %d messages instead of SSH_FXP_VERSION", packet->type); sftp_packet_free(packet); - sftp->version=sftp->server_version=version; sftp_leave_function(); - return 0; + return -1; + } + + buffer_get_u32(packet->payload,&version); + version = ntohl(version); + + ext_name_s = buffer_get_ssh_string(packet->payload); + ext_data_s = buffer_get_ssh_string(packet->payload); + if (ext_name_s == NULL || (ext_data_s == NULL)) { + string_free(ext_name_s); + string_free(ext_data_s); + ssh_log(sftp->session, SSH_LOG_RARE, + "SFTP server version %d", version); + } else { + ext_name = string_to_char(ext_name_s); + ext_data = string_to_char(ext_data_s); + + if (ext_name != NULL || ext_data != NULL) { + ssh_log(sftp->session, SSH_LOG_RARE, + "SFTP server version %d (%s,%s)", + version, ext_name, ext_data); + } else { + ssh_log(sftp->session, SSH_LOG_RARE, + "SFTP server version %d", version); + } + SAFE_FREE(ext_name); + SAFE_FREE(ext_data); + } + string_free(ext_name_s); + string_free(ext_data_s); + + sftp_packet_free(packet); + + sftp->version = sftp->server_version = version; + + sftp_leave_function(); + return 0; } static REQUEST_QUEUE *request_queue_new(SFTP_MESSAGE *msg){ |