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>
This commit is contained in:
		
				
					committed by
					
						
						Martin Storsjö
					
				
			
			
				
	
			
			
			
						parent
						
							fa09e76010
						
					
				
				
					commit
					9d5ec50ead
				
			@@ -18,6 +18,7 @@
 | 
				
			|||||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
					 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <fcntl.h>
 | 
				
			||||||
#include "network.h"
 | 
					#include "network.h"
 | 
				
			||||||
#include "url.h"
 | 
					#include "url.h"
 | 
				
			||||||
#include "libavcodec/internal.h"
 | 
					#include "libavcodec/internal.h"
 | 
				
			||||||
@@ -210,6 +211,24 @@ static int ff_poll_interrupt(struct pollfd *p, nfds_t nfds, int timeout,
 | 
				
			|||||||
    return ret;
 | 
					    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,
 | 
					int ff_listen_bind(int fd, const struct sockaddr *addr,
 | 
				
			||||||
                   socklen_t addrlen, int timeout, URLContext *h)
 | 
					                   socklen_t addrlen, int timeout, URLContext *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);
 | 
					int ff_http_match_no_proxy(const char *no_proxy, const char *hostname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef SOCK_CLOEXEC
 | 
					int ff_socket(int domain, int type, int protocol);
 | 
				
			||||||
#define SOCK_CLOEXEC 0
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static inline int ff_socket(int domain, int type, int protocol)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return socket(domain, type | SOCK_CLOEXEC, protocol);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* AVFORMAT_NETWORK_H */
 | 
					#endif /* AVFORMAT_NETWORK_H */
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user