summaryrefslogtreecommitdiffstats
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
parentde421b208578386bfb4416c67c9922877e670049 (diff)
downloadffmpeg-streaming-28306e6d620c109ddd672f7243adfbc2bbb3b18f.zip
ffmpeg-streaming-28306e6d620c109ddd672f7243adfbc2bbb3b18f.tar.gz
network: factor out bind-listening code
Introduce ff_listen_bind, to be shared with the other non-tcp network protocols.
-rw-r--r--libavformat/network.c29
-rw-r--r--libavformat/network.h3
-rw-r--r--libavformat/tcp.c34
3 files changed, 39 insertions, 27 deletions
diff --git a/libavformat/network.c b/libavformat/network.c
index f493c29..55d55af 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;
+}
diff --git a/libavformat/network.h b/libavformat/network.h
index 5160767..db1b09a 100644
--- a/libavformat/network.h
+++ b/libavformat/network.h
@@ -209,4 +209,7 @@ const char *ff_gai_strerror(int ecode);
int ff_is_multicast_address(struct sockaddr *addr);
+int ff_listen_bind(int fd, const struct sockaddr *addr,
+ socklen_t addrlen, int timeout);
+
#endif /* AVFORMAT_NETWORK_H */
diff --git a/libavformat/tcp.c b/libavformat/tcp.c
index bdaab7f..6e4de0d 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:
OpenPOWER on IntegriCloud