fix mini_snmpd on ipv4. Create a separate mini_snmpd_ipv6 package (closes #6578 ...
authoracoul <acoul@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Thu, 15 Apr 2010 21:11:06 +0000 (21:11 +0000)
committeracoul <acoul@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Thu, 15 Apr 2010 21:11:06 +0000 (21:11 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/packages@20889 3c298f89-4303-0410-b956-a3cf2f4a3e73

net/mini_snmpd/patches/104-ipv6-support.patch [deleted file]
net/mini_snmpd_ipv6/Makefile [new file with mode: 0644]
net/mini_snmpd_ipv6/files/mini_snmpd.config [new file with mode: 0644]
net/mini_snmpd_ipv6/files/mini_snmpd.init [new file with mode: 0644]
net/mini_snmpd_ipv6/patches/101-opt_flags.patch [new file with mode: 0644]
net/mini_snmpd_ipv6/patches/102-compile_fix.patch [new file with mode: 0644]
net/mini_snmpd_ipv6/patches/103-mib_encode_snmp_element_oid_fix.patch [new file with mode: 0644]
net/mini_snmpd_ipv6/patches/104-ipv6-support.patch [new file with mode: 0644]

diff --git a/net/mini_snmpd/patches/104-ipv6-support.patch b/net/mini_snmpd/patches/104-ipv6-support.patch
deleted file mode 100644 (file)
index 5dc5622..0000000
+++ /dev/null
@@ -1,285 +0,0 @@
---- a/mini_snmpd.c
-+++ b/mini_snmpd.c
-@@ -90,9 +90,10 @@
- static void handle_udp_client(void)
- {
--      struct sockaddr_in sockaddr;
-+      struct sockaddr_in6 sockaddr;
-       socklen_t socklen;
-       int rv;
-+      char straddr[INET6_ADDRSTRLEN];
-       /* Read the whole UDP packet from the socket at once */
-       socklen = sizeof (sockaddr);
-@@ -105,8 +106,8 @@
-       }
-       g_udp_client.timestamp = time(NULL);
-       g_udp_client.sockfd = g_udp_sockfd;
--      g_udp_client.addr = sockaddr.sin_addr.s_addr;
--      g_udp_client.port = sockaddr.sin_port;
-+      g_udp_client.addr = sockaddr.sin6_addr;
-+      g_udp_client.port = sockaddr.sin6_port;
-       g_udp_client.size = rv;
-       g_udp_client.outgoing = 0;
- #ifdef DEBUG
-@@ -114,13 +115,14 @@
- #endif
-       /* Call the protocol handler which will prepare the response packet */
-+      inet_ntop(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
-       if (snmp(&g_udp_client) == -1) {
-               lprintf(LOG_WARNING, "could not handle packet from UDP client %s:%d: %m\n",
--                      inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
-+                      straddr, sockaddr.sin6_port);
-               return;
-       } else if (g_udp_client.size == 0) {
-               lprintf(LOG_WARNING, "could not handle packet from UDP client %s:%d: ignored\n",
--                      inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
-+                      straddr, sockaddr.sin6_port);
-               return;
-       }
-       g_udp_client.outgoing = 1;
-@@ -128,13 +130,14 @@
-       /* 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(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
-       if (rv == -1) {
-               lprintf(LOG_WARNING, "could not send packet to UDP client %s:%d: %m\n",
--                      inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
-+                      straddr, sockaddr.sin6_port);
-       } else if (rv != g_udp_client.size) {
-               lprintf(LOG_WARNING, "could not send packet to UDP client %s:%d: "
--                      "only %d of %d bytes written\n", inet_ntoa(sockaddr.sin_addr),
--                      sockaddr.sin_port, rv, (int) g_udp_client.size);
-+                      "only %d of %d bytes written\n", straddr,
-+                      sockaddr.sin6_port, rv, (int) g_udp_client.size);
-       }
- #ifdef DEBUG
-       dump_packet(&g_udp_client);
-@@ -143,11 +146,12 @@
- static void handle_tcp_connect(void)
- {
--      struct sockaddr_in tmp_sockaddr;
--      struct sockaddr_in sockaddr;
-+      struct sockaddr_in6 tmp_sockaddr;
-+      struct sockaddr_in6 sockaddr;
-       socklen_t socklen;
-       client_t *client;
-       int rv;
-+      char straddr[INET6_ADDRSTRLEN];
-       /* Accept the new connection (remember the client's IP address and port) */
-       socklen = sizeof (sockaddr);
-@@ -168,10 +172,11 @@
-                       lprintf(LOG_ERR, "could not accept TCP connection: internal error");
-                       exit(EXIT_SYSCALL);
-               }
--              tmp_sockaddr.sin_addr.s_addr = client->addr;
--              tmp_sockaddr.sin_port = client->port;
-+              tmp_sockaddr.sin6_addr = client->addr;
-+              tmp_sockaddr.sin6_port = client->port;
-+              inet_ntop(AF_INET6, &tmp_sockaddr.sin6_addr, straddr, sizeof(straddr));
-               lprintf(LOG_WARNING, "maximum number of %d clients reached, kicking out %s:%d\n",
--                      MAX_NR_CLIENTS, inet_ntoa(tmp_sockaddr.sin_addr), tmp_sockaddr.sin_port);
-+                      MAX_NR_CLIENTS, straddr, tmp_sockaddr.sin6_port);
-               close(client->sockfd);
-       } else {
-               client = malloc(sizeof (client_t));
-@@ -183,35 +188,38 @@
-       }
-       /* Now fill out the client control structure values */
-+      inet_ntop(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
-       lprintf(LOG_DEBUG, "connected TCP client %s:%d\n",
--              inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
-+              straddr, sockaddr.sin6_port);
-       client->timestamp = time(NULL);
-       client->sockfd = rv;
--      client->addr = sockaddr.sin_addr.s_addr;
--      client->port = sockaddr.sin_port;
-+      client->addr = sockaddr.sin6_addr;
-+      client->port = sockaddr.sin6_port;
-       client->size = 0;
-       client->outgoing = 0;
- }
- static void handle_tcp_client_write(client_t *client)
- {
--      struct sockaddr_in sockaddr;
-+      struct sockaddr_in6 sockaddr;
-       int rv;
-+      char straddr[INET6_ADDRSTRLEN];
-       /* Send the packet atomically and close socket if that did not work */
--      sockaddr.sin_addr.s_addr = client->addr;
--      sockaddr.sin_port = client->port;
-+      sockaddr.sin6_addr = client->addr;
-+      sockaddr.sin6_port = client->port;
-       rv = send(client->sockfd, client->packet, client->size, 0);
-+      inet_ntop(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
-       if (rv == -1) {
-               lprintf(LOG_WARNING, "could not send packet to TCP client %s:%d: %m\n",
--                      inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
-+                      straddr, sockaddr.sin6_port);
-               close(client->sockfd);
-               client->sockfd = -1;
-               return;
-       } else if (rv != client->size) {
-               lprintf(LOG_WARNING, "could not send packet to TCP client %s:%d: "
--                      "only %d of %d bytes written\n", inet_ntoa(sockaddr.sin_addr),
--                      sockaddr.sin_port, rv, (int) client->size);
-+                      "only %d of %d bytes written\n", straddr,
-+                      sockaddr.sin6_port, rv, (int) client->size);
-               close(client->sockfd);
-               client->sockfd = -1;
-               return;
-@@ -227,23 +235,25 @@
- static void handle_tcp_client_read(client_t *client)
- {
--      struct sockaddr_in sockaddr;
-+      struct sockaddr_in6 sockaddr;
-       int rv;
-+      char straddr[INET6_ADDRSTRLEN];
-       /* Read from the socket what arrived and put it into the buffer */
--      sockaddr.sin_addr.s_addr = client->addr;
--      sockaddr.sin_port = client->port;
-+      sockaddr.sin6_addr = client->addr;
-+      sockaddr.sin6_port = client->port;
-       rv = read(client->sockfd, client->packet + client->size,
-               sizeof (client->packet) - client->size);
-+      inet_ntop(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
-       if (rv == -1) {
-               lprintf(LOG_WARNING, "could not read packet from TCP client %s:%d: %m\n",
--                      inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
-+                      straddr, sockaddr.sin6_port);
-               close(client->sockfd);
-               client->sockfd = -1;
-               return;
-       } else if (rv == 0) {
-               lprintf(LOG_DEBUG, "disconnected TCP client %s:%d\n",
--                      inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
-+                      straddr, sockaddr.sin6_port);
-               close(client->sockfd);
-               client->sockfd = -1;
-               return;
-@@ -255,7 +265,7 @@
-       rv = snmp_packet_complete(client);
-       if (rv == -1) {
-               lprintf(LOG_WARNING, "could not handle packet from TCP client %s:%d: %m\n",
--                      inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
-+                      straddr, sockaddr.sin6_port);
-               close(client->sockfd);
-               client->sockfd = -1;
-               return;
-@@ -270,13 +280,13 @@
-       /* Call the protocol handler which will prepare the response packet */
-       if (snmp(client) == -1) {
-               lprintf(LOG_WARNING, "could not handle packet from TCP client %s:%d: %m\n",
--                      inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
-+                      straddr, sockaddr.sin6_port);
-               close(client->sockfd);
-               client->sockfd = -1;
-               return;
-       } else if (client->size == 0) {
-               lprintf(LOG_WARNING, "could not handle packet from TCP client %s:%d: ignored\n",
--                      inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
-+                      straddr, sockaddr.sin6_port);
-               close(client->sockfd);
-               client->sockfd = -1;
-               return;
-@@ -313,7 +323,7 @@
-       int option_index = 1;
-       int c;
--      struct sockaddr_in sockaddr;
-+      struct sockaddr_in6 sockaddr;
-       socklen_t socklen;
-       fd_set rfds;
-       fd_set wfds;
-@@ -399,14 +409,14 @@
- #endif
-       /* Open the server's UDP port and prepare it for listening */
--      g_udp_sockfd = socket(PF_INET, SOCK_DGRAM, 0);
-+      g_udp_sockfd = socket(PF_INET6, SOCK_DGRAM, 0);
-       if (g_udp_sockfd == -1) {
-               lprintf(LOG_ERR, "could not create UDP socket: %m\n");
-               exit(EXIT_SYSCALL);
-       }
--      sockaddr.sin_family = AF_INET;
--      sockaddr.sin_port = htons(g_udp_port);
--      sockaddr.sin_addr.s_addr = INADDR_ANY;
-+      sockaddr.sin6_family = AF_INET6;
-+      sockaddr.sin6_port = htons(g_udp_port);
-+      sockaddr.sin6_addr = in6addr_any;
-       socklen = sizeof (sockaddr);
-       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);
-@@ -414,7 +424,7 @@
-       }
-       /* Open the server's TCP port and prepare it for listening */
--      g_tcp_sockfd = socket(PF_INET, SOCK_STREAM, 0);
-+      g_tcp_sockfd = socket(PF_INET6, SOCK_STREAM, 0);
-       if (g_tcp_sockfd == -1) {
-               lprintf(LOG_ERR, "could not create TCP socket: %m\n");
-               exit(EXIT_SYSCALL);
-@@ -424,9 +434,9 @@
-               lprintf(LOG_WARNING, "could not set SO_REUSEADDR on TCP socket: %m\n");
-               exit(EXIT_SYSCALL);
-       }
--      sockaddr.sin_family = AF_INET;
--      sockaddr.sin_port = htons(g_tcp_port);
--      sockaddr.sin_addr.s_addr = INADDR_ANY;
-+      sockaddr.sin6_family = AF_INET6;
-+      sockaddr.sin6_port = htons(g_tcp_port);
-+      sockaddr.sin6_addr = in6addr_any;
-       socklen = sizeof (sockaddr);
-       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);
---- a/mini_snmpd.h
-+++ b/mini_snmpd.h
-@@ -129,7 +129,7 @@
- typedef struct client_s {
-       time_t timestamp;
-       int sockfd;
--      in_addr_t addr;
-+      struct in6_addr addr;
-       in_port_t port;
-       unsigned char packet[MAX_PACKET_SIZE];
-       size_t size;
---- a/utils.c
-+++ b/utils.c
-@@ -91,12 +91,13 @@
- void dump_packet(const client_t *client)
- {
--      struct in_addr client_addr;
-+      struct in6_addr client_addr;
-+      char straddr[INET6_ADDRSTRLEN];
-       char buffer[BUFSIZ];
-       int len;
-       int i;
--      client_addr.s_addr = client->addr;
-+      client_addr = client->addr;
-       len = 0;
-       for (i = 0; i < client->size; i++) {
-               len += snprintf(buffer + len, sizeof (buffer) - len,
-@@ -105,9 +106,10 @@
-                       break;
-               }
-       }
-+      inet_ntop(AF_INET6, &client_addr, straddr, sizeof(straddr));
-       lprintf(LOG_DEBUG, "%s %u bytes %s %s:%d (%s)\n",
-               client->outgoing ? "transmitted" : "received", (int) client->size,
--              client->outgoing ? "to" : "from", inet_ntoa(client_addr),
-+              client->outgoing ? "to" : "from", straddr,
-               ntohs(client->port), buffer);
- }
diff --git a/net/mini_snmpd_ipv6/Makefile b/net/mini_snmpd_ipv6/Makefile
new file mode 100644 (file)
index 0000000..972433a
--- /dev/null
@@ -0,0 +1,48 @@
+#
+# Copyright (C) 2009 OpenWrt.orgv
+#
+# 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.0
+PKG_RELEASE:=5
+
+PKG_SOURCE:=mini_snmpd.tar.gz
+PKG_SOURCE_URL:=http://members.aon.at/linuxfreak/linux/
+PKG_MD5SUM:=13f2202ff01ff6b6463989f34f453063
+
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
+
+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
+
+
+define Build/Compile
+       $(MAKE) -C $(PKG_BUILD_DIR) \
+               CC="$(TARGET_CC)" \
+               OFLAGS="$(TARGET_CFLAGS) -DSYSLOG" \
+               STRIP="/bin/true" \
+               INSTALL_ROOT="$(PKG_INSTALL_DIR)" \
+               mini_snmpd install
+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
+
+$(eval $(call BuildPackage,mini-snmpd))
diff --git a/net/mini_snmpd_ipv6/files/mini_snmpd.config b/net/mini_snmpd_ipv6/files/mini_snmpd.config
new file mode 100644 (file)
index 0000000..352ac28
--- /dev/null
@@ -0,0 +1,7 @@
+config mini_snmpd
+       option enabled 1
+       option community public
+       option location ''
+       option contact ''
+       option disks '/tmp,/jffs'
+       option interfaces 'lo,br-lan,eth0.1,eth1' # Max 4
diff --git a/net/mini_snmpd_ipv6/files/mini_snmpd.init b/net/mini_snmpd_ipv6/files/mini_snmpd.init
new file mode 100644 (file)
index 0000000..5d7cb76
--- /dev/null
@@ -0,0 +1,38 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2009 OpenWrt.org
+
+NAME=mini_snmpd
+PROG=/usr/bin/$NAME
+START=50
+
+append_string() {
+       local section="$1"
+       local option="$2"
+       local value="$3"
+       local _val
+       config_get _val "$section" "$option"
+       [ -n "$_val" ] && append args "$3 $_val"
+}
+
+mini_snmpd_config() {
+       local cfg="$1"
+       args=""
+
+       append_string "$cfg" community "-c"
+       append_string "$cfg" location "-L"
+       append_string "$cfg" contact "-C"
+       append_string "$cfg" disks "-d"
+       append_string "$cfg" interfaces "-i"
+       
+       config_get_bool enabled "$cfg" "enabled" '1'c
+       [ "$enabled" -gt 0 ] && $PROG $args &
+}
+
+start() {
+       config_load mini_snmpd
+       config_foreach mini_snmpd_config mini_snmpd
+}
+
+stop() {
+       killall mini_snmpd
+}
diff --git a/net/mini_snmpd_ipv6/patches/101-opt_flags.patch b/net/mini_snmpd_ipv6/patches/101-opt_flags.patch
new file mode 100644 (file)
index 0000000..b34852f
--- /dev/null
@@ -0,0 +1,13 @@
+--- a/Makefile
++++ b/Makefile
+@@ -30,8 +30,9 @@ HEADERS      = mini_snmpd.h
+ SOURCES       = mini_snmpd.c protocol.c mib.c globals.c utils.c linux.c freebsd.c
+ VERSION = 1.0
+ VENDOR        = .1.3.6.1.4.1
++OFLAGS        = -O2 -DDEBUG
+ CFLAGS        = -Wall -Werror -DVERSION="\"$(VERSION)\"" -DVENDOR="\"$(VENDOR)\"" \
+-        -O2 -DDEBUG -D__LINUX__ -D__DEMO__
++        $(OFLAGS) -D__LINUX__ -D__DEMO__
+ TARGET        = mini_snmpd
+ MAN   = mini_snmpd.8
+ DOC   = CHANGELOG COPYING README TODO
diff --git a/net/mini_snmpd_ipv6/patches/102-compile_fix.patch b/net/mini_snmpd_ipv6/patches/102-compile_fix.patch
new file mode 100644 (file)
index 0000000..f6ece3e
--- /dev/null
@@ -0,0 +1,31 @@
+--- a/mini_snmpd.c
++++ b/mini_snmpd.c
+@@ -134,7 +134,7 @@
+       } else if (rv != g_udp_client.size) {
+               lprintf(LOG_WARNING, "could not send packet to UDP client %s:%d: "
+                       "only %d of %d bytes written\n", inet_ntoa(sockaddr.sin_addr),
+-                      sockaddr.sin_port, rv, g_udp_client.size);
++                      sockaddr.sin_port, rv, (int) g_udp_client.size);
+       }
+ #ifdef DEBUG
+       dump_packet(&g_udp_client);
+@@ -211,7 +211,7 @@
+       } else if (rv != client->size) {
+               lprintf(LOG_WARNING, "could not send packet to TCP client %s:%d: "
+                       "only %d of %d bytes written\n", inet_ntoa(sockaddr.sin_addr),
+-                      sockaddr.sin_port, rv, client->size);
++                      sockaddr.sin_port, rv, (int) client->size);
+               close(client->sockfd);
+               client->sockfd = -1;
+               return;
+--- a/utils.c
++++ b/utils.c
+@@ -106,7 +106,7 @@
+               }
+       }
+       lprintf(LOG_DEBUG, "%s %u bytes %s %s:%d (%s)\n",
+-              client->outgoing ? "transmitted" : "received", client->size,
++              client->outgoing ? "transmitted" : "received", (int) client->size,
+               client->outgoing ? "to" : "from", inet_ntoa(client_addr),
+               ntohs(client->port), buffer);
+ }
diff --git a/net/mini_snmpd_ipv6/patches/103-mib_encode_snmp_element_oid_fix.patch b/net/mini_snmpd_ipv6/patches/103-mib_encode_snmp_element_oid_fix.patch
new file mode 100644 (file)
index 0000000..a46ace2
--- /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++) {
+@@ -293,6 +296,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) {
++                              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_ipv6/patches/104-ipv6-support.patch b/net/mini_snmpd_ipv6/patches/104-ipv6-support.patch
new file mode 100644 (file)
index 0000000..5dc5622
--- /dev/null
@@ -0,0 +1,285 @@
+--- a/mini_snmpd.c
++++ b/mini_snmpd.c
+@@ -90,9 +90,10 @@
+ static void handle_udp_client(void)
+ {
+-      struct sockaddr_in sockaddr;
++      struct sockaddr_in6 sockaddr;
+       socklen_t socklen;
+       int rv;
++      char straddr[INET6_ADDRSTRLEN];
+       /* Read the whole UDP packet from the socket at once */
+       socklen = sizeof (sockaddr);
+@@ -105,8 +106,8 @@
+       }
+       g_udp_client.timestamp = time(NULL);
+       g_udp_client.sockfd = g_udp_sockfd;
+-      g_udp_client.addr = sockaddr.sin_addr.s_addr;
+-      g_udp_client.port = sockaddr.sin_port;
++      g_udp_client.addr = sockaddr.sin6_addr;
++      g_udp_client.port = sockaddr.sin6_port;
+       g_udp_client.size = rv;
+       g_udp_client.outgoing = 0;
+ #ifdef DEBUG
+@@ -114,13 +115,14 @@
+ #endif
+       /* Call the protocol handler which will prepare the response packet */
++      inet_ntop(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
+       if (snmp(&g_udp_client) == -1) {
+               lprintf(LOG_WARNING, "could not handle packet from UDP client %s:%d: %m\n",
+-                      inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
++                      straddr, sockaddr.sin6_port);
+               return;
+       } else if (g_udp_client.size == 0) {
+               lprintf(LOG_WARNING, "could not handle packet from UDP client %s:%d: ignored\n",
+-                      inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
++                      straddr, sockaddr.sin6_port);
+               return;
+       }
+       g_udp_client.outgoing = 1;
+@@ -128,13 +130,14 @@
+       /* 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(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
+       if (rv == -1) {
+               lprintf(LOG_WARNING, "could not send packet to UDP client %s:%d: %m\n",
+-                      inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
++                      straddr, sockaddr.sin6_port);
+       } else if (rv != g_udp_client.size) {
+               lprintf(LOG_WARNING, "could not send packet to UDP client %s:%d: "
+-                      "only %d of %d bytes written\n", inet_ntoa(sockaddr.sin_addr),
+-                      sockaddr.sin_port, rv, (int) g_udp_client.size);
++                      "only %d of %d bytes written\n", straddr,
++                      sockaddr.sin6_port, rv, (int) g_udp_client.size);
+       }
+ #ifdef DEBUG
+       dump_packet(&g_udp_client);
+@@ -143,11 +146,12 @@
+ static void handle_tcp_connect(void)
+ {
+-      struct sockaddr_in tmp_sockaddr;
+-      struct sockaddr_in sockaddr;
++      struct sockaddr_in6 tmp_sockaddr;
++      struct sockaddr_in6 sockaddr;
+       socklen_t socklen;
+       client_t *client;
+       int rv;
++      char straddr[INET6_ADDRSTRLEN];
+       /* Accept the new connection (remember the client's IP address and port) */
+       socklen = sizeof (sockaddr);
+@@ -168,10 +172,11 @@
+                       lprintf(LOG_ERR, "could not accept TCP connection: internal error");
+                       exit(EXIT_SYSCALL);
+               }
+-              tmp_sockaddr.sin_addr.s_addr = client->addr;
+-              tmp_sockaddr.sin_port = client->port;
++              tmp_sockaddr.sin6_addr = client->addr;
++              tmp_sockaddr.sin6_port = client->port;
++              inet_ntop(AF_INET6, &tmp_sockaddr.sin6_addr, straddr, sizeof(straddr));
+               lprintf(LOG_WARNING, "maximum number of %d clients reached, kicking out %s:%d\n",
+-                      MAX_NR_CLIENTS, inet_ntoa(tmp_sockaddr.sin_addr), tmp_sockaddr.sin_port);
++                      MAX_NR_CLIENTS, straddr, tmp_sockaddr.sin6_port);
+               close(client->sockfd);
+       } else {
+               client = malloc(sizeof (client_t));
+@@ -183,35 +188,38 @@
+       }
+       /* Now fill out the client control structure values */
++      inet_ntop(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
+       lprintf(LOG_DEBUG, "connected TCP client %s:%d\n",
+-              inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
++              straddr, sockaddr.sin6_port);
+       client->timestamp = time(NULL);
+       client->sockfd = rv;
+-      client->addr = sockaddr.sin_addr.s_addr;
+-      client->port = sockaddr.sin_port;
++      client->addr = sockaddr.sin6_addr;
++      client->port = sockaddr.sin6_port;
+       client->size = 0;
+       client->outgoing = 0;
+ }
+ static void handle_tcp_client_write(client_t *client)
+ {
+-      struct sockaddr_in sockaddr;
++      struct sockaddr_in6 sockaddr;
+       int rv;
++      char straddr[INET6_ADDRSTRLEN];
+       /* Send the packet atomically and close socket if that did not work */
+-      sockaddr.sin_addr.s_addr = client->addr;
+-      sockaddr.sin_port = client->port;
++      sockaddr.sin6_addr = client->addr;
++      sockaddr.sin6_port = client->port;
+       rv = send(client->sockfd, client->packet, client->size, 0);
++      inet_ntop(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
+       if (rv == -1) {
+               lprintf(LOG_WARNING, "could not send packet to TCP client %s:%d: %m\n",
+-                      inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
++                      straddr, sockaddr.sin6_port);
+               close(client->sockfd);
+               client->sockfd = -1;
+               return;
+       } else if (rv != client->size) {
+               lprintf(LOG_WARNING, "could not send packet to TCP client %s:%d: "
+-                      "only %d of %d bytes written\n", inet_ntoa(sockaddr.sin_addr),
+-                      sockaddr.sin_port, rv, (int) client->size);
++                      "only %d of %d bytes written\n", straddr,
++                      sockaddr.sin6_port, rv, (int) client->size);
+               close(client->sockfd);
+               client->sockfd = -1;
+               return;
+@@ -227,23 +235,25 @@
+ static void handle_tcp_client_read(client_t *client)
+ {
+-      struct sockaddr_in sockaddr;
++      struct sockaddr_in6 sockaddr;
+       int rv;
++      char straddr[INET6_ADDRSTRLEN];
+       /* Read from the socket what arrived and put it into the buffer */
+-      sockaddr.sin_addr.s_addr = client->addr;
+-      sockaddr.sin_port = client->port;
++      sockaddr.sin6_addr = client->addr;
++      sockaddr.sin6_port = client->port;
+       rv = read(client->sockfd, client->packet + client->size,
+               sizeof (client->packet) - client->size);
++      inet_ntop(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
+       if (rv == -1) {
+               lprintf(LOG_WARNING, "could not read packet from TCP client %s:%d: %m\n",
+-                      inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
++                      straddr, sockaddr.sin6_port);
+               close(client->sockfd);
+               client->sockfd = -1;
+               return;
+       } else if (rv == 0) {
+               lprintf(LOG_DEBUG, "disconnected TCP client %s:%d\n",
+-                      inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
++                      straddr, sockaddr.sin6_port);
+               close(client->sockfd);
+               client->sockfd = -1;
+               return;
+@@ -255,7 +265,7 @@
+       rv = snmp_packet_complete(client);
+       if (rv == -1) {
+               lprintf(LOG_WARNING, "could not handle packet from TCP client %s:%d: %m\n",
+-                      inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
++                      straddr, sockaddr.sin6_port);
+               close(client->sockfd);
+               client->sockfd = -1;
+               return;
+@@ -270,13 +280,13 @@
+       /* Call the protocol handler which will prepare the response packet */
+       if (snmp(client) == -1) {
+               lprintf(LOG_WARNING, "could not handle packet from TCP client %s:%d: %m\n",
+-                      inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
++                      straddr, sockaddr.sin6_port);
+               close(client->sockfd);
+               client->sockfd = -1;
+               return;
+       } else if (client->size == 0) {
+               lprintf(LOG_WARNING, "could not handle packet from TCP client %s:%d: ignored\n",
+-                      inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
++                      straddr, sockaddr.sin6_port);
+               close(client->sockfd);
+               client->sockfd = -1;
+               return;
+@@ -313,7 +323,7 @@
+       int option_index = 1;
+       int c;
+-      struct sockaddr_in sockaddr;
++      struct sockaddr_in6 sockaddr;
+       socklen_t socklen;
+       fd_set rfds;
+       fd_set wfds;
+@@ -399,14 +409,14 @@
+ #endif
+       /* Open the server's UDP port and prepare it for listening */
+-      g_udp_sockfd = socket(PF_INET, SOCK_DGRAM, 0);
++      g_udp_sockfd = socket(PF_INET6, SOCK_DGRAM, 0);
+       if (g_udp_sockfd == -1) {
+               lprintf(LOG_ERR, "could not create UDP socket: %m\n");
+               exit(EXIT_SYSCALL);
+       }
+-      sockaddr.sin_family = AF_INET;
+-      sockaddr.sin_port = htons(g_udp_port);
+-      sockaddr.sin_addr.s_addr = INADDR_ANY;
++      sockaddr.sin6_family = AF_INET6;
++      sockaddr.sin6_port = htons(g_udp_port);
++      sockaddr.sin6_addr = in6addr_any;
+       socklen = sizeof (sockaddr);
+       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);
+@@ -414,7 +424,7 @@
+       }
+       /* Open the server's TCP port and prepare it for listening */
+-      g_tcp_sockfd = socket(PF_INET, SOCK_STREAM, 0);
++      g_tcp_sockfd = socket(PF_INET6, SOCK_STREAM, 0);
+       if (g_tcp_sockfd == -1) {
+               lprintf(LOG_ERR, "could not create TCP socket: %m\n");
+               exit(EXIT_SYSCALL);
+@@ -424,9 +434,9 @@
+               lprintf(LOG_WARNING, "could not set SO_REUSEADDR on TCP socket: %m\n");
+               exit(EXIT_SYSCALL);
+       }
+-      sockaddr.sin_family = AF_INET;
+-      sockaddr.sin_port = htons(g_tcp_port);
+-      sockaddr.sin_addr.s_addr = INADDR_ANY;
++      sockaddr.sin6_family = AF_INET6;
++      sockaddr.sin6_port = htons(g_tcp_port);
++      sockaddr.sin6_addr = in6addr_any;
+       socklen = sizeof (sockaddr);
+       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);
+--- a/mini_snmpd.h
++++ b/mini_snmpd.h
+@@ -129,7 +129,7 @@
+ typedef struct client_s {
+       time_t timestamp;
+       int sockfd;
+-      in_addr_t addr;
++      struct in6_addr addr;
+       in_port_t port;
+       unsigned char packet[MAX_PACKET_SIZE];
+       size_t size;
+--- a/utils.c
++++ b/utils.c
+@@ -91,12 +91,13 @@
+ void dump_packet(const client_t *client)
+ {
+-      struct in_addr client_addr;
++      struct in6_addr client_addr;
++      char straddr[INET6_ADDRSTRLEN];
+       char buffer[BUFSIZ];
+       int len;
+       int i;
+-      client_addr.s_addr = client->addr;
++      client_addr = client->addr;
+       len = 0;
+       for (i = 0; i < client->size; i++) {
+               len += snprintf(buffer + len, sizeof (buffer) - len,
+@@ -105,9 +106,10 @@
+                       break;
+               }
+       }
++      inet_ntop(AF_INET6, &client_addr, straddr, sizeof(straddr));
+       lprintf(LOG_DEBUG, "%s %u bytes %s %s:%d (%s)\n",
+               client->outgoing ? "transmitted" : "received", (int) client->size,
+-              client->outgoing ? "to" : "from", inet_ntoa(client_addr),
++              client->outgoing ? "to" : "from", straddr,
+               ntohs(client->port), buffer);
+ }