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);
+}
+
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;
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);
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);
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);
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);
/* 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);
return 0;
}
else
- {
- MOWGLI_VIO_RETURN_SSLERR_ERRCODE(vio, err)
- }
+ return mowgli_vio_err_sslerrcode(vio, err);
}
/* Connected */
if(err > 0)
{
errno = EIO;
- MOWGLI_VIO_RETURN_ERRCODE(vio, strerror, errno);
+ return mowgli_vio_err_errcode(vio, strerror, errno);
}
/* idk lol */
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;
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;
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);
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;
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
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)
{
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;
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;
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)
{
{
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 */