From 00952be424ba7403d71c338933354d2172df8e67 Mon Sep 17 00:00:00 2001 From: David Fries Date: Mon, 7 Feb 2011 23:14:43 +0200 Subject: udp: Enable address reuse by default for multicast MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Keep the original corner case behaviour, where reuse is enabled for the case where no argument is given to the reuse url option. Signed-off-by: Martin Storsjö Signed-off-by: Ronald S. Bultje --- libavformat/udp.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'libavformat/udp.c') diff --git a/libavformat/udp.c b/libavformat/udp.c index aa17c979f3..4c4db2a589 100644 --- a/libavformat/udp.c +++ b/libavformat/udp.c @@ -313,6 +313,7 @@ static int udp_open(URLContext *h, const char *uri, int flags) char buf[256]; struct sockaddr_storage my_addr; int len; + int reuse_specified = 0; h->is_streamed = 1; h->max_packet_size = 1472; @@ -329,7 +330,14 @@ static int udp_open(URLContext *h, const char *uri, int flags) p = strchr(uri, '?'); if (p) { - s->reuse_socket = find_info_tag(buf, sizeof(buf), "reuse", p); + if (find_info_tag(buf, sizeof(buf), "reuse", p)) { + const char *endptr=NULL; + s->reuse_socket = strtol(buf, &endptr, 10); + /* assume if no digits were found it is a request to enable it */ + if (buf == endptr) + s->reuse_socket = 1; + reuse_specified = 1; + } if (find_info_tag(buf, sizeof(buf), "ttl", p)) { s->ttl = strtol(buf, NULL, 10); } @@ -366,9 +374,14 @@ static int udp_open(URLContext *h, const char *uri, int flags) if (udp_fd < 0) goto fail; - if (s->reuse_socket) + /* Follow the requested reuse option, unless it's multicast in which + * case enable reuse unless explicitely disabled. + */ + if (s->reuse_socket || (s->is_multicast && !reuse_specified)) { + s->reuse_socket = 1; if (setsockopt (udp_fd, SOL_SOCKET, SO_REUSEADDR, &(s->reuse_socket), sizeof(s->reuse_socket)) != 0) goto fail; + } /* the bind is needed to give a port to the socket now */ /* if multicast, try the multicast address bind first */ -- cgit v1.2.3