[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] server: Add a ssh_send_keepalive() function
  [Thread Prev] | [Thread Next]
 
 
- Subject: Re: [PATCH] server: Add a ssh_send_keepalive() function
- From: Andreas Schneider <asn@xxxxxxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Sun, 03 Nov 2013 11:05:35 +0100
- To: libssh@xxxxxxxxxx
On Saturday 02 November 2013 22:33:42 Nicolas Viennot wrote:
> Implementation of a ssh_send_keepalive() function.
> Useful for keeping some client around as NATs may terminate connections.
Hi Nicolas,
did you check if/how the replies are handled? Also how do we find out if the 
client can handle it?
I would also see come code refactoring.
 
> Signed-off-by: Nicolas Viennot <nicolas@xxxxxxxxxxx>
> ---
>  include/libssh/server.h |  2 ++
>  src/server.c            | 34 ++++++++++++++++++++++++++++++++++
>  2 files changed, 36 insertions(+)
> 
> diff --git a/include/libssh/server.h b/include/libssh/server.h
> index dbffecd..9d095fe 100644
> --- a/include/libssh/server.h
> +++ b/include/libssh/server.h
> @@ -382,6 +382,8 @@ LIBSSH_API int ssh_channel_write_stderr(ssh_channel
> channel, const void *data, uint32_t len);
> 
> +LIBSSH_API int ssh_send_keepalive(ssh_session session);
> +
>  /* deprecated functions */
>  SSH_DEPRECATED LIBSSH_API int ssh_accept(ssh_session session);
>  SSH_DEPRECATED LIBSSH_API int channel_write_stderr(ssh_channel channel,
> diff --git a/src/server.c b/src/server.c
> index 0b62776..b31371f 100644
> --- a/src/server.c
> +++ b/src/server.c
> @@ -1221,6 +1221,40 @@ int ssh_execute_message_callbacks(ssh_session
> session){ return SSH_OK;
>  }
> 
> +
> +int ssh_send_keepalive(ssh_session session)
> +{
> +  struct ssh_string_struct *req;
> +  int reply = 1;
> +  int rc = SSH_ERROR;
> +
> +  req = ssh_string_from_char("keepalive@xxxxxxxxxxx");
> +  if (req == NULL) {
> +    ssh_set_error_oom(session);
> +    goto out;
> +  }
> +
> +  if (buffer_add_u8(session->out_buffer, SSH2_MSG_GLOBAL_REQUEST) < 0 ||
> +      buffer_add_ssh_string(session->out_buffer, req) < 0 ||
> +      buffer_add_u8(session->out_buffer, reply == 0 ? 0 : 1) < 0) {
> +    ssh_set_error_oom(session);
> +    goto out;
> +  }
I would like this to be more like:
     rc = buffer_add_u8(session->out_buffer, SSH2_MSG_GLOBAL_REQUEST);
     if (rc < 0) {
         ssh_set_error_oom(session);
		  goto error;
     }
     req = ssh_string_from_char("keepalive@xxxxxxxxxxx");
     if (req == NULL) {
         ssh_set_error_oom(session);
         goto error;
     }
     rc =  buffer_add_ssh_string(session->out_buffer, req);
     string_free(req);
     if (rc < 0) {
         ssh_set_error_oom(session);
         goto error;
     }
	...
error:
     buffer_reinit(session->out_buffer);
     return SSH_ERROR;
This way the code is easier to debug.
gdb$ print rc
> +
> +  if (packet_send(session) == SSH_ERROR)
> +    goto out;
Same here.
     rc = packet_send(session);
     if (rc == SSH_ERROR) {
         goto out;
     }
Please always add brackets. We learned it the hard way in Samba. We had too 
many bugs cause of missing brackets.
> +
> +  ssh_handle_packets(session, 0);
> +
> +  SSH_LOG(SSH_LOG_PACKET, "Sent a keepalive");
> +  rc = SSH_OK;
> +
> +out:
> +  ssh_string_free(req);
> +  return rc;
> +}
> +
>  /** @} */
> 
>  /* vim: set ts=4 sw=4 et cindent: */
| Re: [PATCH] server: Add a ssh_send_keepalive() function | Nicolas Viennot <nicolas@xxxxxxxxxxx> | 
| [PATCH] server: Add a ssh_send_keepalive() function | Nicolas Viennot <nicolas@xxxxxxxxxxx> | 

