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

Reply via email to