aboutsummaryrefslogtreecommitdiff
path: root/libssh/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'libssh/socket.c')
-rw-r--r--libssh/socket.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/libssh/socket.c b/libssh/socket.c
index af32c39..b40bf1b 100644
--- a/libssh/socket.c
+++ b/libssh/socket.c
@@ -66,6 +66,7 @@ enum ssh_socket_states_e {
struct ssh_socket_struct {
socket_t fd_in;
socket_t fd_out;
+ int fd_is_socket;
int last_errno;
int data_to_read; /* reading now on socket will
not block */
@@ -113,6 +114,7 @@ ssh_socket ssh_socket_new(ssh_session session) {
s->fd_in = -1;
s->fd_out= -1;
s->last_errno = -1;
+ s->fd_is_socket = 1;
s->session = session;
s->in_buffer = buffer_new();
if (s->in_buffer == NULL) {
@@ -391,8 +393,10 @@ static int ssh_socket_unbuffered_read(ssh_socket s, void *buffer, uint32_t len)
if (s->data_except) {
return -1;
}
-
- rc = recv(s->fd_in,buffer, len, 0);
+ if(s->fd_is_socket)
+ rc = recv(s->fd_in,buffer, len, 0);
+ else
+ rc = read(s->fd_in,buffer, len);
#ifdef _WIN32
s->last_errno = WSAGetLastError();
#else
@@ -417,8 +421,10 @@ static int ssh_socket_unbuffered_write(ssh_socket s, const void *buffer,
if (s->data_except) {
return -1;
}
-
- w = send(s->fd_out,buffer, len, 0);
+ if (s->fd_is_socket)
+ w = send(s->fd_out,buffer, len, 0);
+ else
+ w = write(s->fd_out, buffer, len);
#ifdef _WIN32
s->last_errno = WSAGetLastError();
#else
@@ -936,6 +942,7 @@ int ssh_socket_connect_proxycommand(ssh_socket s, const char *command){
ssh_socket_set_fd_in(s,in_pipe[0]);
ssh_socket_set_fd_out(s,out_pipe[1]);
s->state=SSH_SOCKET_CONNECTED;
+ s->fd_is_socket=0;
/* POLLOUT is the event to wait for in a nonblocking connect */
ssh_poll_set_events(ssh_socket_get_poll_handle_in(s),POLLIN | POLLERR);
ssh_poll_set_events(ssh_socket_get_poll_handle_out(s),POLLOUT);