From: Rémi Denis-Courmont Date: Mon, 27 Feb 2006 12:46:42 +0000 (+0000) Subject: Separate socket/resolv stuff (network.h) from url stuff (vlc_url.h) X-Git-Tag: 0.9.0-test0~12151 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=d18bfd92bb33df6e590efa02a55121ee75529b4f;p=vlc Separate socket/resolv stuff (network.h) from url stuff (vlc_url.h) --- diff --git a/include/network.h b/include/network.h index 7463f6e5b1..dd2c32a363 100644 --- a/include/network.h +++ b/include/network.h @@ -78,286 +78,6 @@ struct network_socket_t size_t i_mtu; }; -typedef struct -{ - char *psz_protocol; - char *psz_username; - char *psz_password; - char *psz_host; - int i_port; - - char *psz_path; - - char *psz_option; - - char *psz_buffer; /* to be freed */ -} vlc_url_t; - -/***************************************************************************** - * vlc_UrlParse: - ***************************************************************************** - * option : if != 0 then path is split at this char - * - * format [protocol://[login[:password]@]][host[:port]]/path[OPTIONoption] - *****************************************************************************/ -static inline void vlc_UrlParse( vlc_url_t *url, const char *psz_url, - char option ) -{ - char *psz_dup; - char *psz_parse; - char *p; - - url->psz_protocol = NULL; - url->psz_username = NULL; - url->psz_password = NULL; - url->psz_host = NULL; - url->i_port = 0; - url->psz_path = NULL; - url->psz_option = NULL; - - if( psz_url == NULL ) - { - url->psz_buffer = NULL; - return; - } - url->psz_buffer = psz_parse = psz_dup = strdup( psz_url ); - - p = strstr( psz_parse, ":/" ); - if( p != NULL ) - { - /* we have a protocol */ - - /* skip :// */ - *p++ = '\0'; - if( p[1] == '/' ) - p += 2; - url->psz_protocol = psz_parse; - psz_parse = p; - } - p = strchr( psz_parse, '@' ); - if( p != NULL ) - { - /* We have a login */ - url->psz_username = psz_parse; - *p++ = '\0'; - - psz_parse = strchr( psz_parse, ':' ); - if( psz_parse != NULL ) - { - /* We have a password */ - *psz_parse++ = '\0'; - url->psz_password = psz_parse; - } - - psz_parse = p; - } - - p = strchr( psz_parse, '/' ); - if( !p || psz_parse < p ) - { - char *p2; - - /* We have a host[:port] */ - url->psz_host = strdup( psz_parse ); - if( p ) - { - url->psz_host[p - psz_parse] = '\0'; - } - - if( *url->psz_host == '[' ) - { - /* Ipv6 address */ - p2 = strchr( url->psz_host, ']' ); - if( p2 ) - { - p2 = strchr( p2, ':' ); - } - } - else - { - p2 = strchr( url->psz_host, ':' ); - } - if( p2 ) - { - *p2++ = '\0'; - url->i_port = atoi( p2 ); - } - } - psz_parse = p; - - /* Now parse psz_path and psz_option */ - if( psz_parse ) - { - url->psz_path = psz_parse; - if( option != '\0' ) - { - p = strchr( url->psz_path, option ); - if( p ) - { - *p++ = '\0'; - url->psz_option = p; - } - } - } -} - -/***************************************************************************** - * vlc_UrlClean: - ***************************************************************************** - * - *****************************************************************************/ -static inline void vlc_UrlClean( vlc_url_t *url ) -{ - if( url->psz_buffer ) free( url->psz_buffer ); - if( url->psz_host ) free( url->psz_host ); - - url->psz_protocol = NULL; - url->psz_username = NULL; - url->psz_password = NULL; - url->psz_host = NULL; - url->i_port = 0; - url->psz_path = NULL; - url->psz_option = NULL; - - url->psz_buffer = NULL; -} - -static inline int isurlsafe( int c ) -{ - return ( (unsigned char)( c - 'a' ) < 26 ) - || ( (unsigned char)( c - 'A' ) < 26 ) - || ( (unsigned char)( c - '0' ) < 10 ) - /* Hmm, we should not encode character that are allowed in URLs - * (even if they are not URL-safe), nor URL-safe characters. - * We still encode some of them because of Microsoft's crap browser. - */ - || ( strchr( "-_.", c ) != NULL ); -} - -/***************************************************************************** - * vlc_UrlEncode: - ***************************************************************************** - * perform URL encoding - * (you do NOT want to do URL decoding - it is not reversible - do NOT do it) - *****************************************************************************/ -static inline char *vlc_UrlEncode( const char *psz_url ) -{ - char *psz_enc, *out; - const unsigned char *in; - - psz_enc = (char *)malloc( 3 * strlen( psz_url ) + 1 ); - if( psz_enc == NULL ) - return NULL; - - out = psz_enc; - for( in = (const unsigned char *)psz_url; *in; in++ ) - { - unsigned char c = *in; - - if( isurlsafe( c ) ) - *out++ = (char)c; - else - { - *out++ = '%'; - *out++ = ( ( c >> 4 ) >= 0xA ) ? 'A' + ( c >> 4 ) - 0xA - : '0' + ( c >> 4 ); - *out++ = ( ( c & 0xf ) >= 0xA ) ? 'A' + ( c & 0xf ) - 0xA - : '0' + ( c & 0xf ); - } - } - *out++ = '\0'; - - return (char *)realloc( psz_enc, out - psz_enc ); -} - -/***************************************************************************** - * vlc_UrlIsNotEncoded: - ***************************************************************************** - * check if given string is not a valid URL and must hence be encoded - *****************************************************************************/ -#include - -static inline int vlc_UrlIsNotEncoded( const char *psz_url ) -{ - const char *ptr; - - for( ptr = psz_url; *ptr; ptr++ ) - { - char c = *ptr; - - if( c == '%' ) - { - if( !isxdigit( ptr[1] ) || !isxdigit( ptr[2] ) ) - return 1; /* not encoded */ - ptr += 2; - } - else - if( !isurlsafe( c ) ) - return 1; - } - return 0; /* looks fine - but maybe it is not encoded */ -} - -/***************************************************************************** - * vlc_b64_encode: - ***************************************************************************** - * - *****************************************************************************/ -static inline char *vlc_b64_encode( char *src ) -{ - static const char b64[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - size_t len = strlen( src ); - - char *ret; - char *dst = (char *)malloc( ( len + 4 ) * 4 / 3 ); - if( dst == NULL ) - return NULL; - - ret = dst; - - while( len > 0 ) - { - /* pops (up to) 3 bytes of input */ - uint32_t v = *src++ << 24; - - if( len >= 2 ) - { - v |= *src++ << 16; - if( len >= 3 ) - v |= *src++ << 8; - } - - /* pushes (up to) 4 bytes of output */ - while( v ) - { - *dst++ = b64[v >> 26]; - v = v << 6; - } - - switch( len ) - { - case 1: - *dst++ = '='; - *dst++ = '='; - len--; - break; - - case 2: - *dst++ = '='; - len -= 2; - break; - - default: - len -= 3; - } - } - - *dst = '\0'; - - return ret; -} - /* Portable networking layer communication */ #define net_ConnectTCP(a, b, c) __net_ConnectTCP(VLC_OBJECT(a), b, c) #define net_OpenTCP(a, b, c) __net_ConnectTCP(VLC_OBJECT(a), b, c) diff --git a/include/vlc_url.h b/include/vlc_url.h new file mode 100644 index 0000000000..60cade1bc4 --- /dev/null +++ b/include/vlc_url.h @@ -0,0 +1,307 @@ +/***************************************************************************** + * vlc_url.h: URL related macros + ***************************************************************************** + * Copyright (C) 2002-2005 the VideoLAN team + * $Id$ + * + * Authors: Christophe Massiot + * Rémi Denis-Courmont + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef __VLC_URL_H +# define __VLC_URL_H + +typedef struct +{ + char *psz_protocol; + char *psz_username; + char *psz_password; + char *psz_host; + int i_port; + + char *psz_path; + + char *psz_option; + + char *psz_buffer; /* to be freed */ +} vlc_url_t; + +/***************************************************************************** + * vlc_UrlParse: + ***************************************************************************** + * option : if != 0 then path is split at this char + * + * format [protocol://[login[:password]@]][host[:port]]/path[OPTIONoption] + *****************************************************************************/ +static inline void vlc_UrlParse( vlc_url_t *url, const char *psz_url, + char option ) +{ + char *psz_dup; + char *psz_parse; + char *p; + + url->psz_protocol = NULL; + url->psz_username = NULL; + url->psz_password = NULL; + url->psz_host = NULL; + url->i_port = 0; + url->psz_path = NULL; + url->psz_option = NULL; + + if( psz_url == NULL ) + { + url->psz_buffer = NULL; + return; + } + url->psz_buffer = psz_parse = psz_dup = strdup( psz_url ); + + p = strstr( psz_parse, ":/" ); + if( p != NULL ) + { + /* we have a protocol */ + + /* skip :// */ + *p++ = '\0'; + if( p[1] == '/' ) + p += 2; + url->psz_protocol = psz_parse; + psz_parse = p; + } + p = strchr( psz_parse, '@' ); + if( p != NULL ) + { + /* We have a login */ + url->psz_username = psz_parse; + *p++ = '\0'; + + psz_parse = strchr( psz_parse, ':' ); + if( psz_parse != NULL ) + { + /* We have a password */ + *psz_parse++ = '\0'; + url->psz_password = psz_parse; + } + + psz_parse = p; + } + + p = strchr( psz_parse, '/' ); + if( !p || psz_parse < p ) + { + char *p2; + + /* We have a host[:port] */ + url->psz_host = strdup( psz_parse ); + if( p ) + { + url->psz_host[p - psz_parse] = '\0'; + } + + if( *url->psz_host == '[' ) + { + /* Ipv6 address */ + p2 = strchr( url->psz_host, ']' ); + if( p2 ) + { + p2 = strchr( p2, ':' ); + } + } + else + { + p2 = strchr( url->psz_host, ':' ); + } + if( p2 ) + { + *p2++ = '\0'; + url->i_port = atoi( p2 ); + } + } + psz_parse = p; + + /* Now parse psz_path and psz_option */ + if( psz_parse ) + { + url->psz_path = psz_parse; + if( option != '\0' ) + { + p = strchr( url->psz_path, option ); + if( p ) + { + *p++ = '\0'; + url->psz_option = p; + } + } + } +} + +/***************************************************************************** + * vlc_UrlClean: + ***************************************************************************** + * + *****************************************************************************/ +static inline void vlc_UrlClean( vlc_url_t *url ) +{ + if( url->psz_buffer ) free( url->psz_buffer ); + if( url->psz_host ) free( url->psz_host ); + + url->psz_protocol = NULL; + url->psz_username = NULL; + url->psz_password = NULL; + url->psz_host = NULL; + url->i_port = 0; + url->psz_path = NULL; + url->psz_option = NULL; + + url->psz_buffer = NULL; +} + +static inline int isurlsafe( int c ) +{ + return ( (unsigned char)( c - 'a' ) < 26 ) + || ( (unsigned char)( c - 'A' ) < 26 ) + || ( (unsigned char)( c - '0' ) < 10 ) + /* Hmm, we should not encode character that are allowed in URLs + * (even if they are not URL-safe), nor URL-safe characters. + * We still encode some of them because of Microsoft's crap browser. + */ + || ( strchr( "-_.", c ) != NULL ); +} + +/***************************************************************************** + * vlc_UrlEncode: + ***************************************************************************** + * perform URL encoding + * (you do NOT want to do URL decoding - it is not reversible - do NOT do it) + *****************************************************************************/ +static inline char *vlc_UrlEncode( const char *psz_url ) +{ + char *psz_enc, *out; + const unsigned char *in; + + psz_enc = (char *)malloc( 3 * strlen( psz_url ) + 1 ); + if( psz_enc == NULL ) + return NULL; + + out = psz_enc; + for( in = (const unsigned char *)psz_url; *in; in++ ) + { + unsigned char c = *in; + + if( isurlsafe( c ) ) + *out++ = (char)c; + else + { + *out++ = '%'; + *out++ = ( ( c >> 4 ) >= 0xA ) ? 'A' + ( c >> 4 ) - 0xA + : '0' + ( c >> 4 ); + *out++ = ( ( c & 0xf ) >= 0xA ) ? 'A' + ( c & 0xf ) - 0xA + : '0' + ( c & 0xf ); + } + } + *out++ = '\0'; + + return (char *)realloc( psz_enc, out - psz_enc ); +} + +/***************************************************************************** + * vlc_UrlIsNotEncoded: + ***************************************************************************** + * check if given string is not a valid URL and must hence be encoded + *****************************************************************************/ +#include + +static inline int vlc_UrlIsNotEncoded( const char *psz_url ) +{ + const char *ptr; + + for( ptr = psz_url; *ptr; ptr++ ) + { + char c = *ptr; + + if( c == '%' ) + { + if( !isxdigit( ptr[1] ) || !isxdigit( ptr[2] ) ) + return 1; /* not encoded */ + ptr += 2; + } + else + if( !isurlsafe( c ) ) + return 1; + } + return 0; /* looks fine - but maybe it is not encoded */ +} + +/***************************************************************************** + * vlc_b64_encode: + ***************************************************************************** + * + *****************************************************************************/ +static inline char *vlc_b64_encode( char *src ) +{ + static const char b64[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + size_t len = strlen( src ); + + char *ret; + char *dst = (char *)malloc( ( len + 4 ) * 4 / 3 ); + if( dst == NULL ) + return NULL; + + ret = dst; + + while( len > 0 ) + { + /* pops (up to) 3 bytes of input */ + uint32_t v = *src++ << 24; + + if( len >= 2 ) + { + v |= *src++ << 16; + if( len >= 3 ) + v |= *src++ << 8; + } + + /* pushes (up to) 4 bytes of output */ + while( v ) + { + *dst++ = b64[v >> 26]; + v = v << 6; + } + + switch( len ) + { + case 1: + *dst++ = '='; + *dst++ = '='; + len--; + break; + + case 2: + *dst++ = '='; + len -= 2; + break; + + default: + len -= 3; + } + } + + *dst = '\0'; + + return ret; +} +#endif diff --git a/modules/access/ftp.c b/modules/access/ftp.c index 2a51f66034..246ebe8e6d 100644 --- a/modules/access/ftp.c +++ b/modules/access/ftp.c @@ -31,13 +31,7 @@ #include #include "network.h" -#if defined( UNDER_CE ) -# include -#elif defined( WIN32 ) -# include -#else -# include -#endif +#include "vlc_url.h" /***************************************************************************** * Module descriptor diff --git a/modules/access/http.c b/modules/access/http.c index 80bcc132d2..102770ffb4 100644 --- a/modules/access/http.c +++ b/modules/access/http.c @@ -35,6 +35,7 @@ #include "vlc_playlist.h" #include "vlc_meta.h" #include "network.h" +#include "vlc_url.h" #include "vlc_tls.h" /***************************************************************************** diff --git a/modules/access/mms/mmsh.c b/modules/access/mms/mmsh.c index e91354060b..89cc1cc6cf 100644 --- a/modules/access/mms/mmsh.c +++ b/modules/access/mms/mmsh.c @@ -32,6 +32,7 @@ #include "vlc_playlist.h" #include "network.h" +#include "vlc_url.h" #include "asf.h" #include "buffer.h" diff --git a/modules/access/mms/mmstu.c b/modules/access/mms/mmstu.c index 7b69ee1ae6..1a220378d3 100644 --- a/modules/access/mms/mmstu.c +++ b/modules/access/mms/mmstu.c @@ -48,6 +48,7 @@ #endif #include "network.h" +#include "vlc_url.h" #include "asf.h" #include "buffer.h" diff --git a/modules/control/http/rpn.c b/modules/control/http/rpn.c index 8b1bef2a95..b21b3ebf30 100644 --- a/modules/control/http/rpn.c +++ b/modules/control/http/rpn.c @@ -24,6 +24,7 @@ *****************************************************************************/ #include "http.h" +#include "vlc_url.h" static vlc_object_t *GetVLCObject( intf_thread_t *p_intf, const char *psz_object, diff --git a/modules/control/rc.c b/modules/control/rc.c index 5d366c58e7..1fd71e6627 100644 --- a/modules/control/rc.c +++ b/modules/control/rc.c @@ -52,6 +52,7 @@ #include "vlc_error.h" #include "network.h" +#include "vlc_url.h" #if defined(AF_UNIX) && !defined(AF_LOCAL) # define AF_LOCAL AF_UNIX diff --git a/modules/control/telnet.c b/modules/control/telnet.c index a84f1bbd29..3224f0e156 100644 --- a/modules/control/telnet.c +++ b/modules/control/telnet.c @@ -45,15 +45,8 @@ # include #endif -#if defined( UNDER_CE ) -# include -#elif defined( WIN32 ) -# include -#else -# include -#endif - #include "network.h" +#include "vlc_url.h" #include "vlc_vlm.h" diff --git a/modules/misc/rtsp.c b/modules/misc/rtsp.c index e89c08aea3..8f7be995f9 100644 --- a/modules/misc/rtsp.c +++ b/modules/misc/rtsp.c @@ -36,6 +36,7 @@ #include "vlc_httpd.h" #include "vlc_vod.h" #include "network.h" +#include "vlc_url.h" /***************************************************************************** * Module descriptor diff --git a/modules/stream_out/rtp.c b/modules/stream_out/rtp.c index 654b9a1046..3a7946fdb2 100644 --- a/modules/stream_out/rtp.c +++ b/modules/stream_out/rtp.c @@ -33,6 +33,7 @@ #include #include "vlc_httpd.h" +#include "vlc_url.h" #include "network.h" #include "charset.h" diff --git a/modules/stream_out/standard.c b/modules/stream_out/standard.c index 084867ad36..879ed6b862 100644 --- a/modules/stream_out/standard.c +++ b/modules/stream_out/standard.c @@ -30,11 +30,8 @@ #include #include -#ifdef HAVE_UNISTD_H -# include -#endif - #include "network.h" +#include "vlc_url.h" /***************************************************************************** * Module descriptor