From 28306e6d620c109ddd672f7243adfbc2bbb3b18f Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Thu, 30 May 2013 01:08:51 +0200 Subject: network: factor out bind-listening code Introduce ff_listen_bind, to be shared with the other non-tcp network protocols. --- libavformat/network.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'libavformat/network.c') diff --git a/libavformat/network.c b/libavformat/network.c index f493c29e81..55d55af35d 100644 --- a/libavformat/network.c +++ b/libavformat/network.c @@ -187,3 +187,32 @@ int ff_is_multicast_address(struct sockaddr *addr) return 0; } + +int ff_listen_bind(int fd, const struct sockaddr *addr, + socklen_t addrlen, int timeout) +{ + int ret; + int reuse = 1; + struct pollfd lp = { fd, POLLIN, 0 }; + setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)); + ret = bind(fd, addr, addrlen); + if (ret) + return ff_neterrno(); + + ret = listen(fd, 1); + if (ret) + return ff_neterrno(); + + ret = poll(&lp, 1, timeout >= 0 ? timeout : -1); + if (ret <= 0) + return AVERROR(ETIMEDOUT); + + ret = accept(fd, NULL, NULL); + if (ret < 0) + return ff_neterrno(); + + closesocket(fd); + + ff_socket_nonblock(ret, 1); + return ret; +} -- cgit v1.2.3