changeset 10281:54bcbf28698a

Networking support under MinGW. Patch by flo/yepyep <flodt8@yahoo.de>.
author diego
date Wed, 11 Jun 2003 16:48:09 +0000
parents 24145d6b5883
children 12552a460f20
files TOOLS/netstream/netstream.c configure libmpdemux/asf_mmst_streaming.c libmpdemux/asf_streaming.c libmpdemux/network.c libmpdemux/network.h libmpdemux/pnm.c libmpdemux/realrtsp/rmff.h libmpdemux/realrtsp/rtsp.c libmpdemux/realrtsp/rtsp_session.c libmpdemux/rtp.c libmpdemux/rtp.h libmpdemux/stream.c libmpdemux/stream_netstream.c libvo/vo_bl.c
diffstat 15 files changed, 205 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/TOOLS/netstream/netstream.c	Wed Jun 11 10:39:57 2003 +0000
+++ b/TOOLS/netstream/netstream.c	Wed Jun 11 16:48:09 2003 +0000
@@ -28,11 +28,17 @@
 #include <inttypes.h>
 #include <errno.h>
 #include <signal.h>
+#include <sys/types.h>
 
-#include <sys/types.h>
+#include "config.h"
+
+#ifndef HAVE_WINSOCK2
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
+#else
+#include <winsock2.h>
+#endif
 
 #include <libmpdemux/stream.h>
 #include <mp_msg.h>
--- a/configure	Wed Jun 11 10:39:57 2003 +0000
+++ b/configure	Wed Jun 11 16:48:09 2003 +0000
@@ -155,6 +155,7 @@
   --disable-edl          disable EDL (edit decision list) support [enable]
   --disable-rtc          disable RTC (/dev/rtc) on Linux [autodetect]
   --disable-network      disable network support (for: http/mms/rtp) [enable]
+  --enable-winsock2      enable winsock2 usage [autodetect]
   --enable-smb           enable Samba (SMB) input support [autodetect]
   --enable-live          enable LIVE.COM Streaming Media support [disable]
   --enable-dvdnav        enable dvdnav support [disable]
@@ -1058,6 +1059,7 @@
 _tv_bsdbt848=auto
 _edl=yes
 _network=yes
+_winsock2=auto
 _smbsupport=auto
 _vidix=auto
 _joystick=no
@@ -1233,6 +1235,8 @@
   --disable-fastmemcpy)	_fastmemcpy=no	;;
   --enable-network)	_network=yes	;;
   --disable-network)	_network=no	;;
+  --enable-winsock2)	_winsock2=yes	;;
+  --disable-winsock2)	_winsock2=no	;;
   --enable-smb)		_smbsupport=yes	;;
   --disable-smb)	_smbsupport=no	;;
   --enable-vidix)	_vidix=yes	;;
@@ -1807,6 +1811,14 @@
 cc_check -lsocket && _ld_sock="-lsocket"
 cc_check -lnsl && _ld_sock="-lnsl"
 cc_check -lsocket -lnsl && _ld_sock="-lsocket -lnsl"
+if test $_winsock2 = auto && not cygwin ; then
+  _winsock2=no
+  cat > $TMPC << EOF
+#include <winsock2.h>
+int main(void) { (void) gethostbyname(0); return 0; }
+EOF
+  cc_check -lws2_32 && _ld_sock="-lws2_32" && _winsock2=yes
+fi
 if test "$_ld_sock" ; then
   echores "yes (using $_ld_sock)"
 else
@@ -1814,6 +1826,14 @@
 fi
 
 
+if test $_winsock2 = yes ; then
+  _ld_sock="-lws2_32"
+  _def_winsock2='#define HAVE_WINSOCK2 1'
+else
+  _def_winsock2='#undef HAVE_WINSOCK2'
+fi
+
+
 _use_aton=no
 echocheck "inet_pton()"
 cat > $TMPC << EOF
@@ -1822,7 +1842,9 @@
 #include <arpa/inet.h>
 int main(void) { (void) inet_pton(0, 0, 0); return 0; }
 EOF
