[Freeswitch-svn] [commit] r13717 - freeswitch/trunk/src/mod/event_handlers/mod_erlang_event

FreeSWITCH SVN andrew at freeswitch.org
Mon Jun 8 22:24:55 PDT 2009


Author: andrew
Date: Tue Jun  9 00:24:55 2009
New Revision: 13717

Log:
Blindly adding winsock support, I'll test it when I get to a windows machine


Modified:
   freeswitch/trunk/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c
   freeswitch/trunk/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.h

Modified: freeswitch/trunk/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c
==============================================================================
--- freeswitch/trunk/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c	(original)
+++ freeswitch/trunk/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.c	Tue Jun  9 00:24:55 2009
@@ -245,7 +245,11 @@
 	switch_mutex_lock(listen_list.sock_mutex);
 	if (*sock) {
 		shutdown(*sock, SHUT_RDWR);
+#ifdef WIN32
+		closesocket(*sock);
+#else
 		close(*sock);
+#endif
 		sock = NULL;
 	}
 	switch_mutex_unlock(listen_list.sock_mutex);
@@ -1020,7 +1024,11 @@
 	int clientfd;
 
 	if (SWITCH_STATUS_SUCCESS==initialise_ei(&ec)) {
+#ifdef WIN32
+		WSASetLastError(0);
+#else
 		errno = 0;
+#endif
 		if ((clientfd=ei_connect(&ec,node)) < 0) {
 			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error connecting to node %s (erl_errno=%d, errno=%d)!\n",node,erl_errno,errno);
 			return NULL;
@@ -1404,6 +1412,23 @@
 	int on = 1;
 	int clientfd;
 	int epmdfd;
+#ifdef WIN32
+	/* borrowed from MSDN, stupid winsock */
+	WORD wVersionRequested;
+	WSADATA wsaData;
+
+	wVersionRequested = MAKEWORD(2, 2);
+	
+	if (WSAStartup(wVersionRequested, &wsaData) != 0) {
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Winsock initialization failed, oh well\n");
+		return SWITCH_STATUS_TERM;
+	}
+
+	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Your winsock version doesn't support the 2.2 specification, bailing\n");
+		return SWITCH_STATUS_TERM;
+	}
+#endif
 
 	memset(&listen_list, 0, sizeof(listen_list));
 	config();
@@ -1488,7 +1513,11 @@
 		/* zero out errno because ei_accept doesn't differentiate between a
 		 * failed authentication or a socket failure, or a client version
 		 * mismatch or a godzilla attack */
+#ifdef WIN32
+		WSASetLastError(0);
+#else
 		errno = 0;
+#endif
 		if ((clientfd = ei_accept_tmo(&ec, listen_list.sockfd, &conn, 100)) == ERL_ERROR) {
 			if (prefs.done) {
 				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Shutting Down\n");
@@ -1570,6 +1599,10 @@
 		close_socket(&l->sockfd);
 	}
 
+#ifdef WIN32
+	WSACleanup();
+#endif
+
 	switch_mutex_unlock(globals.listener_mutex);
 
 	switch_sleep(1500000); /* sleep for 1.5 seconds */

Modified: freeswitch/trunk/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.h
==============================================================================
--- freeswitch/trunk/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.h	(original)
+++ freeswitch/trunk/src/mod/event_handlers/mod_erlang_event/mod_erlang_event.h	Tue Jun  9 00:24:55 2009
@@ -143,7 +143,11 @@
 typedef struct globals_struct globals_t;
 
 struct listen_list_struct {
+#ifdef WIN32
+	SOCKET sockfd;
+#else
 	int sockfd;
+#endif
 	switch_mutex_t *sock_mutex;
 	listener_t *listeners;
 	uint8_t ready;
@@ -216,6 +220,10 @@
 		break; \
 }
 
+#ifdef WIN32 /* MSDN suggested hack to fake errno for network operations */
+#define errno WSAGetLastError()
+#endif
+
 /* mod_erlang_event.c */
 session_elem_t* attach_call_to_registered_process(listener_t* listener, char* reg_name, switch_core_session_t *session);
 session_elem_t* attach_call_to_pid(listener_t* listener, erlang_pid* pid, switch_core_session_t *session);



More information about the Freeswitch-svn mailing list