static void luv_pushaddrinfo(lua_State* L, struct addrinfo* res) { char ip[INET6_ADDRSTRLEN]; int port, i = 0; const char *addr; struct addrinfo* curr = res; lua_newtable(L); for (curr = res; curr; curr = curr->ai_next) { if (curr->ai_family == AF_INET || curr->ai_family == AF_INET6) { lua_newtable(L); if (curr->ai_family == AF_INET) { addr = (char*) &((struct sockaddr_in*) curr->ai_addr)->sin_addr; port = ((struct sockaddr_in*) curr->ai_addr)->sin_port; } else { addr = (char*) &((struct sockaddr_in6*) curr->ai_addr)->sin6_addr; port = ((struct sockaddr_in6*) curr->ai_addr)->sin6_port; } lua_pushstring(L, luv_af_num_to_string(curr->ai_family)); lua_setfield(L, -2, "family"); uv_inet_ntop(curr->ai_family, addr, ip, INET6_ADDRSTRLEN); lua_pushstring(L, ip); lua_setfield(L, -2, "addr"); if (ntohs(port)) { lua_pushinteger(L, ntohs(port)); lua_setfield(L, -2, "port"); } lua_pushstring(L, luv_sock_num_to_string(curr->ai_socktype)); lua_setfield(L, -2, "socktype"); lua_pushstring(L, luv_af_num_to_string(curr->ai_protocol)); lua_setfield(L, -2, "protocol"); if (curr->ai_canonname) { lua_pushstring(L, curr->ai_canonname); lua_setfield(L, -2, "canonname"); } lua_rawseti(L, -2, ++i); } } }
static int luv_interface_addresses(lua_State* L) { uv_interface_address_t* interfaces; int count, i; char ip[INET6_ADDRSTRLEN]; char netmask[INET6_ADDRSTRLEN]; uv_interface_addresses(&interfaces, &count); lua_newtable(L); for (i = 0; i < count; i++) { lua_getfield(L, -1, interfaces[i].name); if (!lua_istable(L, -1)) { lua_pop(L, 1); lua_newtable(L); lua_pushvalue(L, -1); lua_setfield(L, -3, interfaces[i].name); } lua_newtable(L); lua_pushboolean(L, interfaces[i].is_internal); lua_setfield(L, -2, "internal"); lua_pushlstring(L, interfaces[i].phys_addr, sizeof(interfaces[i].phys_addr)); lua_setfield(L, -2, "mac"); if (interfaces[i].address.address4.sin_family == AF_INET) { uv_ip4_name(&interfaces[i].address.address4, ip, sizeof(ip)); uv_ip4_name(&interfaces[i].netmask.netmask4, netmask, sizeof(netmask)); } else if (interfaces[i].address.address4.sin_family == AF_INET6) { uv_ip6_name(&interfaces[i].address.address6, ip, sizeof(ip)); uv_ip6_name(&interfaces[i].netmask.netmask6, netmask, sizeof(netmask)); } else { strncpy(ip, "<unknown sa family>", INET6_ADDRSTRLEN); strncpy(netmask, "<unknown sa family>", INET6_ADDRSTRLEN); } lua_pushstring(L, ip); lua_setfield(L, -2, "ip"); lua_pushstring(L, netmask); lua_setfield(L, -2, "netmask"); lua_pushstring(L, luv_af_num_to_string(interfaces[i].address.address4.sin_family)); lua_setfield(L, -2, "family"); lua_rawseti(L, -2, lua_rawlen (L, -2) + 1); lua_pop(L, 1); } uv_free_interface_addresses(interfaces, count); return 1; }
static void parse_sockaddr(lua_State* L, struct sockaddr_storage* address, int addrlen) { char ip[INET6_ADDRSTRLEN]; int port = 0; lua_newtable(L); if (address->ss_family == AF_INET) { struct sockaddr_in* addrin = (struct sockaddr_in*)address; uv_inet_ntop(AF_INET, &(addrin->sin_addr), ip, addrlen); port = ntohs(addrin->sin_port); } else if (address->ss_family == AF_INET6) { struct sockaddr_in6* addrin6 = (struct sockaddr_in6*)address; uv_inet_ntop(AF_INET6, &(addrin6->sin6_addr), ip, addrlen); port = ntohs(addrin6->sin6_port); } lua_pushstring(L, luv_af_num_to_string(address->ss_family)); lua_setfield(L, -2, "family"); lua_pushinteger(L, port); lua_setfield(L, -2, "port"); lua_pushstring(L, ip); lua_setfield(L, -2, "ip"); }