[FFmpeg-cvslog] ff_socket: put out-of-line and fallback to fcntl() for close-on-exec
Rémi Denis-Courmont
git at videolan.org
Sat Aug 10 10:24:05 CEST 2013
ffmpeg | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Aug 8 22:26:42 2013 +0300| [9d5ec50ead97e088d77317e77b18cef06cb3d053] | committer: Martin Storsjö
ff_socket: put out-of-line and fallback to fcntl() for close-on-exec
This supports non-Linux systems (SOCK_CLOEXEC is non-standard) and
older Linux kernels to the extent possible.
Signed-off-by: Martin Storsjö <martin at martin.st>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=9d5ec50ead97e088d77317e77b18cef06cb3d053
---
libavformat/network.c | 19 +++++++++++++++++++
libavformat/network.h | 9 +--------
2 files changed, 20 insertions(+), 8 deletions(-)
diff --git a/libavformat/network.c b/libavformat/network.c
index 810a907..6d308eb 100644
--- a/libavformat/network.c
+++ b/libavformat/network.c
@@ -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)
{
diff --git a/libavformat/network.h b/libavformat/network.h
index 85b8f6d..1d3fb7b 100644
--- a/libavformat/network.h
+++ b/libavformat/network.h
@@ -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 */
More information about the ffmpeg-cvslog
mailing list