summaryrefslogtreecommitdiff
path: root/libavformat/udp.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavformat/udp.c')
-rw-r--r--libavformat/udp.c17
1 files changed, 15 insertions, 2 deletions
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 */