diff options
author | Aris Adamantiadis <aris@0xbadc0de.be> | 2010-10-19 23:51:07 +0200 |
---|---|---|
committer | Aris Adamantiadis <aris@0xbadc0de.be> | 2010-10-19 23:51:32 +0200 |
commit | 8e2699e16139c8efdc54a06471de29966ccc233a (patch) | |
tree | 17e515f791fa431d6c9b7726e530786691c07156 | |
parent | 01eb20e13f0c7be95a58a1022e214df269168281 (diff) | |
download | libssh-8e2699e16139c8efdc54a06471de29966ccc233a.tar.gz libssh-8e2699e16139c8efdc54a06471de29966ccc233a.tar.xz libssh-8e2699e16139c8efdc54a06471de29966ccc233a.zip |
start of work to have callbackbased ssh_bind
-rw-r--r-- | include/libssh/priv.h | 6 | ||||
-rw-r--r-- | include/libssh/server.h | 31 | ||||
-rw-r--r-- | src/options.c | 70 | ||||
-rw-r--r-- | src/server.c | 68 |
4 files changed, 139 insertions, 36 deletions
diff --git a/include/libssh/priv.h b/include/libssh/priv.h index a35aa090..4d00a0cb 100644 --- a/include/libssh/priv.h +++ b/include/libssh/priv.h @@ -147,7 +147,10 @@ struct ssh_bind_struct { struct error_struct error; ssh_callbacks callbacks; /* Callbacks to user functions */ + struct ssh_bind_callbacks_struct *bind_callbacks; + void *bind_callbacks_userdata; + struct ssh_poll_handle_struct *poll; /* options */ char *wanted_methods[10]; char *banner; @@ -162,6 +165,9 @@ struct ssh_bind_struct { int toaccept; }; +struct ssh_poll_handle_struct *ssh_bind_get_poll(struct ssh_bind_struct + *sshbind); + SSH_PACKET_CALLBACK(ssh_packet_disconnect_callback); SSH_PACKET_CALLBACK(ssh_packet_ignore_callback); diff --git a/include/libssh/server.h b/include/libssh/server.h index 048abcdc..12f64803 100644 --- a/include/libssh/server.h +++ b/include/libssh/server.h @@ -48,9 +48,35 @@ enum ssh_bind_options_e { SSH_BIND_OPTIONS_LOG_VERBOSITY_STR }; -//typedef struct ssh_bind_struct SSH_BIND; + + typedef struct ssh_bind_struct* ssh_bind; +/* callback functions */ + +/** + * @brief Incoming connection callback. This callback is called when a ssh_bind + * has a new incoming connection. + * @param sshbind Current sshbind session handler + * @param message the actual message + * @param userdata Userdata to be passed to the callback function. + */ +typedef void (*ssh_bind_incoming_connection_callback) (ssh_bind sshbind, + void *userdata); + +/** + * These are the callbacks exported by the ssh_bind structure + * They are called by the server module when events appear on the network + */ + +struct ssh_bind_callbacks_struct { + /** DON'T SET THIS use ssh_callbacks_init() instead. */ + size_t size; + /** A new connection is available */ + ssh_bind_incoming_connection_callback incoming_connection; +}; +typedef struct ssh_bind_callbacks_struct *ssh_bind_callbacks; + /** * @brief Creates a new SSH server bind. * @@ -80,6 +106,9 @@ LIBSSH_API int ssh_bind_options_set(ssh_bind sshbind, */ LIBSSH_API int ssh_bind_listen(ssh_bind ssh_bind_o); +LIBSSH_API int ssh_bind_set_callbacks(ssh_bind sshbind, ssh_bind_callbacks callbacks, + void *userdata); + /** * @brief Set the session to blocking/nonblocking mode. * diff --git a/src/options.c b/src/options.c index 515c77f6..42c9a40a 100644 --- a/src/options.c +++ b/src/options.c @@ -290,41 +290,41 @@ int ssh_options_set_algo(ssh_session session, int algo, * - SSH_OPTTIONS_STATUS_CALLBACK: * Set a callback to show connection status in realtime * (function pointer).\n - * \n - * @code - * fn(void *arg, float status) - * @endcode - * \n - * During ssh_connect(), libssh will call the callback - * with status from 0.0 to 1.0. - * - * - SSH_OPTTIONS_STATUS_ARG: - * Set the status argument which should be passed to the - * status callback (generic pointer). - * - * - SSH_OPTIONS_CIPHERS_C_S: - * Set the symmetric cipher client to server (const char *, - * comma-separated list). - * - * - SSH_OPTIONS_CIPHERS_S_C: - * Set the symmetric cipher server to client (const char *, - * comma-separated list). - * - * - SSH_OPTIONS_COMPRESSION_C_S: - * Set the compression to use for client to server - * communication (const char *, "none" or "zlib"). - * - * - SSH_OPTIONS_COMPRESSION_S_C: - * Set the compression to use for server to client - * communication (const char *, "none" or "zlib"). - * - * - SSH_OPTIONS_STRICTHOSTKEYCHECK: - * Set the parameter StrictHostKeyChecking to avoid - * asking about a fingerprint (int, 0 = false). - * - * - SSH_OPTIONS_PROXYCOMMAND: - * Set the command to be executed in order to connect to - * server (const char *). + * \n + * @code + * fn(void *arg, float status) + * @endcode + * \n + * During ssh_connect(), libssh will call the callback + * with status from 0.0 to 1.0. + * + * - SSH_OPTTIONS_STATUS_ARG: + * Set the status argument which should be passed to the + * status callback (generic pointer). + * + * - SSH_OPTIONS_CIPHERS_C_S: + * Set the symmetric cipher client to server (const char *, + * comma-separated list). + * + * - SSH_OPTIONS_CIPHERS_S_C: + * Set the symmetric cipher server to client (const char *, + * comma-separated list). + * + * - SSH_OPTIONS_COMPRESSION_C_S: + * Set the compression to use for client to server + * communication (const char *, "none" or "zlib"). + * + * - SSH_OPTIONS_COMPRESSION_S_C: + * Set the compression to use for server to client + * communication (const char *, "none" or "zlib"). + * + * - SSH_OPTIONS_STRICTHOSTKEYCHECK: + * Set the parameter StrictHostKeyChecking to avoid + * asking about a fingerprint (int, 0 = false). + * + * - SSH_OPTIONS_PROXYCOMMAND: + * Set the command to be executed in order to connect to + * server (const char *). * * @param value The value to set. This is a generic pointer and the * datatype which is used should be set according to the diff --git a/src/server.c b/src/server.c index c1f68718..10239773 100644 --- a/src/server.c +++ b/src/server.c @@ -44,6 +44,7 @@ #include "libssh/dh.h" #include "libssh/messages.h" #include "libssh/misc.h" +#include "libssh/poll.h" #define set_status(session, status) do {\ if (session->callbacks && session->callbacks->connect_status_function) \ @@ -175,6 +176,73 @@ int ssh_bind_listen(ssh_bind sshbind) { return 0; } +/** + * @brief set the bind callbacks for ssh_bind + * @code + * struct ssh_callbacks_struct cb = { + * .userdata = data, + * .auth_function = my_auth_function + * }; + * ssh_callbacks_init(&cb); + * ssh_set_callbacks(session, &cb); + * @endcode + * @param sshbind the ssh_bind structure to set + * @param callbacks a ssh_bind_callbacks instance already set up. Do + * use ssh_callbacks_init() to initialize it. + * @param userdata userdata to be used with each callback called + * within callbacks. + * @returns SSH_OK on success, + * SSH_ERROR on error. + */ + +int ssh_bind_set_callbacks(ssh_bind sshbind, ssh_bind_callbacks callbacks, + void *userdata){ + if (sshbind == NULL || callbacks == NULL) { + return SSH_ERROR; + } + if(callbacks->size <= 0 || callbacks->size > 1024 * sizeof(void *)){ + ssh_set_error(sshbind,SSH_FATAL, + "Invalid callback passed in (badly initialized)"); + return SSH_ERROR; + } + sshbind->bind_callbacks = callbacks; + sshbind->bind_callbacks_userdata=userdata; + return 0; +} + +/** @internal + * @brief callback being called by poll when an event happens + * + */ +static int ssh_bind_poll_callback(ssh_poll_handle sshpoll, + socket_t fd, int revents, void *user){ + ssh_bind sshbind=(ssh_bind)user; + (void)sshpoll; + (void)fd; + + if(revents & POLLIN){ + /* new incoming connection */ + if(ssh_callbacks_exists(sshbind->bind_callbacks,incoming_connection)){ + sshbind->bind_callbacks->incoming_connection(sshbind, + sshbind->bind_callbacks_userdata); + } + } + return 0; +} + +/** @internal + * @brief returns the current poll handle, or create it + * @param sshbind the ssh_bind object + * @returns a ssh_poll handle suitable for operation + */ +ssh_poll_handle ssh_bind_get_poll(ssh_bind sshbind){ + if(sshbind->poll) + return sshbind->poll; + sshbind->poll=ssh_poll_new(sshbind->bindfd,POLLIN, + ssh_bind_poll_callback,sshbind); + return sshbind->poll; +} + void ssh_bind_set_blocking(ssh_bind sshbind, int blocking) { sshbind->blocking = blocking ? 1 : 0; } |