+++ /dev/null
---- 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);
- }
-
--- /dev/null
+#
+# 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))
--- /dev/null
+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
--- /dev/null
+#!/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
+}
--- /dev/null
+--- 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
--- /dev/null
+--- 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);
+ }
--- /dev/null
+--- 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;
--- /dev/null
+--- 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);
+ }
+