Hi,
Hi,
same as last time, but this time, only fixing this particular bug.
Will ask my AM to upload to DELAYED/5.
//mirabilos
--
Sometimes they [people] care too much: pretty printers [and syntax highligh-
ting, d.A.] mechanically produce pretty output that accentuates irrelevant
detail in the program, which is as sensible as putting all the prepositions
in English text in bold font. -- Rob Pike in "Notes on Programming in C"
diff -u gidentd-0.4.5+dfsg1/debian/changelog
gidentd-0.4.5+dfsg1/debian/changelog
--- gidentd-0.4.5+dfsg1/debian/changelog
+++ gidentd-0.4.5+dfsg1/debian/changelog
@@ -1,3 +1,10 @@
+gidentd (0.4.5+dfsg1-0.3) unstable; urgency=low
+
+ * Non-maintainer upload.
+ * Overhaul IPv4/IPv6 handling. (Closes: #562647)
+
+ -- Thorsten Glaser <t...@mirbsd.de> Thu, 31 Dec 2009 22:48:49 +0000
+
gidentd (0.4.5+dfsg1-0.2) unstable; urgency=low
* Non-maintainer upload.
diff -u gidentd-0.4.5+dfsg1/debian/gidentd.8
gidentd-0.4.5+dfsg1/debian/gidentd.8
--- gidentd-0.4.5+dfsg1/debian/gidentd.8
+++ gidentd-0.4.5+dfsg1/debian/gidentd.8
@@ -32,11 +32,11 @@
.TP
.B "\-4"
-Run \fBgidentd\fP in IPv4 mode, don't use IPv6.
+Run \fBgidentd\fP in IPv4 only mode, don't use IPv6.
.TP
.B "\-6"
-Run \fBgidentd\fP in IPv6 mode.
+Run \fBgidentd\fP in IPv6 only mode, don't use IPv4.
.TP
.B "\-a"
diff -u gidentd-0.4.5+dfsg1/debian/patches/00list
gidentd-0.4.5+dfsg1/debian/patches/00list
--- gidentd-0.4.5+dfsg1/debian/patches/00list
+++ gidentd-0.4.5+dfsg1/debian/patches/00list
@@ -3,0 +4 @@
+04_562647.dpatch
only in patch2:
unchanged:
--- gidentd-0.4.5+dfsg1.orig/debian/patches/04_562647.dpatch
+++ gidentd-0.4.5+dfsg1/debian/patches/04_562647.dpatch
@@ -0,0 +1,327 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 562647.dpatch by Thorsten Glaser <t...@mirbsd.de>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Overhaup IPv4/IPv6 handling
+
+if [ $# -ne 1 ]; then
+ echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+ exit 1
+fi
+case "$1" in
+ -patch) patch -f --no-backup-if-mismatch -p1 < $0;;
+ -unpatch) patch -f --no-backup-if-mismatch -R -p1 < $0;;
+ *)
+ echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+ exit 1;;
+esac
+
+exit 0
+
+diff -pruN gidentd-0.4.5+dfsg1.prepatch/config.c
gidentd-0.4.5+dfsg1.postpatch/config.c
+--- gidentd-0.4.5+dfsg1.prepatch/config.c 2009-12-31 21:36:19.000000000
+0000
++++ gidentd-0.4.5+dfsg1.postpatch/config.c 2009-12-31 22:12:49.000000000
+0000
+@@ -15,15 +15,15 @@ static void defaultconfig(void)
+ config.logfile="/var/log/gidentd.log";
+ config.pidfile="/var/run/gidentd.pid";
+ config.port=113;
+- config.forcev4=0;
++ config.forceproto=0;
+ config.inetd=0;
+ }
+
+ static void display_help(char *prog)
+ {
+ printf("Usage: %s [-46adhi] [-c configfile] [-l logfile] [-p port]\n",
prog);
+- printf("-4 --ipv4 : do not use ipv6\n");
+- printf("-6 --ipv6 : use ipv6 if available, fallback to
ipv4\n");
++ printf("-4 --ipv4 : use IPv4 only, do not use IPv6\n");
++ printf("-6 --ipv6 : use IPv6 only, do not use IPv4\n");
+ printf("-a --auto : auto detect inetd\n");
+ printf("-c --config <file> : use configfile <file>\n");
+ printf("-d --daemon : force daemon mode\n");
+@@ -60,11 +60,11 @@ void GetConfig(int argc, char **argv)
+ while((c=getopt_long(argc, argv, "46acdhil:P:p:", long_options,
&option_index))>=0) {
+ switch(c) {
+ case '4':
+- config.forcev4=1;
++ config.forceproto=4;
+ break;
+
+ case '6':
+- config.forcev4=0;
++ config.forceproto=6;
+ break;
+
+ case 'a':
+diff -pruN gidentd-0.4.5+dfsg1.prepatch/config.h
gidentd-0.4.5+dfsg1.postpatch/config.h
+--- gidentd-0.4.5+dfsg1.prepatch/config.h 2009-12-31 21:36:19.000000000
+0000
++++ gidentd-0.4.5+dfsg1.postpatch/config.h 2009-12-31 22:12:49.000000000
+0000
+@@ -2,7 +2,7 @@ typedef struct {
+ char *logfile;
+ char *pidfile;
+ int port;
+- int forcev4;
++ int forceproto;
+ int inetd; // 0: auto 1: inetd 2: daemon
+ } IdentdConf;
+ extern IdentdConf config;
+diff -pruN gidentd-0.4.5+dfsg1.prepatch/gidentd.c
gidentd-0.4.5+dfsg1.postpatch/gidentd.c
+--- gidentd-0.4.5+dfsg1.prepatch/gidentd.c 2009-12-31 21:36:19.000000000
+0000
++++ gidentd-0.4.5+dfsg1.postpatch/gidentd.c 2009-12-31 22:12:49.000000000
+0000
+@@ -47,7 +47,7 @@ int main(int argc, char **argv)
+ } else {
+ Log("gidentd v%s started in daemon mode.", VERSION);
+ BgProcess(); // close open files && become daemon
+- OpenListenSock(config.port, config.forcev4); // open listening
sock
++ OpenListenSock(config.port, config.forceproto); // open
listening sock
+
+ if (open_proc_files() < 0)
+ return 1;
+diff -pruN gidentd-0.4.5+dfsg1.prepatch/request.c
gidentd-0.4.5+dfsg1.postpatch/request.c
+--- gidentd-0.4.5+dfsg1.prepatch/request.c 2009-12-31 21:36:19.000000000
+0000
++++ gidentd-0.4.5+dfsg1.postpatch/request.c 2009-12-31 22:19:46.000000000
+0000
+@@ -1,3 +1,4 @@
++#include <string.h>
+ #include "parse.h"
+ #include "socket.h"
+ #include "request.h"
+@@ -15,7 +16,7 @@ int Handle_Request(char *line)
+ return(-1);
+ }
+
+- switch(ipversion) {
++ switch(ipversion_child) {
+ case 4:
+ req.uid=tcp4();
+ break;
+diff -pruN gidentd-0.4.5+dfsg1.prepatch/socket.c
gidentd-0.4.5+dfsg1.postpatch/socket.c
+--- gidentd-0.4.5+dfsg1.prepatch/socket.c 2009-12-31 21:36:19.000000000
+0000
++++ gidentd-0.4.5+dfsg1.postpatch/socket.c 2009-12-31 22:23:47.000000000
+0000
+@@ -9,6 +9,7 @@
+ #include <fcntl.h>
+ #include <unistd.h>
+ #include <errno.h>
++#include <poll.h>
+ #include <string.h>
+
+ #include "log.h"
+@@ -17,11 +18,15 @@
+
+ #define TIMEOUT 120
+
++#ifndef INFTIM
++#define INFTIM (-1)
++#endif
++
+ int inetd;
+-int ipversion;
++int ipversion_child;
+ Conn_Struct conn;
+
+-static int s;
++static int s, s4 = -1, s6 = -1;
+
+ void SetInetdSocket()
+ {
+@@ -31,42 +36,75 @@ void SetInetdSocket()
+
+ int NewConn(void)
+ {
+- struct sockaddr_in6 sa;
+- socklen_t slt=sizeof(sa);
+- int s2;
++ union {
++ struct sockaddr sa;
++ struct sockaddr_in sin;
++ struct sockaddr_in6 sin6;
++ } su;
++ socklen_t slt=sizeof(su);
++ int s0, s2, ipversion;
+ char rmt[40], loc[40];
+
+ if(inetd) {
+- if(getpeername(s, (struct sockaddr *)&sa, &slt))
++ if(getpeername(s, &su.sa, &slt))
+ LogError("getpeername");
+- ipversion=((struct sockaddr *)&sa)->sa_family==AF_INET?4:6;
++ ipversion=su.sa.sa_family==AF_INET?4:6;
+ } else {
+- if((s2=accept(s, (struct sockaddr *)&sa, &slt))<0)
++ if (s4 != -1 && s6 != -1) {
++ struct pollfd pfds[2];
++ int i;
++
++ pfds[0].fd = s4;
++ pfds[1].fd = s6;
++ pfds[0].events = POLLIN;
++ pfds[1].events = POLLIN;
++
++ for (;;) {
++ if (poll(pfds, 2, INFTIM) < 0) {
++ if (errno == EINTR || errno == EAGAIN)
++ continue;
++ LogError("poll");
++ }
++ for (i = 0; i < 2; ++i)
++ if (pfds[i].revents & POLLIN) {
++ s0 = pfds[i].fd;
++ break;
++ }
++ }
++ } else
++ s0 = s4 == -1 ? s6 : s4;
++
++ ipversion = s0 == s4 ? 4 : 6;
++ if((s2=accept(s0, &su.sa, &slt))<0)
+ LogError("accept");
+ if(fork()) {
+ close(s2);
+ return(1);
+ }
+- close(s);
++ if (s4 != -1)
++ close(s4);
++ if (s6 != -1)
++ close(s6);
+ s=s2;
++ ipversion_child = ipversion;
+ }
+ if(ipversion==6) {
+- conn.rh=sa.sin6_addr;
+- conn.rp=htons(sa.sin6_port);
++ conn.rh=su.sin6.sin6_addr;
++ conn.rp=htons(su.sin6.sin6_port);
+ } else {
+- conn.rh.s6_addr32[3]=((struct sockaddr_in
*)&sa)->sin_addr.s_addr;
+- conn.rp=htons(((struct sockaddr_in *)&sa)->sin_port);
++ conn.rh.s6_addr32[3]=su.sin.sin_addr.s_addr;
++ conn.rp=htons(su.sin.sin_port);
+ }
+
+- if(getsockname(s, (struct sockaddr *)&sa, &slt))
++ if(getsockname(s, &su.sa, &slt))
+ LogError("getsockname");
+
+ if(ipversion==6) {
+- conn.lh=sa.sin6_addr;
+- conn.lp=htons(sa.sin6_port);
++ conn.lh=su.sin6.sin6_addr;
++ conn.lp=htons(su.sin6.sin6_port);
+ } else {
+- conn.lh.s6_addr32[3]=((struct sockaddr_in
*)&sa)->sin_addr.s_addr;
+- conn.lp=htons(((struct sockaddr_in *)&sa)->sin_port);
++ conn.lh.s6_addr32[3]=su.sin.sin_addr.s_addr;
++ conn.lp=htons(su.sin.sin_port);
+ }
+
+ // Log
+@@ -76,7 +114,7 @@ int NewConn(void)
+ return(0);
+ }
+
+-static void BindListen(int port)
++static void BindListen(int port, int ipversion)
+ {
+ socklen_t slt;
+ struct sockaddr *sa;
+@@ -100,39 +138,48 @@ static void BindListen(int port)
+ }
+
+
+- if(bind(s, sa, slt))
++ if(bind(ipversion==4?s4:s6, sa, slt))
+ LogError("bind");
+- if(listen(s,3))
++ if(listen(ipversion==4?s4:s6,3))
+ LogError("listen");
+ Log("Using IPv%i", ipversion);
+ }
+
+-void OpenListenSock(int port, int forcev4)
++void OpenListenSock(int port, int forceproto)
+ {
+ int one=1;
+-
+- if (!forcev4) {
+- if((s = socket(PF_INET6, SOCK_STREAM, 0)) < 0) {
++
++ if (forceproto != 4) {
++ if((s6 = socket(PF_INET6, SOCK_STREAM, 0)) < 0) {
+ if(errno!=EAFNOSUPPORT)
+ LogError("socket");
+ else
+ Log("IPv6 not available");
+ } else {
+-
if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&one,sizeof(one)))
++
if(setsockopt(s6,SOL_SOCKET,SO_REUSEADDR,&one,sizeof(one)))
+ LogError("setsockopt");
+- ipversion=6;
+- return(BindListen(port));
++#if defined(IPPROTO_IPV6) && defined(IPV6_V6ONLY)
++
if(setsockopt(s6,IPPROTO_IPV6,IPV6_V6ONLY,&one,sizeof(one)))
++ LogError("setsockopt");
++#endif
++ BindListen(port, 6);
+ }
+ }
+
+- if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0)
+- LogError("socket");
+-
+- if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&one,sizeof(one)))
+- LogError("setsockopt");
++ if (forceproto != 6) {
++ if ((s4 = socket(PF_INET, SOCK_STREAM, 0)) < 0)
++ LogError("socket");
++
++ if(setsockopt(s4,SOL_SOCKET,SO_REUSEADDR,&one,sizeof(one)))
++ LogError("setsockopt");
++
++ BindListen(port, 4);
++ }
+
+- ipversion=4;
+- return(BindListen(port));
++ if (s4 == -1 && s6 == -1) {
++ Log("No listen socket available");
++ exit(1);
++ }
+ }
+
+ char *ReadLine(void)
+diff -pruN gidentd-0.4.5+dfsg1.prepatch/socket.h
gidentd-0.4.5+dfsg1.postpatch/socket.h
+--- gidentd-0.4.5+dfsg1.prepatch/socket.h 2009-12-31 21:36:19.000000000
+0000
++++ gidentd-0.4.5+dfsg1.postpatch/socket.h 2009-12-31 22:18:41.000000000
+0000
+@@ -1,8 +1,8 @@
+ #include <netinet/in.h>
+
+-extern int ipversion;
++extern int ipversion_child;
+ extern int inetd;
+-void OpenListenSock(int port, int forcev4);
++void OpenListenSock(int port, int forceproto);
+ char *ReadLine(void);
+ void SetInetdSocket();
+ int NewConn(void);
+diff -pruN gidentd-0.4.5+dfsg1.prepatch/system.c
gidentd-0.4.5+dfsg1.postpatch/system.c
+--- gidentd-0.4.5+dfsg1.prepatch/system.c 2009-12-31 21:36:19.000000000
+0000
++++ gidentd-0.4.5+dfsg1.postpatch/system.c 2009-12-31 22:12:49.000000000
+0000
+@@ -88,6 +88,9 @@ void BgProcess(void)
+ // signal handler
+ static void sighandler(int s)
+ {
++ int e;
++
++ e = errno;
+ switch(s) {
+ case SIGCHLD:
+ while(waitpid(-1, NULL, WNOHANG)>0);
+@@ -96,6 +99,7 @@ static void sighandler(int s)
+ Log("received SIGTERM, exiting");
+ exit(0);
+ }
++ errno = e;
+ }
+
+ // install signal handler for signal sig