]> git.sesse.net Git - ffmpeg/blob - libavformat/os_support.c
5a8bb9ecd1e7090b9af46e64a538674bc4253c58
[ffmpeg] / libavformat / os_support.c
1 /*
2  * Various utilities for ffmpeg system
3  * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
4  * copyright (c) 2002 Francois Revol
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 #include "config.h"
23 #include "avformat.h"
24 #if !defined(__MINGW32__)
25 #include <unistd.h>
26 #include <fcntl.h>
27 #endif
28
29 #ifndef HAVE_SYS_POLL_H
30 #if defined(__MINGW32__)
31 #include <winsock2.h>
32 #else
33 #include <sys/select.h>
34 #endif
35 #endif
36
37 #ifdef CONFIG_NETWORK
38 #include "network.h"
39
40 #if !defined(HAVE_INET_ATON)
41 #include <stdlib.h>
42 #include <strings.h>
43
44 int inet_aton (const char * str, struct in_addr * add)
45 {
46     const char * pch = str;
47     unsigned int add1 = 0, add2 = 0, add3 = 0, add4 = 0;
48
49     add1 = atoi(pch);
50     pch = strpbrk(pch,".");
51     if (pch == 0 || ++pch == 0) goto done;
52     add2 = atoi(pch);
53     pch = strpbrk(pch,".");
54     if (pch == 0 || ++pch == 0) goto done;
55     add3 = atoi(pch);
56     pch = strpbrk(pch,".");
57     if (pch == 0 || ++pch == 0) goto done;
58     add4 = atoi(pch);
59
60 done:
61     add->s_addr=(add4<<24)+(add3<<16)+(add2<<8)+add1;
62
63     return 1;
64 }
65 #endif /* !defined(HAVE_INET_ATON) */
66
67 /* resolve host with also IP address parsing */
68 int resolve_host(struct in_addr *sin_addr, const char *hostname)
69 {
70     struct hostent *hp;
71
72     if (!inet_aton(hostname, sin_addr)) {
73         hp = gethostbyname(hostname);
74         if (!hp)
75             return -1;
76         memcpy(sin_addr, hp->h_addr, sizeof(struct in_addr));
77     }
78     return 0;
79 }
80
81 int ff_socket_nonblock(int socket, int enable)
82 {
83 #ifdef __MINGW32__
84    return ioctlsocket(socket, FIONBIO, &enable);
85 #else
86    if (enable)
87       return fcntl(socket, F_SETFL, fcntl(socket, F_GETFL) | O_NONBLOCK);
88    else
89       return fcntl(socket, F_SETFL, fcntl(socket, F_GETFL) & ~O_NONBLOCK);
90 #endif
91 }
92 #endif /* CONFIG_NETWORK */
93
94 #ifdef CONFIG_FFSERVER
95 #ifndef HAVE_SYS_POLL_H
96 int poll(struct pollfd *fds, nfds_t numfds, int timeout)
97 {
98     fd_set read_set;
99     fd_set write_set;
100     fd_set exception_set;
101     nfds_t i;
102     int n;
103     int rc;
104
105 #ifdef __MINGW32__
106     if (numfds >= FD_SETSIZE) {
107         errno = EINVAL;
108         return -1;
109     }
110 #endif
111
112     FD_ZERO(&read_set);
113     FD_ZERO(&write_set);
114     FD_ZERO(&exception_set);
115
116     n = -1;
117     for(i = 0; i < numfds; i++) {
118         if (fds[i].fd < 0)
119             continue;
120 #ifndef __MINGW32__
121         if (fds[i].fd >= FD_SETSIZE) {
122             errno = EINVAL;
123             return -1;
124         }
125 #endif
126
127         if (fds[i].events & POLLIN)  FD_SET(fds[i].fd, &read_set);
128         if (fds[i].events & POLLOUT) FD_SET(fds[i].fd, &write_set);
129         if (fds[i].events & POLLERR) FD_SET(fds[i].fd, &exception_set);
130
131         if (fds[i].fd > n)
132             n = fds[i].fd;
133     };
134
135     if (n == -1)
136         /* Hey!? Nothing to poll, in fact!!! */
137         return 0;
138
139     if (timeout < 0)
140         rc = select(n+1, &read_set, &write_set, &exception_set, NULL);
141     else {
142         struct timeval    tv;
143
144         tv.tv_sec = timeout / 1000;
145         tv.tv_usec = 1000 * (timeout % 1000);
146         rc = select(n+1, &read_set, &write_set, &exception_set, &tv);
147     };
148
149     if (rc < 0)
150         return rc;
151
152     for(i = 0; i < (nfds_t) n; i++) {
153         fds[i].revents = 0;
154
155         if (FD_ISSET(fds[i].fd, &read_set))      fds[i].revents |= POLLIN;
156         if (FD_ISSET(fds[i].fd, &write_set))     fds[i].revents |= POLLOUT;
157         if (FD_ISSET(fds[i].fd, &exception_set)) fds[i].revents |= POLLERR;
158     };
159
160     return rc;
161 }
162 #endif /* HAVE_SYS_POLL_H */
163 #endif /* CONFIG_FFSERVER */
164