--- a/globals.c
+++ b/globals.c
@@ -31,6 +31,8 @@
 const struct in_addr inaddr_any = { INADDR_ANY };
 #endif
 
+int g_family = AF_INET;
+
 in_port_t g_udp_port = 161;
 in_port_t g_tcp_port = 161;
 int g_timeout = 100;
--- a/mini_snmpd.c
+++ b/mini_snmpd.c
@@ -54,6 +54,10 @@ static void print_help(void)
 	fprintf(stderr, "-d, --disks nnn        set the disks to monitor (/)\n");
 	fprintf(stderr, "-i, --interfaces nnn   set the network interfaces to monitor (lo)\n");
 	fprintf(stderr, "-I, --listen nnn       set the network interface to listen (all)\n");
+#ifdef __IPV6__
+	fprintf(stderr, "-4, --ipv4             use IPv4 (default)\n");
+	fprintf(stderr, "-6, --ipv6             use IPv6\n");
+#endif
 	fprintf(stderr, "-t, --timeout nnn      set the timeout for MIB updates (1 second)\n");
 	fprintf(stderr, "-a, --auth             require authentication (thus SNMP version 2c)\n");
 	fprintf(stderr, "-v, --verbose          verbose syslog messages \n");
@@ -117,7 +121,7 @@ static void handle_udp_client(void)
 #endif
 
 	/* Call the protocol handler which will prepare the response packet */
-	inet_ntop(my_af_inet, &sockaddr.my_sin_addr, straddr, sizeof(straddr));
+	inet_ntop(g_family, &sockaddr.my_sin_addr, straddr, sizeof(straddr));
 	if (snmp(&g_udp_client) == -1) {
 		lprintf(LOG_WARNING, "could not handle packet from UDP client %s:%d: %m\n",
 			straddr, sockaddr.my_sin_port);
@@ -132,7 +136,7 @@ static void handle_udp_client(void)
 	/* Send the whole UDP packet to the socket at once */
 	rv = sendto(g_udp_sockfd, g_udp_client.packet, g_udp_client.size,
 		MSG_DONTWAIT, (struct sockaddr *)&sockaddr, socklen);
-	inet_ntop(my_af_inet, &sockaddr.my_sin_addr, straddr, sizeof(straddr));
+	inet_ntop(g_family, &sockaddr.my_sin_addr, straddr, sizeof(straddr));
 	if (rv == -1) {
 		lprintf(LOG_WARNING, "could not send packet to UDP client %s:%d: %m\n",
 			straddr, sockaddr.my_sin_port);
@@ -176,7 +180,7 @@ static void handle_tcp_connect(void)
 		}
 		tmp_sockaddr.my_sin_addr = client->addr;
 		tmp_sockaddr.my_sin_port = client->port;
-		inet_ntop(my_af_inet, &tmp_sockaddr.my_sin_addr, straddr, sizeof(straddr));
+		inet_ntop(g_family, &tmp_sockaddr.my_sin_addr, straddr, sizeof(straddr));
 		lprintf(LOG_WARNING, "maximum number of %d clients reached, kicking out %s:%d\n",
 			MAX_NR_CLIENTS, straddr, tmp_sockaddr.my_sin_port);
 		close(client->sockfd);
@@ -190,7 +194,7 @@ static void handle_tcp_connect(void)
 	}
 
 	/* Now fill out the client control structure values */
-	inet_ntop(my_af_inet, &sockaddr.my_sin_addr, straddr, sizeof(straddr));
+	inet_ntop(g_family, &sockaddr.my_sin_addr, straddr, sizeof(straddr));
 	lprintf(LOG_DEBUG, "connected TCP client %s:%d\n",
 		straddr, sockaddr.my_sin_port);
 	client->timestamp = time(NULL);
