From ba472aaf010e69661866decbd3cfde177d8c0ee9 Mon Sep 17 00:00:00 2001
From: Alex Beregszaszi <alex@rtfs.hu>
Date: Fri, 27 Apr 2007 00:41:50 +0000
Subject: [PATCH] implement ff_socket_nonblock and use it in networking code

Originally committed as revision 8846 to svn://svn.ffmpeg.org/ffmpeg/trunk
---
 ffserver.c               | 4 ++--
 libavformat/network.h    | 2 ++
 libavformat/os_support.c | 8 ++++++++
 libavformat/tcp.c        | 3 +--
 4 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/ffserver.c b/ffserver.c
index 9f5502b2285..8f9bba6b49c 100644
--- a/ffserver.c
+++ b/ffserver.c
@@ -440,7 +440,7 @@ static int socket_open_listen(struct sockaddr_in *my_addr)
         closesocket(server_fd);
         return -1;
     }
-    fcntl(server_fd, F_SETFL, O_NONBLOCK);
+    ff_socket_nonblock(server_fd, 1);
 
     return server_fd;
 }
@@ -649,7 +649,7 @@ static void new_connection(int server_fd, int is_rtsp)
                 &len);
     if (fd < 0)
         return;
-    fcntl(fd, F_SETFL, O_NONBLOCK);
+    ff_socket_nonblock(fd, 1);
 
     /* XXX: should output a warning page when coming
        close to the connection limit */
diff --git a/libavformat/network.h b/libavformat/network.h
index 7dcbfe244c0..6ceba419026 100644
--- a/libavformat/network.h
+++ b/libavformat/network.h
@@ -32,6 +32,8 @@
 #define ff_neterrno() errno
 #define FF_NETERROR(err) err
 
+int ff_socket_nonblock(int socket, int enable);
+
 #if !defined(HAVE_INET_ATON)
 /* in os_support.c */
 int inet_aton (const char * str, struct in_addr * add);
diff --git a/libavformat/os_support.c b/libavformat/os_support.c
index da303be49cb..abee749aacb 100644
--- a/libavformat/os_support.c
+++ b/libavformat/os_support.c
@@ -114,6 +114,14 @@ int resolve_host(struct in_addr *sin_addr, const char *hostname)
     }
     return 0;
 }
+
+int ff_socket_nonblock(int socket, int enable)
+{
+   if (enable)
+      return fcntl(socket, F_SETFL, fcntl(socket, F_GETFL) | O_NONBLOCK);
+   else
+      return fcntl(socket, F_SETFL, fcntl(socket, F_GETFL) & ~O_NONBLOCK);
+}
 #endif /* CONFIG_NETWORK */
 
 #ifdef CONFIG_FFSERVER
diff --git a/libavformat/tcp.c b/libavformat/tcp.c
index b2f6d37a763..36b67076af8 100644
--- a/libavformat/tcp.c
+++ b/libavformat/tcp.c
@@ -22,7 +22,6 @@
 #include <unistd.h>
 #include "network.h"
 #include <sys/time.h>
-#include <fcntl.h>
 
 typedef struct TCPContext {
     int fd;
@@ -62,7 +61,7 @@ static int tcp_open(URLContext *h, const char *uri, int flags)
     fd = socket(AF_INET, SOCK_STREAM, 0);
     if (fd < 0)
         goto fail;
-    fcntl(fd, F_SETFL, O_NONBLOCK);
+    ff_socket_nonblock(fd, 1);
 
  redo:
     ret = connect(fd, (struct sockaddr *)&dest_addr,
-- 
GitLab