mini_snmpd: import 1.2b from oldpackages for reference http://git.openwrt.org/?p...
authorLuke McKee <hojuruku@gmail.com>
Sat, 9 Jul 2016 13:36:28 +0000 (20:36 +0700)
committerLuke McKee <hojuruku@gmail.com>
Mon, 11 Jul 2016 12:49:41 +0000 (19:49 +0700)
Signed-off-by: Luke McKee <hojuruku@gmail.com>
net/mini_snmpd/Makefile [new file with mode: 0644]
net/mini_snmpd/files/mini_snmpd.config [new file with mode: 0644]
net/mini_snmpd/files/mini_snmpd.init [new file with mode: 0644]
net/mini_snmpd/files/mini_snmpd.init-v2 [new file with mode: 0644]
net/mini_snmpd/files/mini_snmpd.init.orig [new file with mode: 0644]
net/mini_snmpd/patches/100-dualstack.patch [new file with mode: 0644]
net/mini_snmpd/patches/101-opt_flags.patch [new file with mode: 0644]
net/mini_snmpd/patches/102-mib_fix_uninitialized_memory.patch [new file with mode: 0644]
net/mini_snmpd/patches/103-mib_encode_snmp_element_oid_fix.patch [new file with mode: 0644]
net/mini_snmpd/patches/104-memset_fix.patch [new file with mode: 0644]

