2 * Various utilities for ffmpeg system
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
4 * copyright (c) 2002 Francois Revol
6 * This file is part of FFmpeg.
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.
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.
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
26 #include "os_support.h"
30 #ifdef HAVE_WINSOCK2_H
32 #elif defined (HAVE_SYS_SELECT_H)
33 #include <sys/select.h>
39 #if !defined(HAVE_INET_ATON)
43 int inet_aton (const char * str
, struct in_addr
* add
)
45 unsigned int add1
= 0, add2
= 0, add3
= 0, add4
= 0;
47 if (sscanf(str
, "%d.%d.%d.%d", &add1
, &add2
, &add3
, &add4
) != 4)
50 if (!add1
|| (add1
|add2
|add3
|add4
) > 255) return 0;
52 add
->s_addr
=(add4
<<24)+(add3
<<16)+(add2
<<8)+add1
;
56 #endif /* !defined(HAVE_INET_ATON) */
58 /* resolve host with also IP address parsing */
59 int resolve_host(struct in_addr
*sin_addr
, const char *hostname
)
63 if (!inet_aton(hostname
, sin_addr
)) {
64 hp
= gethostbyname(hostname
);
67 memcpy(sin_addr
, hp
->h_addr
, sizeof(struct in_addr
));
72 int ff_socket_nonblock(int socket
, int enable
)
74 #ifdef HAVE_WINSOCK2_H
75 return ioctlsocket(socket
, FIONBIO
, &enable
);
78 return fcntl(socket
, F_SETFL
, fcntl(socket
, F_GETFL
) | O_NONBLOCK
);
80 return fcntl(socket
, F_SETFL
, fcntl(socket
, F_GETFL
) & ~O_NONBLOCK
);
83 #endif /* CONFIG_NETWORK */
85 #ifdef CONFIG_FFSERVER
87 int poll(struct pollfd
*fds
, nfds_t numfds
, int timeout
)
96 #ifdef HAVE_WINSOCK2_H
97 if (numfds
>= FD_SETSIZE
) {
105 FD_ZERO(&exception_set
);
108 for(i
= 0; i
< numfds
; i
++) {
111 #ifndef HAVE_WINSOCK2_H
112 if (fds
[i
].fd
>= FD_SETSIZE
) {
118 if (fds
[i
].events
& POLLIN
) FD_SET(fds
[i
].fd
, &read_set
);
119 if (fds
[i
].events
& POLLOUT
) FD_SET(fds
[i
].fd
, &write_set
);
120 if (fds
[i
].events
& POLLERR
) FD_SET(fds
[i
].fd
, &exception_set
);
127 /* Hey!? Nothing to poll, in fact!!! */
131 rc
= select(n
+1, &read_set
, &write_set
, &exception_set
, NULL
);
135 tv
.tv_sec
= timeout
/ 1000;
136 tv
.tv_usec
= 1000 * (timeout
% 1000);
137 rc
= select(n
+1, &read_set
, &write_set
, &exception_set
, &tv
);
143 for(i
= 0; i
< (nfds_t
) n
; i
++) {
146 if (FD_ISSET(fds
[i
].fd
, &read_set
)) fds
[i
].revents
|= POLLIN
;
147 if (FD_ISSET(fds
[i
].fd
, &write_set
)) fds
[i
].revents
|= POLLOUT
;
148 if (FD_ISSET(fds
[i
].fd
, &exception_set
)) fds
[i
].revents
|= POLLERR
;
153 #endif /* HAVE_POLL_H */
154 #endif /* CONFIG_FFSERVER */