static gboolean resolve_hostname_to_sockaddr_using_gethostbyname(GSockAddr **addr, gint family, const gchar *name) { struct hostent *he; G_LOCK(resolv_lock); he = gethostbyname(name); if (he) { switch (family) { case AF_INET: { struct sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_addr = *(struct in_addr *) he->h_addr; sin.sin_port = htons(0); *addr = g_sockaddr_inet_new2(&sin); break; } default: g_assert_not_reached(); break; } } G_UNLOCK(resolv_lock); return he != NULL; }
static gboolean resolve_hostname_to_sockaddr_using_getaddrinfo(GSockAddr **addr, gint family, const gchar *name) { struct addrinfo hints; struct addrinfo *res; memset(&hints, 0, sizeof(hints)); hints.ai_family = 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 (family) { case AF_INET: *addr = g_sockaddr_inet_new2(((struct sockaddr_in *) res->ai_addr)); break; #if ENABLE_IPV6 case AF_INET6: *addr = g_sockaddr_inet6_new2((struct sockaddr_in6 *) res->ai_addr); break; #endif default: g_assert_not_reached(); break; } freeaddrinfo(res); return TRUE; } return FALSE; }
/** * g_sockaddr_new: * @sa: libc sockaddr * pointer to convert * @salen: size of sa * * General function to allocate and initialize a GSockAddr structure, * and convert a libc style sockaddr * pointer to our representation. * * Returns: a GSockAddr instance or NULL if failure * **/ GSockAddr * g_sockaddr_new(struct sockaddr *sa, int salen) { GSockAddr *addr = NULL; switch (sa->sa_family) { #if SYSLOG_NG_ENABLE_IPV6 case AF_INET6: if (salen >= sizeof(struct sockaddr_in6)) addr = g_sockaddr_inet6_new2((struct sockaddr_in6 *) sa); break; #endif case AF_INET: if (salen == sizeof(struct sockaddr_in)) addr = g_sockaddr_inet_new2((struct sockaddr_in *) sa); break; case AF_UNIX: addr = g_sockaddr_unix_new2((struct sockaddr_un *) sa, salen); break; default: /*LOG This message indicates an internal error, Zorp tries to use an address family it doesn't support. */ g_error("Unsupported socket family in g_sockaddr_new(); family='%d'", sa->sa_family); break; } return addr; }
static gboolean _deserialize_ipv4(SerializeArchive *sa, GSockAddr **addr) { struct sockaddr_in sin; sin.sin_family = AF_INET; if (!serialize_read_blob(sa, (gchar *) &sin.sin_addr, sizeof(sin.sin_addr)) || !serialize_read_uint16(sa, &sin.sin_port)) return FALSE; *addr = g_sockaddr_inet_new2(&sin); return TRUE; }
static gboolean resolve_wildcard_hostname_to_sockaddr(GSockAddr **addr, gint family, const gchar *name) { struct sockaddr_storage ss; /* return the wildcard address that can be used as a bind address */ memset(&ss, 0, sizeof(ss)); ss.ss_family = family; switch (family) { case AF_INET: *addr = g_sockaddr_inet_new2(((struct sockaddr_in *) &ss)); break; #if ENABLE_IPV6 case AF_INET6: *addr = g_sockaddr_inet6_new2((struct sockaddr_in6 *) &ss); break; #endif default: g_assert_not_reached(); break; } return TRUE; }