aboutsummaryrefslogtreecommitdiff
path: root/libssh/sftp.c
diff options
context:
space:
mode:
authorAndreas Schneider <mail@cynapses.org>2009-04-23 12:21:30 +0000
committerAndreas Schneider <mail@cynapses.org>2009-04-23 12:21:30 +0000
commit441929f8b8583b8b5e2dbb2228bfc8bd556fb24e (patch)
treef8b0d3f9c6a2e9629067da73e9cba257bfc1191c /libssh/sftp.c
parent75da13532472350d1c5bb3369e88fd78cd090e28 (diff)
downloadlibssh-441929f8b8583b8b5e2dbb2228bfc8bd556fb24e.tar.gz
libssh-441929f8b8583b8b5e2dbb2228bfc8bd556fb24e.tar.xz
libssh-441929f8b8583b8b5e2dbb2228bfc8bd556fb24e.zip
Reformat sftp_dir_eof().
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@596 7dcaeef0-15fb-0310-b436-a5af3365683c
Diffstat (limited to 'libssh/sftp.c')
-rw-r--r--libssh/sftp.c160
1 files changed, 97 insertions, 63 deletions
diff --git a/libssh/sftp.c b/libssh/sftp.c
index 0780989a..b3c2f79f 100644
--- a/libssh/sftp.c
+++ b/libssh/sftp.c
@@ -1130,76 +1130,110 @@ int sftp_server_version(SFTP_SESSION *sftp) {
}
/* Get a single file attributes structure of a directory. */
-SFTP_ATTRIBUTES *sftp_readdir(SFTP_SESSION *sftp, SFTP_DIR *dir){
- BUFFER *payload;
- u32 id;
- SFTP_MESSAGE *msg=NULL;
- STATUS_MESSAGE *status;
- SFTP_ATTRIBUTES *attr;
- if(!dir->buffer){
- payload=buffer_new();
- id=sftp_get_new_id(sftp);
- buffer_add_u32(payload,id);
- buffer_add_ssh_string(payload,dir->handle);
- sftp_packet_write(sftp,SSH_FXP_READDIR,payload);
- buffer_free(payload);
- ssh_log(sftp->session, SSH_LOG_PACKET,
- "Sent a ssh_fxp_readdir with id %d", id);
- 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);
- switch (status->status) {
- case SSH_FX_EOF:
- dir->eof = 1;
- status_msg_free(status);
- return NULL;
- default:
- break;
- }
- ssh_set_error(sftp->session,SSH_FATAL,"Unknown error status : %d",status->status);
- status_msg_free(status);
- return NULL;
- case SSH_FXP_NAME:
- buffer_get_u32(msg->payload,&dir->count);
- dir->count=ntohl(dir->count);
- dir->buffer=msg->payload;
- msg->payload=NULL;
- sftp_message_free(msg);
- break;
- default:
- ssh_set_error(sftp->session,SSH_FATAL,"unsupported message back %d",msg->packet_type);
- sftp_message_free(msg);
- return NULL;
- }
+SFTP_ATTRIBUTES *sftp_readdir(SFTP_SESSION *sftp, SFTP_DIR *dir) {
+ SFTP_MESSAGE *msg = NULL;
+ STATUS_MESSAGE *status;
+ SFTP_ATTRIBUTES *attr;
+ BUFFER *payload;
+ u32 id;
+
+ if (dir->buffer == NULL) {
+ payload = buffer_new();
+ if (payload == NULL) {
+ return NULL;
}
- /* now dir->buffer contains a buffer and dir->count != 0 */
- if(dir->count==0){
- ssh_set_error(sftp->session,SSH_FATAL,"Count of files sent by the server is zero, which is invalid, or libsftp bug");
+
+ id = sftp_get_new_id(sftp);
+ if (buffer_add_u32(payload, id) < 0 ||
+ buffer_add_ssh_string(payload, dir->handle) < 0) {
+ buffer_free(payload);
+ return NULL;
+ }
+
+ if (sftp_packet_write(sftp, SSH_FXP_READDIR, payload) < 0) {
+ buffer_free(payload);
+ return NULL;
+ }
+ buffer_free(payload);
+
+ ssh_log(sftp->session, SSH_LOG_PACKET,
+ "Sent a ssh_fxp_readdir with id %d", id);
+
+ while (msg == NULL) {
+ if (sftp_read_and_dispatch(sftp) < 0) {
+ /* something nasty has happened */
return NULL;
+ }
+ msg = sftp_dequeue(sftp, id);
}
- ssh_log(sftp->session, SSH_LOG_RARE, "Count is %d", dir->count);
- attr=sftp_parse_attr(sftp,dir->buffer,1);
- dir->count--;
- if(dir->count==0){
- buffer_free(dir->buffer);
- dir->buffer=NULL;
+
+ 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);
+ switch (status->status) {
+ case SSH_FX_EOF:
+ dir->eof = 1;
+ status_msg_free(status);
+ return NULL;
+ default:
+ break;
+ }
+
+ ssh_set_error(sftp->session, SSH_FATAL,
+ "Unknown error status: %d", status->status);
+ status_msg_free(status);
+
+ return NULL;
+ case SSH_FXP_NAME:
+ buffer_get_u32(msg->payload, &dir->count);
+ dir->count = ntohl(dir->count);
+ dir->buffer = msg->payload;
+ msg->payload = NULL;
+ sftp_message_free(msg);
+ break;
+ default:
+ ssh_set_error(sftp->session, SSH_FATAL,
+ "Unsupported message back %d", msg->packet_type);
+ sftp_message_free(msg);
+
+ return NULL;
}
- return attr;
+ }
+
+ /* now dir->buffer contains a buffer and dir->count != 0 */
+ if (dir->count == 0) {
+ ssh_set_error(sftp->session, SSH_FATAL,
+ "Count of files sent by the server is zero, which is invalid, or "
+ "libsftp bug");
+ return NULL;
+ }
+
+ ssh_log(sftp->session, SSH_LOG_RARE, "Count is %d", dir->count);
+
+ attr = sftp_parse_attr(sftp, dir->buffer, 1);
+ if (attr == NULL) {
+ ssh_set_error(sftp->session, SSH_FATAL,
+ "Couldn't parse the SFTP attributes");
+ return NULL;
+ }
+
+ dir->count--;
+ if (dir->count == 0) {
+ buffer_free(dir->buffer);
+ dir->buffer = NULL;
+ }
+
+ return attr;
}
/* Tell if the directory has reached EOF (End Of File). */
-int sftp_dir_eof(SFTP_DIR *dir){
- return (dir->eof);
+int sftp_dir_eof(SFTP_DIR *dir) {
+ return dir->eof;
}
/* Free a SFTP_ATTRIBUTE handle */