diff options
author | Martin Storsjö <martin@martin.st> | 2011-02-07 12:59:50 +0200 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2011-11-05 12:08:47 +0200 |
commit | f6d371009678e46877e6f81ab0eae475d41b1f57 (patch) | |
tree | aefecb4fd6d878922e1eeeb52b6cb80789e8d513 /libavformat/network.c | |
parent | add7b1140fdd0651d0fc9352962631807126d3d0 (diff) | |
download | ffmpeg-f6d371009678e46877e6f81ab0eae475d41b1f57.tar.gz |
avformat: Split out functions from network.h to a new file, network.c
Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat/network.c')
-rw-r--r-- | libavformat/network.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/libavformat/network.c b/libavformat/network.c new file mode 100644 index 0000000000..f694614e8b --- /dev/null +++ b/libavformat/network.c @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2007 The Libav Project + * + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "network.h" + +int ff_network_init(void) +{ +#if HAVE_WINSOCK2_H + WSADATA wsaData; + if (WSAStartup(MAKEWORD(1,1), &wsaData)) + return 0; +#endif + return 1; +} + +int ff_network_wait_fd(int fd, int write) +{ + int ev = write ? POLLOUT : POLLIN; + struct pollfd p = { .fd = fd, .events = ev, .revents = 0 }; + int ret; + ret = poll(&p, 1, 100); + return ret < 0 ? ff_neterrno() : p.revents & (ev | POLLERR | POLLHUP) ? 0 : AVERROR(EAGAIN); +} + +void ff_network_close(void) +{ +#if HAVE_WINSOCK2_H + WSACleanup(); +#endif +} + +#if HAVE_WINSOCK2_H +int ff_neterrno(void) +{ + int err = WSAGetLastError(); + switch (err) { + case WSAEWOULDBLOCK: + return AVERROR(EAGAIN); + case WSAEINTR: + return AVERROR(EINTR); + } + return -err; +} +#endif + +int ff_is_multicast_address(struct sockaddr *addr) +{ + if (addr->sa_family == AF_INET) { + return IN_MULTICAST(ntohl(((struct sockaddr_in *)addr)->sin_addr.s_addr)); + } +#if HAVE_STRUCT_SOCKADDR_IN6 + if (addr->sa_family == AF_INET6) { + return IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6 *)addr)->sin6_addr); + } +#endif + + return 0; +} + |