summaryrefslogtreecommitdiffstats
path: root/stream/network.c
diff options
context:
space:
mode:
authorben <ben@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-08-05 10:30:06 +0000
committerben <ben@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-08-05 10:30:06 +0000
commitd7b460956a351157b59a551a8c21cfc18bf11e69 (patch)
tree9733d7622666dccb56bc641dd3c9cf78825bc7c0 /stream/network.c
parentd3df3a773f3abd46c8f96a14c45c8d4a57ac71fb (diff)
downloadmpv-d7b460956a351157b59a551a8c21cfc18bf11e69.tar.bz2
mpv-d7b460956a351157b59a551a8c21cfc18bf11e69.tar.xz
isolated tcp socket code from network.c to a dedicated file
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@19341 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'stream/network.c')
-rw-r--r--stream/network.c208
1 files changed, 1 insertions, 207 deletions
diff --git a/stream/network.c b/stream/network.c
index 4b0e0966db..4b8856d4b4 100644
--- a/stream/network.c
+++ b/stream/network.c
@@ -31,6 +31,7 @@
#include "m_config.h"
#include "network.h"
+#include "tcp.h"
#include "http.h"
#include "cookies.h"
#include "url.h"
@@ -51,7 +52,6 @@ int network_cookies_enabled = 0;
char *network_useragent=NULL;
/* IPv6 options */
-int network_prefer_ipv4 = 0;
int network_ipv4_only_proxy = 0;
@@ -114,212 +114,6 @@ streaming_ctrl_free( streaming_ctrl_t *streaming_ctrl ) {
free( streaming_ctrl );
}
-
-// Converts an address family constant to a string
-
-const char *af2String(int af) {
- switch (af) {
- case AF_INET: return "AF_INET";
-
-#ifdef HAVE_AF_INET6
- case AF_INET6: return "AF_INET6";
-#endif
- default: return "Unknown address family!";
- }
-}
-
-
-
-// Connect to a server using a TCP connection, with specified address family
-// return -2 for fatal error, like unable to resolve name, connection timeout...
-// return -1 is unable to connect to a particular port
-
-int
-connect2Server_with_af(char *host, int port, int af,int verb) {
- int socket_server_fd;
- int err;
- socklen_t err_len;
- int ret,count = 0;
- fd_set set;
- struct timeval tv;
- union {
- struct sockaddr_in four;
-#ifdef HAVE_AF_INET6
- struct sockaddr_in6 six;
-#endif
- } server_address;
- size_t server_address_size;
- void *our_s_addr; // Pointer to sin_addr or sin6_addr
- struct hostent *hp=NULL;
- char buf[255];
-
-#ifdef HAVE_WINSOCK2
- u_long val;
-#endif
-
- socket_server_fd = socket(af, SOCK_STREAM, 0);
-
-
- if( socket_server_fd==-1 ) {
-// mp_msg(MSGT_NETWORK,MSGL_ERR,"Failed to create %s socket:\n", af2String(af));
- return -2;
- }
-
- switch (af) {
- case AF_INET: our_s_addr = (void *) &server_address.four.sin_addr; break;
-#ifdef HAVE_AF_INET6
- case AF_INET6: our_s_addr = (void *) &server_address.six.sin6_addr; break;
-#endif
- default:
- mp_msg(MSGT_NETWORK,MSGL_ERR, MSGTR_MPDEMUX_NW_UnknownAF, af);
- return -2;
- }
-
-
- memset(&server_address, 0, 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
- {
- if(verb) mp_msg(MSGT_NETWORK,MSGL_STATUS,MSGTR_MPDEMUX_NW_ResolvingHostForAF, host, af2String(af));
-
-#ifdef HAVE_GETHOSTBYNAME2
- hp=(struct hostent*)gethostbyname2( host, af );
-#else
- hp=(struct hostent*)gethostbyname( host );
-#endif
- if( hp==NULL ) {
- if(verb) mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_NW_CantResolv, af2String(af), host);
- return -2;
- }
-
- memcpy( our_s_addr, (void*)hp->h_addr_list[0], 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:
- server_address.four.sin_family=af;
- server_address.four.sin_port=htons(port);
- server_address_size = sizeof(server_address.four);
- break;
-#ifdef HAVE_AF_INET6
- case AF_INET6:
- server_address.six.sin6_family=af;
- server_address.six.sin6_port=htons(port);
- server_address_size = sizeof(server_address.six);
- break;
-#endif
- default:
- mp_msg(MSGT_NETWORK,MSGL_ERR, MSGTR_MPDEMUX_NW_UnknownAF, af);
- return -2;
- }
-
-#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);
-#endif
- if(verb) mp_msg(MSGT_NETWORK,MSGL_STATUS,MSGTR_MPDEMUX_NW_ConnectingToServer, 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
- if(verb) mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_NW_CantConnect2Server, af2String(af));
- closesocket(socket_server_fd);
- return -1;
- }
- }
- tv.tv_sec = 0;
- tv.tv_usec = 500000;
- FD_ZERO( &set );
- FD_SET( socket_server_fd, &set );
- // When the connection will be made, we will have a writable fd
- while((ret = select(socket_server_fd+1, NULL, &set, NULL, &tv)) == 0) {
- if( ret<0 ) mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_NW_SelectFailed);
- else if(ret > 0) break;
- else if(count > 30 || mp_input_check_interrupt(500)) {
- if(count > 30)
- mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_NW_ConnTimeout);
- else
- mp_msg(MSGT_NETWORK,MSGL_V,"Connection interuppted by user\n");
- return -3;
- }
- count++;
- FD_ZERO( &set );
- FD_SET( socket_server_fd, &set );
- tv.tv_sec = 0;
- tv.tv_usec = 500000;
- }
-
- // 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);
- if(ret < 0) {
- mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_NW_GetSockOptFailed,strerror(errno));
- return -2;
- }
- if(err > 0) {
- mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_NW_ConnectError,strerror(err));
- return -1;
- }
-
- return socket_server_fd;
-}
-
-// Connect to a server using a TCP connection
-// return -2 for fatal error, like unable to resolve name, connection timeout...
-// return -1 is unable to connect to a particular port
-
-
-int
-connect2Server(char *host, int port, int verb) {
-#ifdef HAVE_AF_INET6
- int r;
- int s = -2;
-
- r = connect2Server_with_af(host, port, network_prefer_ipv4 ? AF_INET:AF_INET6,verb);
- if (r > -1) return r;
-
- s = connect2Server_with_af(host, port, network_prefer_ipv4 ? AF_INET6:AF_INET,verb);
- if (s == -2) return r;
- return s;
-#else
- return connect2Server_with_af(host, port, AF_INET,verb);
-#endif
-
-
-}
-
URL_t*
check4proxies( URL_t *url ) {
URL_t *url_out = NULL;