aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormilo <milo@r0ot.me>2011-02-20 13:51:08 +0100
committermilo <milo@r0ot.me>2011-02-20 14:21:45 +0100
commita2634ceea8e121f141ecf6e283a04a9926933cc1 (patch)
tree02326d45be18d94edaad0ce680a2bed3d4b5ac78
parentac8276c70e67e04ffbbcd68a9e7f69348a520fbd (diff)
downloadlibssh-a2634ceea8e121f141ecf6e283a04a9926933cc1.tar.gz
libssh-a2634ceea8e121f141ecf6e283a04a9926933cc1.tar.xz
libssh-a2634ceea8e121f141ecf6e283a04a9926933cc1.zip
poll: Started to add a poll based event loop.
-rw-r--r--include/libssh/libssh.h3
-rw-r--r--src/poll.c49
2 files changed, 52 insertions, 0 deletions
diff --git a/include/libssh/libssh.h b/include/libssh/libssh.h
index 5430786..1062ba5 100644
--- a/include/libssh/libssh.h
+++ b/include/libssh/libssh.h
@@ -117,6 +117,7 @@ typedef struct ssh_key_struct* ssh_key;
typedef struct ssh_scp_struct* ssh_scp;
typedef struct ssh_session_struct* ssh_session;
typedef struct ssh_string_struct* ssh_string;
+typedef struct ssh_event_struct* ssh_event;
/* Socket type */
#ifdef _WIN32
@@ -474,6 +475,8 @@ LIBSSH_API void ssh_string_free_char(char *s);
LIBSSH_API int ssh_getpass(const char *prompt, char *buf, size_t len, int echo,
int verify);
+LIBSSH_API ssh_event ssh_event_new(void);
+
#ifndef LIBSSH_LEGACY_0_4
#include "libssh/legacy.h"
#endif
diff --git a/src/poll.c b/src/poll.c
index 156457c..b79dd32 100644
--- a/src/poll.c
+++ b/src/poll.c
@@ -34,6 +34,11 @@
#include "libssh/poll.h"
#include "libssh/socket.h"
#include "libssh/session.h"
+#ifdef WITH_SERVER
+#include "libssh/server.h"
+#include "libssh/misc.h"
+#endif
+
#ifndef SSH_POLL_CTX_CHUNK
#define SSH_POLL_CTX_CHUNK 5
@@ -678,6 +683,50 @@ ssh_poll_ctx ssh_poll_get_default_ctx(ssh_session session){
return session->default_poll_ctx;
}
+/* public event API */
+
+struct ssh_event_struct {
+ ssh_poll_ctx ctx;
+#ifdef WITH_SERVER
+ struct ssh_list *sessions;
+#endif
+};
+
+/**
+ * @brief Create a new event context. It could be associated with many
+ * ssh_session objects and socket fd which are going to be polled at the
+ * same time as the event context. You would need a single event context
+ * per thread.
+ *
+ * @return The ssh_event object on success, NULL on failure.
+ */
+ssh_event ssh_event_new(void) {
+ ssh_event event;
+
+ event = malloc(sizeof(struct ssh_event_struct));
+ if (event == NULL) {
+ return NULL;
+ }
+ ZERO_STRUCTP(event);
+
+ event->ctx = ssh_poll_ctx_new(2);
+ if(event->ctx == NULL) {
+ free(event);
+ return NULL;
+ }
+
+#ifdef WITH_SERVER
+ event->sessions = ssh_list_new();
+ if(event->sessions == NULL) {
+ ssh_poll_ctx_free(event->ctx);
+ free(event);
+ return NULL;
+ }
+#endif
+
+ return event;
+}
+
/** @} */
/* vim: set ts=4 sw=4 et cindent: */