IPv6 patches for nnrpd -D

Antonio Querubin tony at lava.net
Wed Apr 3 15:05:52 UTC 2002


The attached patch now allows nnrpd to listen on an IPv6 address if
invoked with -D.  A patch to the man page is also attached.

There are two ways to have 'nnrpd -D' simultaneously listen on IPv4 and
IPv6.  The first is to specify '-b ::' and the other is to invoke
nnrpd twice with differing addresses for -b.


-- Attached file included as plaintext by Ecartis --
-- File: nnrpd.c.diff
-- Desc: for CURRENT snapshot

--- nnrpd/nnrpd.c.orig	Sat Mar 30 00:00:50 2002
+++ nnrpd/nnrpd.c	Wed Apr  3 04:53:20 2002
@@ -220,7 +220,7 @@
 #ifdef DO_PYTHON
     if (innconf->nnrppythonauth) {
         if (PY_close() < 0) {
-	    syslog(L_NOTICE, "PY_close(): close method not invoked because it is not defined in Python authenticaton module.");
+	    syslog(L_NOTICE, "PY_close(): close method not invoked because it is not defined in Python authentication module.");
 	}
     }
 #endif	/* DO_PYTHON */
@@ -824,10 +824,22 @@
     int 		count=123456789;
     struct		timeval tv;
     unsigned short	ListenPort = NNTP_PORT;
-    unsigned long	ListenAddr = htonl(INADDR_ANY);
+#ifdef HAVE_INET6
+    char		ListenAddr[INET6_ADDRSTRLEN];
+#else
+    char		ListenAddr[16];
+#endif
     int			lfd, fd;
     socklen_t		clen;
+#ifdef HAVE_INET6
+    struct sockaddr_storage ssa, csa;
+    struct sockaddr_in6	*ssa6 = (struct sockaddr_in6 *) &ssa;
+    struct sockaddr_in6	*csa6 = (struct sockaddr_in6 *) &csa;
+#else
     struct sockaddr_in	ssa, csa;
+#endif
+    struct sockaddr_in	*ssa4 = (struct sockaddr_in *) &ssa;
+    struct sockaddr_in	*csa4 = (struct sockaddr_in *) &csa;
     struct stat		Sb;
     pid_t		pid = -1;
     gid_t               NewsGID;
@@ -879,10 +891,7 @@
 	    break;
  	case 'b':			/* bind to a certain address in
  	        			   daemon mode */
-            if (inet_aton(optarg, &ssa.sin_addr))
-                ListenAddr = ssa.sin_addr.s_addr;
-            else
- 	    	ListenAddr = htonl(INADDR_ANY);
+	    strncpy( ListenAddr, optarg, sizeof ListenAddr );    
  	    break;
  	case 'D':			/* standalone daemon mode */
  	    DaemonMode = TRUE;
@@ -948,21 +957,38 @@
     SPOOLlen = strlen(innconf->patharticles);
 
     if (DaemonMode) {
-	if ((lfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
-	    syslog(L_FATAL, "can't open socket (%m)");
-	    exit(1);
+
+#ifdef HAVE_INET6
+	memset(&ssa, '\0', sizeof(struct sockaddr_in6));
+	ssa6->sin6_family = AF_INET6;
+	ssa6->sin6_port = htons(ListenPort);
+	if (inet_pton( AF_INET6, ListenAddr, ssa6->sin6_addr.s6_addr) > 0 ) {
+	    if ((lfd = socket(AF_INET6, SOCK_STREAM, 0)) < 0) {
+		syslog(L_FATAL, "can't open socket (%m)");
+		exit(1);
+	    }
 	}
+	else {
+#endif
+	    memset(&ssa, '\0', sizeof(struct sockaddr_in));
+	    ssa4->sin_family = AF_INET;
+	    ssa4->sin_port = htons(ListenPort);
+	    if (inet_aton(ListenAddr, (void *) &ssa4->sin_addr.s_addr) <= 0 )
+		ssa4->sin_addr.s_addr = htonl(INADDR_ANY);
+	    if ((lfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
+		syslog(L_FATAL, "can't open socket (%m)");
+		exit(1);
+	    }
+#ifdef HAVE_INET6
+	}
+#endif
 
-	if (setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)) < 0) {
+	if (setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR,
+		       (char *)&one, sizeof(one)) < 0) {
 	    syslog(L_FATAL, "can't setsockopt(SO_REUSEADDR) (%m)");
 	    exit(1);
 	}
 
-	memset(&ssa, '\0', sizeof(ssa));
-	ssa.sin_family = AF_INET;
-	ssa.sin_addr.s_addr = ListenAddr;
-	ssa.sin_port = htons(ListenPort);
-	
 	if (bind(lfd, (struct sockaddr *) &ssa, sizeof(ssa)) < 0) {
 	    fprintf(stderr, "%s: can't bind (%s)\n", argv[0], strerror(errno));
 	    syslog(L_FATAL, "can't bind local address (%m)");

-- Attached file included as plaintext by Ecartis --
-- File: nnrpd.8.diff
-- Desc: for CURRENT snapshot

--- doc/man/nnrpd.8.orig	Sat Mar 30 00:00:21 2002
+++ doc/man/nnrpd.8	Wed Apr  3 04:47:34 2002
@@ -89,9 +89,9 @@
 to bind to the specified
 .I IP address
 when started as a standalone daemon using the ``\-D'' flag. 
-This has to be a valid Internet
-address in dotted-quad format belonging to an interface of the local
-host.
+This has to be a valid IPv4 or IPv6 address belonging to an interface of
+the local host.  It can also be ::0 but the default is 0.0.0.0 if it's not
+specified.
 .TP
 .B \-c
 By default, 



More information about the inn-patches mailing list