summaryrefslogtreecommitdiffstats
path: root/src
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 /src
parent01eb20e13f0c7be95a58a1022e214df269168281 (diff)
downloadlibssh-8e2699e16139c8efdc54a06471de29966ccc233a.tar.gz
libssh-8e2699e16139c8efdc54a06471de29966ccc233a.tar.xz
libssh-8e2699e16139c8efdc54a06471de29966ccc233a.zip
start of work to have callbackbased ssh_bind
Diffstat (limited to 'src')
-rw-r--r--src/options.c70
-rw-r--r--src/server.c68
2 files changed, 103 insertions, 35 deletions
diff --git a/src/options.c b/src/options.c
index 515c77f..42c9a40 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 c1f6871..1023977 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;
}