diff --git a/net/mini_snmpd/Makefile b/net/mini_snmpd/Makefile
new file mode 100644 (file)
index 0000000..e4a77b5
--- /dev/null
@@ -0,0 +1,61 @@
+#
+# Copyright (C) 2009-2014 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=mini_snmpd
+PKG_VERSION:=1.2b
+PKG_RELEASE:=8
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=http://members.aon.at/linuxfreak/linux/
+PKG_MD5SUM:=9e432c50ba8216d7fab0983b11b7112a
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
+PKG_BUILD_PARALLEL:=1
+PKG_INSTALL:=1
+
+include $(INCLUDE_DIR)/package.mk
+
+define Package/mini-snmpd
+  SECTION:=net
+  CATEGORY:=Network
+  TITLE:=SNMP server for embedded systems
+  URL:=http://members.aon.at/linuxfreak/linux/mini_snmpd.html
+endef
+
+ifneq ($(CONFIG_IPV6),)
+  TARGET_CFLAGS+= -D__IPV6__
+else
+  TARGET_CFLAGS+= -D__IPV4__
+endif
+
+TARGET_CFLAGS+= -DSYSLOG
+
+MAKE_FLAGS+= \
+       OFLAGS="$(TARGET_CFLAGS)" \
+       STRIP="/bin/true" \
+       INSTALL_ROOT="$(PKG_INSTALL_DIR)"
+
+define Build/Compile
+       $(call Build/Compile/Default,mini_snmpd)
+endef
+
+define Package/mini-snmpd/install
+       $(INSTALL_DIR) $(1)/usr/bin
+       $(CP) $(PKG_INSTALL_DIR)/sbin/mini_snmpd $(1)/usr/bin/
+       $(INSTALL_DIR) $(1)/etc/config
+       $(INSTALL_CONF) ./files/mini_snmpd.config $(1)/etc/config/mini_snmpd
+       $(INSTALL_DIR) $(1)/etc/init.d
+       $(INSTALL_BIN) ./files/mini_snmpd.init $(1)/etc/init.d/mini_snmpd
+endef
+
+define Package/mini-snmpd/conffiles
+/etc/config/mini_snmpd
+endef
+
+$(eval $(call BuildPackage,mini-snmpd))
diff --git a/net/mini_snmpd/files/mini_snmpd.config b/net/mini_snmpd/files/mini_snmpd.config
new file mode 100644 (file)
index 0000000..e41bdc9
--- /dev/null
@@ -0,0 +1,16 @@
+config mini_snmpd
+       option enabled 0
+       option ipv6 0
+       option community 'public'
+       option contact ''
+       option location ''
+
+       # enable basic disk usage statistics on specified mountpoint
+       list disks '/jffs'
+       list disks '/tmp'
+
+       # enable basic network statistics on specified interface
+       # 4 interfaces maximum, as named in /etc/config/network
+       list interfaces 'loopback'
+       list interfaces 'lan'
+       list interfaces 'wan'
diff --git a/net/mini_snmpd/files/mini_snmpd.init b/net/mini_snmpd/files/mini_snmpd.init
new file mode 100644 (file)
index 0000000..20e2c62
--- /dev/null
@@ -0,0 +1,65 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2009-2012 OpenWrt.org
+
+START=50
+
+SERVICE_DAEMONIZE=1
+SERVICE_WRITE_PID=1
+
+append_disk() {
+       local disk="$1"
+       append disks "$disk" ','
+}
+
+append_interface() {
+       local name="$1"
+       local device
+       network_get_device device "$name"
+       append interfaces "${device:-$name}" ','
+}
+
+append_string() {
+       local section="$1"
+       local option="$2"
+       local value="$3"
+       local _val
+       config_get _val "$section" "$option"
+       [ -n "$_val" ] && append args "$3 $_val"
+}
+
+start_instance() {
+       local cfg="$1"
+       local args=""
+       local disks=""
+       local interfaces=""
+       local ipv6
+
+       append_string "$cfg" community "-c"
+       append_string "$cfg" location "-L"
+       append_string "$cfg" contact "-C"
+
+       config_get_bool ipv6 "$cfg" "ipv6" '0'
+       [ "$ipv6" -gt 0 ] && append args "-6"
+
+       config_get_bool enabled "$cfg" "enabled" '1'
+       [ "$enabled" -gt 0 ] || return 1
+
+       config_list_foreach "$section" 'disks' append_disk
+       args="${args}${disks:+ -d $disks}"
+
+       config_list_foreach "$section" 'interfaces' append_interface
+       args="${args}${interfaces:+ -i $interfaces}"
+
+       service_start /usr/bin/mini_snmpd $args
+}
+
+start() {
+       . /lib/functions/network.sh
+
+       config_load 'mini_snmpd'
+       config_foreach start_instance 'mini_snmpd'
+}
+
+stop() {
+       service_stop /usr/bin/mini_snmpd
+}
diff --git a/net/mini_snmpd/files/mini_snmpd.init-v2 b/net/mini_snmpd/files/mini_snmpd.init-v2
new file mode 100644 (file)
index 0000000..9b81407
--- /dev/null
@@ -0,0 +1,146 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2009-2016 OpenWrt.org
+
+START=95
+USE_PROCD=1
+PROCD_DEBUG=1
+PROG=/usr/bin/mini_snmpd
+NAME=mini_snmpd
+
+# mini_snmpd now starts later in the game. Expects filesystems monitored to be already mounted, 
+# and at least configuration entry for network physical interface defined in /etc/config/network
+# It handles network interfaces not yet present (e.g. ppp) but will statfs() the root/wrong filesystem if device not mounted
+
+append_disk() {
+       local disk="$1"
+       [ -z $disk_count ] && disk_count=1
+       if grep -qF "$disk" /proc/mounts ; then
+               if [ $disk_count -le 4 ] ;  then  
+                       append disks "$disk" ','
+                       disk_count=$((disk_count++))
+               else
+                       logger -s -t mini_snmpd -p daemon.error "more than 4 mountpoints defined in uci. Disc $disk ignored."
+               fi
+       else
+               logger -s -t mini_snmpd -p daemon.error "mountpoint $disk for snmp monitoring not mounted, ignoring."
+       fi
+}
+
+append_interface() {
+       local name="$1"
+       local device
+       [ $(ubus -S call network.interface dump | jsonfilter -e "@.interface[@.interface=\"$name\"].device") ] && { 
+               append interfaces "${device:-$name}" ','
+       }
+}
+
+append_arg() {
+        local cfg="$1"
+        local var="$2"
+        local opt="$3"
+        local def="$4"
+        local val
+        config_get val "$cfg" "$var"
+        [ -n "$val" -o -n "$def" ] && procd_append_param command $opt "${val:-$def}"
+}
+
+listen_interface_status() {
+       local cfg="$1"
+}
+
+watch_interfaces() {
+       local cfg="$1"
+       local enabled listen_interface
+       config_get_bool enabled "$cfg" "enabled" '1'
+       [ "$enabled" -gt 0 ] || return 0
+       config_get listen_interface "$cfg" listen_interface
+       [ "$listen_interface" = "all" ] && return 0
+       local listen_interface_up=$(ubus -S call network.interface dump | jsonfilter -e "@.interface[@.interface=\"$listen_interface\"].up")
+       # if ubus knows about it regardless if it's status we'll watch for changes.
+       [ -n "$listen_interface" -a -n "$listen_interface_up" ] && trigger_interfaces=" ${listen_interface} ${trigger_interfaces}"
+}
+
+service_triggers() {
+        #procd_add_reload_trigger mini_snmpd
+        procd_open_trigger
+        procd_add_config_trigger "config.change" "mini_snmpd" /etc/init.d/mini_snmpd reload
+        config_load 'mini_snmpd'
+        config_foreach watch_interfaces 'mini_snmpd' 
+        [ -n "${trigger_interfaces}" ] & {
+                for n in $trigger_interfaces ; do
+                       procd_add_interface_trigger "interface.*" $n /etc/init.d/mini_snmpd restart
+                done
+        }
+        procd_close_trigger
+        #procd_add_validation validate_section_mini_snmpd
+}
+
+
+start_instance() {
+       local cfg="$1" disks="" interfaces=""
+       local ipv6 debug auth
+
+       config_get_bool enabled "$cfg" "enabled" '1'
+       [ "$enabled" -gt 0 ] || return 1 
+
+       local listen_interface listen_interface_json listen_interface_ip listen_interface_device listen_interface_up
+       config_get_bool ipv6 "$cfg" "ipv6" '0'
+       config_get listen_interface "$cfg" listen_interface
+       [ -n "$listen_interface" -a "$listen_interface" != "all" ] && {
+               listen_interface_json=$(ubus -S call network.interface.$listen_interface status)
+               [ -z "$listen_interface_json" ] && { 
+                       logger -s -t mini_snmpd -p daemon.error "interface configured to bind to is not configured in /etc/config/network"
+                       return 1
+               }
+               listen_interface_up=$(jsonfilter -s "$listen_interface_json" -e '@.up')
+               if [ "$ipv6" -gt 0 ]; then
+                       listen_interface_ip=$(jsonfilter -s "$listen_interface_json" -e "@['ipv6-address'][0].address")
+               else
+                       listen_interface_ip=$(jsonfilter -s "$listen_interface_json" -e "@['ipv4-address'][0].address")
+               fi
+               [ -n "$listen_interface_ip" -a "$listen_interface_up" = 'true' ] || {
+                       logger -s -t mini_snmpd -p daemon.debug "interface configured to bind to is not up yet, procd will try again later"
+                       return 0
+               }
+               listen_interface_device=$(jsonfilter -s "$listen_interface_json" -e '@.l3_device')
+       }
+
+       procd_open_instance
+
+       procd_set_param command "$PROG" -n
+       procd_set_param stdout "1"
+       procd_set_param stderr "1"
+       procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}
+
+       append_arg "$cfg" community "-c"
+       append_arg "$cfg" location "-L"
+       append_arg "$cfg" contact "-C"
+       append_arg "$cfg" udp_port "-p"
+       append_arg "$cfg" tcp_port "-P"
+       append_arg "$cfg" vendor_oid "-V"
+       append_arg "$cfg" mib_timeout "-t"
+
+       [ "$ipv6" -gt 0 ] && procd_append_param command "-6"
+       config_get_bool debug "$cfg" "debug" '0'
+       [ "$debug" -gt 0 ] && procd_append_param command "-v"
+       config_get_bool auth "$cfg" "auth" '0'
+       [ "$auth" -gt 0 ] && procd_append_param command "-a"
+       config_list_foreach "$cfg" 'disks' append_disk
+       [ -n "$disks" ] && procd_append_param command "-d $disks" 
+       config_list_foreach "$cfg" 'interfaces' append_interface
+       [ -n "$interfaces" ] && procd_append_param command "-i $interfaces"
+       # https://github.com/troglobit/mini-snmpd/issues/4 - yes I know there is no space after the -I
+       [ -n "$listen_interface_device" ] && procd_append_param command "-I$listen_interface_device"
+
+       procd_close_instance
+}
+
+start_service() {
+       config_load 'mini_snmpd'
+       config_foreach start_instance 'mini_snmpd'
+}
+
+reload_service() {
+       stop
+        start
+}
diff --git a/net/mini_snmpd/files/mini_snmpd.init.orig b/net/mini_snmpd/files/mini_snmpd.init.orig
new file mode 100644 (file)
index 0000000..20e2c62
--- /dev/null
@@ -0,0 +1,65 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2009-2012 OpenWrt.org
+
+START=50
+
+SERVICE_DAEMONIZE=1
+SERVICE_WRITE_PID=1
+
+append_disk() {
+       local disk="$1"
+       append disks "$disk" ','
+}
+
+append_interface() {
+       local name="$1"
+       local device
+       network_get_device device "$name"
+       append interfaces "${device:-$name}" ','
+}
+
+append_string() {
+       local section="$1"
+       local option="$2"
+       local value="$3"
+       local _val
+       config_get _val "$section" "$option"
+       [ -n "$_val" ] && append args "$3 $_val"
+}
+
+start_instance() {
+       local cfg="$1"
+       local args=""
+       local disks=""
+       local interfaces=""
+       local ipv6
+
+       append_string "$cfg" community "-c"
+       append_string "$cfg" location "-L"
+       append_string "$cfg" contact "-C"
+
+       config_get_bool ipv6 "$cfg" "ipv6" '0'
+       [ "$ipv6" -gt 0 ] && append args "-6"
+
+       config_get_bool enabled "$cfg" "enabled" '1'
+       [ "$enabled" -gt 0 ] || return 1
+
+       config_list_foreach "$section" 'disks' append_disk
+       args="${args}${disks:+ -d $disks}"
+
+       config_list_foreach "$section" 'interfaces' append_interface
+       args="${args}${interfaces:+ -i $interfaces}"
+
+       service_start /usr/bin/mini_snmpd $args
+}
+
+start() {
+       . /lib/functions/network.sh
+
+       config_load 'mini_snmpd'
+       config_foreach start_instance 'mini_snmpd'
+}
+
+stop() {
+       service_stop /usr/bin/mini_snmpd
+}
diff --git a/net/mini_snmpd/patches/100-dualstack.patch b/net/mini_snmpd/patches/100-dualstack.patch
new file mode 100644 (file)
index 0000000..08aa4a0
--- /dev/null
@@ -0,0 +1,218 @@
+--- a/globals.c
++++ b/globals.c
+@@ -27,9 +27,9 @@
+  * Global variables
+  */
+-#ifdef __IPV4__
+ 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;
+--- 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' },
+@@ -327,7 +339,12 @@ int main(int argc, char *argv[])
+       int option_index = 1;
+       int c;
+-      struct my_sockaddr_t sockaddr;
++      union {
++              struct sockaddr_in sa;
++#ifdef __IPV6__
++              struct sockaddr_in6 sa6;
++#endif
++      } sockaddr;
+       my_socklen_t socklen;
+       struct timeval tv_last;
+       struct timeval tv_now;
+@@ -396,6 +413,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,15 +460,24 @@ 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_port = htons(g_udp_port);
+-      sockaddr.my_sin_addr = my_inaddr_any;
+-      socklen = sizeof (sockaddr);
++      if (g_family == AF_INET) {
++              sockaddr.sa.sin_family = g_family;
++              sockaddr.sa.sin_port = htons(g_udp_port);
++              sockaddr.sa.sin_addr = inaddr_any;
++              socklen = sizeof(sockaddr.sa);
++#ifdef __IPV6__
++      } else {
++              sockaddr.sa6.sin6_family = g_family;
++              sockaddr.sa6.sin6_port = htons(g_udp_port);
++              sockaddr.sa6.sin6_addr = in6addr_any;
++              socklen = sizeof(sockaddr.sa6);
++#endif
++      }
+       if (bind(g_udp_sockfd, (struct sockaddr *)&sockaddr, socklen) == -1) {
+               lprintf(LOG_ERR, "could not bind UDP socket to port %d: %m\n", g_udp_port);
+               exit(EXIT_SYSCALL);
+@@ -457,7 +491,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,10 +508,19 @@ 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_port = htons(g_tcp_port);
+-      sockaddr.my_sin_addr = my_inaddr_any;
+-      socklen = sizeof (sockaddr);
++      if (g_family == AF_INET) {
++              sockaddr.sa.sin_family = g_family;
++              sockaddr.sa.sin_port = htons(g_udp_port);
++              sockaddr.sa.sin_addr = inaddr_any;
++              socklen = sizeof(sockaddr.sa);
++#ifdef __IPV6__
++      } else {
++              sockaddr.sa6.sin6_family = g_family;
++              sockaddr.sa6.sin6_port = htons(g_udp_port);
++              sockaddr.sa6.sin6_addr = in6addr_any;
++              socklen = sizeof(sockaddr.sa6);
++#endif
++      }
+       if (bind(g_tcp_sockfd, (struct sockaddr *)&sockaddr, socklen) == -1) {
+               lprintf(LOG_ERR, "could not bind TCP socket to port %d: %m\n", g_tcp_port);
+               exit(EXIT_SYSCALL);
+--- 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;
+@@ -265,9 +266,9 @@ extern char *g_vendor;
+ extern char *g_location;
+ extern char *g_contact;
+ extern char *g_bind_to_device;
+-#ifdef __IPV4__
++
+ extern const struct in_addr inaddr_any;
+-#endif
++
+ extern char *g_disk_list[MAX_NR_DISKS];
+ extern int g_disk_list_length;
diff --git a/net/mini_snmpd/patches/101-opt_flags.patch b/net/mini_snmpd/patches/101-opt_flags.patch
new file mode 100644 (file)
index 0000000..70dbce5
--- /dev/null
@@ -0,0 +1,14 @@
+--- a/Makefile
++++ b/Makefile
+@@ -32,9 +32,9 @@ HEADERS      = mini_snmpd.h
+ SOURCES       = mini_snmpd.c protocol.c mib.c globals.c utils.c linux.c freebsd.c
+ VERSION = 1.2b
+ VENDOR        = .1.3.6.1.4.1
+-OFLAGS        = -O2 -DDEBUG -g
++OFLAGS        = -O2
+ CFLAGS        = -Wall -Werror -DVERSION="\"$(VERSION)\"" -DVENDOR="\"$(VENDOR)\"" \
+-        $(OFLAGS) -D__TRAPS__ -D__LINUX__ -D__IPV6__
++        $(OFLAGS) -D__TRAPS__ -D__LINUX__
+ LDFLAGS       = $(OFLAGS)
+ TARGET        = mini_snmpd
+ MAN   = mini_snmpd.8
diff --git a/net/mini_snmpd/patches/102-mib_fix_uninitialized_memory.patch b/net/mini_snmpd/patches/102-mib_fix_uninitialized_memory.patch
new file mode 100644 (file)
index 0000000..fc8cecf
--- /dev/null
@@ -0,0 +1,34 @@
+--- a/mib.c
++++ b/mib.c
+@@ -290,6 +290,7 @@ static int mib_build_entry(const oid_t *
+                       value->data.max_length = sizeof (int) + 2;
+                       value->data.encoded_length = 0;
+                       value->data.buffer = malloc(value->data.max_length);
++                      memset(value->data.buffer, 0, value->data.max_length);
+                       if (encode_snmp_element_integer(value, (int)default_value) == -1) {
+                               return -1;
+                       }
+@@ -298,6 +299,7 @@ static int mib_build_entry(const oid_t *
+                       value->data.max_length = strlen((const char *)default_value) + 4;
+                       value->data.encoded_length = 0;
+                       value->data.buffer = malloc(value->data.max_length);
++                      memset(value->data.buffer, 0, value->data.max_length);
+                       if (encode_snmp_element_string(value, (const char *)default_value) == -1) {
+                               return -1;
+                       }
+@@ -306,6 +308,7 @@ static int mib_build_entry(const oid_t *
+                       value->data.max_length = MAX_NR_SUBIDS * 5 + 4;
+                       value->data.encoded_length = 0;
+                       value->data.buffer = malloc(value->data.max_length);
++                      memset(value->data.buffer, 0, value->data.max_length);
+                       if (encode_snmp_element_oid(value, oid_aton((const char *)default_value)) == -1) {
+                               return -1;
+                       }
+@@ -316,6 +319,7 @@ static int mib_build_entry(const oid_t *
+                       value->data.max_length = sizeof (unsigned int) + 2;
+                       value->data.encoded_length = 0;
+                       value->data.buffer = malloc(value->data.max_length);
++                      memset(value->data.buffer, 0, value->data.max_length);
+                       if (encode_snmp_element_unsigned(value, type, (unsigned int)default_value) == -1) {
+                               return -1;
+                       }
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
new file mode 100644 (file)
index 0000000..a1f105c
--- /dev/null
@@ -0,0 +1,21 @@
+--- a/mib.c
++++ b/mib.c
+@@ -120,6 +120,9 @@ static int encode_snmp_element_oid(value
+       int length;
+       int i;
++      if (oid_value == NULL) {
++              return -1;
++      }
+       buffer = value->data.buffer;
+       length = 1;
+       for (i = 2; i < oid_value->subid_list_length; i++) {
+@@ -310,6 +313,8 @@ static int mib_build_entry(const oid_t *
+                       value->data.buffer = malloc(value->data.max_length);
+                       memset(value->data.buffer, 0, value->data.max_length);
+                       if (encode_snmp_element_oid(value, oid_aton((const char *)default_value)) == -1) {
++                              lprintf(LOG_ERR, "could not create MIB entry '%s.%d.%d': invalid oid '%s'\n",
++                                      oid_ntoa(prefix), column, row, (char *)default_value);
+                               return -1;
+                       }
+                       break;
diff --git a/net/mini_snmpd/patches/104-memset_fix.patch b/net/mini_snmpd/patches/104-memset_fix.patch
new file mode 100644 (file)
index 0000000..0ed2a2e
--- /dev/null
@@ -0,0 +1,11 @@
+--- a/mini_snmpd.c
++++ b/mini_snmpd.c
+@@ -443,7 +443,7 @@ int main(int argc, char *argv[])
+       /* Store the starting time since we need it for MIB updates */
+       if (gettimeofday(&tv_last, NULL) == -1) {
+               memset(&tv_last, 0, sizeof (tv_last));
+-              memset(&tv_sleep, 0, sizeof (&tv_sleep));
++              memset(&tv_sleep, 0, sizeof (tv_sleep));
+       } else {
+               tv_sleep.tv_sec = g_timeout / 100;
+               tv_sleep.tv_usec = (g_timeout % 100) * 10000;