-if cc_check $_ld_sock ; then
+if test "$_winsock2" = yes ; then
+    echores "not needed (using winsock2 functions)"
+elif cc_check $_ld_sock ; then
   # NOTE: Linux has libresolv but does not need it
   :
   echores "yes (using $_ld_sock)"
@@ -5791,6 +5813,9 @@
 /* enable network */
 $_def_network
 
+/* enable winsock2 instead of Unix functions*/
+$_def_winsock2
+
 /* define this to use inet_aton() instead of inet_pton() */
 $_def_use_aton
 
--- a/libmpdemux/asf_mmst_streaming.c	Wed Jun 11 10:39:57 2003 +0000
+++ b/libmpdemux/asf_mmst_streaming.c	Wed Jun 11 16:48:09 2003 +0000
@@ -16,6 +16,12 @@
 
 #include "config.h"
 
+#ifndef HAVE_WINSOCK2
+#define closesocket close
+#else
+#include <winsock2.h>
+#endif
+
 #include "url.h"
 #include "asf.h"
 
@@ -433,7 +439,7 @@
   int s = stream->fd;
 
   if( s>0 ) {
-	  close( stream->fd );
+	  closesocket( stream->fd );
 	  stream->fd = -1;
   }
   
--- a/libmpdemux/asf_streaming.c	Wed Jun 11 10:39:57 2003 +0000
+++ b/libmpdemux/asf_streaming.c	Wed Jun 11 16:48:09 2003 +0000
@@ -6,6 +6,12 @@
 
 #include "config.h"
 
+#ifndef HAVE_WINSOCK2
+#define closesocket close
+#else
+#include <winsock2.h>
+#endif
+
 #include "url.h"
 #include "http.h"
 #include "asf.h"
