summaryrefslogtreecommitdiff
path: root/libavformat/network.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2011-02-07 12:59:50 +0200
committerMartin Storsjö <martin@martin.st>2011-11-05 12:08:47 +0200
commitf6d371009678e46877e6f81ab0eae475d41b1f57 (patch)
treeaefecb4fd6d878922e1eeeb52b6cb80789e8d513 /libavformat/network.c
parentadd7b1140fdd0651d0fc9352962631807126d3d0 (diff)
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.c76
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;
+}
+