static void add_ip_range(struct linked_list* list, struct ip_range* info) { char buf1[INET6_ADDRSTRLEN+1]; char buf2[INET6_ADDRSTRLEN+1]; if (info->lo.af == AF_INET) { net_address_to_string(AF_INET, &info->lo.internal_ip_data.in.s_addr, buf1, INET6_ADDRSTRLEN); net_address_to_string(AF_INET, &info->hi.internal_ip_data.in.s_addr, buf2, INET6_ADDRSTRLEN); } else if (info->lo.af == AF_INET6) { net_address_to_string(AF_INET6, &info->lo.internal_ip_data.in6, buf1, INET6_ADDRSTRLEN); net_address_to_string(AF_INET6, &info->hi.internal_ip_data.in6, buf2, INET6_ADDRSTRLEN); } LOG_DEBUG("ACL: Added ip range: %s-%s", buf1, buf2); list_append(list, info); }
const char* net_get_local_address(int fd) { static char address[INET6_ADDRSTRLEN+1]; struct sockaddr_storage storage; struct sockaddr_in6* name6; struct sockaddr_in* name4; struct sockaddr* name; socklen_t namelen; memset(address, 0, INET6_ADDRSTRLEN); namelen = sizeof(struct sockaddr_storage); memset(&storage, 0, namelen); name6 = (struct sockaddr_in6*) &storage; name4 = (struct sockaddr_in*) &storage; name = (struct sockaddr*) &storage; if (getsockname(fd, (struct sockaddr*) name, &namelen) != -1) { #ifndef WINSOCK int af = storage.ss_family; if (af == AF_INET6) { net_address_to_string(af, (void*) &name6->sin6_addr, address, INET6_ADDRSTRLEN); } else #else int af = AF_INET; #endif { net_address_to_string(af, (void*) &name4->sin_addr, address, INET6_ADDRSTRLEN); } return address; } else { net_error_out(fd, "net_get_local_address"); net_stats_add_error(); } return "0.0.0.0"; }
int net_accept(int fd, struct ip_addr_encap* ipaddr) { struct sockaddr_storage addr; struct sockaddr_in* addr4; struct sockaddr_in6* addr6; socklen_t addr_size; int ret = 0; addr_size = sizeof(struct sockaddr_storage); memset(&addr, 0, addr_size); addr4 = (struct sockaddr_in*) &addr; addr6 = (struct sockaddr_in6*) &addr; ret = accept(fd, (struct sockaddr*) &addr, &addr_size); if (ret == -1) { switch (net_error()) { #if defined(__HAIKU__) case ETIMEDOUT: #endif #if defined(__linux__) case ENETDOWN: case EPROTO: case ENOPROTOOPT: case EHOSTDOWN: case ENONET: case EHOSTUNREACH: case EOPNOTSUPP: errno = EWOULDBLOCK; #endif #ifdef WINSOCK case WSAEWOULDBLOCK: break; #else case EWOULDBLOCK: break; #endif default: net_error_out(fd, "net_accept"); net_stats_add_error(); return -1; } } else { net_stats_add_accept(); if (ipaddr) { memset(ipaddr, 0, sizeof(struct ip_addr_encap)); ipaddr->af = addr.ss_family;; if (ipaddr->af == AF_INET6) { char address[INET6_ADDRSTRLEN+1] = { 0, }; net_address_to_string(AF_INET6, (void*) &addr6->sin6_addr, address, INET6_ADDRSTRLEN+1); if (strchr(address, '.')) { /* Hack to convert IPv6 mapped IPv4 addresses to true IPv4 addresses */ ipaddr->af = AF_INET; net_string_to_address(AF_INET, address, (void*) &ipaddr->internal_ip_data.in); } else { memcpy(&ipaddr->internal_ip_data.in6, &addr6->sin6_addr, sizeof(struct in6_addr)); } } else { memcpy(&ipaddr->internal_ip_data.in, &addr4->sin_addr, sizeof(struct in_addr)); } } } return ret; }