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