odyssey/third_party/machinarium/sources/dns.c

72 lines
1.4 KiB
C
Raw Normal View History

2017-03-21 12:15:05 +00:00
/*
* machinarium.
*
* cooperative multitasking engine.
*/
2017-03-21 12:15:05 +00:00
#include <machinarium.h>
#include <machinarium_private.h>
2017-03-21 12:15:05 +00:00
typedef struct {
char *addr;
char *service;
struct addrinfo *hints;
struct addrinfo **res;
int rc;
} mm_getaddrinfo_t;
2017-03-21 12:15:05 +00:00
static void mm_getaddrinfo_cb(void *arg)
2017-03-21 12:15:05 +00:00
{
mm_getaddrinfo_t *gai = arg;
gai->rc = mm_socket_getaddrinfo(gai->addr, gai->service, gai->hints,
gai->res);
2017-03-21 12:15:05 +00:00
}
MACHINE_API int machine_getaddrinfo(char *addr, char *service,
struct addrinfo *hints,
struct addrinfo **res, uint32_t time_ms)
2017-03-21 12:15:05 +00:00
{
mm_getaddrinfo_t gai = { .addr = addr,
.service = service,
.hints = hints,
.res = res,
.rc = 0 };
2017-03-21 12:15:05 +00:00
int rc;
rc = mm_taskmgr_new(&machinarium.task_mgr, mm_getaddrinfo_cb, &gai,
time_ms);
if (rc == -1)
2017-03-29 11:58:27 +00:00
return -1;
return gai.rc;
}
MACHINE_API int machine_getsockname(machine_io_t *obj, struct sockaddr *sa,
int *salen)
{
mm_io_t *io = mm_cast(mm_io_t *, obj);
2017-05-30 14:00:16 +00:00
mm_errno_set(0);
socklen_t slen = *salen;
int rc = mm_socket_getsockname(io->fd, sa, &slen);
if (rc < 0) {
2017-05-30 14:00:16 +00:00
mm_errno_set(errno);
return -1;
}
*salen = slen;
return 0;
}
MACHINE_API int machine_getpeername(machine_io_t *obj, struct sockaddr *sa,
int *salen)
{
mm_io_t *io = mm_cast(mm_io_t *, obj);
2017-05-30 14:00:16 +00:00
mm_errno_set(0);
socklen_t slen = *salen;
int rc = mm_socket_getpeername(io->fd, sa, &slen);
if (rc < 0) {
2017-05-30 14:00:16 +00:00
mm_errno_set(errno);
return -1;
}
*salen = slen;
return 0;
}