Mercurial > pidgin.yaz
diff libpurple/network.c @ 29742:422889fb57e0
propagate from branch 'im.pidgin.pidgin' (head 9028ac0daaa1f7e565726fa39aca22ce7d3ecc49)
to branch 'im.pidgin.pidgin.next.minor' (head debffa49382d07f0934a2b22a035940cb8f7892f)
author | Paul Aurich <paul@darkrain42.org> |
---|---|
date | Thu, 04 Feb 2010 05:30:35 +0000 |
parents | df24cbb0d6e2 |
children | ecd1aa92fd57 |
line wrap: on
line diff
--- a/libpurple/network.c Thu Feb 04 02:18:37 2010 +0000 +++ b/libpurple/network.c Thu Feb 04 05:30:35 2010 +0000 @@ -200,6 +200,45 @@ return "0.0.0.0"; } +GList * +purple_network_get_all_local_system_ips(void) +{ + GList *result = NULL; + int source = source = socket(PF_INET,SOCK_STREAM, 0); + char buffer[1024]; + char *tmp; + struct ifconf ifc; + struct ifreq *ifr; + + ifc.ifc_len = sizeof(buffer); + ifc.ifc_req = (struct ifreq *)buffer; + ioctl(source, SIOCGIFCONF, &ifc); + close(source); + + tmp = buffer; + while (tmp < buffer + ifc.ifc_len) { + char dst[INET_ADDRSTRLEN]; + + ifr = (struct ifreq *)tmp; + tmp += HX_SIZE_OF_IFREQ(*ifr); + + /* TODO: handle IPv6 */ + if (ifr->ifr_addr.sa_family == AF_INET) { + struct sockaddr_in *sinptr = (struct sockaddr_in *)&ifr->ifr_addr; + + inet_ntop(AF_INET, &sinptr->sin_addr, dst, + sizeof(dst)); + purple_debug_info("network", + "found local i/f with address %s on IPv4\n", dst); + if (!purple_strequal(dst, "127.0.0.1")) { + result = g_list_append(result, g_strdup(dst)); + } + } + } + + return result; +} + const char * purple_network_get_my_ip(int fd) {