Commit aa519c47 authored by Luca Abeni's avatar Luca Abeni

Remove some more duplicated code

Originally committed as revision 11038 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent d4936869
...@@ -158,13 +158,9 @@ static int udp_set_url(struct sockaddr_storage *addr, const char *hostname, int ...@@ -158,13 +158,9 @@ static int udp_set_url(struct sockaddr_storage *addr, const char *hostname, int
return addr_len; return addr_len;
} }
static int udp_ipv6_set_local(URLContext *h) { static int udp_socket_create(UDPContext *s, struct sockaddr_storage *addr, int *addr_len)
UDPContext *s = h->priv_data; {
int udp_fd = -1; int udp_fd = -1;
struct sockaddr_storage clientaddr;
socklen_t addrlen;
char sbuf[NI_MAXSERV];
char hbuf[NI_MAXHOST];
struct addrinfo *res0 = NULL, *res = NULL; struct addrinfo *res0 = NULL, *res = NULL;
int family = AF_UNSPEC; int family = AF_UNSPEC;
...@@ -182,25 +178,10 @@ static int udp_ipv6_set_local(URLContext *h) { ...@@ -182,25 +178,10 @@ static int udp_ipv6_set_local(URLContext *h) {
if (udp_fd < 0) if (udp_fd < 0)
goto fail; goto fail;
if (bind(udp_fd, res0->ai_addr, res0->ai_addrlen) < 0) { memcpy(addr, res->ai_addr, res->ai_addrlen);
perror("bind"); *addr_len = res->ai_addrlen;
goto fail;
}
freeaddrinfo(res0);
res0 = NULL;
addrlen = sizeof(clientaddr);
if (getsockname(udp_fd, (struct sockaddr *)&clientaddr, &addrlen) < 0) {
perror("getsockname");
goto fail;
}
if (getnameinfo((struct sockaddr *)&clientaddr, addrlen, hbuf, sizeof(hbuf), sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV) != 0) {
perror("getnameinfo");
goto fail;
}
s->local_port = strtol(sbuf, NULL, 10); freeaddrinfo(res0);
return udp_fd; return udp_fd;
...@@ -212,6 +193,19 @@ static int udp_ipv6_set_local(URLContext *h) { ...@@ -212,6 +193,19 @@ static int udp_ipv6_set_local(URLContext *h) {
return -1; return -1;
} }
static int udp_port(struct sockaddr_storage *addr, int addr_len)
{
char sbuf[NI_MAXSERV];
char hbuf[NI_MAXHOST];
if (getnameinfo((struct sockaddr *)addr, addr_len, hbuf, sizeof(hbuf), sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV) != 0) {
perror("getnameinfo");
return -1;
}
return strtol(sbuf, NULL, 10);
}
#else #else
static int udp_set_url(struct sockaddr_in *addr, const char *hostname, int port) static int udp_set_url(struct sockaddr_in *addr, const char *hostname, int port)
...@@ -225,6 +219,26 @@ static int udp_set_url(struct sockaddr_in *addr, const char *hostname, int port) ...@@ -225,6 +219,26 @@ static int udp_set_url(struct sockaddr_in *addr, const char *hostname, int port)
return sizeof(struct sockaddr_in); return sizeof(struct sockaddr_in);
} }
static int udp_socket_create(UDPContext *s, struct sockaddr_in *addr, int *addr_len)
{
int fd;
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0)
return -1;
addr->sin_family = AF_INET;
addr->sin_addr.s_addr = htonl (INADDR_ANY);
addr->sin_port = htons(s->local_port);
*addr_len = sizeof(struct sockaddr_in);
return fd;
}
static int udp_port(struct sockaddr_in *addr, int len)
{
return ntohs(addr->sin_port);
}
#endif /* CONFIG_IPV6 */ #endif /* CONFIG_IPV6 */
...@@ -295,8 +309,10 @@ static int udp_open(URLContext *h, const char *uri, int flags) ...@@ -295,8 +309,10 @@ static int udp_open(URLContext *h, const char *uri, int flags)
char buf[256]; char buf[256];
#ifndef CONFIG_IPV6 #ifndef CONFIG_IPV6
struct sockaddr_in my_addr; struct sockaddr_in my_addr;
int len; #else
struct sockaddr_storage my_addr;
#endif #endif
int len;
h->is_streamed = 1; h->is_streamed = 1;
h->max_packet_size = 1472; h->max_packet_size = 1472;
...@@ -341,31 +357,22 @@ static int udp_open(URLContext *h, const char *uri, int flags) ...@@ -341,31 +357,22 @@ static int udp_open(URLContext *h, const char *uri, int flags)
if (s->is_multicast && !(h->flags & URL_WRONLY)) if (s->is_multicast && !(h->flags & URL_WRONLY))
s->local_port = port; s->local_port = port;
#ifndef CONFIG_IPV6 udp_fd = udp_socket_create(s, &my_addr, &len);
udp_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (udp_fd < 0) if (udp_fd < 0)
goto fail; goto fail;
my_addr.sin_family = AF_INET;
my_addr.sin_addr.s_addr = htonl (INADDR_ANY);
my_addr.sin_port = htons(s->local_port);
if (s->reuse_socket) if (s->reuse_socket)
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 (bind(udp_fd,(struct sockaddr *)&my_addr, sizeof(my_addr)) < 0) if (bind(udp_fd,(struct sockaddr *)&my_addr, len) < 0)
goto fail; goto fail;
len = sizeof(my_addr); len = sizeof(my_addr);
getsockname(udp_fd, (struct sockaddr *)&my_addr, &len); getsockname(udp_fd, (struct sockaddr *)&my_addr, &len);
s->local_port = ntohs(my_addr.sin_port); s->local_port = udp_port(&my_addr, len);
#else
udp_fd = udp_ipv6_set_local(h);
if (udp_fd < 0)
goto fail;
#endif /* CONFIG_IPV6 */
if (s->is_multicast) { if (s->is_multicast) {
if (h->flags & URL_WRONLY) { if (h->flags & URL_WRONLY) {
/* output */ /* output */
......
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