@@ -211,7 +215,7 @@ static void handle_tcp_client_write(clie
 	sockaddr.my_sin_addr = client->addr;
 	sockaddr.my_sin_port = client->port;
 	rv = send(client->sockfd, client->packet, client->size, 0);
-	inet_ntop(my_af_inet, &sockaddr.my_sin_addr, straddr, sizeof(straddr));
+	inet_ntop(g_family, &sockaddr.my_sin_addr, straddr, sizeof(straddr));
 	if (rv == -1) {
 		lprintf(LOG_WARNING, "could not send packet to TCP client %s:%d: %m\n",
 			straddr, sockaddr.my_sin_port);
@@ -246,7 +250,7 @@ static void handle_tcp_client_read(clien
 	sockaddr.my_sin_port = client->port;
 	rv = read(client->sockfd, client->packet + client->size,
 		sizeof (client->packet) - client->size);
-	inet_ntop(my_af_inet, &sockaddr.my_sin_addr, straddr, sizeof(straddr));
+	inet_ntop(g_family, &sockaddr.my_sin_addr, straddr, sizeof(straddr));
 	if (rv == -1) {
 		lprintf(LOG_WARNING, "could not read packet from TCP client %s:%d: %m\n",
 			straddr, sockaddr.my_sin_port);
@@ -304,7 +308,11 @@ static void handle_tcp_client_read(clien
 
 int main(int argc, char *argv[])
 {
+#ifdef __IPV6__
+	static const char short_options[] = "p:P:c:D:V:L:C:d:i:I:t:T:avl46h";
+#else
 	static const char short_options[] = "p:P:c:D:V:L:C:d:i:I:t:T:avlh";
+#endif
 	static const struct option long_options[] = {
 		{ "udp-port", 1, 0, 'p' },
 		{ "tcp-port", 1, 0, 'P' },
@@ -316,6 +324,10 @@ int main(int argc, char *argv[])
 		{ "disks", 1, 0, 'd' },
 		{ "interfaces", 1, 0, 'i' },
 		{ "listen", 1, 0, 'I' },
+#ifdef __IPV6__
+		{ "ipv4", 0, 0, '4' },
+		{ "ipv6", 0, 0, '6' },
+#endif
 		{ "timeout", 1, 0, 't' },
 		{ "traps", 1, 0, 'T' },
 		{ "auth", 0, 0, 'a' },
@@ -396,6 +408,14 @@ int main(int argc, char *argv[])
 			case 'v':
 				g_verbose = 1;
 				break;
+#ifdef __IPV6__
+			case '4':
+				g_family = AF_INET;
+				break;
+			case '6':
+				g_family = AF_INET6;
+				break;
+#endif
 			case 'l':
 				print_version();
 				exit(EXIT_ARGS);
@@ -435,12 +455,12 @@ int main(int argc, char *argv[])
 #endif
 
 	/* Open the server's UDP port and prepare it for listening */
-	g_udp_sockfd = socket(my_pf_inet, SOCK_DGRAM, 0);
+	g_udp_sockfd = socket((g_family == AF_INET) ? PF_INET : PF_INET6, SOCK_DGRAM, 0);
 	if (g_udp_sockfd == -1) {
 		lprintf(LOG_ERR, "could not create UDP socket: %m\n");
 		exit(EXIT_SYSCALL);
 	}
-	sockaddr.my_sin_family = my_af_inet;
+	sockaddr.my_sin_family = g_family;
 	sockaddr.my_sin_port = htons(g_udp_port);
 	sockaddr.my_sin_addr = my_inaddr_any;
 	socklen = sizeof (sockaddr);
@@ -457,7 +477,7 @@ int main(int argc, char *argv[])
 	}
 
 	/* Open the server's TCP port and prepare it for listening */
-	g_tcp_sockfd = socket(my_pf_inet, SOCK_STREAM, 0);
+	g_tcp_sockfd = socket((g_family == AF_INET) ? PF_INET : PF_INET6, SOCK_STREAM, 0);
 	if (g_tcp_sockfd == -1) {
 		lprintf(LOG_ERR, "could not create TCP socket: %m\n");
 		exit(EXIT_SYSCALL);
@@ -474,7 +494,7 @@ int main(int argc, char *argv[])
 		lprintf(LOG_WARNING, "could not set SO_REUSEADDR on TCP socket: %m\n");
 		exit(EXIT_SYSCALL);
 	}
-	sockaddr.my_sin_family = my_af_inet;
+	sockaddr.my_sin_family = g_family;
 	sockaddr.my_sin_port = htons(g_tcp_port);
 	sockaddr.my_sin_addr = my_inaddr_any;
 	socklen = sizeof (sockaddr);
--- a/mini_snmpd.h
+++ b/mini_snmpd.h
@@ -255,6 +255,7 @@ typedef struct demoinfo_s {
 
 extern in_port_t g_udp_port;
 extern in_port_t g_tcp_port;
+extern int g_family;
 extern int g_timeout;
 extern int g_auth;
 extern int g_verbose;