From: acoul Date: Thu, 15 Apr 2010 21:11:06 +0000 (+0000) Subject: fix mini_snmpd on ipv4. Create a separate mini_snmpd_ipv6 package (closes #6578 ... X-Git-Url: http://207.154.207.93/?a=commitdiff_plain;h=0318938558d13bfaa0e333fbd95ed1974b40d44d;p=packages.git fix mini_snmpd on ipv4. Create a separate mini_snmpd_ipv6 package (closes #6578 & #7094) git-svn-id: svn://svn.openwrt.org/openwrt/packages@20889 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- diff --git a/net/mini_snmpd/patches/104-ipv6-support.patch b/net/mini_snmpd/patches/104-ipv6-support.patch deleted file mode 100644 index 5dc5622aa..000000000 --- a/net/mini_snmpd/patches/104-ipv6-support.patch +++ /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 index 000000000..972433af4 --- /dev/null +++ b/net/mini_snmpd_ipv6/Makefile @@ -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 index 000000000..352ac283b --- /dev/null +++ b/net/mini_snmpd_ipv6/files/mini_snmpd.config @@ -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 index 000000000..5d7cb7685 --- /dev/null +++ b/net/mini_snmpd_ipv6/files/mini_snmpd.init @@ -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 index 000000000..b34852f16 --- /dev/null +++ b/net/mini_snmpd_ipv6/patches/101-opt_flags.patch @@ -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 index 000000000..f6ece3e9c --- /dev/null +++ b/net/mini_snmpd_ipv6/patches/102-compile_fix.patch @@ -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 index 000000000..a46ace24e --- /dev/null +++ b/net/mini_snmpd_ipv6/patches/103-mib_encode_snmp_element_oid_fix.patch @@ -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 index 000000000..5dc5622aa --- /dev/null +++ b/net/mini_snmpd_ipv6/patches/104-ipv6-support.patch @@ -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); + } +