1
1
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@617 7dcaeef0-15fb-0310-b436-a5af3365683c
Этот коммит содержится в:
Andreas Schneider 2009-04-27 10:42:39 +00:00
родитель 0eedebd84a
Коммит 99946c7bcc

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

@ -2340,37 +2340,50 @@ SFTP_ATTRIBUTES *sftp_lstat(SFTP_SESSION *session, const char *path) {
} }
SFTP_ATTRIBUTES *sftp_fstat(SFTP_FILE *file) { SFTP_ATTRIBUTES *sftp_fstat(SFTP_FILE *file) {
u32 id=sftp_get_new_id(file->sftp);
BUFFER *buffer=buffer_new();
SFTP_MESSAGE *msg=NULL;
STATUS_MESSAGE *status = NULL; STATUS_MESSAGE *status = NULL;
SFTP_ATTRIBUTES *pattr=NULL; SFTP_MESSAGE *msg = NULL;
BUFFER *buffer;
u32 id;
buffer_add_u32(buffer,id); buffer = buffer_new();
buffer_add_ssh_string(buffer,file->handle); if (buffer == NULL) {
sftp_packet_write(file->sftp,SSH_FXP_FSTAT,buffer);
buffer_free(buffer);
while(!msg){
if(sftp_read_and_dispatch(file->sftp))
return NULL; return NULL;
}
id = sftp_get_new_id(file->sftp);
if (buffer_add_u32(buffer, id) < 0 ||
buffer_add_ssh_string(buffer, file->handle) < 0 ||
sftp_packet_write(file->sftp, SSH_FXP_FSTAT, buffer) < 0) {
buffer_free(buffer);
return NULL;
}
buffer_free(buffer);
while (msg == NULL) {
if (sftp_read_and_dispatch(file->sftp) < 0) {
return NULL;
}
msg = sftp_dequeue(file->sftp, id); msg = sftp_dequeue(file->sftp, id);
} }
if (msg->packet_type == SSH_FXP_ATTRS){ if (msg->packet_type == SSH_FXP_ATTRS){
pattr=sftp_parse_attr(file->sftp,msg->payload,0); return sftp_parse_attr(file->sftp, msg->payload, 0);
return pattr; } else if (msg->packet_type == SSH_FXP_STATUS) {
}
if(msg->packet_type== 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 == NULL) {
return NULL; return NULL;
ssh_set_error(file->sftp->session,SSH_REQUEST_DENIED,"sftp server: %s",status->errormsg); }
ssh_set_error(file->sftp->session, SSH_REQUEST_DENIED,
"SFTP server: %s", status->errormsg);
status_msg_free(status); status_msg_free(status);
return NULL; return NULL;
} }
ssh_set_error(file->sftp->session, SSH_FATAL, ssh_set_error(file->sftp->session, SSH_FATAL,
"Received msg %d during fstat()", msg->packet_type); "Received msg %d during fstat()", msg->packet_type);
sftp_message_free(msg); sftp_message_free(msg);
return NULL; return NULL;
} }