yading@11: /* yading@11: * Copyright (c) 2007 The FFmpeg Project yading@11: * yading@11: * This file is part of FFmpeg. yading@11: * yading@11: * FFmpeg is free software; you can redistribute it and/or yading@11: * modify it under the terms of the GNU Lesser General Public yading@11: * License as published by the Free Software Foundation; either yading@11: * version 2.1 of the License, or (at your option) any later version. yading@11: * yading@11: * FFmpeg is distributed in the hope that it will be useful, yading@11: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@11: * Lesser General Public License for more details. yading@11: * yading@11: * You should have received a copy of the GNU Lesser General Public yading@11: * License along with FFmpeg; if not, write to the Free Software yading@11: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@11: */ yading@11: yading@11: #ifndef AVFORMAT_NETWORK_H yading@11: #define AVFORMAT_NETWORK_H yading@11: yading@11: #include yading@11: #include yading@11: yading@11: #include "config.h" yading@11: #include "libavutil/error.h" yading@11: #include "os_support.h" yading@11: #include "avio.h" yading@11: yading@11: #if HAVE_UNISTD_H yading@11: #include yading@11: #endif yading@11: yading@11: #if HAVE_WINSOCK2_H yading@11: #include yading@11: #include yading@11: yading@11: #ifndef EPROTONOSUPPORT yading@11: #define EPROTONOSUPPORT WSAEPROTONOSUPPORT yading@11: #endif yading@11: #ifndef ETIMEDOUT yading@11: #define ETIMEDOUT WSAETIMEDOUT yading@11: #endif yading@11: #ifndef ECONNREFUSED yading@11: #define ECONNREFUSED WSAECONNREFUSED yading@11: #endif yading@11: #ifndef EINPROGRESS yading@11: #define EINPROGRESS WSAEINPROGRESS yading@11: #endif yading@11: yading@11: #define getsockopt(a, b, c, d, e) getsockopt(a, b, c, (char*) d, e) yading@11: #define setsockopt(a, b, c, d, e) setsockopt(a, b, c, (const char*) d, e) yading@11: yading@11: int ff_neterrno(void); yading@11: #else yading@11: #include yading@11: #include yading@11: #include yading@11: #include yading@11: yading@11: #define ff_neterrno() AVERROR(errno) yading@11: #endif yading@11: yading@11: #if HAVE_ARPA_INET_H yading@11: #include yading@11: #endif yading@11: yading@11: #if HAVE_POLL_H yading@11: #include yading@11: #endif yading@11: yading@11: int ff_socket_nonblock(int socket, int enable); yading@11: yading@11: extern int ff_network_inited_globally; yading@11: int ff_network_init(void); yading@11: void ff_network_close(void); yading@11: yading@11: void ff_tls_init(void); yading@11: void ff_tls_deinit(void); yading@11: yading@11: int ff_network_wait_fd(int fd, int write); yading@11: yading@11: /** yading@11: * This works similarly to ff_network_wait_fd, but waits up to 'timeout' microseconds yading@11: * Uses ff_network_wait_fd in a loop yading@11: * yading@11: * @fd Socket descriptor yading@11: * @write Set 1 to wait for socket able to be read, 0 to be written yading@11: * @timeout Timeout interval, in microseconds. Actual precision is 100000 mcs, due to ff_network_wait_fd usage yading@11: * @param int_cb Interrupt callback, is checked after each ff_network_wait_fd call yading@11: * @return 0 if data can be read/written, AVERROR(ETIMEDOUT) if timeout expired, or negative error code yading@11: */ yading@11: int ff_network_wait_fd_timeout(int fd, int write, int64_t timeout, AVIOInterruptCB *int_cb); yading@11: yading@11: int ff_inet_aton (const char * str, struct in_addr * add); yading@11: yading@11: #if !HAVE_STRUCT_SOCKADDR_STORAGE yading@11: struct sockaddr_storage { yading@11: #if HAVE_STRUCT_SOCKADDR_SA_LEN yading@11: uint8_t ss_len; yading@11: uint8_t ss_family; yading@11: #else yading@11: uint16_t ss_family; yading@11: #endif yading@11: char ss_pad1[6]; yading@11: int64_t ss_align; yading@11: char ss_pad2[112]; yading@11: }; yading@11: #endif yading@11: yading@11: #if !HAVE_STRUCT_ADDRINFO yading@11: struct addrinfo { yading@11: int ai_flags; yading@11: int ai_family; yading@11: int ai_socktype; yading@11: int ai_protocol; yading@11: int ai_addrlen; yading@11: struct sockaddr *ai_addr; yading@11: char *ai_canonname; yading@11: struct addrinfo *ai_next; yading@11: }; yading@11: #endif yading@11: yading@11: /* getaddrinfo constants */ yading@11: #ifndef EAI_AGAIN yading@11: #define EAI_AGAIN 2 yading@11: #endif yading@11: #ifndef EAI_BADFLAGS yading@11: #define EAI_BADFLAGS 3 yading@11: #endif yading@11: #ifndef EAI_FAIL yading@11: #define EAI_FAIL 4 yading@11: #endif yading@11: #ifndef EAI_FAMILY yading@11: #define EAI_FAMILY 5 yading@11: #endif yading@11: #ifndef EAI_MEMORY yading@11: #define EAI_MEMORY 6 yading@11: #endif yading@11: #ifndef EAI_NODATA yading@11: #define EAI_NODATA 7 yading@11: #endif yading@11: #ifndef EAI_NONAME yading@11: #define EAI_NONAME 8 yading@11: #endif yading@11: #ifndef EAI_SERVICE yading@11: #define EAI_SERVICE 9 yading@11: #endif yading@11: #ifndef EAI_SOCKTYPE yading@11: #define EAI_SOCKTYPE 10 yading@11: #endif yading@11: yading@11: #ifndef AI_PASSIVE yading@11: #define AI_PASSIVE 1 yading@11: #endif yading@11: yading@11: #ifndef AI_CANONNAME yading@11: #define AI_CANONNAME 2 yading@11: #endif yading@11: yading@11: #ifndef AI_NUMERICHOST yading@11: #define AI_NUMERICHOST 4 yading@11: #endif yading@11: yading@11: #ifndef NI_NOFQDN yading@11: #define NI_NOFQDN 1 yading@11: #endif yading@11: yading@11: #ifndef NI_NUMERICHOST yading@11: #define NI_NUMERICHOST 2 yading@11: #endif yading@11: yading@11: #ifndef NI_NAMERQD yading@11: #define NI_NAMERQD 4 yading@11: #endif yading@11: yading@11: #ifndef NI_NUMERICSERV yading@11: #define NI_NUMERICSERV 8 yading@11: #endif yading@11: yading@11: #ifndef NI_DGRAM yading@11: #define NI_DGRAM 16 yading@11: #endif yading@11: yading@11: #if !HAVE_GETADDRINFO yading@11: int ff_getaddrinfo(const char *node, const char *service, yading@11: const struct addrinfo *hints, struct addrinfo **res); yading@11: void ff_freeaddrinfo(struct addrinfo *res); yading@11: int ff_getnameinfo(const struct sockaddr *sa, int salen, yading@11: char *host, int hostlen, yading@11: char *serv, int servlen, int flags); yading@11: #define getaddrinfo ff_getaddrinfo yading@11: #define freeaddrinfo ff_freeaddrinfo yading@11: #define getnameinfo ff_getnameinfo yading@11: #endif yading@11: #if !HAVE_GETADDRINFO || HAVE_WINSOCK2_H yading@11: const char *ff_gai_strerror(int ecode); yading@11: #undef gai_strerror yading@11: #define gai_strerror ff_gai_strerror yading@11: #endif yading@11: yading@11: #ifndef INADDR_LOOPBACK yading@11: #define INADDR_LOOPBACK 0x7f000001 yading@11: #endif yading@11: yading@11: #ifndef INET_ADDRSTRLEN yading@11: #define INET_ADDRSTRLEN 16 yading@11: #endif yading@11: yading@11: #ifndef INET6_ADDRSTRLEN yading@11: #define INET6_ADDRSTRLEN INET_ADDRSTRLEN yading@11: #endif yading@11: yading@11: #ifndef IN_MULTICAST yading@11: #define IN_MULTICAST(a) ((((uint32_t)(a)) & 0xf0000000) == 0xe0000000) yading@11: #endif yading@11: #ifndef IN6_IS_ADDR_MULTICAST yading@11: #define IN6_IS_ADDR_MULTICAST(a) (((uint8_t *) (a))[0] == 0xff) yading@11: #endif yading@11: yading@11: int ff_is_multicast_address(struct sockaddr *addr); yading@11: yading@11: #endif /* AVFORMAT_NETWORK_H */