diff options
author | Aris Adamantiadis <aris@0xbadc0de.be> | 2008-03-04 00:44:02 +0000 |
---|---|---|
committer | Aris Adamantiadis <aris@0xbadc0de.be> | 2008-03-04 00:44:02 +0000 |
commit | 077dd81fcc9453613de18c6d037ef61f3a8e161c (patch) | |
tree | 027bfb56ae17b1395100809a6ab791551ab8ca0e /libssh/packet.c | |
parent | 9b5f8935132433d64757ac60ce0ee4e8c59a8af8 (diff) | |
download | libssh-077dd81fcc9453613de18c6d037ef61f3a8e161c.tar.gz libssh-077dd81fcc9453613de18c6d037ef61f3a8e161c.tar.xz libssh-077dd81fcc9453613de18c6d037ef61f3a8e161c.zip |
added the socket class and created wrappers
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@137 7dcaeef0-15fb-0310-b436-a5af3365683c
Diffstat (limited to 'libssh/packet.c')
-rw-r--r-- | libssh/packet.c | 65 |
1 files changed, 22 insertions, 43 deletions
diff --git a/libssh/packet.c b/libssh/packet.c index 00f87f8..a4d0726 100644 --- a/libssh/packet.c +++ b/libssh/packet.c @@ -34,25 +34,7 @@ MA 02111-1307, USA. */ /* XXX include selected mac size */ static int macsize=SHA_DIGEST_LEN; -/* completeread will read blocking until len bytes have been read */ -static int completeread(int fd, void *buffer, int len){ - int r; - int total=0; - int toread=len; - if(fd<0) - return SSH_ERROR; - while((r=read(fd,buffer+total,toread))){ - if(r==-1) - return SSH_ERROR; - total += r; - toread-=r; - if(total==len) - return len; - if(r==0) - return 0; - } - return total ; /* connection closed */ -} + /* in nonblocking mode, socket_read will read as much as it can, and return */ /* SSH_OK if it has read at least len bytes, otherwise, SSH_AGAIN. */ @@ -71,13 +53,12 @@ static int socket_read(SSH_SESSION *session,int len){ return SSH_OK; if(session->blocking){ buf=malloc(to_read); - r=completeread(session->fd,buf,to_read); + r=ssh_socket_completeread(session->socket,buf,to_read); session->data_to_read=0; if(r==SSH_ERROR || r ==0){ ssh_set_error(session,SSH_FATAL, (r==0)?"Connection closed by remote host" : "Error reading socket"); - close(session->fd); - session->fd=-1; + ssh_socket_close(session->socket); session->alive=0; session->data_except=1; return SSH_ERROR; @@ -94,16 +75,14 @@ static int socket_read(SSH_SESSION *session,int len){ return SSH_AGAIN; session->data_to_read=0; /* read as much as we can */ - if(session->fd>0) - r=read(session->fd,buffer,sizeof(buffer)); + if(ssh_socket_is_open(session->socket)) + r=ssh_socket_read(session->socket,buffer,sizeof(buffer)); else r=-1; if(r<=0){ ssh_set_error(session,SSH_FATAL, (r==0)?"Connection closed by remote host" : "Error reading socket"); - if(session->fd>=0) - close(session->fd); - session->fd=-1; + ssh_socket_close(session->socket); session->data_except=1; session->alive=0; return SSH_ERROR; @@ -341,12 +320,13 @@ int packet_translate(SSH_SESSION *session){ return 0; } -static int atomic_write(int fd, void *buffer, int len){ +// FIXME moves it in socket.c and rename it ssh_socket_completewrite() +static int atomic_write(struct socket *s, void *buffer, int len){ int written; - if(fd<0) + if(!ssh_socket_is_open(s)) return SSH_ERROR; while(len >0) { - written=write(fd,buffer,len); + written=ssh_socket_write(s,buffer,len); if(written==0 || written==-1) return SSH_ERROR; len-=written; @@ -361,14 +341,15 @@ static int packet_nonblocking_flush(SSH_SESSION *session){ int except, can_write; int w; ssh_fd_poll(session,&can_write,&except); /* internally sets data_to_write */ - if(session->fd<0){ + if(!ssh_socket_is_open(session->socket)){ session->alive=0; + // FIXME use ssh_socket_get_errno ssh_set_error(session,SSH_FATAL,"Writing packet : error on socket (or connection closed): %s",strerror(errno)); return SSH_ERROR; } while(session->data_to_write && buffer_get_rest_len(session->out_socket_buffer)>0){ - if(session->fd>=0){ - w=write(session->fd,buffer_get_rest(session->out_socket_buffer), + if(ssh_socket_is_open(session->socket)){ + w=ssh_socket_write(session->socket,buffer_get_rest(session->out_socket_buffer), buffer_get_rest_len(session->out_socket_buffer)); session->data_to_write=0; } else @@ -377,8 +358,8 @@ static int packet_nonblocking_flush(SSH_SESSION *session){ session->data_to_write=0; session->data_except=1; session->alive=0; - close(session->fd); - session->fd=-1; + ssh_socket_close(session->socket); + // FIXME use ssh_socket_get_errno() ssh_set_error(session,SSH_FATAL,"Writing packet : error on socket (or connection closed): %s", strerror(errno)); return SSH_ERROR; @@ -394,7 +375,7 @@ static int packet_nonblocking_flush(SSH_SESSION *session){ /* blocking packet flush */ static int packet_blocking_flush(SSH_SESSION *session){ - if(session->fd<0) { + if(!ssh_socket_is_open(session->socket)) { session->alive=0; return SSH_ERROR; } @@ -402,13 +383,13 @@ static int packet_blocking_flush(SSH_SESSION *session){ return SSH_ERROR; if(buffer_get_rest(session->out_socket_buffer)==0) return SSH_OK; - if(atomic_write(session->fd,buffer_get_rest(session->out_socket_buffer), + if(atomic_write(session->socket,buffer_get_rest(session->out_socket_buffer), buffer_get_rest_len(session->out_socket_buffer))){ session->data_to_write=0; session->data_except=1; session->alive=0; - close(session->fd); - session->fd=-1; + ssh_socket_close(session->socket); + // FIXME use the proper errno ssh_set_error(session,SSH_FATAL,"Writing packet : error on socket (or connection closed): %s", strerror(errno)); return SSH_ERROR; @@ -545,8 +526,7 @@ void packet_parse(SSH_SESSION *session){ case SSH_MSG_DISCONNECT: ssh_say(2,"Received SSH_MSG_DISCONNECT\n"); ssh_set_error(session,SSH_FATAL,"Received SSH_MSG_DISCONNECT"); - close(session->fd); - session->fd=-1; + ssh_socket_close(session->socket); session->alive=0; return; case SSH_SMSG_STDOUT_DATA: @@ -572,8 +552,7 @@ void packet_parse(SSH_SESSION *session){ free(error_s); free(error); } - close(session->fd); - session->fd=-1; + ssh_socket_close(session->socket); session->alive=0; return; case SSH2_MSG_CHANNEL_WINDOW_ADJUST: |