Browse Source

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@martin.st>
tags/n2.1
Rémi Denis-Courmont Martin Storsjö 12 years ago
parent
commit
9d5ec50ead
2 changed files with 20 additions and 8 deletions
  1. +19
    -0
      libavformat/network.c
  2. +1
    -8
      libavformat/network.h

+ 19
- 0
libavformat/network.c View 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)
{


+ 1
- 8
libavformat/network.h View 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 */

Loading…
Cancel
Save