@@ -643,7 +649,7 @@
 
 	do {
 		done = 1;
-		if( fd>0 ) close( fd );
+		if( fd>0 ) closesocket( fd );
 
 		if( !strcasecmp( url->protocol, "http_proxy" ) ) {
 			if( url->port==0 ) url->port = 8080;
@@ -729,7 +735,7 @@
 			case ASF_Unknown_e:
 			default:
 				mp_msg(MSGT_NETWORK,MSGL_ERR,"Unknown ASF streaming type\n");
-				close(fd);
+				closesocket(fd);
 				http_free( http_hdr );
 				return -1;
 		}
--- a/libmpdemux/network.c	Wed Jun 11 10:39:57 2003 +0000
+++ b/libmpdemux/network.c	Wed Jun 11 16:48:09 2003 +0000
@@ -16,6 +16,13 @@
 
 #include "config.h"
 
+#ifndef HAVE_WINSOCK2
+#define closesocket close
+#else
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#endif
+
 #include "stream.h"
 #include "demuxer.h"
 #include "../m_config.h"
@@ -194,6 +201,10 @@
 	struct hostent *hp=NULL;
 	char buf[255];
 	
+#ifdef HAVE_WINSOCK2
+	u_long val;
+#endif
+	
 	socket_server_fd = socket(af, SOCK_STREAM, 0);
 	
 	
@@ -215,11 +226,15 @@
 	
 	bzero(&server_address, sizeof(server_address));
 	
+#ifndef HAVE_WINSOCK2
 #ifdef USE_ATON
 	if (inet_aton(host, our_s_addr)!=1)
 #else
 	if (inet_pton(af, host, our_s_addr)!=1)
 #endif
+#else
+	if ( inet_addr(host)==INADDR_NONE )
+#endif
 	{
 		mp_msg(MSGT_NETWORK,MSGL_STATUS,"Resolving %s for %s...\n", host, af2String(af));
 		
@@ -235,6 +250,12 @@
 		
 		memcpy( our_s_addr, (void*)hp->h_addr, hp->h_length );
 	}
+#ifdef HAVE_WINSOCK2
+	else {
+		unsigned long addr = inet_addr(host);
+		memcpy( our_s_addr, (void*)&addr, sizeof(addr) );
+	}
+#endif
 	
 	switch (af) {
 		case AF_INET:
@@ -254,7 +275,7 @@
 			return -2;
 	}
 
-#ifdef USE_ATON
+#if defined(USE_ATON) || defined(HAVE_WINSOCK2)
 	strncpy( buf, inet_ntoa( *((struct in_addr*)our_s_addr) ), 255);
 #else
 	inet_ntop(af, our_s_addr, buf, 255);
@@ -262,11 +283,20 @@
 	mp_msg(MSGT_NETWORK,MSGL_STATUS,"Connecting to server %s[%s]:%d ...\n", host, buf , port );
 
 	// Turn the socket as non blocking so we can timeout on the connection
+#ifndef HAVE_WINSOCK2
 	fcntl( socket_server_fd, F_SETFL, fcntl(socket_server_fd, F_GETFL) | O_NONBLOCK );
+#else
+	val = 1;
+	ioctlsocket( socket_server_fd, FIONBIO, &val );
+#endif
 	if( connect( socket_server_fd, (struct sockaddr*)&server_address, server_address_size )==-1 ) {
+#ifndef HAVE_WINSOCK2
 		if( errno!=EINPROGRESS ) {
+#else
+		if( (WSAGetLastError() != WSAEINPROGRESS) && (WSAGetLastError() != WSAEWOULDBLOCK) ) {
+#endif
 			mp_msg(MSGT_NETWORK,MSGL_ERR,"Failed to connect to server with %s\n", af2String(af));
-			close(socket_server_fd);
+			closesocket(socket_server_fd);
 			return -1;
 		}
 	}
@@ -293,7 +323,12 @@
 	}
 
 	// Turn back the socket as blocking
+#ifndef HAVE_WINSOCK2
 	fcntl( socket_server_fd, F_SETFL, fcntl(socket_server_fd, F_GETFL) & ~O_NONBLOCK );
+#else
+	val = 0;
+	ioctlsocket( socket_server_fd, FIONBIO, &val );
+#endif
 	// Check if there were any error
 	err_len = sizeof(int);
 	ret =  getsockopt(socket_server_fd,SOL_SOCKET,SO_ERROR,&err,&err_len);
@@ -655,7 +690,7 @@
 
 			http_hdr = http_read_response( fd );
 			if( http_hdr==NULL ) {
-				close( fd );
+				closesocket( fd );
 				http_free( http_hdr );
 				return -1;
 			}
@@ -734,7 +769,7 @@
 					// TODO: RFC 2616, recommand to detect infinite redirection loops
 					next_url = http_get_field( http_hdr, "Location" );
 					if( next_url!=NULL ) {
-						close( fd );
+						closesocket( fd );
 						url_free( url );
 						streaming_ctrl->url = url = url_new( next_url );
 						http_free( http_hdr );
@@ -840,7 +875,7 @@
 				break;
 			default:
 				mp_msg(MSGT_NETWORK,MSGL_ERR,"Server return %d: %s\n", http_hdr->status_code, http_hdr->reason_phrase );
-				close( fd );
+				closesocket( fd );
 				fd = -1;
 		}
 		stream->fd = fd;
@@ -938,7 +973,7 @@
 	if ( redirected == 1 ) {
 		url_free(stream->streaming_ctrl->url);
 		stream->streaming_ctrl->url = url_new(mrl);
-		close(fd);
+		closesocket(fd);
 	}
 
 	free(mrl);
@@ -988,19 +1023,28 @@
 		}
 		memcpy( (void*)&server_address.sin_addr.s_addr, (void*)hp->h_addr, hp->h_length );
 	} else {
+#ifndef HAVE_WINSOCK2
 #ifdef USE_ATON
 		inet_aton(url->hostname, &server_address.sin_addr);
 #else
 		inet_pton(AF_INET, url->hostname, &server_address.sin_addr);
 #endif
+#else
+		unsigned int addr = inet_addr(url->hostname);
+		memcpy( (void*)&server_address.sin_addr, (void*)&addr, sizeof(addr) );
+#endif
 	}
 	server_address.sin_family=AF_INET;
 	server_address.sin_port=htons(url->port);
 
 	if( bind( socket_server_fd, (struct sockaddr*)&server_address, sizeof(server_address) )==-1 ) {
+#ifndef HAVE_WINSOCK2
 		if( errno!=EINPROGRESS ) {
+#else
+		if( WSAGetLastError() != WSAEINPROGRESS ) {
+#endif
 			mp_msg(MSGT_NETWORK,MSGL_ERR,"Failed to connect to server\n");
-			close(socket_server_fd);
+			closesocket(socket_server_fd);
 			return -1;
 		}
 	}
@@ -1032,7 +1076,7 @@
 		if( err ) {
 			mp_msg(MSGT_NETWORK,MSGL_ERR,"Timeout! No data from host %s\n", url->hostname );
 			mp_msg(MSGT_NETWORK,MSGL_DBG2,"Socket error: %d\n", err );
-			close(socket_server_fd);
+			closesocket(socket_server_fd);
 			return -1;
 		}
 	}
