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;