[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Flushing ssh_channel_write() ?


Hi,

I would like to propose to add a new function to the API, so an
application can ensure its data gets sent:
int ssh_blocking_flush(ssh_session session)

Please see the attached patch.

It would be great if this could be included in the upcoming 0.5
release. I know its late in the cycle, but since it only adds a
function, it can't break any existing code.

Regards,
Jan


Jan Willamowius wrote:
> Hi,
> 
> while implementing my ssh server (with a 0.5 snapshot), I noticed that
> data sent to the client with ssh_channel_write() doesn't seem to be sent
> out immediately. Sometimes it only appears in the client when the client
> presses another key.
> 
> Is there a way to flush the data written with ssh_ channel_write() to
> make sure it gets sent ?
> 
> samplesshd doesn't have this issue, but my server doesn't enter
> ssh_channel_read immediately after ssh_channel_write(). It only
> does so when the client socket has new data to be read.
> 
> Thanks,
> Jan
> 
> -- 
> Jan Willamowius, jan@xxxxxxxxxxxxxx, http://www.gnugk.org/

-- 
Jan Willamowius, jan@xxxxxxxxxxxxxx, http://www.gnugk.org/
--- include/libssh/libssh.h	2011-03-21 13:45:16.000000000 +0100
+++ ../orig/include/libssh/libssh.h	2011-03-09 18:33:49.000000000 +0100
@@ -386,7 +386,6 @@
 LIBSSH_API int ssh_get_status(ssh_session session);
 LIBSSH_API int ssh_init(void);
 LIBSSH_API int ssh_is_blocking(ssh_session session);
-LIBSSH_API int ssh_blocking_flush(ssh_session session);
 LIBSSH_API int ssh_is_connected(ssh_session session);
 LIBSSH_API int ssh_is_server_known(ssh_session session);
 LIBSSH_API void ssh_log(ssh_session session, int prioriry, const char *format, ...) PRINTF_ATTRIBUTE(3, 4);
--- src/socket.c	2011-03-21 13:55:20.000000000 +0100
+++ ../v0-5/src/socket.c	2011-03-09 18:33:49.000000000 +0100
@@ -558,53 +558,11 @@
       ssh_set_error_oom(s->session);
       return SSH_ERROR;
     }
-	ssh_socket_nonblocking_flush(s);
+    ssh_socket_nonblocking_flush(s);
   }
   leave_function();
   return SSH_OK;
 }
-
-/**
- * \brief possibly blocking flush of the output buffer
- *
- */
-int ssh_blocking_flush(ssh_session session) {
-  ssh_socket s = session->socket;
-  uint32_t len;
-  int w;
-
-  enter_function();
-
-  if (!ssh_socket_is_open(s)) {
-    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(s->last_errno));
-
-    leave_function();
-    return SSH_ERROR;
-  }
-
-  len = buffer_get_rest_len(s->out_buffer);
-  w = ssh_socket_unbuffered_write(s, buffer_get_rest(s->out_buffer), len);
-  if (w < 0) {
-    session->alive = 0;
-    ssh_socket_close(s);
-    /* FIXME use ssh_socket_get_errno() */
-    /* FIXME use callback for errors */
-    ssh_set_error(session, SSH_FATAL,
-        "Writing packet: error on socket (or connection closed): %s",
-        strerror(s->last_errno));
-    leave_function();
-    return SSH_ERROR;
-  }
-  buffer_pass_bytes(s->out_buffer, w);
-
-  /* all data written */
-  leave_function();
-  return SSH_OK;
-}
 
 
 /** \internal

Follow-Ups:
Re: Flushing ssh_channel_write() ?Aris Adamantiadis <aris@xxxxxxxxxxxx>
Archive administrator: postmaster@lists.cynapses.org