Commit 9087a46d authored by David Fries's avatar David Fries Committed by Michael Niedermayer

udp: Enable address reuse by default for multicast

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: 's avatarMartin Storsjö <martin@martin.st>
Signed-off-by: 's avatarRonald S. Bultje <rsbultje@gmail.com>
(cherry picked from commit 00952be4)
parent c3052f1d
...@@ -313,6 +313,7 @@ static int udp_open(URLContext *h, const char *uri, int flags) ...@@ -313,6 +313,7 @@ static int udp_open(URLContext *h, const char *uri, int flags)
char buf[256]; char buf[256];
struct sockaddr_storage my_addr; struct sockaddr_storage my_addr;
int len; int len;
int reuse_specified = 0;
h->is_streamed = 1; h->is_streamed = 1;
h->max_packet_size = 1472; h->max_packet_size = 1472;
...@@ -329,7 +330,14 @@ static int udp_open(URLContext *h, const char *uri, int flags) ...@@ -329,7 +330,14 @@ static int udp_open(URLContext *h, const char *uri, int flags)
p = strchr(uri, '?'); p = strchr(uri, '?');
if (p) { 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)) { if (find_info_tag(buf, sizeof(buf), "ttl", p)) {
s->ttl = strtol(buf, NULL, 10); s->ttl = strtol(buf, NULL, 10);
} }
...@@ -366,9 +374,14 @@ static int udp_open(URLContext *h, const char *uri, int flags) ...@@ -366,9 +374,14 @@ static int udp_open(URLContext *h, const char *uri, int flags)
if (udp_fd < 0) if (udp_fd < 0)
goto fail; 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) if (setsockopt (udp_fd, SOL_SOCKET, SO_REUSEADDR, &(s->reuse_socket), sizeof(s->reuse_socket)) != 0)
goto fail; goto fail;
}
/* the bind is needed to give a port to the socket now */ /* the bind is needed to give a port to the socket now */
/* if multicast, try the multicast address bind first */ /* if multicast, try the multicast address bind first */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment