summaryrefslogtreecommitdiff
path: root/libavformat/tcp.c
diff options
context:
space:
mode:
authorLuca Barbato <lu_zero@gentoo.org>2013-05-30 01:08:51 +0200
committerLuca Barbato <lu_zero@gentoo.org>2013-06-01 15:29:53 +0200
commit28306e6d620c109ddd672f7243adfbc2bbb3b18f (patch)
treefc2df8e1f6dcc773f9b338559ac6804738992d07 /libavformat/tcp.c
parentde421b208578386bfb4416c67c9922877e670049 (diff)
network: factor out bind-listening code
Introduce ff_listen_bind, to be shared with the other non-tcp network protocols.
Diffstat (limited to 'libavformat/tcp.c')
-rw-r--r--libavformat/tcp.c34
1 files changed, 7 insertions, 27 deletions
diff --git a/libavformat/tcp.c b/libavformat/tcp.c
index bdaab7f806..6e4de0db6b 100644
--- a/libavformat/tcp.c
+++ b/libavformat/tcp.c
@@ -85,39 +85,18 @@ static int tcp_open(URLContext *h, const char *uri, int flags)
cur_ai = ai;
restart:
- ret = AVERROR(EIO);
fd = socket(cur_ai->ai_family, cur_ai->ai_socktype, cur_ai->ai_protocol);
- if (fd < 0)
+ if (fd < 0) {
+ ret = ff_neterrno();
goto fail;
+ }
if (listen_socket) {
- int fd1;
- int reuse = 1;
- struct pollfd lp = { fd, POLLIN, 0 };
- setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
- ret = bind(fd, cur_ai->ai_addr, cur_ai->ai_addrlen);
- if (ret) {
- ret = ff_neterrno();
- goto fail1;
- }
- ret = listen(fd, 1);
- if (ret) {
- ret = ff_neterrno();
- goto fail1;
- }
- ret = poll(&lp, 1, listen_timeout >= 0 ? listen_timeout : -1);
- if (ret <= 0) {
- ret = AVERROR(ETIMEDOUT);
- goto fail1;
- }
- fd1 = accept(fd, NULL, NULL);
- if (fd1 < 0) {
- ret = ff_neterrno();
+ if ((fd = ff_listen_bind(fd, cur_ai->ai_addr, cur_ai->ai_addrlen,
+ listen_timeout)) < 0) {
+ ret = fd;
goto fail1;
}
- closesocket(fd);
- fd = fd1;
- ff_socket_nonblock(fd, 1);
} else {
redo:
ff_socket_nonblock(fd, 1);
@@ -177,6 +156,7 @@ static int tcp_open(URLContext *h, const char *uri, int flags)
cur_ai = cur_ai->ai_next;
if (fd >= 0)
closesocket(fd);
+ ret = 0;
goto restart;
}
fail1: