aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAris Adamantiadis <aris@0xbadc0de.be>2010-10-19 23:51:07 +0200
committerAris Adamantiadis <aris@0xbadc0de.be>2010-10-19 23:51:32 +0200
commit8e2699e16139c8efdc54a06471de29966ccc233a (patch)
tree17e515f791fa431d6c9b7726e530786691c07156
parent01eb20e13f0c7be95a58a1022e214df269168281 (diff)
downloadlibssh-8e2699e16139c8efdc54a06471de29966ccc233a.tar.gz
libssh-8e2699e16139c8efdc54a06471de29966ccc233a.tar.xz
libssh-8e2699e16139c8efdc54a06471de29966ccc233a.zip
start of work to have callbackbased ssh_bind
-rw-r--r--include/libssh/priv.h6
-rw-r--r--include/libssh/server.h31
-rw-r--r--src/options.c70
-rw-r--r--src/server.c68
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;
}