1
1
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@189 7dcaeef0-15fb-0310-b436-a5af3365683c
Этот коммит содержится в:
Aris Adamantiadis 2008-11-05 16:45:37 +00:00
родитель 11e3d3ebab
Коммит 14c66c9bc5

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

@ -1056,7 +1056,7 @@ u32 sftp_async_read_begin(SFTP_FILE *file, int len){
SFTP_SESSION *sftp=file->sftp; SFTP_SESSION *sftp=file->sftp;
BUFFER *buffer; BUFFER *buffer;
u32 id; u32 id;
sftp_function_start(); sftp_enter_function();
buffer=buffer_new(); buffer=buffer_new();
id=sftp_get_new_id(sftp); id=sftp_get_new_id(sftp);
buffer_add_u32(buffer,id); buffer_add_u32(buffer,id);
@ -1066,7 +1066,7 @@ u32 sftp_async_read_begin(SFTP_FILE *file, int len){
sftp_packet_write(sftp,SSH_FXP_READ,buffer); sftp_packet_write(sftp,SSH_FXP_READ,buffer);
buffer_free(buffer); buffer_free(buffer);
file->offset += len; // assume we'll read len bytes file->offset += len; // assume we'll read len bytes
sftp_function_end(); sftp_leave_function();
return id; return id;
} }
@ -1091,9 +1091,9 @@ int sftp_async_read(SFTP_FILE *file, void *data, int size, u32 id){
STRING *datastring; STRING *datastring;
int err=0; int err=0;
int len; int len;
sftp_function_start(); sftp_enter_function();
if(file->eof){ if(file->eof){
sftp_function_end(); sftp_leave_function();
return 0; return 0;
} }
@ -1105,38 +1105,43 @@ int sftp_async_read(SFTP_FILE *file, void *data, int size, u32 id){
return SSH_AGAIN; return SSH_AGAIN;
} }
} }
if(sftp_read_and_dispatch(sftp)) if(sftp_read_and_dispatch(sftp)){
/* something nasty has happened */ /* something nasty has happened */
return -1; sftp_leave_function();
return SSH_ERROR;
}
msg=sftp_dequeue(sftp,id); msg=sftp_dequeue(sftp,id);
} }
switch (msg->packet_type){ switch (msg->packet_type){
case SSH_FXP_STATUS: case SSH_FXP_STATUS:
status=parse_status_msg(msg); status=parse_status_msg(msg);
sftp_message_free(msg); sftp_message_free(msg);
if(!status) if(!status){
sftp_leave_function();
return -1; return -1;
}
if(status->status != SSH_FX_EOF){ if(status->status != SSH_FX_EOF){
ssh_set_error(sftp->session,SSH_REQUEST_DENIED,"sftp server : %s",status->errormsg); ssh_set_error(sftp->session,SSH_REQUEST_DENIED,"sftp server : %s",status->errormsg);
sftp_leave_function();
err=-1; err=-1;
} else } else
file->eof=1; file->eof=1;
status_msg_free(status); status_msg_free(status);
sftp_function_end(); sftp_leave_function();
return err?err:0; return err?err:0;
case SSH_FXP_DATA: case SSH_FXP_DATA:
datastring=buffer_get_ssh_string(msg->payload); datastring=buffer_get_ssh_string(msg->payload);
sftp_message_free(msg); sftp_message_free(msg);
if(!datastring){ if(!datastring){
ssh_set_error(sftp->session,SSH_FATAL,"Received invalid DATA packet from sftp server"); ssh_set_error(sftp->session,SSH_FATAL,"Received invalid DATA packet from sftp server");
sftp_function_end(); sftp_leave_function();
return -1; return -1;
} }
if(string_len(datastring)>size){ if(string_len(datastring)>size){
ssh_set_error(sftp->session,SSH_FATAL,"Received a too big DATA packet from sftp server : %d and asked for %d", ssh_set_error(sftp->session,SSH_FATAL,"Received a too big DATA packet from sftp server : %d and asked for %d",
string_len(datastring),size); string_len(datastring),size);
free(datastring); free(datastring);
sftp_function_end(); sftp_leave_function();
return SSH_ERROR; return SSH_ERROR;
} }
len=string_len(datastring); len=string_len(datastring);
@ -1145,14 +1150,15 @@ int sftp_async_read(SFTP_FILE *file, void *data, int size, u32 id){
* and effective lengths are different */ * and effective lengths are different */
memcpy(data,datastring->string,len); memcpy(data,datastring->string,len);
free(datastring); free(datastring);
sftp_function_end(); sftp_leave_function();
return len; return len;
default: default:
ssh_set_error(sftp->session,SSH_FATAL,"Received message %d during read!",msg->packet_type); ssh_set_error(sftp->session,SSH_FATAL,"Received message %d during read!",msg->packet_type);
sftp_message_free(msg); sftp_message_free(msg);
sftp_function_end(); sftp_leave_function();
return SSH_ERROR; return SSH_ERROR;
} }
sftp_leave_function();
} }
int sftp_write(SFTP_FILE *file, void *data, int len){ int sftp_write(SFTP_FILE *file, void *data, int len){