ff_socket: put out-of-line and fallback to fcntl() for close-on-exec
authorRémi Denis-Courmont <remi@remlab.net>
Thu, 8 Aug 2013 19:26:42 +0000 (22:26 +0300)
committerMartin Storsjö <martin@martin.st>
Fri, 9 Aug 2013 08:26:50 +0000 (11:26 +0300)
This supports non-Linux systems (SOCK_CLOEXEC is non-standard) and
older Linux kernels to the extent possible.

Signed-off-by: Martin Storsjö <martin@martin.st>
libavformat/network.c
libavformat/network.h

index 810a907..6d308eb 100644 (file)
@@ -18,6 +18,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include <fcntl.h>
 #include "network.h"
 #include "url.h"
 #include "libavcodec/internal.h"
@@ -210,6 +211,24 @@ static int ff_poll_interrupt(struct pollfd *p, nfds_t nfds, int timeout,
     return ret;
 }
 
+int ff_socket(int af, int type, int proto)
+{
+    int fd;
+
+#ifdef SOCK_CLOEXEC
+    fd = socket(af, type | SOCK_CLOEXEC, proto);
+    if (fd == -1 && errno == EINVAL)
+#endif
+    {
+        fd = socket(af, type, proto);
+#if HAVE_FCNTL
+        if (fd != -1)
+            fcntl(fd, F_SETFD, FD_CLOEXEC);
+#endif
+    }
+    return fd;
+}
+
 int ff_listen_bind(int fd, const struct sockaddr *addr,
                    socklen_t addrlen, int timeout, URLContext *h)
 {
index 85b8f6d..1d3fb7b 100644 (file)
@@ -249,13 +249,6 @@ int ff_listen_connect(int fd, const struct sockaddr *addr,
 
 int ff_http_match_no_proxy(const char *no_proxy, const char *hostname);
 
-#ifndef SOCK_CLOEXEC
-#define SOCK_CLOEXEC 0
-#endif
-
-static inline int ff_socket(int domain, int type, int protocol)
-{
-    return socket(domain, type | SOCK_CLOEXEC, protocol);
-}
+int ff_socket(int domain, int type, int protocol);
 
 #endif /* AVFORMAT_NETWORK_H */