aboutsummaryrefslogtreecommitdiff
path: root/libssh/sftp.c
diff options
context:
space:
mode:
authorAndreas Schneider <mail@cynapses.org>2009-04-23 09:09:36 +0000
committerAndreas Schneider <mail@cynapses.org>2009-04-23 09:09:36 +0000
commitcedc9d71c3853eb8ee79791461a6ad84ebe78576 (patch)
tree2378bef500c3020489b1dad70c2a5265b3ae0c0c /libssh/sftp.c
parent39f8c7faab2f2d76428ec9cca05380922bbd73aa (diff)
downloadlibssh-cedc9d71c3853eb8ee79791461a6ad84ebe78576.tar.gz
libssh-cedc9d71c3853eb8ee79791461a6ad84ebe78576.tar.xz
libssh-cedc9d71c3853eb8ee79791461a6ad84ebe78576.zip
Improve sftp_opendir().
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@590 7dcaeef0-15fb-0310-b436-a5af3365683c
Diffstat (limited to 'libssh/sftp.c')
-rw-r--r--libssh/sftp.c132
1 files changed, 80 insertions, 52 deletions
diff --git a/libssh/sftp.c b/libssh/sftp.c
index 5953429e..42dd7260 100644
--- a/libssh/sftp.c
+++ b/libssh/sftp.c
@@ -665,60 +665,88 @@ static SFTP_FILE *parse_handle_msg(SFTP_MESSAGE *msg){
/* Open a directory */
SFTP_DIR *sftp_opendir(SFTP_SESSION *sftp, const char *path){
- SFTP_DIR *dir=NULL;
- SFTP_FILE *file;
- STATUS_MESSAGE *status;
- SFTP_MESSAGE *msg=NULL;
- STRING *path_s;
- BUFFER *payload=buffer_new();
- u32 id=sftp_get_new_id(sftp);
- buffer_add_u32(payload,id);
- path_s=string_from_char(path);
- buffer_add_ssh_string(payload,path_s);
- free(path_s);
- sftp_packet_write(sftp,SSH_FXP_OPENDIR,payload);
+ SFTP_MESSAGE *msg = NULL;
+ SFTP_FILE *file = NULL;
+ SFTP_DIR *dir = NULL;
+ STATUS_MESSAGE *status;
+ STRING *path_s;
+ BUFFER *payload;
+ u32 id;
+
+ payload = buffer_new();
+ if (payload == NULL) {
+ return NULL;
+ }
+
+ path_s = string_from_char(path);
+ if (path_s == NULL) {
buffer_free(payload);
- while(!msg){
- if(sftp_read_and_dispatch(sftp))
- /* something nasty has happened */
- return NULL;
- msg=sftp_dequeue(sftp,id);
- }
- switch (msg->packet_type){
- case SSH_FXP_STATUS:
- status=parse_status_msg(msg);
- sftp_message_free(msg);
- if(!status)
- return NULL;
- sftp_set_error(sftp, status->status);
- ssh_set_error(sftp->session,SSH_REQUEST_DENIED,"sftp server : %s",status->errormsg);
- status_msg_free(status);
- return NULL;
- case SSH_FXP_HANDLE:
- file=parse_handle_msg(msg);
- sftp_message_free(msg);
- if (file) {
- dir = malloc(sizeof(SFTP_DIR));
- if (dir == NULL) {
- return NULL;
- }
- memset(dir,0,sizeof(*dir));
- dir->sftp=sftp;
- dir->name = strdup(path);
- if (dir->name == NULL) {
- SAFE_FREE(dir);
- SAFE_FREE(file);
- return NULL;
- }
- dir->handle=file->handle;
- free(file);
- }
- return dir;
- default:
- ssh_set_error(sftp->session,SSH_FATAL,"Received message %d during opendir!",msg->packet_type);
- sftp_message_free(msg);
- }
return NULL;
+ }
+
+ id = sftp_get_new_id(sftp);
+ if (buffer_add_u32(payload, id) < 0 ||
+ buffer_add_ssh_string(payload, path_s) < 0) {
+ buffer_free(payload);
+ string_free(path_s);
+ return NULL;
+ }
+ string_free(path_s);
+
+ if (sftp_packet_write(sftp, SSH_FXP_OPENDIR, payload) < 0) {
+ buffer_free(payload);
+ return NULL;
+ }
+ buffer_free(payload);
+
+ while (msg == NULL) {
+ if (sftp_read_and_dispatch(sftp) < 0) {
+ /* something nasty has happened */
+ return NULL;
+ }
+ msg = sftp_dequeue(sftp, id);
+ }
+
+ switch (msg->packet_type) {
+ case SSH_FXP_STATUS:
+ status = parse_status_msg(msg);
+ sftp_message_free(msg);
+ if (status == NULL) {
+ return NULL;
+ }
+ sftp_set_error(sftp, status->status);
+ ssh_set_error(sftp->session, SSH_REQUEST_DENIED,
+ "SFTP server: %s", status->errormsg);
+ status_msg_free(status);
+ return NULL;
+ case SSH_FXP_HANDLE:
+ file = parse_handle_msg(msg);
+ sftp_message_free(msg);
+ if (file != NULL) {
+ dir = malloc(sizeof(SFTP_DIR));
+ if (dir == NULL) {
+ return NULL;
+ }
+ ZERO_STRUCTP(dir);
+
+ dir->sftp = sftp;
+ dir->name = strdup(path);
+ if (dir->name == NULL) {
+ SAFE_FREE(dir);
+ SAFE_FREE(file);
+ return NULL;
+ }
+ dir->handle = file->handle;
+ SAFE_FREE(file);
+ }
+ return dir;
+ default:
+ ssh_set_error(sftp->session, SSH_FATAL,
+ "Received message %d during opendir!", msg->packet_type);
+ sftp_message_free(msg);
+ }
+
+ return NULL;
}
/* parse the attributes from a payload from some messages */