]> jfr.im git - irc/atheme/libmowgli-2.git/commitdiff
vio: convert ugly non-syntactic macros to functions.
authorElizabeth J. Myers <redacted>
Thu, 29 Mar 2012 03:42:11 +0000 (22:42 -0500)
committerElizabeth J. Myers <redacted>
Thu, 29 Mar 2012 03:43:01 +0000 (22:43 -0500)
src/libmowgli/vio/vio.c
src/libmowgli/vio/vio.h
src/libmowgli/vio/vio_openssl.c
src/libmowgli/vio/vio_sockets.c

index 837564f6a83d0a257e036ce1be8c95b78f22479d..ea6ec2fa252d91a6da6516a9f522ed895e8e1f46 100644 (file)
@@ -85,42 +85,43 @@ void mowgli_vio_eventloop_attach(mowgli_vio_t *vio, mowgli_eventloop_t *eventloo
        vio->io = mowgli_pollable_create(eventloop, vio->fd, vio->userdata);
        if (vio->io != NULL)
        {
-               /* Blergh */
-               mowgli_node_add(eventloop, mowgli_node_create(), &(vio->eventloops));
-
+               vio->eventloop = eventloop;
                /* You're probably going to want this */
                mowgli_pollable_set_nonblocking(vio->io, true);
        }
+       else
+               mowgli_log("Unable to create pollable with VIO object [%p], expect problems.", vio);
 }
 
-void mowgli_vio_eventloop_detach(mowgli_vio_t *vio, mowgli_eventloop_t *eventloop)
+void mowgli_vio_eventloop_detach(mowgli_vio_t *vio)
 {
-       mowgli_node_t *n, *tn;
-
        return_if_fail(vio->io != NULL);
+       return_if_fail(vio->eventloop != NULL);
 
-       /* Remove from eventloops list */
-       MOWGLI_LIST_FOREACH_SAFE(n, tn, vio->eventloops.head)
-       {
-               if ((mowgli_eventloop_t *)n->data == eventloop)
-                       mowgli_node_delete(n, &(vio->eventloops));
-       }
-
-       mowgli_pollable_destroy(eventloop, vio->io);
+       mowgli_pollable_destroy(vio->eventloop, vio->io);
 }
 
 void mowgli_vio_destroy(mowgli_vio_t *vio)
 {
-       mowgli_node_t *n, *tn;
-
-       /* Detach from each eventloop we're attached to */
-       MOWGLI_LIST_FOREACH_SAFE(n, tn, vio->eventloops.head)
-       {
-               mowgli_pollable_destroy(n->data, vio->io);
-               mowgli_node_delete(n, &(vio->eventloops));
-       }
+       mowgli_vio_eventloop_detach(vio);
 
        if (mowgli_vio_hasflag(vio, MOWGLI_VIO_FLAGS_ISONHEAP))
                mowgli_heap_free(vio_heap, vio);
 }
 
