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: Martin Storsjö <martin@martin.st> Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
This commit is contained in:
parent
569ff02168
commit
00952be424
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user