odyssey/third_party/machinarium/sources/dns.c

75 lines
1.5 KiB
C
Raw Normal View History

2017-03-21 12:15:05 +00:00
/*
* machinarium.
*
* cooperative multitasking engine.
*/
#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,
2017-03-21 12:15:05 +00:00
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;
}