Skip to content

Instantly share code, notes, and snippets.

@mhinz
Created May 6, 2017 12:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mhinz/7362e3326d111d2b715a7963827fdf36 to your computer and use it in GitHub Desktop.
Save mhinz/7362e3326d111d2b715a7963827fdf36 to your computer and use it in GitHub Desktop.
void socket_watcher_init(Loop *loop, SocketWatcher *watcher, const char *endpoint,
void *data)
FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_NONNULL_ARG(2) FUNC_ATTR_NONNULL_ARG(3)
{
xstrlcpy(watcher->addr, endpoint, sizeof(watcher->addr));
char *addr = xstrdup(endpoint);
char *host_end = strrchr(addr, ':');
if (host_end && addr != host_end) {
uv_getaddrinfo_t request;
*host_end = '\0';
int retval = uv_getaddrinfo(&loop->uv, &request, NULL, addr, host_end+1,
&(struct addrinfo){
.ai_family = AF_UNSPEC,
.ai_socktype = SOCK_STREAM,
});
if (retval == 0) {
struct addrinfo *ai = request.addrinfo;
// DEBUG
/* void *addr = (ai->ai_family == AF_INET) */
/* ? &((struct sockaddr_in *)ai->ai_addr)->sin_addr */
/* : &((struct sockaddr_in6 *)ai->ai_addr)->sin6_addr; */
/* char canon[INET6_ADDRSTRLEN]; */
/* inet_ntop(ai->ai_family, addr, canon, sizeof(canon)); */
/* ILOG("%s: %s", (ai->ai_family == 2 ? "AF_INET" : */
/* ai->ai_family == 30 ? "AF_INET6" : "AF_WTF"), canon); */
// DEBUG END
memcpy(&watcher->uv.tcp.addr, ai->ai_addr, ai->ai_addrlen);
uv_tcp_init(&loop->uv, &watcher->uv.tcp.handle);
watcher->stream = (uv_stream_t *)&watcher->uv.tcp.handle;
freeaddrinfo(request.addrinfo);
}
} else {
uv_pipe_init(&loop->uv, &watcher->uv.pipe.handle, 0);
watcher->stream = (uv_stream_t *)&watcher->uv.pipe.handle;
}
watcher->stream->data = watcher;
watcher->cb = NULL;
watcher->close_cb = NULL;
watcher->events = NULL;
xfree(addr);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment