Ignore:
Timestamp:
2011-11-13T19:50:07+01:00 (4 years ago)
Author:
nico
Message:

packages/mini_snmpd: fix binding on IPv4 when IPv6 support is enabled

File:
1 edited

Legend:

Unmodified
Added
Removed
  • packages/net/mini_snmpd/patches/100-dualstack.patch

    r26826 r29040  
    11--- a/globals.c 
    22+++ b/globals.c 
    3 @@ -31,6 +31,8 @@ 
     3@@ -27,9 +27,9 @@ 
     4  * Global variables 
     5  */ 
     6  
     7-#ifdef __IPV4__ 
    48 const struct in_addr inaddr_any = { INADDR_ANY }; 
    5  #endif 
    6   
     9-#endif 
     10+ 
    711+int g_family = AF_INET; 
    8 + 
     12  
    913 in_port_t g_udp_port = 161; 
    1014 in_port_t g_tcp_port = 161; 
    11  int g_timeout = 100; 
    1215--- a/mini_snmpd.c 
    1316+++ b/mini_snmpd.c 
     
    100103                { "traps", 1, 0, 'T' }, 
    101104                { "auth", 0, 0, 'a' }, 
    102 @@ -396,6 +408,14 @@ int main(int argc, char *argv[]) 
     105@@ -327,7 +339,12 @@ int main(int argc, char *argv[]) 
     106        int option_index = 1; 
     107        int c; 
     108  
     109-       struct my_sockaddr_t sockaddr; 
     110+       union { 
     111+               struct sockaddr_in sa; 
     112+#ifdef __IPV6__ 
     113+               struct sockaddr_in6 sa6; 
     114+#endif 
     115+       } sockaddr; 
     116        my_socklen_t socklen; 
     117        struct timeval tv_last; 
     118        struct timeval tv_now; 
     119@@ -396,6 +413,14 @@ int main(int argc, char *argv[]) 
    103120                        case 'v': 
    104121                                g_verbose = 1; 
     
    115132                                print_version(); 
    116133                                exit(EXIT_ARGS); 
    117 @@ -435,12 +455,12 @@ int main(int argc, char *argv[]) 
     134@@ -435,15 +460,24 @@ int main(int argc, char *argv[]) 
    118135 #endif 
    119136  
     
    126143        } 
    127144-       sockaddr.my_sin_family = my_af_inet; 
    128 +       sockaddr.my_sin_family = g_family; 
    129         sockaddr.my_sin_port = htons(g_udp_port); 
    130         sockaddr.my_sin_addr = my_inaddr_any; 
    131         socklen = sizeof (sockaddr); 
    132 @@ -457,7 +477,7 @@ int main(int argc, char *argv[]) 
     145-       sockaddr.my_sin_port = htons(g_udp_port); 
     146-       sockaddr.my_sin_addr = my_inaddr_any; 
     147-       socklen = sizeof (sockaddr); 
     148+       if (g_family == AF_INET) { 
     149+               sockaddr.sa.sin_family = g_family; 
     150+               sockaddr.sa.sin_port = htons(g_udp_port); 
     151+               sockaddr.sa.sin_addr = inaddr_any; 
     152+               socklen = sizeof(sockaddr.sa); 
     153+#ifdef __IPV6__ 
     154+       } else { 
     155+               sockaddr.sa6.sin6_family = g_family; 
     156+               sockaddr.sa6.sin6_port = htons(g_udp_port); 
     157+               sockaddr.sa6.sin6_addr = in6addr_any; 
     158+               socklen = sizeof(sockaddr.sa6); 
     159+#endif 
     160+       } 
     161        if (bind(g_udp_sockfd, (struct sockaddr *)&sockaddr, socklen) == -1) { 
     162                lprintf(LOG_ERR, "could not bind UDP socket to port %d: %m\n", g_udp_port); 
     163                exit(EXIT_SYSCALL); 
     164@@ -457,7 +491,7 @@ int main(int argc, char *argv[]) 
    133165        } 
    134166  
     
    139171                lprintf(LOG_ERR, "could not create TCP socket: %m\n"); 
    140172                exit(EXIT_SYSCALL); 
    141 @@ -474,7 +494,7 @@ int main(int argc, char *argv[]) 
     173@@ -474,10 +508,19 @@ int main(int argc, char *argv[]) 
    142174                lprintf(LOG_WARNING, "could not set SO_REUSEADDR on TCP socket: %m\n"); 
    143175                exit(EXIT_SYSCALL); 
    144176        } 
    145177-       sockaddr.my_sin_family = my_af_inet; 
    146 +       sockaddr.my_sin_family = g_family; 
    147         sockaddr.my_sin_port = htons(g_tcp_port); 
    148         sockaddr.my_sin_addr = my_inaddr_any; 
    149         socklen = sizeof (sockaddr); 
     178-       sockaddr.my_sin_port = htons(g_tcp_port); 
     179-       sockaddr.my_sin_addr = my_inaddr_any; 
     180-       socklen = sizeof (sockaddr); 
     181+       if (g_family == AF_INET) { 
     182+               sockaddr.sa.sin_family = g_family; 
     183+               sockaddr.sa.sin_port = htons(g_udp_port); 
     184+               sockaddr.sa.sin_addr = inaddr_any; 
     185+               socklen = sizeof(sockaddr.sa); 
     186+#ifdef __IPV6__ 
     187+       } else { 
     188+               sockaddr.sa6.sin6_family = g_family; 
     189+               sockaddr.sa6.sin6_port = htons(g_udp_port); 
     190+               sockaddr.sa6.sin6_addr = in6addr_any; 
     191+               socklen = sizeof(sockaddr.sa6); 
     192+#endif 
     193+       } 
     194        if (bind(g_tcp_sockfd, (struct sockaddr *)&sockaddr, socklen) == -1) { 
     195                lprintf(LOG_ERR, "could not bind TCP socket to port %d: %m\n", g_tcp_port); 
     196                exit(EXIT_SYSCALL); 
    150197--- a/mini_snmpd.h 
    151198+++ b/mini_snmpd.h 
     
    158205 extern int g_auth; 
    159206 extern int g_verbose; 
     207@@ -265,9 +266,9 @@ extern char *g_vendor; 
     208 extern char *g_location; 
     209 extern char *g_contact; 
     210 extern char *g_bind_to_device; 
     211-#ifdef __IPV4__ 
     212+ 
     213 extern const struct in_addr inaddr_any; 
     214-#endif 
     215+ 
     216  
     217 extern char *g_disk_list[MAX_NR_DISKS]; 
     218 extern int g_disk_list_length; 
Note: See TracChangeset for help on using the changeset viewer.