static void afinet_set_port(GSockAddr *addr, gchar *service, const gchar *proto) { if (addr) { gchar *end; gint port; /* check if service is numeric */ port = strtol(service, &end, 10); if ((*end != 0)) { struct servent *se; /* service is not numeric, check if it's a service in /etc/services */ se = getservbyname(service, proto); if (se) { port = ntohs(se->s_port); } else { msg_error("Error finding port number, falling back to default", evt_tag_printf("service", "%s/%s", proto, service), NULL); return; } } switch (addr->sa.sa_family) { case AF_INET: g_sockaddr_inet_set_port(addr, port); break; #if ENABLE_IPV6 case AF_INET6: g_sockaddr_inet6_set_port(addr, port); break; #endif default: g_assert_not_reached(); break; } } }
static void afinet_set_port(GSockAddr *addr, gint port, gchar *service, gchar *proto) { if (addr) { if (proto) { struct servent *se; se = getservbyname(service, proto); if (se) { port = ntohs(se->s_port); } else { msg_error("Error finding port number, falling back to default", evt_tag_printf("service", "%s/%s", proto, service), NULL); return; } } switch (addr->sa.sa_family) { case AF_INET: g_sockaddr_inet_set_port(addr, port); break; #if ENABLE_IPV6 case AF_INET6: g_sockaddr_inet6_set_port(addr, port); break; #endif default: g_assert_not_reached(); break; } } }
gboolean resolve_hostname(GSockAddr **addr, gchar *name) { if (addr) { #if HAVE_GETADDRINFO struct addrinfo hints; struct addrinfo *res; memset(&hints, 0, sizeof(hints)); hints.ai_family = (*addr)->sa.sa_family; hints.ai_socktype = 0; hints.ai_protocol = 0; if (getaddrinfo(name, NULL, &hints, &res) == 0) { /* we only use the first entry in the returned list */ switch ((*addr)->sa.sa_family) { case AF_INET: g_sockaddr_inet_set_address((*addr), ((struct sockaddr_in *) res->ai_addr)->sin_addr); break; #if ENABLE_IPV6 case AF_INET6: { guint16 port; /* we need to copy the whole sockaddr_in6 structure as it * might contain scope and other required data */ port = g_sockaddr_inet6_get_port(*addr); *g_sockaddr_inet6_get_sa(*addr) = *((struct sockaddr_in6 *) res->ai_addr); /* we need to restore the port number as it is zeroed out by the previous assignment */ g_sockaddr_inet6_set_port(*addr, port); break; } #endif default: g_assert_not_reached(); break; } freeaddrinfo(res); } else { msg_error("Error resolving hostname", evt_tag_str("host", name), NULL); return FALSE; } #else struct hostent *he; G_LOCK(resolv_lock); he = gethostbyname(name); if (he) { switch ((*addr)->sa.sa_family) { case AF_INET: g_sockaddr_inet_set_address((*addr), *(struct in_addr *) he->h_addr); break; default: g_assert_not_reached(); break; } G_UNLOCK(resolv_lock); } else { G_UNLOCK(resolv_lock); msg_error("Error resolving hostname", evt_tag_str("host", name), NULL); return FALSE; } #endif } return TRUE; }