3 @@ -106,25 +106,20 @@ volatile sig_atomic_t should_send_public
4 /* OpenAndConfHTTPSocket() :
5 * setup the socket used to handle incoming HTTP connections. */
7 -OpenAndConfHTTPSocket(unsigned short port)
8 +OpenAndConfHTTPSocket(unsigned short port, int family)
13 - struct sockaddr_in6 listenname;
15 - struct sockaddr_in listenname;
17 + struct sockaddr_storage listenname;
18 + struct sockaddr_in *ln4 = (struct sockaddr_in *)&listenname;
19 + struct sockaddr_in6 *ln6 = (struct sockaddr_in6 *)&listenname;
20 socklen_t listenname_len;
28 - SOCK_STREAM, 0)) < 0)
29 + if( (s = socket(family, SOCK_STREAM, 0)) < 0)
31 + if ((family == AF_INET6) && (errno == EAFNOSUPPORT))
32 + return OpenAndConfHTTPSocket(port, AF_INET);
34 syslog(LOG_ERR, "socket(http): %m");
37 @@ -147,18 +142,20 @@ OpenAndConfHTTPSocket(unsigned short por
38 syslog(LOG_WARNING, "set_non_blocking(http): %m");
42 - memset(&listenname, 0, sizeof(struct sockaddr_in6));
43 - listenname.sin6_family = AF_INET6;
44 - listenname.sin6_port = htons(port);
45 - listenname.sin6_addr = in6addr_any;
46 - listenname_len = sizeof(struct sockaddr_in6);
48 - listenname.sin_family = AF_INET;
49 - listenname.sin_port = htons(port);
50 - listenname.sin_addr.s_addr = htonl(INADDR_ANY);
51 - listenname_len = sizeof(struct sockaddr_in);
53 + memset(&listenname, 0, sizeof(listenname));
54 + ln6->sin6_family = family;
55 + ln6->sin6_port = htons(port);
57 + if (family == AF_INET6)
59 + ln6->sin6_addr = in6addr_any;
60 + listenname_len = sizeof(struct sockaddr_in6);
64 + ln4->sin_addr.s_addr = htonl(INADDR_ANY);
65 + listenname_len = sizeof(struct sockaddr_in);
68 if(bind(s, (struct sockaddr *)&listenname, listenname_len) < 0)
70 @@ -1254,6 +1251,9 @@ main(int argc, char * * argv)
71 int sudp = -1; /* IP v4 socket for receiving SSDP */
73 int sudpv6 = -1; /* IP v6 socket for receiving SSDP */
74 + int addr_family = AF_INET6;
76 + int addr_family = AF_INET;
80 @@ -1338,7 +1338,7 @@ main(int argc, char * * argv)
83 /* open socket for HTTP connections. Listen on the 1st LAN address */
84 - shttpl = OpenAndConfHTTPSocket((v.port > 0) ? v.port : 0);
85 + shttpl = OpenAndConfHTTPSocket((v.port > 0) ? v.port : 0, addr_family);
88 syslog(LOG_ERR, "Failed to open socket for HTTP. EXITING");
91 @@ -277,8 +277,6 @@ OpenAndConfSSDPNotifySockets(int * socke
94 sockets[i] = OpenAndConfSSDPNotifySocketIPv6(lan_addr->index);
100 @@ -495,6 +493,9 @@ SendSSDPNotifies(int s, const char * hos
107 memset(&sockname, 0, sizeof(sockname));
110 @@ -868,6 +869,10 @@ SendSSDPGoodbye(int * sockets, int n_soc
115 + if (sockets[j] < 0)
118 for(i=0; known_service_types[i].s; i++)