diff --git a/net/mini_snmpd/Makefile b/net/mini_snmpd/Makefile index 1e7d70566..a1fe691c2 100644 --- a/net/mini_snmpd/Makefile +++ b/net/mini_snmpd/Makefile @@ -1,5 +1,5 @@ # -# Copyright (C) 2009-2010 OpenWrt.org +# Copyright (C) 2009-2011 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mini_snmpd PKG_VERSION:=1.2b -PKG_RELEASE:=1 +PKG_RELEASE:=2 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=http://members.aon.at/linuxfreak/linux/ diff --git a/net/mini_snmpd/files/mini_snmpd.config b/net/mini_snmpd/files/mini_snmpd.config index 352ac283b..43ab93141 100644 --- a/net/mini_snmpd/files/mini_snmpd.config +++ b/net/mini_snmpd/files/mini_snmpd.config @@ -1,5 +1,6 @@ config mini_snmpd option enabled 1 + option ipv6 0 option community public option location '' option contact '' diff --git a/net/mini_snmpd/files/mini_snmpd.init b/net/mini_snmpd/files/mini_snmpd.init index 5d7cb7685..cc051c0bd 100644 --- a/net/mini_snmpd/files/mini_snmpd.init +++ b/net/mini_snmpd/files/mini_snmpd.init @@ -23,8 +23,11 @@ mini_snmpd_config() { append_string "$cfg" contact "-C" append_string "$cfg" disks "-d" append_string "$cfg" interfaces "-i" - - config_get_bool enabled "$cfg" "enabled" '1'c + + config_get_bool ipv6 "$cfg" "ipv6" '0' + [ "$ipv6" -gt 0 ] && append args "-6" + + config_get_bool enabled "$cfg" "enabled" '1' [ "$enabled" -gt 0 ] && $PROG $args & } diff --git a/net/mini_snmpd/patches/100-dualstack.patch b/net/mini_snmpd/patches/100-dualstack.patch new file mode 100644 index 000000000..a83236af2 --- /dev/null +++ b/net/mini_snmpd/patches/100-dualstack.patch @@ -0,0 +1,159 @@ +--- a/globals.c ++++ b/globals.c +@@ -31,6 +31,8 @@ + const struct in_addr inaddr_any = { INADDR_ANY }; + #endif + ++int g_family = AF_INET; ++ + in_port_t g_udp_port = 161; + in_port_t g_tcp_port = 161; + int g_timeout = 100; +--- a/mini_snmpd.c ++++ b/mini_snmpd.c +@@ -54,6 +54,10 @@ static void print_help(void) + fprintf(stderr, "-d, --disks nnn set the disks to monitor (/)\n"); + fprintf(stderr, "-i, --interfaces nnn set the network interfaces to monitor (lo)\n"); + fprintf(stderr, "-I, --listen nnn set the network interface to listen (all)\n"); ++#ifdef __IPV6__ ++ fprintf(stderr, "-4, --ipv4 use IPv4 (default)\n"); ++ fprintf(stderr, "-6, --ipv6 use IPv6\n"); ++#endif + fprintf(stderr, "-t, --timeout nnn set the timeout for MIB updates (1 second)\n"); + fprintf(stderr, "-a, --auth require authentication (thus SNMP version 2c)\n"); + fprintf(stderr, "-v, --verbose verbose syslog messages \n"); +@@ -117,7 +121,7 @@ static void handle_udp_client(void) + #endif + + /* Call the protocol handler which will prepare the response packet */ +- inet_ntop(my_af_inet, &sockaddr.my_sin_addr, straddr, sizeof(straddr)); ++ inet_ntop(g_family, &sockaddr.my_sin_addr, straddr, sizeof(straddr)); + if (snmp(&g_udp_client) == -1) { + lprintf(LOG_WARNING, "could not handle packet from UDP client %s:%d: %m\n", + straddr, sockaddr.my_sin_port); +@@ -132,7 +136,7 @@ static void handle_udp_client(void) + /* Send the whole UDP packet to the socket at once */ + rv = sendto(g_udp_sockfd, g_udp_client.packet, g_udp_client.size, + MSG_DONTWAIT, (struct sockaddr *)&sockaddr, socklen); +- inet_ntop(my_af_inet, &sockaddr.my_sin_addr, straddr, sizeof(straddr)); ++ inet_ntop(g_family, &sockaddr.my_sin_addr, straddr, sizeof(straddr)); + if (rv == -1) { + lprintf(LOG_WARNING, "could not send packet to UDP client %s:%d: %m\n", + straddr, sockaddr.my_sin_port); +@@ -176,7 +180,7 @@ static void handle_tcp_connect(void) + } + tmp_sockaddr.my_sin_addr = client->addr; + tmp_sockaddr.my_sin_port = client->port; +- inet_ntop(my_af_inet, &tmp_sockaddr.my_sin_addr, straddr, sizeof(straddr)); ++ inet_ntop(g_family, &tmp_sockaddr.my_sin_addr, straddr, sizeof(straddr)); + lprintf(LOG_WARNING, "maximum number of %d clients reached, kicking out %s:%d\n", + MAX_NR_CLIENTS, straddr, tmp_sockaddr.my_sin_port); + close(client->sockfd); +@@ -190,7 +194,7 @@ static void handle_tcp_connect(void) + } + + /* Now fill out the client control structure values */ +- inet_ntop(my_af_inet, &sockaddr.my_sin_addr, straddr, sizeof(straddr)); ++ inet_ntop(g_family, &sockaddr.my_sin_addr, straddr, sizeof(straddr)); + lprintf(LOG_DEBUG, "connected TCP client %s:%d\n", + straddr, sockaddr.my_sin_port); + client->timestamp = time(NULL); +@@ -211,7 +215,7 @@ static void handle_tcp_client_write(clie + sockaddr.my_sin_addr = client->addr; + sockaddr.my_sin_port = client->port; + rv = send(client->sockfd, client->packet, client->size, 0); +- inet_ntop(my_af_inet, &sockaddr.my_sin_addr, straddr, sizeof(straddr)); ++ inet_ntop(g_family, &sockaddr.my_sin_addr, straddr, sizeof(straddr)); + if (rv == -1) { + lprintf(LOG_WARNING, "could not send packet to TCP client %s:%d: %m\n", + straddr, sockaddr.my_sin_port); +@@ -246,7 +250,7 @@ static void handle_tcp_client_read(clien + sockaddr.my_sin_port = client->port; + rv = read(client->sockfd, client->packet + client->size, + sizeof (client->packet) - client->size); +- inet_ntop(my_af_inet, &sockaddr.my_sin_addr, straddr, sizeof(straddr)); ++ inet_ntop(g_family, &sockaddr.my_sin_addr, straddr, sizeof(straddr)); + if (rv == -1) { + lprintf(LOG_WARNING, "could not read packet from TCP client %s:%d: %m\n", + straddr, sockaddr.my_sin_port); +@@ -304,7 +308,11 @@ static void handle_tcp_client_read(clien + + int main(int argc, char *argv[]) + { ++#ifdef __IPV6__ ++ static const char short_options[] = "p:P:c:D:V:L:C:d:i:I:t:T:avl46h"; ++#else + static const char short_options[] = "p:P:c:D:V:L:C:d:i:I:t:T:avlh"; ++#endif + static const struct option long_options[] = { + { "udp-port", 1, 0, 'p' }, + { "tcp-port", 1, 0, 'P' }, +@@ -316,6 +324,10 @@ int main(int argc, char *argv[]) + { "disks", 1, 0, 'd' }, + { "interfaces", 1, 0, 'i' }, + { "listen", 1, 0, 'I' }, ++#ifdef __IPV6__ ++ { "ipv4", 0, 0, '4' }, ++ { "ipv6", 0, 0, '6' }, ++#endif + { "timeout", 1, 0, 't' }, + { "traps", 1, 0, 'T' }, + { "auth", 0, 0, 'a' }, +@@ -396,6 +408,14 @@ int main(int argc, char *argv[]) + case 'v': + g_verbose = 1; + break; ++#ifdef __IPV6__ ++ case '4': ++ g_family = AF_INET; ++ break; ++ case '6': ++ g_family = AF_INET6; ++ break; ++#endif + case 'l': + print_version(); + exit(EXIT_ARGS); +@@ -435,12 +455,12 @@ int main(int argc, char *argv[]) + #endif + + /* Open the server's UDP port and prepare it for listening */ +- g_udp_sockfd = socket(my_pf_inet, SOCK_DGRAM, 0); ++ g_udp_sockfd = socket((g_family == AF_INET) ? PF_INET : PF_INET6, SOCK_DGRAM, 0); + if (g_udp_sockfd == -1) { + lprintf(LOG_ERR, "could not create UDP socket: %m\n"); + exit(EXIT_SYSCALL); + } +- sockaddr.my_sin_family = my_af_inet; ++ sockaddr.my_sin_family = g_family; + sockaddr.my_sin_port = htons(g_udp_port); + sockaddr.my_sin_addr = my_inaddr_any; + socklen = sizeof (sockaddr); +@@ -457,7 +477,7 @@ int main(int argc, char *argv[]) + } + + /* Open the server's TCP port and prepare it for listening */ +- g_tcp_sockfd = socket(my_pf_inet, SOCK_STREAM, 0); ++ g_tcp_sockfd = socket((g_family == AF_INET) ? PF_INET : PF_INET6, SOCK_STREAM, 0); + if (g_tcp_sockfd == -1) { + lprintf(LOG_ERR, "could not create TCP socket: %m\n"); + exit(EXIT_SYSCALL); +@@ -474,7 +494,7 @@ int main(int argc, char *argv[]) + lprintf(LOG_WARNING, "could not set SO_REUSEADDR on TCP socket: %m\n"); + exit(EXIT_SYSCALL); + } +- sockaddr.my_sin_family = my_af_inet; ++ sockaddr.my_sin_family = g_family; + sockaddr.my_sin_port = htons(g_tcp_port); + sockaddr.my_sin_addr = my_inaddr_any; + socklen = sizeof (sockaddr); +--- a/mini_snmpd.h ++++ b/mini_snmpd.h +@@ -255,6 +255,7 @@ typedef struct demoinfo_s { + + extern in_port_t g_udp_port; + extern in_port_t g_tcp_port; ++extern int g_family; + extern int g_timeout; + extern int g_auth; + extern int g_verbose; diff --git a/net/mini_snmpd/patches/103-mib_encode_snmp_element_oid_fix.patch b/net/mini_snmpd/patches/103-mib_encode_snmp_element_oid_fix.patch index a46ace24e..be4361c85 100644 --- a/net/mini_snmpd/patches/103-mib_encode_snmp_element_oid_fix.patch +++ b/net/mini_snmpd/patches/103-mib_encode_snmp_element_oid_fix.patch @@ -10,7 +10,7 @@ buffer = value->data.buffer; length = 1; for (i = 2; i < oid_value->subid_list_length; i++) { -@@ -293,6 +296,8 @@ static int mib_build_entry(const oid_t * +@@ -307,6 +310,8 @@ static int mib_build_entry(const oid_t * value->data.encoded_length = 0; value->data.buffer = malloc(value->data.max_length); if (encode_snmp_element_oid(value, oid_aton((const char *)default_value)) == -1) {