File pidentd-3.1a25-ipv6.diff of Package pidentd

--- src/k_linux.c
+++ src/k_linux.c
@@ -51,37 +51,36 @@
 {
 #ifdef HAVE_IPV6
     static FILE *fp[2];
-#else
-    FILE *fp;
-#endif
+    int e6, e;
 
-    
-#ifdef HAVE_IPV6
     while ((fp[FP_INET6] = fopen("/proc/net/tcp6", "r")) == NULL &&
 	   errno == EINTR)
 	;
-
-    /* We just ignore this - IPv6 is not in use on this machine */
-#if 0
-    if (fp[FP_INET6] == NULL)
-	syslog(LOG_ERR, "fopen(\"/proc/net/tcp6\", \"r\"): %m");
-#endif
+    e6 = errno;
     
     while ((fp[FP_INET] = fopen("/proc/net/tcp", "r")) == NULL &&
 	   errno == EINTR)
 	;
+    e = errno;
     
-    if (fp[FP_INET] == NULL)
+    if (fp[FP_INET] == NULL && fp[FP_INET6] == NULL)
+    {
+	syslog(LOG_ERR, "fopen(\"/proc/net/tcp6\", \"r\"): %s", strerror(e6));
+	syslog(LOG_ERR, "fopen(\"/proc/net/tcp\", \"r\"): %s", strerror(e));
+	return -1;
+    }
 #else
+    FILE *fp;
+
     while ((fp = fopen("/proc/net/tcp", "r")) == NULL && errno == EINTR)
 	;
     
     if (fp == NULL)
-#endif
     {
 	syslog(LOG_ERR, "fopen(\"/proc/net/tcp\", \"r\"): %m");
 	return -1;
     }
+#endif
 
     *misc = (void *) fp;
     return 0;
@@ -100,6 +99,8 @@
     int r_lport, r_rport, mylport, myrport;
     int euid;
 
+    if (fp == NULL)
+	return -1;
     
     r_lport = ntohs(SGPORT(kp->local));
     r_rport = ntohs(SGPORT(kp->remote));
@@ -130,49 +131,26 @@
     return -1;
 }
 
-int
-ka_lookup(void *vp, struct kernel *kp)
+static int
+ka_lookup6(FILE *fp,
+	   struct kernel *kp,
+	   struct in6_addr *r_laddr,
+	   struct in6_addr *r_raddr)
 {
-    FILE *fp;
     long dummy;
     unsigned dummy2;
     char buf[512];
+    struct in6_addr myladdr, myraddr;
     int r_lport, r_rport, mylport, myrport;
     int euid;
-#ifdef HAVE_IPV6 
-    struct in6_addr *r_laddr, *r_raddr, myladdr, myraddr;
-#endif
     
-    if (SGFAM(kp->remote) == AF_INET)
-    {
-	return ka_lookup4(((FILE **)vp)[FP_INET],
-			   kp,
-			   * (UINT32 *) SGADDRP(kp->local),
-			   * (UINT32 *) SGADDRP(kp->remote));
-    }
-
-#ifdef HAVE_IPV6
-    r_laddr = (struct in6_addr *) SGADDRP(kp->local);
-    r_raddr = (struct in6_addr *) SGADDRP(kp->remote);
-    
-    if (IN6_IS_ADDR_V4MAPPED(r_raddr))
-    {
-	return ka_lookup4(((FILE **)vp)[FP_INET],
-			   kp,
-			   r_laddr->s6_addr32[3],
-			   r_raddr->s6_addr32[3]);
-    }
+    if (fp == NULL)
+	return -1;
     
     r_lport = ntohs(SGPORT(kp->local));
     r_rport = ntohs(SGPORT(kp->remote));
 
-    fp = ((FILE **)vp)[FP_INET6];
-
-    if (fp == NULL)
-	return -1;
-	
     kp->ruid = NO_UID;
-
     rewind(fp);
     
     /* eat header */
@@ -198,6 +176,52 @@
 	    }
 	}
     }
+    
+    return -1;
+}
+
+int
+ka_lookup(void *vp, struct kernel *kp)
+{
+#ifdef HAVE_IPV6 
+    struct in6_addr r_laddr, r_raddr;
+    
+    switch(SGFAM(kp->remote)) {
+    case AF_INET:
+	memset(&r_laddr, 0, sizeof(r_laddr));
+	memset(&r_raddr, 0, sizeof(r_raddr));
+	r_laddr.s6_addr16[5] = 0xffff;
+	r_raddr.s6_addr16[5] = 0xffff;
+	r_laddr.s6_addr32[3] = *(UINT32 *)SGADDRP(kp->local);
+	r_raddr.s6_addr32[3] = *(UINT32 *)SGADDRP(kp->remote);
+	break;
+    case AF_INET6:
+	memcpy(&r_laddr, SGADDRP(kp->local), sizeof(r_laddr));
+	memcpy(&r_raddr, SGADDRP(kp->remote), sizeof(r_raddr));
+	break;
+    default:
+	return -1;
+    }
+    
+    if(!ka_lookup6(((FILE **)vp)[FP_INET6], kp, &r_laddr, &r_raddr))
+	return 0;
+    
+    if(SGFAM(kp->remote) == AF_INET6 && !IN6_IS_ADDR_V4MAPPED(&r_raddr))
+	return -1;
+
+    return ka_lookup4(((FILE **)vp)[FP_INET],
+			   kp,
+			   r_laddr.s6_addr32[3],
+			   r_raddr.s6_addr32[3]);
+
+#else
+    if (SGFAM(kp->remote) == AF_INET)
+    {
+	return ka_lookup4(((FILE **)vp)[FP_INET],
+			   kp,
+			   * (UINT32 *) SGADDRP(kp->local),
+			   * (UINT32 *) SGADDRP(kp->remote));
+    }
 #endif
 
     return -1;
openSUSE Build Service is sponsored by