yading@11
|
1 /*
|
yading@11
|
2 * Copyright (c) 2007 The FFmpeg Project
|
yading@11
|
3 *
|
yading@11
|
4 * This file is part of FFmpeg.
|
yading@11
|
5 *
|
yading@11
|
6 * FFmpeg is free software; you can redistribute it and/or
|
yading@11
|
7 * modify it under the terms of the GNU Lesser General Public
|
yading@11
|
8 * License as published by the Free Software Foundation; either
|
yading@11
|
9 * version 2.1 of the License, or (at your option) any later version.
|
yading@11
|
10 *
|
yading@11
|
11 * FFmpeg is distributed in the hope that it will be useful,
|
yading@11
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@11
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@11
|
14 * Lesser General Public License for more details.
|
yading@11
|
15 *
|
yading@11
|
16 * You should have received a copy of the GNU Lesser General Public
|
yading@11
|
17 * License along with FFmpeg; if not, write to the Free Software
|
yading@11
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@11
|
19 */
|
yading@11
|
20
|
yading@11
|
21 #ifndef AVFORMAT_NETWORK_H
|
yading@11
|
22 #define AVFORMAT_NETWORK_H
|
yading@11
|
23
|
yading@11
|
24 #include <errno.h>
|
yading@11
|
25 #include <stdint.h>
|
yading@11
|
26
|
yading@11
|
27 #include "config.h"
|
yading@11
|
28 #include "libavutil/error.h"
|
yading@11
|
29 #include "os_support.h"
|
yading@11
|
30 #include "avio.h"
|
yading@11
|
31
|
yading@11
|
32 #if HAVE_UNISTD_H
|
yading@11
|
33 #include <unistd.h>
|
yading@11
|
34 #endif
|
yading@11
|
35
|
yading@11
|
36 #if HAVE_WINSOCK2_H
|
yading@11
|
37 #include <winsock2.h>
|
yading@11
|
38 #include <ws2tcpip.h>
|
yading@11
|
39
|
yading@11
|
40 #ifndef EPROTONOSUPPORT
|
yading@11
|
41 #define EPROTONOSUPPORT WSAEPROTONOSUPPORT
|
yading@11
|
42 #endif
|
yading@11
|
43 #ifndef ETIMEDOUT
|
yading@11
|
44 #define ETIMEDOUT WSAETIMEDOUT
|
yading@11
|
45 #endif
|
yading@11
|
46 #ifndef ECONNREFUSED
|
yading@11
|
47 #define ECONNREFUSED WSAECONNREFUSED
|
yading@11
|
48 #endif
|
yading@11
|
49 #ifndef EINPROGRESS
|
yading@11
|
50 #define EINPROGRESS WSAEINPROGRESS
|
yading@11
|
51 #endif
|
yading@11
|
52
|
yading@11
|
53 #define getsockopt(a, b, c, d, e) getsockopt(a, b, c, (char*) d, e)
|
yading@11
|
54 #define setsockopt(a, b, c, d, e) setsockopt(a, b, c, (const char*) d, e)
|
yading@11
|
55
|
yading@11
|
56 int ff_neterrno(void);
|
yading@11
|
57 #else
|
yading@11
|
58 #include <sys/types.h>
|
yading@11
|
59 #include <sys/socket.h>
|
yading@11
|
60 #include <netinet/in.h>
|
yading@11
|
61 #include <netdb.h>
|
yading@11
|
62
|
yading@11
|
63 #define ff_neterrno() AVERROR(errno)
|
yading@11
|
64 #endif
|
yading@11
|
65
|
yading@11
|
66 #if HAVE_ARPA_INET_H
|
yading@11
|
67 #include <arpa/inet.h>
|
yading@11
|
68 #endif
|
yading@11
|
69
|
yading@11
|
70 #if HAVE_POLL_H
|
yading@11
|
71 #include <poll.h>
|
yading@11
|
72 #endif
|
yading@11
|
73
|
yading@11
|
74 int ff_socket_nonblock(int socket, int enable);
|
yading@11
|
75
|
yading@11
|
76 extern int ff_network_inited_globally;
|
yading@11
|
77 int ff_network_init(void);
|
yading@11
|
78 void ff_network_close(void);
|
yading@11
|
79
|
yading@11
|
80 void ff_tls_init(void);
|
yading@11
|
81 void ff_tls_deinit(void);
|
yading@11
|
82
|
yading@11
|
83 int ff_network_wait_fd(int fd, int write);
|
yading@11
|
84
|
yading@11
|
85 /**
|
yading@11
|
86 * This works similarly to ff_network_wait_fd, but waits up to 'timeout' microseconds
|
yading@11
|
87 * Uses ff_network_wait_fd in a loop
|
yading@11
|
88 *
|
yading@11
|
89 * @fd Socket descriptor
|
yading@11
|
90 * @write Set 1 to wait for socket able to be read, 0 to be written
|
yading@11
|
91 * @timeout Timeout interval, in microseconds. Actual precision is 100000 mcs, due to ff_network_wait_fd usage
|
yading@11
|
92 * @param int_cb Interrupt callback, is checked after each ff_network_wait_fd call
|
yading@11
|
93 * @return 0 if data can be read/written, AVERROR(ETIMEDOUT) if timeout expired, or negative error code
|
yading@11
|
94 */
|
yading@11
|
95 int ff_network_wait_fd_timeout(int fd, int write, int64_t timeout, AVIOInterruptCB *int_cb);
|
yading@11
|
96
|
yading@11
|
97 int ff_inet_aton (const char * str, struct in_addr * add);
|
yading@11
|
98
|
yading@11
|
99 #if !HAVE_STRUCT_SOCKADDR_STORAGE
|
yading@11
|
100 struct sockaddr_storage {
|
yading@11
|
101 #if HAVE_STRUCT_SOCKADDR_SA_LEN
|
yading@11
|
102 uint8_t ss_len;
|
yading@11
|
103 uint8_t ss_family;
|
yading@11
|
104 #else
|
yading@11
|
105 uint16_t ss_family;
|
yading@11
|
106 #endif
|
yading@11
|
107 char ss_pad1[6];
|
yading@11
|
108 int64_t ss_align;
|
yading@11
|
109 char ss_pad2[112];
|
yading@11
|
110 };
|
yading@11
|
111 #endif
|
yading@11
|
112
|
yading@11
|
113 #if !HAVE_STRUCT_ADDRINFO
|
yading@11
|
114 struct addrinfo {
|
yading@11
|
115 int ai_flags;
|
yading@11
|
116 int ai_family;
|
yading@11
|
117 int ai_socktype;
|
yading@11
|
118 int ai_protocol;
|
yading@11
|
119 int ai_addrlen;
|
yading@11
|
120 struct sockaddr *ai_addr;
|
yading@11
|
121 char *ai_canonname;
|
yading@11
|
122 struct addrinfo *ai_next;
|
yading@11
|
123 };
|
yading@11
|
124 #endif
|
yading@11
|
125
|
yading@11
|
126 /* getaddrinfo constants */
|
yading@11
|
127 #ifndef EAI_AGAIN
|
yading@11
|
128 #define EAI_AGAIN 2
|
yading@11
|
129 #endif
|
yading@11
|
130 #ifndef EAI_BADFLAGS
|
yading@11
|
131 #define EAI_BADFLAGS 3
|
yading@11
|
132 #endif
|
yading@11
|
133 #ifndef EAI_FAIL
|
yading@11
|
134 #define EAI_FAIL 4
|
yading@11
|
135 #endif
|
yading@11
|
136 #ifndef EAI_FAMILY
|
yading@11
|
137 #define EAI_FAMILY 5
|
yading@11
|
138 #endif
|
yading@11
|
139 #ifndef EAI_MEMORY
|
yading@11
|
140 #define EAI_MEMORY 6
|
yading@11
|
141 #endif
|
yading@11
|
142 #ifndef EAI_NODATA
|
yading@11
|
143 #define EAI_NODATA 7
|
yading@11
|
144 #endif
|
yading@11
|
145 #ifndef EAI_NONAME
|
yading@11
|
146 #define EAI_NONAME 8
|
yading@11
|
147 #endif
|
yading@11
|
148 #ifndef EAI_SERVICE
|
yading@11
|
149 #define EAI_SERVICE 9
|
yading@11
|
150 #endif
|
yading@11
|
151 #ifndef EAI_SOCKTYPE
|
yading@11
|
152 #define EAI_SOCKTYPE 10
|
yading@11
|
153 #endif
|
yading@11
|
154
|
yading@11
|
155 #ifndef AI_PASSIVE
|
yading@11
|
156 #define AI_PASSIVE 1
|
yading@11
|
157 #endif
|
yading@11
|
158
|
yading@11
|
159 #ifndef AI_CANONNAME
|
yading@11
|
160 #define AI_CANONNAME 2
|
yading@11
|
161 #endif
|
yading@11
|
162
|
yading@11
|
163 #ifndef AI_NUMERICHOST
|
yading@11
|
164 #define AI_NUMERICHOST 4
|
yading@11
|
165 #endif
|
yading@11
|
166
|
yading@11
|
167 #ifndef NI_NOFQDN
|
yading@11
|
168 #define NI_NOFQDN 1
|
yading@11
|
169 #endif
|
yading@11
|
170
|
yading@11
|
171 #ifndef NI_NUMERICHOST
|
yading@11
|
172 #define NI_NUMERICHOST 2
|
yading@11
|
173 #endif
|
yading@11
|
174
|
yading@11
|
175 #ifndef NI_NAMERQD
|
yading@11
|
176 #define NI_NAMERQD 4
|
yading@11
|
177 #endif
|
yading@11
|
178
|
yading@11
|
179 #ifndef NI_NUMERICSERV
|
yading@11
|
180 #define NI_NUMERICSERV 8
|
yading@11
|
181 #endif
|
yading@11
|
182
|
yading@11
|
183 #ifndef NI_DGRAM
|
yading@11
|
184 #define NI_DGRAM 16
|
yading@11
|
185 #endif
|
yading@11
|
186
|
yading@11
|
187 #if !HAVE_GETADDRINFO
|
yading@11
|
188 int ff_getaddrinfo(const char *node, const char *service,
|
yading@11
|
189 const struct addrinfo *hints, struct addrinfo **res);
|
yading@11
|
190 void ff_freeaddrinfo(struct addrinfo *res);
|
yading@11
|
191 int ff_getnameinfo(const struct sockaddr *sa, int salen,
|
yading@11
|
192 char *host, int hostlen,
|
yading@11
|
193 char *serv, int servlen, int flags);
|
yading@11
|
194 #define getaddrinfo ff_getaddrinfo
|
yading@11
|
195 #define freeaddrinfo ff_freeaddrinfo
|
yading@11
|
196 #define getnameinfo ff_getnameinfo
|
yading@11
|
197 #endif
|
yading@11
|
198 #if !HAVE_GETADDRINFO || HAVE_WINSOCK2_H
|
yading@11
|
199 const char *ff_gai_strerror(int ecode);
|
yading@11
|
200 #undef gai_strerror
|
yading@11
|
201 #define gai_strerror ff_gai_strerror
|
yading@11
|
202 #endif
|
yading@11
|
203
|
yading@11
|
204 #ifndef INADDR_LOOPBACK
|
yading@11
|
205 #define INADDR_LOOPBACK 0x7f000001
|
yading@11
|
206 #endif
|
yading@11
|
207
|
yading@11
|
208 #ifndef INET_ADDRSTRLEN
|
yading@11
|
209 #define INET_ADDRSTRLEN 16
|
yading@11
|
210 #endif
|
yading@11
|
211
|
yading@11
|
212 #ifndef INET6_ADDRSTRLEN
|
yading@11
|
213 #define INET6_ADDRSTRLEN INET_ADDRSTRLEN
|
yading@11
|
214 #endif
|
yading@11
|
215
|
yading@11
|
216 #ifndef IN_MULTICAST
|
yading@11
|
217 #define IN_MULTICAST(a) ((((uint32_t)(a)) & 0xf0000000) == 0xe0000000)
|
yading@11
|
218 #endif
|
yading@11
|
219 #ifndef IN6_IS_ADDR_MULTICAST
|
yading@11
|
220 #define IN6_IS_ADDR_MULTICAST(a) (((uint8_t *) (a))[0] == 0xff)
|
yading@11
|
221 #endif
|
yading@11
|
222
|
yading@11
|
223 int ff_is_multicast_address(struct sockaddr *addr);
|
yading@11
|
224
|
yading@11
|
225 #endif /* AVFORMAT_NETWORK_H */
|