avformat: Split out functions from network.h to a new file, network.c
[ffmpeg.git] / libavformat / network.c
1 /*
2  * Copyright (c) 2007 The Libav Project
3  *
4  * This file is part of Libav.
5  *
6  * Libav is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * Libav is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with Libav; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20
21 #include "network.h"
22
23 int ff_network_init(void)
24 {
25 #if HAVE_WINSOCK2_H
26     WSADATA wsaData;
27     if (WSAStartup(MAKEWORD(1,1), &wsaData))
28         return 0;
29 #endif
30     return 1;
31 }
32
33 int ff_network_wait_fd(int fd, int write)
34 {
35     int ev = write ? POLLOUT : POLLIN;
36     struct pollfd p = { .fd = fd, .events = ev, .revents = 0 };
37     int ret;
38     ret = poll(&p, 1, 100);
39     return ret < 0 ? ff_neterrno() : p.revents & (ev | POLLERR | POLLHUP) ? 0 : AVERROR(EAGAIN);
40 }
41
42 void ff_network_close(void)
43 {
44 #if HAVE_WINSOCK2_H
45     WSACleanup();
46 #endif
47 }
48
49 #if HAVE_WINSOCK2_H
50 int ff_neterrno(void)
51 {
52     int err = WSAGetLastError();
53     switch (err) {
54     case WSAEWOULDBLOCK:
55         return AVERROR(EAGAIN);
56     case WSAEINTR:
57         return AVERROR(EINTR);
58     }
59     return -err;
60 }
61 #endif
62
63 int ff_is_multicast_address(struct sockaddr *addr)
64 {
65     if (addr->sa_family == AF_INET) {
66         return IN_MULTICAST(ntohl(((struct sockaddr_in *)addr)->sin_addr.s_addr));
67     }
68 #if HAVE_STRUCT_SOCKADDR_IN6
69     if (addr->sa_family == AF_INET6) {
70         return IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6 *)addr)->sin6_addr);
71     }
72 #endif
73
74     return 0;
75 }
76