Mercurial > pidgin.yaz
changeset 11364:e1840eb860e7
[gaim-migrate @ 13588]
Make the stun stuff compile on win32. This is largely untested since this code will not currently ever be called, but it compiles. This is based on a patch from Fran?ois Gagn?."
committer: Tailor Script <tailor@pidgin.im>
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Tue, 30 Aug 2005 00:32:32 +0000 |
parents | 78615ddd09ef |
children | 817e52833803 |
files | src/Makefile.mingw src/stun.c src/win32/libc_interface.c src/win32/libc_internal.h |
diffstat | 4 files changed, 98 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/Makefile.mingw Mon Aug 29 21:48:22 2005 +0000 +++ b/src/Makefile.mingw Tue Aug 30 00:32:32 2005 +0000 @@ -143,6 +143,7 @@ sslconn.c \ status.c \ stringref.c \ + stun.c \ upnp.c \ util.c \ value.c \
--- a/src/stun.c Mon Aug 29 21:48:22 2005 +0000 +++ b/src/stun.c Tue Aug 30 00:32:32 2005 +0000 @@ -26,11 +26,15 @@ * */ +#ifndef _WIN32 #include <sys/socket.h> #include <ifaddrs.h> #include <net/if.h> #include <sys/ioctl.h> #include <resolv.h> +#else +#include "libc_interface.h" +#endif #include "internal.h" @@ -141,9 +145,8 @@ tmp = buffer; while(tmp < buffer + ifc.ifc_len) { ifr = (struct ifreq *) tmp; - len = sizeof(struct sockaddr); - tmp += sizeof(ifr->ifr_name) + len; + tmp += sizeof(struct ifreq); if(ifr->ifr_addr.sa_family == AF_INET) { // we only care about ipv4 interfaces
--- a/src/win32/libc_interface.c Mon Aug 29 21:48:22 2005 +0000 +++ b/src/win32/libc_interface.c Tue Aug 30 00:32:32 2005 +0000 @@ -187,6 +187,41 @@ } return 0; } + case SIOCGIFCONF: + { + INTERFACE_INFO InterfaceList[20]; + unsigned long nBytesReturned; + if (WSAIoctl(fd, SIO_GET_INTERFACE_LIST, + 0, 0, &InterfaceList, + sizeof(InterfaceList), &nBytesReturned, + 0, 0) == SOCKET_ERROR) { + errno = WSAGetLastError(); + return -1; + } else { + int i; + struct ifconf *ifc = val; + char *tmp = ifc->ifc_buf; + int nNumInterfaces = + nBytesReturned / sizeof(INTERFACE_INFO); + for (i = 0; i < nNumInterfaces; i++) { + INTERFACE_INFO ii = InterfaceList[i]; + struct ifreq *ifr = (struct ifreq *) tmp; + struct sockaddr_in *sa = (struct sockaddr_in *) &ifr->ifr_addr; + + sa->sin_family = ii.iiAddress.AddressIn.sin_family; + sa->sin_port = ii.iiAddress.AddressIn.sin_port; + sa->sin_addr.s_addr = ii.iiAddress.AddressIn.sin_addr.s_addr; + tmp += sizeof(struct ifreq); + + /* Make sure that we can fit in the original buffer */ + if (tmp >= (ifc->ifc_buf + ifc->ifc_len + sizeof(struct ifreq))) { + break; + } + } + /* Replace the length with the actually used length */ + ifc->ifc_len = ifc->ifc_len - (ifc->ifc_buf - tmp); + } + } default: errno = EINVAL; return -1;
--- a/src/win32/libc_internal.h Mon Aug 29 21:48:22 2005 +0000 +++ b/src/win32/libc_internal.h Tue Aug 30 00:32:32 2005 +0000 @@ -27,6 +27,63 @@ #define F_SETFL 1 #define O_NONBLOCK 1 +/* ioctl.h */ +#define SIOCGIFCONF 0x8912 /* get iface list */ + +/* net/if.h */ +struct ifreq +{ + union + { + char ifrn_name[6]; /* Interface name, e.g. "en0". */ + } ifr_ifrn; + + union + { + struct sockaddr ifru_addr; +#if 0 + struct sockaddr ifru_dstaddr; + struct sockaddr ifru_broadaddr; + struct sockaddr ifru_netmask; + struct sockaddr ifru_hwaddr; + short int ifru_flags; + int ifru_ivalue; + int ifru_mtu; +#endif + char *ifru_data; + } ifr_ifru; +}; +# define ifr_name ifr_ifrn.ifrn_name /* interface name */ +# define ifr_addr ifr_ifru.ifru_addr /* address */ +#if 0 +# define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */ +# define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */ +# define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ +# define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */ +# define ifr_flags ifr_ifru.ifru_flags /* flags */ +# define ifr_metric ifr_ifru.ifru_ivalue /* metric */ +# define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ +#endif +# define ifr_data ifr_ifru.ifru_data /* for use by interface */ +#if 0 +# define ifr_ifindex ifr_ifru.ifru_ivalue /* interface index */ +# define ifr_bandwidth ifr_ifru.ifru_ivalue /* link bandwidth */ +# define ifr_qlen ifr_ifru.ifru_ivalue /* queue length */ +#endif + + +struct ifconf +{ + int ifc_len; /* Size of buffer. */ + union + { + char *ifcu_buf; + struct ifreq *ifcu_req; + } ifc_ifcu; +}; +# define ifc_buf ifc_ifcu.ifcu_buf /* Buffer address. */ +# define ifc_req ifc_ifcu.ifcu_req /* Array of structures. */ + /* sys/time.h */ struct timezone { int tz_minuteswest;