aboutsummaryrefslogtreecommitdiff
path: root/libssh/sftp.c
diff options
context:
space:
mode:
authorAndreas Schneider <mail@cynapses.org>2009-04-22 15:41:14 +0000
committerAndreas Schneider <mail@cynapses.org>2009-04-22 15:41:14 +0000
commit45d8248efb7996d29667ced8bd652b18d25cb9ed (patch)
treebe71334484285a2661adabb7e55e10a2f854ca09 /libssh/sftp.c
parent47ff8d4679ffc9f6513b7c92b0519b810cb8ffa1 (diff)
downloadlibssh-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.c110
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){