home *** CD-ROM | disk | FTP | other *** search
/ mail.altrad.com / 2015.02.mail.altrad.com.tar / mail.altrad.com / TEST / vlc-2-0-5-win32.exe / sdk / include / vlc / plugins / vlc_network.h < prev    next >
C/C++ Source or Header  |  2012-12-12  |  11KB  |  379 lines

  1. /*****************************************************************************
  2.  * vlc_network.h: interface to communicate with network plug-ins
  3.  *****************************************************************************
  4.  * Copyright (C) 2002-2005 VLC authors and VideoLAN
  5.  * Copyright ┬⌐ 2006-2007 R├⌐mi Denis-Courmont
  6.  * $Id: 7ee51e305ed8bf62a12e1aafbfe69a0b99ebc642 $
  7.  *
  8.  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  9.  *          Laurent Aimar <fenrir@via.ecp.fr>
  10.  *          R├⌐mi Denis-Courmont <rem # videolan.org>
  11.  *
  12.  * This program is free software; you can redistribute it and/or modify it
  13.  * under the terms of the GNU Lesser General Public License as published by
  14.  * the Free Software Foundation; either version 2.1 of the License, or
  15.  * (at your option) any later version.
  16.  *
  17.  * This program is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20.  * GNU Lesser General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU Lesser General Public License
  23.  * along with this program; if not, write to the Free Software Foundation,
  24.  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  25.  *****************************************************************************/
  26.  
  27. #ifndef VLC_NETWORK_H
  28. # define VLC_NETWORK_H
  29.  
  30. /**
  31.  * \file
  32.  * This file defines interface to communicate with network plug-ins
  33.  */
  34.  
  35. #if defined( WIN32 )
  36. #   if !defined(UNDER_CE)
  37. #       define _NO_OLDNAMES 1
  38. #       include <io.h>
  39. #   endif
  40. #   include <winsock2.h>
  41. #   include <ws2tcpip.h>
  42. #   define ENETUNREACH WSAENETUNREACH
  43. #   define net_errno (WSAGetLastError())
  44. extern const char *net_strerror( int val );
  45.  
  46. struct iovec
  47. {
  48.     void  *iov_base;
  49.     size_t iov_len;
  50. };
  51.  
  52. struct msghdr
  53. {
  54.     void         *msg_name;
  55.     size_t        msg_namelen;
  56.     struct iovec *msg_iov;
  57.     size_t        msg_iovlen;
  58.     void         *msg_control;
  59.     size_t        msg_controllen;
  60.     int           msg_flags;
  61. };
  62.  
  63. #   ifndef IPV6_V6ONLY
  64. #       define IPV6_V6ONLY 27
  65. #   endif
  66. #else
  67. #   include <sys/types.h>
  68. #   include <unistd.h>
  69. #   include <sys/socket.h>
  70. #   include <netinet/in.h>
  71. #   include <netdb.h>
  72. #   define net_errno errno
  73. #endif
  74.  
  75. #if defined( __SYMBIAN32__ )
  76. #   undef AF_INET6
  77. #   undef IN6_IS_ADDR_MULTICAST
  78. #   undef IPV6_V6ONLY
  79. #   undef IPV6_MULTICAST_HOPS
  80. #   undef IPV6_MULTICAST_IF
  81. #   undef IPV6_TCLASS
  82. #   undef IPV6_JOIN_GROUP
  83. #endif
  84.  
  85. VLC_API int vlc_socket (int, int, int, bool nonblock) VLC_USED;
  86.  
  87. struct sockaddr;
  88. VLC_API int vlc_accept( int, struct sockaddr *, socklen_t *, bool ) VLC_USED;
  89.  
  90. # ifdef __cplusplus
  91. extern "C" {
  92. # endif
  93.  
  94. /* Portable networking layer communication */
  95. int net_Socket (vlc_object_t *obj, int family, int socktype, int proto);
  96.  
  97. VLC_API int net_Connect(vlc_object_t *p_this, const char *psz_host, int i_port, int socktype, int protocol);
  98. #define net_Connect(a, b, c, d, e) net_Connect(VLC_OBJECT(a), b, c, d, e)
  99.  
  100. VLC_API int * net_Listen(vlc_object_t *p_this, const char *psz_host, int i_port, int socktype, int protocol);
  101.  
  102. #define net_ListenTCP(a, b, c) net_Listen(VLC_OBJECT(a), b, c, \
  103.                                           SOCK_STREAM, IPPROTO_TCP)
  104.  
  105. static inline int net_ConnectTCP (vlc_object_t *obj, const char *host, int port)
  106. {
  107.     return net_Connect (obj, host, port, SOCK_STREAM, IPPROTO_TCP);
  108. }
  109. #define net_ConnectTCP(a, b, c) net_ConnectTCP(VLC_OBJECT(a), b, c)
  110.  
  111. VLC_API int net_AcceptSingle(vlc_object_t *obj, int lfd);
  112.  
  113. VLC_API int net_Accept( vlc_object_t *, int * );
  114. #define net_Accept(a, b) \
  115.         net_Accept(VLC_OBJECT(a), b)
  116.  
  117. VLC_API int net_ConnectDgram( vlc_object_t *p_this, const char *psz_host, int i_port, int hlim, int proto );
  118. #define net_ConnectDgram(a, b, c, d, e ) \
  119.         net_ConnectDgram(VLC_OBJECT(a), b, c, d, e)
  120.  
  121. static inline int net_ConnectUDP (vlc_object_t *obj, const char *host, int port, int hlim)
  122. {
  123.     return net_ConnectDgram (obj, host, port, hlim, IPPROTO_UDP);
  124. }
  125.  
  126. VLC_API int net_OpenDgram( vlc_object_t *p_this, const char *psz_bind, int i_bind, const char *psz_server, int i_server, int proto );
  127. #define net_OpenDgram( a, b, c, d, e, g ) \
  128.         net_OpenDgram(VLC_OBJECT(a), b, c, d, e, g)
  129.  
  130. static inline int net_ListenUDP1 (vlc_object_t *obj, const char *host, int port)
  131. {
  132.     return net_OpenDgram (obj, host, port, NULL, 0, IPPROTO_UDP);
  133. }
  134.  
  135. VLC_API void net_ListenClose( int *fd );
  136.  
  137. int net_Subscribe (vlc_object_t *obj, int fd, const struct sockaddr *addr,
  138.                    socklen_t addrlen);
  139.  
  140. VLC_API int net_SetCSCov( int fd, int sendcov, int recvcov );
  141.  
  142. /* Functions to read from or write to the networking layer */
  143. struct virtual_socket_t
  144. {
  145.     void *p_sys;
  146.     int (*pf_recv) ( void *, void *, size_t );
  147.     int (*pf_send) ( void *, const void *, size_t );
  148. };
  149.  
  150. VLC_API ssize_t net_Read( vlc_object_t *p_this, int fd, const v_socket_t *, void *p_data, size_t i_data, bool b_retry );
  151. #define net_Read(a,b,c,d,e,f) net_Read(VLC_OBJECT(a),b,c,d,e,f)
  152. VLC_API ssize_t net_Write( vlc_object_t *p_this, int fd, const v_socket_t *, const void *p_data, size_t i_data );
  153. #define net_Write(a,b,c,d,e) net_Write(VLC_OBJECT(a),b,c,d,e)
  154. VLC_API char * net_Gets( vlc_object_t *p_this, int fd, const v_socket_t * );
  155. #define net_Gets(a,b,c) net_Gets(VLC_OBJECT(a),b,c)
  156.  
  157.  
  158. VLC_API ssize_t net_Printf( vlc_object_t *p_this, int fd, const v_socket_t *, const char *psz_fmt, ... ) VLC_FORMAT( 4, 5 );
  159. #define net_Printf(o,fd,vs,...) net_Printf(VLC_OBJECT(o),fd,vs, __VA_ARGS__)
  160. VLC_API ssize_t net_vaPrintf( vlc_object_t *p_this, int fd, const v_socket_t *, const char *psz_fmt, va_list args );
  161. #define net_vaPrintf(a,b,c,d,e) net_vaPrintf(VLC_OBJECT(a),b,c,d,e)
  162.  
  163. struct pollfd;
  164. VLC_API int vlc_poll(struct pollfd *fds, unsigned nfds, int timeout);
  165.  
  166.  
  167. #ifdef WIN32
  168. /* Microsoft: same semantic, same value, different name... go figure */
  169. # define SHUT_RD SD_RECEIVE
  170. # define SHUT_WR SD_SEND
  171. # define SHUT_RDWR SD_BOTH
  172. # define net_Close( fd ) closesocket ((SOCKET)fd)
  173. #else
  174. # ifdef __OS2__
  175. #  define SHUT_RD    0
  176. #  define SHUT_WR    1
  177. #  define SHUT_RDWR  2
  178. # endif
  179. # define net_Close( fd ) (void)close (fd)
  180. #endif
  181.  
  182. /* Portable network names/addresses resolution layer */
  183.  
  184. /* GAI error codes */
  185. # ifndef EAI_BADFLAGS
  186. #  define EAI_BADFLAGS -1
  187. # endif
  188. # ifndef EAI_NONAME
  189. #  define EAI_NONAME -2
  190. # endif
  191. # ifndef EAI_AGAIN
  192. #  define EAI_AGAIN -3
  193. # endif
  194. # ifndef EAI_FAIL
  195. #  define EAI_FAIL -4
  196. # endif
  197. # ifndef EAI_NODATA
  198. #  define EAI_NODATA -5
  199. # endif
  200. # ifndef EAI_FAMILY
  201. #  define EAI_FAMILY -6
  202. # endif
  203. # ifndef EAI_SOCKTYPE
  204. #  define EAI_SOCKTYPE -7
  205. # endif
  206. # ifndef EAI_SERVICE
  207. #  define EAI_SERVICE -8
  208. # endif
  209. # ifndef EAI_ADDRFAMILY
  210. #  define EAI_ADDRFAMILY -9
  211. # endif
  212. # ifndef EAI_MEMORY
  213. #  define EAI_MEMORY -10
  214. # endif
  215. #ifndef EAI_OVERFLOW
  216. #  define EAI_OVERFLOW -11
  217. #endif
  218. # ifndef EAI_SYSTEM
  219. #  define EAI_SYSTEM -12
  220. # endif
  221.  
  222.  
  223. # ifndef NI_MAXHOST
  224. #  define NI_MAXHOST 1025
  225. #  define NI_MAXSERV 32
  226. # endif
  227. # define NI_MAXNUMERICHOST 64
  228.  
  229. #ifndef AI_NUMERICSERV
  230. # define AI_NUMERICSERV 0
  231. #endif
  232.  
  233. #ifdef __OS2__
  234. # ifndef NI_NUMERICHOST
  235. #  define NI_NUMERICHOST 0x01
  236. #  define NI_NUMERICSERV 0x02
  237. #  define NI_NOFQDN      0x04
  238. #  define NI_NAMEREQD    0x08
  239. #  define NI_DGRAM       0x10
  240. # endif
  241.  
  242. struct addrinfo
  243. {
  244.     int ai_flags;
  245.     int ai_family;
  246.     int ai_socktype;
  247.     int ai_protocol;
  248.     size_t ai_addrlen;
  249.     struct sockaddr *ai_addr;
  250.     char *ai_canonname;
  251.     struct addrinfo *ai_next;
  252. };
  253.  
  254. # define AI_PASSIVE     1
  255. # define AI_CANONNAME   2
  256. # define AI_NUMERICHOST 4
  257.  
  258. VLC_API const char *gai_strerror( int errnum );
  259.  
  260. VLC_API int  getaddrinfo ( const char *, const char *,
  261.                            const struct addrinfo *, struct addrinfo ** );
  262. VLC_API void freeaddrinfo( struct addrinfo * );
  263. VLC_API int  getnameinfo ( const struct sockaddr *, socklen_t,
  264.                            char *, int, char *, int, int );
  265. #endif
  266.  
  267. VLC_API int vlc_getnameinfo( const struct sockaddr *, int, char *, int, int *, int );
  268. VLC_API int vlc_getaddrinfo( vlc_object_t *, const char *, int, const struct addrinfo *, struct addrinfo ** );
  269.  
  270.  
  271. #ifdef __OS2__
  272. /* OS/2 does not support IPv6, yet. But declare these only for compilation */
  273. struct in6_addr
  274. {
  275.     uint8_t s6_addr[16];
  276. };
  277.  
  278. struct sockaddr_in6
  279. {
  280.     uint8_t         sin6_len;
  281.     uint8_t         sin6_family;
  282.     uint16_t        sin6_port;
  283.     uint32_t        sin6_flowinfo;
  284.     struct in6_addr sin6_addr;
  285.     uint32_t        sin6_scope_id;
  286. };
  287.  
  288. # define IN6_IS_ADDR_MULTICAST(a)   (((__const uint8_t *) (a))[0] == 0xff)
  289.  
  290. static const struct in6_addr in6addr_any =
  291.     { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
  292. #endif
  293.  
  294. static inline bool
  295. net_SockAddrIsMulticast (const struct sockaddr *addr, socklen_t len)
  296. {
  297.     switch (addr->sa_family)
  298.     {
  299. #ifdef IN_MULTICAST
  300.         case AF_INET:
  301.         {
  302.             const struct sockaddr_in *v4 = (const struct sockaddr_in *)addr;
  303.             if ((size_t)len < sizeof (*v4))
  304.                 return false;
  305.             return IN_MULTICAST (ntohl (v4->sin_addr.s_addr)) != 0;
  306.         }
  307. #endif
  308.  
  309. #ifdef IN6_IS_ADDR_MULTICAST
  310.         case AF_INET6:
  311.         {
  312.             const struct sockaddr_in6 *v6 = (const struct sockaddr_in6 *)addr;
  313.             if ((size_t)len < sizeof (*v6))
  314.                 return false;
  315.             return IN6_IS_ADDR_MULTICAST (&v6->sin6_addr) != 0;
  316.         }
  317. #endif
  318.     }
  319.  
  320.     return false;
  321. }
  322.  
  323.  
  324. static inline int net_GetSockAddress( int fd, char *address, int *port )
  325. {
  326.     struct sockaddr_storage addr;
  327.     socklen_t addrlen = sizeof( addr );
  328.  
  329.     return getsockname( fd, (struct sockaddr *)&addr, &addrlen )
  330.         || vlc_getnameinfo( (struct sockaddr *)&addr, addrlen, address,
  331.                             NI_MAXNUMERICHOST, port, NI_NUMERICHOST )
  332.         ? VLC_EGENERIC : 0;
  333. }
  334.  
  335. static inline int net_GetPeerAddress( int fd, char *address, int *port )
  336. {
  337.     struct sockaddr_storage addr;
  338.     socklen_t addrlen = sizeof( addr );
  339.  
  340.     return getpeername( fd, (struct sockaddr *)&addr, &addrlen )
  341.         || vlc_getnameinfo( (struct sockaddr *)&addr, addrlen, address,
  342.                             NI_MAXNUMERICHOST, port, NI_NUMERICHOST )
  343.         ? VLC_EGENERIC : 0;
  344. }
  345.  
  346. static inline uint16_t net_GetPort (const struct sockaddr *addr)
  347. {
  348.     switch (addr->sa_family)
  349.     {
  350. #ifdef AF_INET6
  351.         case AF_INET6:
  352.             return ((const struct sockaddr_in6 *)addr)->sin6_port;
  353. #endif
  354.         case AF_INET:
  355.             return ((const struct sockaddr_in *)addr)->sin_port;
  356.     }
  357.     return 0;
  358. }
  359.  
  360. static inline void net_SetPort (struct sockaddr *addr, uint16_t port)
  361. {
  362.     switch (addr->sa_family)
  363.     {
  364. #ifdef AF_INET6
  365.         case AF_INET6:
  366.             ((struct sockaddr_in6 *)addr)->sin6_port = port;
  367.         break;
  368. #endif
  369.         case AF_INET:
  370.             ((struct sockaddr_in *)addr)->sin_port = port;
  371.         break;
  372.     }
  373. }
  374. # ifdef __cplusplus
  375. }
  376. # endif
  377.  
  378. #endif
  379.