From de421b208578386bfb4416c67c9922877e670049 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Sat, 1 Jun 2013 10:38:56 +0200 Subject: [PATCH 1/2] use my full first name instead of short one in copyrights --- libavcodec/binkdata.h | 2 +- libavcodec/binkdsp.c | 2 +- libavcodec/binkdsp.h | 2 +- libavformat/rtmp.h | 2 +- libavformat/rtmppkt.c | 2 +- libavformat/rtmppkt.h | 2 +- libavformat/rtmpproto.c | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libavcodec/binkdata.h b/libavcodec/binkdata.h index 60f0a59b49..3da6b7e987 100644 --- a/libavcodec/binkdata.h +++ b/libavcodec/binkdata.h @@ -1,6 +1,6 @@ /* * Bink video decoder - * Copyright (C) 2009 Kostya Shishkov + * Copyright (C) 2009 Konstantin Shishkov * * This file is part of Libav. * diff --git a/libavcodec/binkdsp.c b/libavcodec/binkdsp.c index a73c1481a0..a0ac2a8787 100644 --- a/libavcodec/binkdsp.c +++ b/libavcodec/binkdsp.c @@ -1,6 +1,6 @@ /* * Bink DSP routines - * Copyright (c) 2009 Kostya Shishkov + * Copyright (c) 2009 Konstantin Shishkov * * This file is part of Libav. * diff --git a/libavcodec/binkdsp.h b/libavcodec/binkdsp.h index 4968413bee..4c1f73f0c8 100644 --- a/libavcodec/binkdsp.h +++ b/libavcodec/binkdsp.h @@ -1,6 +1,6 @@ /* * Bink DSP routines - * Copyright (c) 2009 Kostya Shishkov + * Copyright (c) 2009 Konstantin Shishkov * * This file is part of Libav. * diff --git a/libavformat/rtmp.h b/libavformat/rtmp.h index b9c5f1e430..dc7ba5bdeb 100644 --- a/libavformat/rtmp.h +++ b/libavformat/rtmp.h @@ -1,6 +1,6 @@ /* * RTMP definitions - * Copyright (c) 2009 Kostya Shishkov + * Copyright (c) 2009 Konstantin Shishkov * * This file is part of Libav. * diff --git a/libavformat/rtmppkt.c b/libavformat/rtmppkt.c index 35534b1a47..1fc1263cad 100644 --- a/libavformat/rtmppkt.c +++ b/libavformat/rtmppkt.c @@ -1,6 +1,6 @@ /* * RTMP input format - * Copyright (c) 2009 Kostya Shishkov + * Copyright (c) 2009 Konstantin Shishkov * * This file is part of Libav. * diff --git a/libavformat/rtmppkt.h b/libavformat/rtmppkt.h index 276c5608c0..3f8660fce5 100644 --- a/libavformat/rtmppkt.h +++ b/libavformat/rtmppkt.h @@ -1,6 +1,6 @@ /* * RTMP packet utilities - * Copyright (c) 2009 Kostya Shishkov + * Copyright (c) 2009 Konstantin Shishkov * * This file is part of Libav. * diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c index 94f7aaef40..58cedef86a 100644 --- a/libavformat/rtmpproto.c +++ b/libavformat/rtmpproto.c @@ -1,6 +1,6 @@ /* * RTMP network protocol - * Copyright (c) 2009 Kostya Shishkov + * Copyright (c) 2009 Konstantin Shishkov * * This file is part of Libav. * From 28306e6d620c109ddd672f7243adfbc2bbb3b18f Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Thu, 30 May 2013 01:08:51 +0200 Subject: [PATCH 2/2] network: factor out bind-listening code Introduce ff_listen_bind, to be shared with the other non-tcp network protocols. --- libavformat/network.c | 29 +++++++++++++++++++++++++++++ libavformat/network.h | 3 +++ libavformat/tcp.c | 34 +++++++--------------------------- 3 files changed, 39 insertions(+), 27 deletions(-) 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; +} diff --git a/libavformat/network.h b/libavformat/network.h index 51607673e2..db1b09a91e 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 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(); + if ((fd = ff_listen_bind(fd, cur_ai->ai_addr, cur_ai->ai_addrlen, + listen_timeout)) < 0) { + ret = fd; 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(); - 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: