Improve sftp_get_client_message.
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@620 7dcaeef0-15fb-0310-b436-a5af3365683c
Этот коммит содержится в:
родитель
72aeba410f
Коммит
1f6341f549
@ -27,103 +27,190 @@
|
|||||||
#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_PACKET *packet;
|
||||||
|
SFTP_CLIENT_MESSAGE *msg;
|
||||||
|
BUFFER *payload;
|
||||||
|
STRING *tmp;
|
||||||
|
|
||||||
SFTP_CLIENT_MESSAGE *sftp_get_client_message(SFTP_SESSION *sftp){
|
msg = malloc(sizeof (SFTP_CLIENT_MESSAGE));
|
||||||
SFTP_PACKET *packet;
|
if (msg == NULL) {
|
||||||
SFTP_CLIENT_MESSAGE *msg;
|
return NULL;
|
||||||
BUFFER *payload;
|
}
|
||||||
STRING *tmp;
|
ZERO_STRUCTP(msg);
|
||||||
|
|
||||||
msg = malloc(sizeof (SFTP_CLIENT_MESSAGE));
|
packet = sftp_packet_read(sftp);
|
||||||
if (msg == NULL) {
|
if (packet == NULL) {
|
||||||
return NULL;
|
sftp_client_message_free(msg);
|
||||||
}
|
return NULL;
|
||||||
memset(msg,0,sizeof(SFTP_CLIENT_MESSAGE));
|
}
|
||||||
|
|
||||||
packet = sftp_packet_read(sftp);
|
payload = packet->payload;
|
||||||
if (packet == NULL) {
|
msg->type = packet->type;
|
||||||
return NULL;
|
msg->sftp = sftp;
|
||||||
}
|
|
||||||
payload=packet->payload;
|
buffer_get_u32(payload, &msg->id);
|
||||||
msg->type=packet->type;
|
|
||||||
msg->sftp=sftp;
|
switch(msg->type) {
|
||||||
buffer_get_u32(payload,&msg->id);
|
case SSH_FXP_CLOSE:
|
||||||
switch(msg->type){
|
case SSH_FXP_READDIR:
|
||||||
case SSH_FXP_CLOSE:
|
msg->handle = buffer_get_ssh_string(payload);
|
||||||
case SSH_FXP_READDIR:
|
if (msg->handle == NULL) {
|
||||||
msg->handle=buffer_get_ssh_string(payload);
|
sftp_client_message_free(msg);
|
||||||
break;
|
return NULL;
|
||||||
case SSH_FXP_READ:
|
}
|
||||||
msg->handle=buffer_get_ssh_string(payload);
|
break;
|
||||||
buffer_get_u64(payload,&msg->offset);
|
case SSH_FXP_READ:
|
||||||
buffer_get_u32(payload,&msg->len);
|
msg->handle = buffer_get_ssh_string(payload);
|
||||||
break;
|
if (msg->handle == NULL) {
|
||||||
case SSH_FXP_WRITE:
|
sftp_client_message_free(msg);
|
||||||
msg->handle=buffer_get_ssh_string(payload);
|
return NULL;
|
||||||
buffer_get_u64(payload,&msg->offset);
|
}
|
||||||
msg->data=buffer_get_ssh_string(payload);
|
buffer_get_u64(payload, &msg->offset);
|
||||||
break;
|
buffer_get_u32(payload, &msg->len);
|
||||||
case SSH_FXP_REMOVE:
|
break;
|
||||||
case SSH_FXP_RMDIR:
|
case SSH_FXP_WRITE:
|
||||||
case SSH_FXP_OPENDIR:
|
msg->handle = buffer_get_ssh_string(payload);
|
||||||
case SSH_FXP_READLINK:
|
if (msg->handle == NULL) {
|
||||||
case SSH_FXP_REALPATH:
|
sftp_client_message_free(msg);
|
||||||
tmp=buffer_get_ssh_string(payload);
|
return NULL;
|
||||||
msg->filename=string_to_char(tmp);
|
}
|
||||||
free(tmp);
|
buffer_get_u64(payload, &msg->offset);
|
||||||
break;
|
msg->data = buffer_get_ssh_string(payload);
|
||||||
case SSH_FXP_RENAME:
|
if (msg->data == NULL) {
|
||||||
case SSH_FXP_SYMLINK:
|
sftp_client_message_free(msg);
|
||||||
tmp=buffer_get_ssh_string(payload);
|
return NULL;
|
||||||
msg->filename=string_to_char(tmp);
|
}
|
||||||
free(tmp);
|
break;
|
||||||
msg->data=buffer_get_ssh_string(payload);
|
case SSH_FXP_REMOVE:
|
||||||
break;
|
case SSH_FXP_RMDIR:
|
||||||
case SSH_FXP_MKDIR:
|
case SSH_FXP_OPENDIR:
|
||||||
case SSH_FXP_SETSTAT:
|
case SSH_FXP_READLINK:
|
||||||
tmp=buffer_get_ssh_string(payload);
|
case SSH_FXP_REALPATH:
|
||||||
msg->filename=string_to_char(tmp);
|
tmp = buffer_get_ssh_string(payload);
|
||||||
free(tmp);
|
if (tmp == NULL) {
|
||||||
msg->attr=sftp_parse_attr(sftp, payload,0);
|
sftp_client_message_free(msg);
|
||||||
break;
|
return NULL;
|
||||||
case SSH_FXP_FSETSTAT:
|
}
|
||||||
msg->handle=buffer_get_ssh_string(payload);
|
msg->filename = string_to_char(tmp);
|
||||||
msg->attr=sftp_parse_attr(sftp, payload,0);
|
string_free(tmp);
|
||||||
break;
|
if (msg->filename == NULL) {
|
||||||
case SSH_FXP_LSTAT:
|
sftp_client_message_free(msg);
|
||||||
case SSH_FXP_STAT:
|
return NULL;
|
||||||
tmp=buffer_get_ssh_string(payload);
|
}
|
||||||
msg->filename=string_to_char(tmp);
|
break;
|
||||||
free(tmp);
|
case SSH_FXP_RENAME:
|
||||||
if(sftp->version >3)
|
case SSH_FXP_SYMLINK:
|
||||||
buffer_get_u32(payload,&msg->flags);
|
tmp = buffer_get_ssh_string(payload);
|
||||||
break;
|
if (tmp == NULL) {
|
||||||
case SSH_FXP_OPEN:
|
sftp_client_message_free(msg);
|
||||||
tmp=buffer_get_ssh_string(payload);
|
return NULL;
|
||||||
msg->filename=string_to_char(tmp);
|
}
|
||||||
free(tmp);
|
msg->filename = string_to_char(tmp);
|
||||||
buffer_get_u32(payload,&msg->flags);
|
string_free(tmp);
|
||||||
msg->attr=sftp_parse_attr(sftp, payload,0);
|
if (msg->filename == NULL) {
|
||||||
case SSH_FXP_FSTAT:
|
sftp_client_message_free(msg);
|
||||||
msg->handle=buffer_get_ssh_string(payload);
|
return NULL;
|
||||||
buffer_get_u32(payload,&msg->flags);
|
}
|
||||||
break;
|
msg->data = buffer_get_ssh_string(payload);
|
||||||
default:
|
if (msg->data == NULL) {
|
||||||
printf("Received handled sftp message %d\n",msg->type);
|
sftp_client_message_free(msg);
|
||||||
}
|
return NULL;
|
||||||
msg->flags=ntohl(msg->flags);
|
}
|
||||||
msg->offset=ntohll(msg->offset);
|
break;
|
||||||
msg->len=ntohl(msg->len);
|
case SSH_FXP_MKDIR:
|
||||||
sftp_packet_free(packet);
|
case SSH_FXP_SETSTAT:
|
||||||
return msg;
|
tmp = buffer_get_ssh_string(payload);
|
||||||
|
if (tmp == NULL) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
msg->attr = sftp_parse_attr(sftp, payload, 0);
|
||||||
|
if (msg->attr == NULL) {
|
||||||
|
sftp_client_message_free(msg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SSH_FXP_FSETSTAT:
|
||||||
|
msg->handle = buffer_get_ssh_string(payload);
|
||||||
|
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;
|
||||||
|
case SSH_FXP_LSTAT:
|
||||||
|
case SSH_FXP_STAT:
|
||||||
|
tmp = buffer_get_ssh_string(payload);
|
||||||
|
if (tmp == NULL) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
if(sftp->version > 3) {
|
||||||
|
buffer_get_u32(payload,&msg->flags);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SSH_FXP_OPEN:
|
||||||
|
tmp=buffer_get_ssh_string(payload);
|
||||||
|
if (tmp == NULL) {
|
||||||
|
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);
|
||||||
|
msg->attr = sftp_parse_attr(sftp, payload, 0);
|
||||||
|
if (msg->attr == NULL) {
|
||||||
|
sftp_client_message_free(msg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
case SSH_FXP_FSTAT:
|
||||||
|
msg->handle = buffer_get_ssh_string(payload);
|
||||||
|
if (msg->handle == NULL) {
|
||||||
|
sftp_client_message_free(msg);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
buffer_get_u32(payload, &msg->flags);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "Received unhandled sftp message %d\n", msg->type);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg->flags = ntohl(msg->flags);
|
||||||
|
msg->offset = ntohll(msg->offset);
|
||||||
|
msg->len = ntohl(msg->len);
|
||||||
|
sftp_packet_free(packet);
|
||||||
|
|
||||||
|
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)
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user