# HG changeset patch # User Tero Marttila # Date 1235285301 -7200 # Node ID 4c4c906cc64920f37b2ce88c237a21f7ede64585 # Parent be88e543c8ff9f23cb54820eacffb004b6421cfa add sock_stream_callbacks and ev_base diff -r be88e543c8ff -r 4c4c906cc649 Makefile --- a/Makefile Sun Feb 22 08:21:22 2009 +0200 +++ b/Makefile Sun Feb 22 08:48:21 2009 +0200 @@ -16,8 +16,8 @@ FIXED_CFLAGS = -Wall -std=gnu99 # libevent -LIBEVENT_CFLAGS = -LIBEVENT_LDFLAGS = -levent +LIBEVENT_CFLAGS = -I/home/terom/opt/include +LIBEVENT_LDFLAGS = -L/home/terom/opt/lib -levent_core # GnuTLS stuff GNUTLS_NAME = "gnutls" diff -r be88e543c8ff -r 4c4c906cc649 src/nexus.c --- a/src/nexus.c Sun Feb 22 08:21:22 2009 +0200 +++ b/src/nexus.c Sun Feb 22 08:48:21 2009 +0200 @@ -7,6 +7,7 @@ #include #include +#include #include "sock.h" #include "line_proto.h" @@ -16,22 +17,27 @@ #define LINE_LENGTH 512 int main (int argc, char **argv) { + struct event_base *ev_base; struct sock_stream *sock; struct line_proto *lp; char line_buf[LINE_LENGTH + 1]; - struct error_info err; + struct error_info _err; - // initialize - if (sock_init(&err)) - errx(1, "sock_init: %s", error_msg(&err)); + // initialize libevent + if ((ev_base = event_base_new()) == NULL) + err(1, "event_base_new"); + + // initialize sock module + if (sock_init(ev_base, &_err)) + errx(1, "sock_init: %s", error_msg(&_err)); // over-simplified connect - if (sock_gnutls_connect(&sock, CONNECT_HOST, CONNECT_SERV, &err)) - errx(1, "sock_gnutls_connect: %s", error_msg(&err)); + if (sock_gnutls_connect(&sock, CONNECT_HOST, CONNECT_SERV, &_err)) + errx(1, "sock_gnutls_connect: %s", error_msg(&_err)); // line protocol - if (line_proto_create(&lp, sock, &err)) - errx(1, "line_proto_create: %s", error_msg(&err)); + if (line_proto_create(&lp, sock, &_err)) + errx(1, "line_proto_create: %s", error_msg(&_err)); // read lines and dump them out do { diff -r be88e543c8ff -r 4c4c906cc649 src/sock.c --- a/src/sock.c Sun Feb 22 08:21:22 2009 +0200 +++ b/src/sock.c Sun Feb 22 08:48:21 2009 +0200 @@ -4,8 +4,14 @@ #include -err_t sock_init (struct error_info *err) +// global sock_stream_ctx instance +struct sock_stream_ctx _sock_stream_ctx; + +err_t sock_init (struct event_base *ev_base, struct error_info *err) { + // store ev_base + _sock_stream_ctx.ev_base = ev_base; + // XXX: just call these all directly for now if (sock_gnutls_global_init(err)) return ERROR_CODE(err); @@ -23,6 +29,13 @@ sock->type = type; } +void sock_stream_set_callbacks (struct sock_stream *sock, const struct sock_stream_callbacks *callbacks, void *arg) +{ + // store + sock->cb_info = callbacks; + sock->cb_arg = arg; +} + err_t sock_stream_read (struct sock_stream *sock, void *buf, size_t len) { // proxy off to method handler diff -r be88e543c8ff -r 4c4c906cc649 src/sock.h --- a/src/sock.h Sun Feb 22 08:21:22 2009 +0200 +++ b/src/sock.h Sun Feb 22 08:48:21 2009 +0200 @@ -6,6 +6,7 @@ */ #include "error.h" #include +#include /* * The generic socket handle @@ -13,9 +14,22 @@ struct sock_stream; /* + * Async callbacks for socket operation + */ +struct sock_stream_callbacks { + /* Sockeet is readable */ + void (*on_read)(struct sock_stream *sock, void *arg); + + /* Socket is writeable */ + void (*on_write)(struct sock_stream *sock, void *arg); +}; + +/* * Initialize the socket module's global state. Call this before calling any other sock_* functions. + * + * The given \a ev_base is the libevent base to use for nonblocking operation. */ -err_t sock_init (struct error_info *err); +err_t sock_init (struct event_base *ev_base, struct error_info *err); /* * A simple blocking TCP connect to the given host/service, using getaddrinfo. The connected socket is returned via @@ -37,6 +51,11 @@ err_t sock_gnutls_connect (struct sock_stream **sock_ptr, const char *host, const char *service, struct error_info *err); /* + * Set the callbacks for a sock_stream. Note that the callbacks struct isn't copied - it's used as-is-given. + */ +void sock_stream_set_callbacks (struct sock_stream *sock, const struct sock_stream_callbacks *callbacks, void *arg); + +/* * The generic read/write API for stream sockets. */ err_t sock_stream_read (struct sock_stream *sock, void *buf, size_t len); diff -r be88e543c8ff -r 4c4c906cc649 src/sock_gnutls.c --- a/src/sock_gnutls.c Sun Feb 22 08:21:22 2009 +0200 +++ b/src/sock_gnutls.c Sun Feb 22 08:48:21 2009 +0200 @@ -4,14 +4,6 @@ #include #include -static void _sock_gnutls_error (struct sock_gnutls *sock, const char *func, int _err) { - if (_err == GNUTLS_E_FATAL_ALERT_RECEIVED) - errx(1, "%s: %s: %s", func, gnutls_strerror(_err), gnutls_alert_get_name(gnutls_alert_get(sock->session))); - - else - errx(1, "%s: %s", func, gnutls_strerror(_err)); -} - static err_t sock_gnutls_read (struct sock_stream *base_sock, void *buf, size_t len) { struct sock_gnutls *sock = SOCK_FROM_BASE(base_sock, struct sock_gnutls); diff -r be88e543c8ff -r 4c4c906cc649 src/sock_internal.h --- a/src/sock_internal.h Sun Feb 22 08:21:22 2009 +0200 +++ b/src/sock_internal.h Sun Feb 22 08:48:21 2009 +0200 @@ -4,6 +4,15 @@ #include "sock.h" /* + * Global config related to all sock_streams + */ +extern struct sock_stream_ctx { + /* Event core */ + struct event_base *ev_base; + +} _sock_stream_ctx; + +/* * The base type struct, which defines the method table. */ struct sock_stream_type { @@ -30,6 +39,12 @@ /* Last error info */ struct error_info err; + + /* Callbacks */ + const struct sock_stream_callbacks *cb_info; + + /* Callback arg */ + void *cb_arg; }; #define SOCK_FROM_BASE(sock, type) ((type*) sock)