1
mirror of https://github.com/mpv-player/mpv synced 2024-08-04 14:59:58 +02:00

Networking support under MinGW.

Patch by flo/yepyep <flodt8@yahoo.de>.


git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@10282 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
diego 2003-06-11 16:48:09 +00:00
parent 5ccc705d9a
commit 6ac4f22567
15 changed files with 205 additions and 30 deletions

View File

@ -28,11 +28,17 @@
#include <inttypes.h>
#include <errno.h>
#include <signal.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>

27
configure vendored
View File

@ -155,6 +155,7 @@ Optional features:
--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_v4l=auto
_tv_bsdbt848=auto
_edl=yes
_network=yes
_winsock2=auto
_smbsupport=auto
_vidix=auto
_joystick=no
@ -1233,6 +1235,8 @@ for ac_option do
--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 @@ EOF
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 @@ else
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 @@ cat > $TMPC << EOF
#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 @@ $_def_faad_version
/* 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

View File

@ -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 asf_mmst_streaming_start(stream_t *stream)
int s = stream->fd;
if( s>0 ) {
close( stream->fd );
closesocket( stream->fd );
stream->fd = -1;
}

View File

@ -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 @@ asf_http_streaming_start( stream_t *stream, int *demuxer_type ) {
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 @@ asf_http_streaming_start( stream_t *stream, int *demuxer_type ) {
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;
}

View File

@ -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 @@ connect2Server_with_af(char *host, int port, int af) {
struct hostent *hp=NULL;
char buf[255];
#ifdef HAVE_WINSOCK2
u_long val;
#endif
socket_server_fd = socket(af, SOCK_STREAM, 0);
@ -215,10 +226,14 @@ connect2Server_with_af(char *host, int port, int af) {
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 @@ connect2Server_with_af(char *host, int port, int af) {
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 @@ connect2Server_with_af(char *host, int port, int af) {
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 @@ connect2Server_with_af(char *host, int port, int af) {
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 @@ connect2Server_with_af(char *host, int port, int af) {
}
// 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 @@ extension=NULL;
http_hdr = http_read_response( fd );
if( http_hdr==NULL ) {
close( fd );
closesocket( fd );
http_free( http_hdr );
return -1;
}
@ -734,7 +769,7 @@ extension=NULL;
// 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 @@ nop_streaming_start( stream_t *stream ) {
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 @@ realrtsp_streaming_start( stream_t *stream ) {
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 @@ rtp_open_socket( URL_t *url ) {
}
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 @@ rtp_open_socket( URL_t *url ) {
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 @@ streaming_start(stream_t *stream, int *demuxer_type, URL_t *url) {
// 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;

View File

@ -8,12 +8,16 @@
#define __NETWORK_H
#include <fcntl.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <sys/types.h>
#include "config.h"
#ifndef HAVE_WINSOCK2
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#endif
#include "url.h"
#include "http.h"

View File

@ -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 @@ static int rm_write(int s, const char *buf, int len) {
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 @@ int pnm_peek_header (pnm_t *this, char *data) {
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);
}

View File

@ -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>

View File

@ -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 @@ static int host_connect_attempt(struct in_addr ia, int port) {
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 @@ static int write_stream(int s, const char *buf, int len) {
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 @@ rtsp_t *rtsp_connect(int fd, char* mrl, char *path, char *host, int port, char *
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);

View File

@ -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>

View File

@ -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 */

View File

@ -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 */

View File

@ -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* new_stream(int fd,int type){
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 @@ void free_stream(stream_t *s){
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);

View File

@ -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 @@ static struct m_struct_st stream_opts = {
//// 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 @@ static int lock_fd(int fd) {
}
} 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 @@ static int unlock_fd(int fd) {
strerror(errno));
return 0;
}
#else
printf("FIXME? should unlock here\n");
#endif
return 1;
}
@ -280,7 +293,7 @@ static int open_s(stream_t *stream,int mode, void* opts, int* file_format) {
return STREAM_OK;
error:
close(f);
closesocket(f);
m_struct_free(&stream_opts,opts);
return STREAM_ERROR;
}

View File

@ -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 @@ static int udp_init(bl_host_t *h) {
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_send(bl_host_t *h) {
}
static void udp_close(bl_host_t *h) {
close(h->fd);
closesocket(h->fd);
}
#define NO_BLS 2