1
1

Improve sftp_get_client_message.

git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@620 7dcaeef0-15fb-0310-b436-a5af3365683c
Этот коммит содержится в:
Andreas Schneider 2009-04-27 11:30:36 +00:00
родитель 72aeba410f
Коммит 1f6341f549

Просмотреть файл

@ -27,13 +27,13 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include "libssh/libssh.h" #include "libssh/libssh.h"
#include "libssh/sftp.h" #include "libssh/sftp.h"
#include "libssh/ssh2.h" #include "libssh/ssh2.h"
#include "libssh/priv.h" #include "libssh/priv.h"
SFTP_CLIENT_MESSAGE *sftp_get_client_message(SFTP_SESSION *sftp) {
SFTP_CLIENT_MESSAGE *sftp_get_client_message(SFTP_SESSION *sftp){
SFTP_PACKET *packet; SFTP_PACKET *packet;
SFTP_CLIENT_MESSAGE *msg; SFTP_CLIENT_MESSAGE *msg;
BUFFER *payload; BUFFER *payload;
@ -43,87 +43,174 @@ SFTP_CLIENT_MESSAGE *sftp_get_client_message(SFTP_SESSION *sftp){
if (msg == NULL) { if (msg == NULL) {
return NULL; return NULL;
} }
memset(msg,0,sizeof(SFTP_CLIENT_MESSAGE)); ZERO_STRUCTP(msg);
packet = sftp_packet_read(sftp); packet = sftp_packet_read(sftp);
if (packet == NULL) { if (packet == NULL) {
sftp_client_message_free(msg);
return NULL; return NULL;
} }
payload=packet->payload;
msg->type=packet->type; payload = packet->payload;
msg->sftp=sftp; msg->type = packet->type;
buffer_get_u32(payload,&msg->id); msg->sftp = sftp;
switch(msg->type){
buffer_get_u32(payload, &msg->id);
switch(msg->type) {
case SSH_FXP_CLOSE: case SSH_FXP_CLOSE:
case SSH_FXP_READDIR: case SSH_FXP_READDIR:
msg->handle=buffer_get_ssh_string(payload); msg->handle = buffer_get_ssh_string(payload);
if (msg->handle == NULL) {
sftp_client_message_free(msg);
return NULL;
}
break; break;
case SSH_FXP_READ: case SSH_FXP_READ:
msg->handle=buffer_get_ssh_string(payload); msg->handle = buffer_get_ssh_string(payload);
buffer_get_u64(payload,&msg->offset); if (msg->handle == NULL) {
buffer_get_u32(payload,&msg->len); sftp_client_message_free(msg);
return NULL;
}
buffer_get_u64(payload, &msg->offset);
buffer_get_u32(payload, &msg->len);
break; break;
case SSH_FXP_WRITE: case SSH_FXP_WRITE:
msg->handle=buffer_get_ssh_string(payload); msg->handle = buffer_get_ssh_string(payload);
buffer_get_u64(payload,&msg->offset); if (msg->handle == NULL) {
msg->data=buffer_get_ssh_string(payload); sftp_client_message_free(msg);
return NULL;
}
buffer_get_u64(payload, &msg->offset);
msg->data = buffer_get_ssh_string(payload);
if (msg->data == NULL) {
sftp_client_message_free(msg);
return NULL;
}
break; break;
case SSH_FXP_REMOVE: case SSH_FXP_REMOVE:
case SSH_FXP_RMDIR: case SSH_FXP_RMDIR:
case SSH_FXP_OPENDIR: case SSH_FXP_OPENDIR:
case SSH_FXP_READLINK: case SSH_FXP_READLINK:
case SSH_FXP_REALPATH: case SSH_FXP_REALPATH:
tmp=buffer_get_ssh_string(payload); tmp = buffer_get_ssh_string(payload);
msg->filename=string_to_char(tmp); if (tmp == NULL) {
free(tmp); sftp_client_message_free(msg);
return NULL;
}
msg->filename = string_to_char(tmp);
string_free(tmp);
if (msg->filename == NULL) {
sftp_client_message_free(msg);
return NULL;
}
break; break;
case SSH_FXP_RENAME: case SSH_FXP_RENAME:
case SSH_FXP_SYMLINK: case SSH_FXP_SYMLINK:
tmp=buffer_get_ssh_string(payload); tmp = buffer_get_ssh_string(payload);
msg->filename=string_to_char(tmp); if (tmp == NULL) {
free(tmp); sftp_client_message_free(msg);
msg->data=buffer_get_ssh_string(payload); return NULL;
}
msg->filename = string_to_char(tmp);
string_free(tmp);
if (msg->filename == NULL) {
sftp_client_message_free(msg);
return NULL;
}
msg->data = buffer_get_ssh_string(payload);
if (msg->data == NULL) {
sftp_client_message_free(msg);
return NULL;
}
break; break;
case SSH_FXP_MKDIR: case SSH_FXP_MKDIR:
case SSH_FXP_SETSTAT: case SSH_FXP_SETSTAT:
tmp=buffer_get_ssh_string(payload); tmp = buffer_get_ssh_string(payload);
if (tmp == NULL) {
sftp_client_message_free(msg);
return NULL;
}
msg->filename=string_to_char(tmp); msg->filename=string_to_char(tmp);
free(tmp); string_free(tmp);
msg->attr=sftp_parse_attr(sftp, payload,0); if (msg->filename == NULL) {
sftp_client_message_free(msg);
return NULL;
}
msg->attr = sftp_parse_attr(sftp, payload, 0);
if (msg->attr == NULL) {
sftp_client_message_free(msg);
return NULL;
}
break; break;
case SSH_FXP_FSETSTAT: case SSH_FXP_FSETSTAT:
msg->handle=buffer_get_ssh_string(payload); msg->handle = buffer_get_ssh_string(payload);
msg->attr=sftp_parse_attr(sftp, payload,0); if (msg->handle == NULL) {
sftp_client_message_free(msg);
return NULL;
}
msg->attr = sftp_parse_attr(sftp, payload, 0);
if (msg->attr == NULL) {
sftp_client_message_free(msg);
return NULL;
}
break; break;
case SSH_FXP_LSTAT: case SSH_FXP_LSTAT:
case SSH_FXP_STAT: case SSH_FXP_STAT:
tmp=buffer_get_ssh_string(payload); tmp = buffer_get_ssh_string(payload);
msg->filename=string_to_char(tmp); if (tmp == NULL) {
free(tmp); sftp_client_message_free(msg);
if(sftp->version >3) return NULL;
}
msg->filename = string_to_char(tmp);
string_free(tmp);
if (msg->filename == NULL) {
sftp_client_message_free(msg);
return NULL;
}
if(sftp->version > 3) {
buffer_get_u32(payload,&msg->flags); buffer_get_u32(payload,&msg->flags);
}
break; break;
case SSH_FXP_OPEN: case SSH_FXP_OPEN:
tmp=buffer_get_ssh_string(payload); tmp=buffer_get_ssh_string(payload);
msg->filename=string_to_char(tmp); if (tmp == NULL) {
free(tmp); sftp_client_message_free(msg);
return NULL;
}
msg->filename = string_to_char(tmp);
string_free(tmp);
if (msg->filename == NULL) {
sftp_client_message_free(msg);
return NULL;
}
buffer_get_u32(payload,&msg->flags); buffer_get_u32(payload,&msg->flags);
msg->attr=sftp_parse_attr(sftp, payload,0); msg->attr = sftp_parse_attr(sftp, payload, 0);
if (msg->attr == NULL) {
sftp_client_message_free(msg);
return NULL;
}
case SSH_FXP_FSTAT: case SSH_FXP_FSTAT:
msg->handle=buffer_get_ssh_string(payload); msg->handle = buffer_get_ssh_string(payload);
buffer_get_u32(payload,&msg->flags); if (msg->handle == NULL) {
sftp_client_message_free(msg);
return NULL;
}
buffer_get_u32(payload, &msg->flags);
break; break;
default: default:
printf("Received handled sftp message %d\n",msg->type); fprintf(stderr, "Received unhandled sftp message %d\n", msg->type);
} }
msg->flags=ntohl(msg->flags);
msg->offset=ntohll(msg->offset); msg->flags = ntohl(msg->flags);
msg->len=ntohl(msg->len); msg->offset = ntohll(msg->offset);
msg->len = ntohl(msg->len);
sftp_packet_free(packet); sftp_packet_free(packet);
return msg; return msg;
} }
void sftp_client_message_free(SFTP_CLIENT_MESSAGE *msg){ void sftp_client_message_free(SFTP_CLIENT_MESSAGE *msg) {
if(msg->filename) if(msg->filename)
free(msg->filename); free(msg->filename);
if(msg->data) if(msg->data)