bool server_socket_add_path(struct server_socket *ss, const char *path, GError **error_r) { #ifdef HAVE_UN struct sockaddr_un s_un; size_t path_length = strlen(path); if (path_length >= sizeof(s_un.sun_path)) { g_set_error(error_r, server_socket_quark(), 0, "UNIX socket path is too long"); return false; } unlink(path); s_un.sun_family = AF_UNIX; memcpy(s_un.sun_path, path, path_length + 1); struct one_socket *s = server_socket_add_address(ss, (const struct sockaddr *)&s_un, sizeof(s_un)); s->path = g_strdup(path); return true; #else /* !HAVE_UN */ (void)ss; (void)path; g_set_error(error_r, server_socket_quark(), 0, "UNIX domain socket support is disabled"); return false; #endif /* !HAVE_UN */ }
bool server_socket_add_host(struct server_socket *ss, const char *hostname, unsigned port, GError **error_r) { #ifdef HAVE_TCP struct addrinfo *ai = resolve_host_port(hostname, port, AI_PASSIVE, SOCK_STREAM, error_r); if (ai == NULL) return false; for (const struct addrinfo *i = ai; i != NULL; i = i->ai_next) server_socket_add_address(ss, i->ai_addr, i->ai_addrlen); freeaddrinfo(ai); ++ss->next_serial; return true; #else /* HAVE_TCP */ (void)ss; (void)hostname; (void)port; g_set_error(error_r, server_socket_quark(), 0, "TCP support is disabled"); return false; #endif /* HAVE_TCP */ }
/** * Add a listener on a port on all IPv6 interfaces. * * @param port the TCP port */ static void server_socket_add_port_ipv6(struct server_socket *ss, unsigned port) { struct sockaddr_in6 sin; memset(&sin, 0, sizeof(sin)); sin.sin6_port = htons(port); sin.sin6_family = AF_INET6; server_socket_add_address(ss, (const struct sockaddr *)&sin, sizeof(sin)); }
/** * Add a listener on a port on all IPv4 interfaces. * * @param port the TCP port */ static void server_socket_add_port_ipv4(struct server_socket *ss, unsigned port) { struct sockaddr_in sin; memset(&sin, 0, sizeof(sin)); sin.sin_port = htons(port); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; server_socket_add_address(ss, (const struct sockaddr *)&sin, sizeof(sin)); }
bool server_socket_add_host(struct server_socket *ss, const char *hostname, unsigned port, GError **error_r) { #ifdef HAVE_TCP struct addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_PASSIVE; hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; char service[20]; g_snprintf(service, sizeof(service), "%u", port); struct addrinfo *ai; int ret = getaddrinfo(hostname, service, &hints, &ai); if (ret != 0) { g_set_error(error_r, server_socket_quark(), ret, "Failed to look up host \"%s\": %s", hostname, gai_strerror(ret)); return false; } for (const struct addrinfo *i = ai; i != NULL; i = i->ai_next) server_socket_add_address(ss, i->ai_addr, i->ai_addrlen); freeaddrinfo(ai); ++ss->next_serial; return true; #else /* HAVE_TCP */ (void)ss; (void)hostname; (void)port; g_set_error(error_r, server_socket_quark(), 0, "TCP support is disabled"); return false; #endif /* HAVE_TCP */ }