@@ -1091,7 +1135,7 @@
 	// For RTP streams, we usually don't know the stream type until we open it.
 	if( !strcasecmp( stream->streaming_ctrl->url->protocol, "rtp")) {
 		if(stream->fd >= 0) {
-			if(close(stream->fd) < 0)
+			if(closesocket(stream->fd) < 0)
 				mp_msg(MSGT_NETWORK,MSGL_ERR,"streaming_start : Closing socket %d failed %s\n",stream->fd,strerror(errno));
 		}
 		stream->fd = -1;
--- a/libmpdemux/network.h	Wed Jun 11 10:39:57 2003 +0000
+++ b/libmpdemux/network.h	Wed Jun 11 16:48:09 2003 +0000
@@ -8,12 +8,16 @@
 #define __NETWORK_H
 
 #include <fcntl.h>
+#include <sys/time.h>
+#include <sys/types.h>
+
+#include "config.h"
+#ifndef HAVE_WINSOCK2
 #include <netdb.h>
 #include <netinet/in.h>
-#include <sys/time.h>
-#include <sys/types.h>
 #include <sys/socket.h>
 #include <arpa/inet.h>
+#endif
 
 #include "url.h"
 #include "http.h"
--- a/libmpdemux/pnm.c	Wed Jun 11 10:39:57 2003 +0000
+++ b/libmpdemux/pnm.c	Wed Jun 11 16:48:09 2003 +0000
@@ -26,9 +26,6 @@
 #include <unistd.h>
 #include <stdio.h>
 #include <assert.h>
-#include <sys/socket.h>
-//#include <netinet/in.h>
-//#include <netdb.h>
 #include <string.h>
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -37,6 +34,16 @@
 #include <sys/time.h>
 #include <inttypes.h>
 
+#include "config.h"
+#ifndef HAVE_WINSOCK2
+#define closesocket close
+#include <sys/socket.h>
+//#include <netinet/in.h>
+//#include <netdb.h>
+#else
+#include <winsock2.h>
+#endif
+
 #include "pnm.h"
 //#include "libreal/rmff.h"
 
@@ -207,7 +214,11 @@
     if (n > 0)
       total += n;
     else if (n < 0) {
+#ifndef HAVE_WINSOCK2
       if ((timeout>0) && ((errno == EAGAIN) || (errno == EINPROGRESS))) {
+#else
+      if ((timeout>0) && ((errno == EAGAIN) || (WSAGetLastError() == WSAEINPROGRESS))) {
+#endif
         sleep (1); timeout--;
       } else
         return -1;
@@ -810,7 +821,7 @@
 
 void pnm_close(pnm_t *p) {
 
-  if (p->s >= 0) close(p->s);
+  if (p->s >= 0) closesocket(p->s);
   free(p->path);
   free(p);
 }
--- a/libmpdemux/realrtsp/rmff.h	Wed Jun 11 10:39:57 2003 +0000
+++ b/libmpdemux/realrtsp/rmff.h	Wed Jun 11 16:48:09 2003 +0000
@@ -27,9 +27,14 @@
  */
 
 #include <sys/types.h>
+#include "config.h"
+#ifndef HAVE_WINSOCK2
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <netdb.h>
+#else
+#include <winsock2.h>
+#endif
 #include <unistd.h>
 #include <stdio.h>
 #include <fcntl.h>
--- a/libmpdemux/realrtsp/rtsp.c	Wed Jun 11 10:39:57 2003 +0000
+++ b/libmpdemux/realrtsp/rtsp.c	Wed Jun 11 16:48:09 2003 +0000
@@ -29,9 +29,15 @@
 #include <unistd.h>
 #include <stdio.h>
 #include <assert.h>
+#include "config.h"
+#ifndef HAVE_WINSOCK2
+#define closesocket close
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <netdb.h>
+#else
+#include <winsock2.h>
+#endif
 #include <string.h>
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -119,9 +125,13 @@
   sin.sin_port   = htons(port);
   
   if (connect(s, (struct sockaddr *)&sin, sizeof(sin))==-1 
+#ifndef HAVE_WINSOCK2
       && errno != EINPROGRESS) {
+#else
+      && WSAGetLastError() == WSAEINPROGRESS) {
+#endif
     printf ("rtsp: connect(): %s\n", strerror(errno));
-    close(s);
+    closesocket(s);
     return -1;
   }
 
@@ -163,7 +173,11 @@
     if (n > 0)
       total += n;
     else if (n < 0) {
+#ifndef HAVE_WINSOCK2
       if ((timeout>0) && ((errno == EAGAIN) || (errno == EINPROGRESS))) {
+#else
+      if ((timeout>0) && ((errno == EAGAIN) || (WSAGetLastError() == WSAEINPROGRESS))) {
+#endif
         sleep (1); timeout--;
       } else
         return -1;
@@ -641,7 +655,7 @@
 
 void rtsp_close(rtsp_t *s) {
 
-  if (s->server_state) close(s->s); /* TODO: send a TEAROFF */
+  if (s->server_state) closesocket(s->s); /* TODO: send a TEAROFF */
   if (s->path) free(s->path);
   if (s->host) free(s->host);
   if (s->mrl) free(s->mrl);
--- a/libmpdemux/realrtsp/rtsp_session.c	Wed Jun 11 10:39:57 2003 +0000
+++ b/libmpdemux/realrtsp/rtsp_session.c	Wed Jun 11 16:48:09 2003 +0000
@@ -26,9 +26,14 @@
  */
 
 #include <sys/types.h>
+#include "config.h"
+#ifndef HAVE_WINSOCK2
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <netdb.h>
+#else
+#include <winsock2.h>
+#endif
 #include <unistd.h>
 #include <stdio.h>
 #include <fcntl.h>
--- a/libmpdemux/rtp.c	Wed Jun 11 10:39:57 2003 +0000
+++ b/libmpdemux/rtp.c	Wed Jun 11 16:48:09 2003 +0000
@@ -2,12 +2,18 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
-#include <netinet/in.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <sys/types.h>
+#include "config.h"
+#ifndef HAVE_WINSOCK2
+#include <netinet/in.h>
 #include <sys/socket.h>
 #include <arpa/inet.h>
+#else
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#endif
 
 /* MPEG-2 TS RTP stack */
 
--- a/libmpdemux/rtp.h	Wed Jun 11 10:39:57 2003 +0000
+++ b/libmpdemux/rtp.h	Wed Jun 11 16:48:09 2003 +0000
@@ -1,7 +1,12 @@
 #ifndef _RTP_H
 #define _RTP_H
 
+#include "config.h"
+#ifndef HAVE_WINSOCK2
 #include <sys/socket.h>
+#else
+#include <winsock2.h>
+#endif
 
 struct rtpbits {
   unsigned int v:2;           /* version: 2 */
--- a/libmpdemux/stream.c	Wed Jun 11 10:39:57 2003 +0000
+++ b/libmpdemux/stream.c	Wed Jun 11 16:48:09 2003 +0000
@@ -14,6 +14,13 @@
 #include <strings.h>
 
 #include "config.h"
+
+#ifndef HAVE_WINSOCK2
+#define closesocket close
+#else
+#include <winsock2.h>
+#endif
+
 #include "mp_msg.h"
 #include "help_mp.h"
 #include "../osdep/shmem.h"
@@ -376,6 +383,14 @@
   stream_t *s=malloc(sizeof(stream_t));
   if(s==NULL) return NULL;
   memset(s,0,sizeof(stream_t));
+
+#ifdef HAVE_WINSOCK2
+  {
+    WSADATA wsdata;
+    int temp = WSAStartup(0x0202, &wsdata); // there might be a better place for this (-> later)
+    mp_msg(MSGT_STREAM,MSGL_V,"WINSOCK2 init: %i\n", temp);
+  }
+#endif
   
   s->fd=fd;
   s->type=type;
@@ -414,7 +429,11 @@
   default:
     if(s->close) s->close(s);
   }
-  if(s->fd>0) close(s->fd);
+  if(s->fd>0) closesocket(s->fd);
+#ifdef HAVE_WINSOCK2
+  mp_msg(MSGT_STREAM,MSGL_V,"WINSOCK2 uninit\n");
+  WSACleanup(); // there might be a better place for this (-> later)
+#endif
   // Disabled atm, i don't like that. s->priv can be anything after all
   // streams should destroy their priv on close
   //if(s->priv) free(s->priv);
--- a/libmpdemux/stream_netstream.c	Wed Jun 11 10:39:57 2003 +0000
+++ b/libmpdemux/stream_netstream.c	Wed Jun 11 16:48:09 2003 +0000
@@ -48,9 +48,14 @@
 #include <inttypes.h>
 #include <errno.h>
 
+#ifndef HAVE_WINSOCK2
+#define closesocket close
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
+#else
+#include <winsock2.h>
+#endif
 
 #include "mp_msg.h"
 #include "stream.h"
@@ -89,6 +94,7 @@
 //// When the cache is running we need a lock as
 //// fill_buffer is called from another proccess
 static int lock_fd(int fd) {
+#ifndef HAVE_WINSOCK2
   struct flock lock;
 
   memset(&lock,0,sizeof(struct flock));
@@ -104,10 +110,14 @@
     }
   } while(0);
   mp_msg(MSGT_STREAM,MSGL_DBG2, "Locked (%d)\n",getpid());
+#else
+printf("FIXME? should lock here\n");
+#endif
   return 1;
 }
 
 static int unlock_fd(int fd) {
+#ifndef HAVE_WINSOCK2
   struct flock lock;
 
   memset(&lock,0,sizeof(struct flock));
@@ -119,6 +129,9 @@
 	   strerror(errno));
     return 0;
   }
+#else
+printf("FIXME? should unlock here\n");
+#endif
   return 1;
 }
 
@@ -280,7 +293,7 @@
   return STREAM_OK;
 
   error:
-  close(f);
+  closesocket(f);
   m_struct_free(&stream_opts,opts);
   return STREAM_ERROR;
 }
--- a/libvo/vo_bl.c	Wed Jun 11 10:39:57 2003 +0000
+++ b/libvo/vo_bl.c	Wed Jun 11 16:48:09 2003 +0000
@@ -19,17 +19,23 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include <errno.h>
-#include <netdb.h>
 #include <sys/stat.h>
 #include <sys/types.h>
-#include <sys/socket.h>
 #include <sys/time.h>
 #include <sys/mman.h>
 #include <sys/ioctl.h>
-#include <netinet/in.h>
 
 #include "config.h"
 
+#ifndef HAVE_WINSOCK2
+#define closesocket close
+#include <netdb.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#else
+#include <winsock2.h>
+#endif
+
 #include "video_out.h"
 #include "video_out_internal.h"
 #include "../mp_msg.h"
@@ -168,7 +174,7 @@
 	if (connect(h->fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
 		mp_msg(MSGT_VO, MSGL_ERR, "couldn't connect socket for %s\n", 
 				h->name);
-		close(h->fd);
+		closesocket(h->fd);
 		return 1;
 	}
 	return 0;
@@ -180,7 +186,7 @@
 }
 
 static void udp_close(bl_host_t *h) {
-	close(h->fd);
+	closesocket(h->fd);
 }
 
 #define NO_BLS 2