Commit c7c8bd43 authored by Warren Dukes's avatar Warren Dukes

bind to ipv4 and ipv6 addresses for "any"

git-svn-id: https://svn.musicpd.org/mpd/trunk@4407 09075e82-0dd4-0310-85a5-a0d7c8717e4f
parent adcc2662
...@@ -43,13 +43,72 @@ ...@@ -43,13 +43,72 @@
int * listenSockets = NULL; int * listenSockets = NULL;
int numberOfListenSockets = 0; int numberOfListenSockets = 0;
static int establishListen(unsigned int port, ConfigParam * param) { static void establishListen(unsigned int port,
int allowReuse = ALLOW_REUSE; struct sockaddr * addrp,
socklen_t addrlen)
{
int pf;
int sock; int sock;
int allowReuse = ALLOW_REUSE;
switch(addrp->sa_family) {
case AF_INET:
pf = PF_INET;
break;
#ifdef HAVE_IPV6
case AF_INET6:
pf = PF_INET6;
break;
#endif
case AF_UNIX:
pf = PF_UNIX;
break;
default:
ERROR("unknown address family: %i\n",addrp->sa_family);
exit(EXIT_FAILURE);
}
if((sock = socket(pf,SOCK_STREAM,0)) < 0) {
ERROR("socket < 0\n");
exit(EXIT_FAILURE);
}
if(fcntl(sock, F_SETFL ,fcntl(sock, F_GETFL) | O_NONBLOCK) < 0) {
ERROR("problems setting nonblocking on listen socket: %s\n",
strerror(errno));
exit(EXIT_FAILURE);
}
if(setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char *)&allowReuse,
sizeof(allowReuse))<0)
{
ERROR("problems setsockopt'ing: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
if(bind(sock,addrp,addrlen)<0) {
ERROR("unable to bind port %u", port);
ERROR(": %s\n", strerror(errno));
ERROR("maybe MPD is still running?\n");
exit(EXIT_FAILURE);
}
if(listen(sock,5)<0) {
ERROR("problems listen'ing: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
numberOfListenSockets++;
listenSockets =
realloc(listenSockets,sizeof(int)*numberOfListenSockets);
listenSockets[numberOfListenSockets-1] = sock;
}
static void parseListenConfigParam(unsigned int port, ConfigParam * param) {
struct sockaddr * addrp; struct sockaddr * addrp;
socklen_t addrlen; socklen_t addrlen;
struct sockaddr_in sin; struct sockaddr_in sin;
int pf;
#ifdef HAVE_IPV6 #ifdef HAVE_IPV6
struct sockaddr_in6 sin6; struct sockaddr_in6 sin6;
...@@ -68,14 +127,13 @@ static int establishListen(unsigned int port, ConfigParam * param) { ...@@ -68,14 +127,13 @@ static int establishListen(unsigned int port, ConfigParam * param) {
sin6.sin6_addr = in6addr_any; sin6.sin6_addr = in6addr_any;
addrp = (struct sockaddr *) &sin6; addrp = (struct sockaddr *) &sin6;
addrlen = sizeof(struct sockaddr_in6); addrlen = sizeof(struct sockaddr_in6);
establishListen(port, addrp, addrlen);
} }
else
#endif #endif
{
sin.sin_addr.s_addr = INADDR_ANY; sin.sin_addr.s_addr = INADDR_ANY;
addrp = (struct sockaddr *) &sin; addrp = (struct sockaddr *) &sin;
addrlen = sizeof(struct sockaddr_in); addrlen = sizeof(struct sockaddr_in);
} establishListen(port, addrp, addrlen);
} }
else { else {
struct hostent * he; struct hostent * he;
...@@ -112,57 +170,9 @@ static int establishListen(unsigned int port, ConfigParam * param) { ...@@ -112,57 +170,9 @@ static int establishListen(unsigned int port, ConfigParam * param) {
param->value, param->line); param->value, param->line);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
}
switch(addrp->sa_family) { establishListen(port, addrp, addrlen);
case AF_INET:
pf = PF_INET;
break;
#ifdef HAVE_IPV6
case AF_INET6:
pf = PF_INET6;
break;
#endif
case AF_UNIX:
pf = PF_UNIX;
break;
default:
ERROR("unknown address family: %i\n",addrp->sa_family);
exit(EXIT_FAILURE);
} }
if((sock = socket(pf,SOCK_STREAM,0)) < 0) {
ERROR("socket < 0\n");
exit(EXIT_FAILURE);
}
if(fcntl(sock, F_SETFL ,fcntl(sock, F_GETFL) | O_NONBLOCK) < 0) {
ERROR("problems setting nonblocking on listen socket: %s\n",
strerror(errno));
exit(EXIT_FAILURE);
}
if(setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char *)&allowReuse,
sizeof(allowReuse))<0)
{
ERROR("problems setsockopt'ing: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
if(bind(sock,addrp,addrlen)<0) {
ERROR("unable to bind port %u", port);
if(param) ERROR(" (for address at line %i)", param->line);
ERROR(": %s\n", strerror(errno));
ERROR("maybe MPD is still running?\n");
exit(EXIT_FAILURE);
}
if(listen(sock,5)<0) {
ERROR("problems listen'ing: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
return sock;
} }
void listenOnPort(void) { void listenOnPort(void) {
...@@ -186,12 +196,7 @@ void listenOnPort(void) { ...@@ -186,12 +196,7 @@ void listenOnPort(void) {
} }
do { do {
numberOfListenSockets++; parseListenConfigParam(port, param);
listenSockets = realloc(listenSockets,
sizeof(int)*numberOfListenSockets);
listenSockets[numberOfListenSockets-1] =
establishListen(port, param);
} while ((param = getNextConfigParam(CONF_BIND_TO_ADDRESS, param))); } while ((param = getNextConfigParam(CONF_BIND_TO_ADDRESS, param)));
} }
......
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