+int mowgli_vio_err_errcode(mowgli_vio_t *vio, char *(*int_to_error)(int), int errcode)
+{
+       vio->error.type = MOWGLI_VIO_ERR_ERRCODE;
+       vio->error.code = errcode;
+       mowgli_strlcpy(vio->error.string, int_to_error(errcode), sizeof(vio->error.string));
+       return mowgli_vio_error(vio);
+}
+
+int mowgli_vio_err_sslerrcode(mowgli_vio_t *vio, int errcode)
+{
+       vio->error.type = MOWGLI_VIO_ERR_ERRCODE;
+       vio->error.code = errcode;
+       ERR_error_string_n(errcode, vio->error.string, sizeof(vio->error.string));
+       return mowgli_vio_error(vio);
+}
+
index de0df7fe4eb44b58996a5da7e94dffce9493da9e..6b0873444fe39b46d461653c7a46cf43cbb99660 100644 (file)
@@ -95,8 +95,7 @@ struct _mowgli_vio {
        mowgli_eventloop_io_t *io;
        mowgli_descriptor_t fd;
 
-       /* Some jackass could attach us to multiple event loops I guess */
-       mowgli_list_t eventloops;
+       mowgli_eventloop_t *eventloop;
 
        mowgli_vio_sockaddr_t addr;
 
@@ -157,28 +156,6 @@ static inline void mowgli_vio_setflag(mowgli_vio_t *vio, int flag, bool setting)
        mowgli_vio_setflag(v, MOWGLI_VIO_FLAGS_ISCLOSED, true);         \
        mowgli_vio_setflag(v, MOWGLI_VIO_FLAGS_ISSSLCONNECTING, false);
 
-#define MOWGLI_VIO_RETURN_ERRCODE(v, s, e)                                     \
-{                                                                              \
-       v->error.type = MOWGLI_VIO_ERR_ERRCODE;                                 \
-       v->error.code = e;                                                      \
-       mowgli_strlcpy(v->error.string, s(e), sizeof((v)->error.string));       \
-       return mowgli_vio_error((v));                                           \
-}
-
-#ifdef HAVE_OPENSSL
-
-#define MOWGLI_VIO_RETURN_SSLERR_ERRCODE(v, e)                                 \
-{                                                                              \
-       (v)->error.type = MOWGLI_VIO_ERR_ERRCODE;                               \
-       (v)->error.code = e;                                                    \
-       ERR_error_string_n(e, (v)->error.string, sizeof((v)->error.string));    \
-       return mowgli_vio_error(v);                                             \
-}
-
-#else
-#      define MOWGLI_VIO_RETURN_SSL_ERRCODE(v, e) MOWGLI_VIO_RETURN_ERRCODE(v, strerror, e)
-#endif
-
 
 /* Decls */
 extern mowgli_vio_t * mowgli_vio_create(void *userdata);
@@ -186,7 +163,7 @@ extern void mowgli_vio_init(mowgli_vio_t *vio, void *userdata);
 extern void mowgli_vio_destroy(mowgli_vio_t *vio);
 
 extern void mowgli_vio_eventloop_attach(mowgli_vio_t *vio, mowgli_eventloop_t *eventloop);
-extern void mowgli_vio_eventloop_detach(mowgli_vio_t *vio, mowgli_eventloop_t *eventloop);
+extern void mowgli_vio_eventloop_detach(mowgli_vio_t *vio);
 
 extern mowgli_vio_sockaddr_t * mowgli_vio_sockaddr_create(mowgli_vio_sockaddr_t *naddr, int proto, const char *addr, int port);
 extern mowgli_vio_sockaddr_t * mowgli_vio_sockaddr_from_struct(mowgli_vio_sockaddr_t *naddr, const void *addr, socklen_t size);
@@ -206,6 +183,9 @@ extern int mowgli_vio_default_close(mowgli_vio_t *vio);
 extern int mowgli_vio_default_seek(mowgli_vio_t *vio, long offset, int whence);
 extern int mowgli_vio_default_tell(mowgli_vio_t *vio);
 
+extern int mowgli_vio_err_errcode(mowgli_vio_t *vio, char *(*int_to_error)(int), int errcode);
+extern int mowgli_vio_err_sslerrcode(mowgli_vio_t *vio, int errcode);
+
 extern int mowgli_vio_openssl_setssl(mowgli_vio_t *vio, mowgli_vio_ssl_settings_t *settings);
 /* These are void ptr's so they can be null ops if SSL isn't available */
 extern void * mowgli_vio_openssl_getsslhandle(mowgli_vio_t *vio);
index 2618e327e4998a5f0bfeb0f6002245be44666969..c8aeeae4a471f50aac46140f27286ef82dfcd4ff 100644 (file)
@@ -104,9 +104,7 @@ static int mowgli_vio_openssl_connect(mowgli_vio_t *vio, mowgli_vio_sockaddr_t *
        if (connect(vio->fd, (struct sockaddr *)&addr->addr, addr->addrlen) < 0)
        {
                if (!mowgli_eventloop_ignore_errno(errno))
-               {
-                       MOWGLI_VIO_RETURN_ERRCODE(vio, strerror, errno);
-               }
+                       return mowgli_vio_err_errcode(vio, strerror, errno);
                else
                {
                        mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCONNECTING, true);
@@ -152,16 +150,16 @@ static int mowgli_vio_openssl_client_handshake(mowgli_vio_t *vio, mowgli_ssl_con
        /* Cast is to eliminate an excessively bogus warning on old OpenSSL --Elizacat */
        connection->ssl_context = SSL_CTX_new((SSL_METHOD *)method);
        if (connection->ssl_context == NULL)
-               MOWGLI_VIO_RETURN_SSLERR_ERRCODE(vio, ERR_get_error())
+               return mowgli_vio_err_sslerrcode(vio, ERR_get_error());
 
        connection->ssl_handle = SSL_new(connection->ssl_context);
        if (connection->ssl_handle == NULL)
-               MOWGLI_VIO_RETURN_SSLERR_ERRCODE(vio, ERR_get_error())
+               return mowgli_vio_err_sslerrcode(vio, ERR_get_error());
        
        SSL_set_connect_state(connection->ssl_handle);
        
        if (!SSL_set_fd(connection->ssl_handle, vio->fd))
-               MOWGLI_VIO_RETURN_SSLERR_ERRCODE(vio, ERR_get_error())
+               return mowgli_vio_err_sslerrcode(vio, ERR_get_error());
 
        /* XXX not what we want for blocking sockets if they're in use! */
        SSL_CTX_set_mode(connection->ssl_context, SSL_MODE_ENABLE_PARTIAL_WRITE);
@@ -179,9 +177,7 @@ static int mowgli_vio_openssl_client_handshake(mowgli_vio_t *vio, mowgli_ssl_con
                        return 0;
                }
                else
-               {
-                       MOWGLI_VIO_RETURN_SSLERR_ERRCODE(vio, err)
-               }
+                       return mowgli_vio_err_sslerrcode(vio, err);
        }
 
        /* Connected */
@@ -257,7 +253,7 @@ static int mowgli_openssl_read_or_write(bool read, mowgli_vio_t *vio, void *buff
                if(err > 0)
                {
                        errno = EIO;
-                       MOWGLI_VIO_RETURN_ERRCODE(vio, strerror, errno);
+                       return mowgli_vio_err_errcode(vio, strerror, errno);
                }
 
                /* idk lol */
index 401df54034b639c5a051e8f531f0948224a6f38a..08476b1b5602242ac7dabfd4eab89574cf592393 100644 (file)
@@ -34,7 +34,7 @@ int mowgli_vio_default_socket(mowgli_vio_t *vio, int family, int type, int proto
                family = AF_INET6;      /* This is fine, IPv4 will still work via a 6to4 mapping */
 
        if ((fd = socket(family, type, proto)) == -1)
-               MOWGLI_VIO_RETURN_ERRCODE(vio, strerror, errno);
+               return mowgli_vio_err_errcode(vio, strerror, errno);
 
        vio->fd = fd;
 
@@ -53,7 +53,7 @@ int mowgli_vio_default_bind(mowgli_vio_t *vio, mowgli_vio_sockaddr_t *addr)
        vio->error.op = MOWGLI_VIO_ERR_OP_BIND;
 
        if (bind(vio->fd, (struct sockaddr *)&addr->addr, addr->addrlen) != 0)
-               MOWGLI_VIO_RETURN_ERRCODE(vio, strerror, errno);
+               return mowgli_vio_err_errcode(vio, strerror, errno);
 
        memcpy(&vio->addr.addr, &addr->addr, sizeof(struct sockaddr_storage));
        vio->addr.addrlen = addr->addrlen;
@@ -66,7 +66,7 @@ int mowgli_vio_default_listen(mowgli_vio_t *vio, int backlog)
        vio->error.op = MOWGLI_VIO_ERR_OP_LISTEN;
 
        if (listen(vio->fd, backlog) < 0)
-               MOWGLI_VIO_RETURN_ERRCODE(vio, strerror, errno);
+               return mowgli_vio_err_errcode(vio, strerror, errno);
 
        mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISSERVER, true);
        mowgli_vio_setflag(vio, MOWGLI_VIO_FLAGS_ISCLIENT, false);
@@ -93,13 +93,9 @@ int mowgli_vio_default_accept(mowgli_vio_t *vio, mowgli_vio_t *newvio)
        if ((fd = accept(vio->fd, (struct sockaddr *)&newvio->addr.addr, &(newvio->addr.addrlen))) < 0)
        {
                if (!mowgli_eventloop_ignore_errno(errno))
-               {
-                       MOWGLI_VIO_RETURN_ERRCODE(newvio, strerror, errno);
-               }
+                       return mowgli_vio_err_errcode(newvio, strerror, errno);
                else
-               {
                        return 0;
-               }
        }
 
        newvio->fd = fd;
@@ -119,13 +115,9 @@ int mowgli_vio_default_connect(mowgli_vio_t *vio, mowgli_vio_sockaddr_t *addr)
        if (connect(vio->fd, (struct sockaddr *)&addr->addr, addr->addrlen) < 0)
        {
                if (!mowgli_eventloop_ignore_errno(errno))
-               {
-                       MOWGLI_VIO_RETURN_ERRCODE(vio, strerror, errno);
-               }
+                       return mowgli_vio_err_errcode(vio, strerror, errno);
                else
-               {
                        return 0;
-               }
        }
 
        /* XXX -- overwrites if we already used bind -- not terribly concerning as this is
@@ -153,13 +145,9 @@ int mowgli_vio_default_read(mowgli_vio_t *vio, void *buffer, size_t len)
        if ((ret = (int)recv(vio->fd, buffer, len, 0)) < 0)
        {
                if (!mowgli_eventloop_ignore_errno(errno))
-               {
-                       MOWGLI_VIO_RETURN_ERRCODE(vio, strerror, errno);
-               }
+                       return mowgli_vio_err_errcode(vio, strerror, errno);
                else if (errno != 0)
-               {
                        return 0;
-               }
 
                if (ret == 0)
                {
@@ -188,13 +176,9 @@ int mowgli_vio_default_write(mowgli_vio_t *vio, const void *buffer, size_t len)
        if ((ret = (int)send(vio->fd, buffer, len, 0)) == -1)
        {
                if (!mowgli_eventloop_ignore_errno(errno))
-               {
-                       MOWGLI_VIO_RETURN_ERRCODE(vio, strerror, errno);
-               }
+                       return mowgli_vio_err_errcode(vio, strerror, errno);
                else
-               {
                        return 0;
-               }
        }
 
        vio->error.op = MOWGLI_VIO_ERR_OP_NONE;
@@ -212,13 +196,9 @@ int mowgli_vio_default_sendto(mowgli_vio_t *vio, const void *buffer, size_t len,
        if ((ret = (int)sendto(vio->fd, buffer, len, 0, (struct sockaddr *)&addr->addr, addr->addrlen)) == -1)
        {
                if (!mowgli_eventloop_ignore_errno(errno))
-               {
-                       MOWGLI_VIO_RETURN_ERRCODE(vio, strerror, errno);
-               }
+                       return mowgli_vio_err_errcode(vio, strerror, errno);
                else
-               {
                        return 0;
-               }
        }
 
        vio->error.op = MOWGLI_VIO_ERR_OP_NONE;
@@ -236,13 +216,9 @@ int mowgli_vio_default_recvfrom(mowgli_vio_t *vio, void *buffer, size_t len, mow
        if ((ret = (int)recvfrom(vio->fd, buffer, len, 0, (struct sockaddr *)&addr->addr, &addr->addrlen)) < 0)
        {
                if (!mowgli_eventloop_ignore_errno(errno))
-               {
-                       MOWGLI_VIO_RETURN_ERRCODE(vio, strerror, errno);
-               }
+                       return mowgli_vio_err_errcode(vio, strerror, errno);
                else if (errno != 0)
-               {
                        return 0;
-               }
 
                if (ret == 0)
                {
@@ -316,14 +292,14 @@ int mowgli_vio_default_seek(mowgli_vio_t *vio, long offset, int whence)
 {
        vio->error.op = MOWGLI_VIO_ERR_OP_SEEK;
        errno = ENOSYS;
-       MOWGLI_VIO_RETURN_ERRCODE(vio, strerror, errno);
+       return mowgli_vio_err_errcode(vio, strerror, errno);
 }
 
 int mowgli_vio_default_tell(mowgli_vio_t *vio)
 {
        vio->error.op = MOWGLI_VIO_ERR_OP_TELL;
        errno = ENOSYS;
-       MOWGLI_VIO_RETURN_ERRCODE(vio, strerror, errno);
+       return mowgli_vio_err_errcode(vio, strerror, errno);
 }
 
 /* Generate a mowgli_sockaddr_t struct */