AA: miniupnpd: backport r36488
[12.09/packages.git] / net / miniupnpd / patches / 100-gracefully-handle-missing-ipv6.patch
1 --- a/miniupnpd.c
2 +++ b/miniupnpd.c
3 @@ -106,25 +106,20 @@ volatile sig_atomic_t should_send_public
4  /* OpenAndConfHTTPSocket() :
5   * setup the socket used to handle incoming HTTP connections. */
6  static int
7 -OpenAndConfHTTPSocket(unsigned short port)
8 +OpenAndConfHTTPSocket(unsigned short port, int family)
9  {
10         int s;
11         int i = 1;
12 -#ifdef ENABLE_IPV6
13 -       struct sockaddr_in6 listenname;
14 -#else
15 -       struct sockaddr_in listenname;
16 -#endif
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;
21  
22 -       if( (s = socket(
23 -#ifdef ENABLE_IPV6
24 -                       PF_INET6,
25 -#else
26 -                       PF_INET,
27 -#endif
28 -                       SOCK_STREAM, 0)) < 0)
29 +       if( (s = socket(family, SOCK_STREAM, 0)) < 0)
30         {
31 +               if ((family == AF_INET6) && (errno == EAFNOSUPPORT))
32 +                       return OpenAndConfHTTPSocket(port, AF_INET);
33 +
34                 syslog(LOG_ERR, "socket(http): %m");
35                 return -1;
36         }
37 @@ -147,18 +142,20 @@ OpenAndConfHTTPSocket(unsigned short por
38                 syslog(LOG_WARNING, "set_non_blocking(http): %m");
39         }
40  
41 -#ifdef ENABLE_IPV6
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);
47 -#else
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);
52 -#endif
53 +       memset(&listenname, 0, sizeof(listenname));
54 +       ln6->sin6_family = family;
55 +       ln6->sin6_port   = htons(port);
56 +
57 +       if (family == AF_INET6)
58 +       {
59 +               ln6->sin6_addr = in6addr_any;
60 +               listenname_len = sizeof(struct sockaddr_in6);
61 +       }
62 +       else
63 +       {
64 +               ln4->sin_addr.s_addr = htonl(INADDR_ANY);
65 +               listenname_len = sizeof(struct sockaddr_in);
66 +       }
67  
68         if(bind(s, (struct sockaddr *)&listenname, listenname_len) < 0)
69         {
70 @@ -1254,6 +1251,9 @@ main(int argc, char * * argv)
71         int sudp = -1;          /* IP v4 socket for receiving SSDP */
72  #ifdef ENABLE_IPV6
73         int sudpv6 = -1;        /* IP v6 socket for receiving SSDP */
74 +       int addr_family = AF_INET6;
75 +#else
76 +       int addr_family = AF_INET;
77  #endif
78  #ifdef ENABLE_NATPMP
79         int * snatpmp = NULL;
80 @@ -1338,7 +1338,7 @@ main(int argc, char * * argv)
81         {
82  
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);
86                 if(shttpl < 0)
87                 {
88                         syslog(LOG_ERR, "Failed to open socket for HTTP. EXITING");
89 --- a/minissdp.c
90 +++ b/minissdp.c
91 @@ -277,8 +277,6 @@ OpenAndConfSSDPNotifySockets(int * socke
92                 i++;
93  #ifdef ENABLE_IPV6
94                 sockets[i] = OpenAndConfSSDPNotifySocketIPv6(lan_addr->index);
95 -               if(sockets[i] < 0)
96 -                       goto error;
97                 i++;
98  #endif
99         }
100 @@ -495,6 +493,9 @@ SendSSDPNotifies(int s, const char * hos
101         int i=0;
102         char ver_str[4];
103  
104 +       if (s < 0)
105 +               return;
106 +
107         memset(&sockname, 0, sizeof(sockname));
108  #ifdef ENABLE_IPV6
109         if(ipv6)
110 @@ -868,6 +869,10 @@ SendSSDPGoodbye(int * sockets, int n_soc
111  #ifdef ENABLE_IPV6
112                 ipv6 = j & 1;
113  #endif
114 +
115 +           if (sockets[j] < 0)
116 +               continue;
117 +
118             for(i=0; known_service_types[i].s; i++)
119             {
120                         if(i==0)