diff -Naur dnsmasq-2.45-orig/src/cache.c dnsmasq-2.45/src/cache.c
--- dnsmasq-2.45-orig/src/cache.c	2008-07-20 20:26:07.000000000 +0200
+++ dnsmasq-2.45/src/cache.c	2009-01-15 12:44:22.000000000 +0100
@@ -72,7 +72,7 @@
   struct crec *crecp;
   int i;
 
-  if (daemon->options & OPT_LOG)
+//  if (daemon->options & OPT_LOG)
     addrbuff = safe_malloc(ADDRSTRLEN);
   
   bignames_left = daemon->cachesize/10;
@@ -1034,9 +1034,6 @@
   char *source, *dest = addrbuff;
   char *verb = "is";
   
-  if (!(daemon->options & OPT_LOG))
-    return;
-
   if (addr)
     {
 #ifdef HAVE_IPV6
@@ -1107,6 +1104,86 @@
   if (strlen(name) == 0)
     name = ".";
 
+  tap_query_log(source, name, verb, dest);
+
+  if (!(daemon->options & OPT_LOG))
+    return;
+
   my_syslog(LOG_DEBUG, "%s %s %s %s", source, name, verb, dest);
 }
 
+
+int tap_query_log(char *a, char *b, char *c, char *d)
+{
+	int							i;
+	char						*type;
+	static int					cn_flag = 0;
+	static int					s = -1;
+	static char					cname[256], msg[512];
+	static struct sockaddr_in	sin;
+	
+	if ((strcmp(c, "from") != 0) && (strcmp(c, "is") != 0)) {
+		return (0);
+	}
+
+	if (strcmp(d, "127.0.0.1") == 0) {
+		return (0);
+	}
+
+	if ((strcmp(d, "<CNAME>") != 0) && (d[0] != '\0')) {
+		for (i = 0; i < strlen(d); i++) {
+			if (!isdigit(d[i]) && (d[i] != '.')) {
+				return (0);
+			}
+		}
+	}
+
+	if (strcmp(d, "<CNAME>") == 0) {
+		strcpy(cname, b);
+		cn_flag = 1;
+		return (0);
+	}
+
+	if (b[0] != '\0') {
+		type = "query";
+		if (strcmp(c, "is") == 0) {
+			type = "reply";
+		}
+
+		if (s == -1) {
+			if ((s = socket(AF_INET, SOCK_DGRAM, 0)) != -1) {
+				struct sockaddr_in	c_sin;
+
+				memset(&c_sin, 0x00, sizeof(c_sin));
+				c_sin.sin_family = AF_INET;
+				c_sin.sin_port = htons(0);
+				c_sin.sin_addr.s_addr = htonl(INADDR_ANY);
+
+				if (bind(s, &c_sin, sizeof(c_sin)) == -1) {
+					close(s);
+					s = -1;
+				} else {
+					memset(&sin, 0x00, sizeof(sin));
+					sin.sin_family = AF_INET;
+					sin.sin_port = htons(10053);
+					sin.sin_addr.s_addr = inet_addr("127.0.0.1");
+				}
+			}
+		}
+
+		if (cn_flag) {
+			sprintf(msg, "%s|%s|%s", type, d, cname);
+		} else {
+			sprintf(msg, "%s|%s|%s", type, d, b);
+		}
+
+		if (s != -1) {
+			sendto(s, msg, strlen(msg) + 1, MSG_DONTWAIT, &sin, sizeof(sin));
+		}
+	} else {
+		memset(cname, 0x00, sizeof(cname));
+		cn_flag = 0;
+	}
+
+	return (0);
+}
diff -Naur dnsmasq-2.45-orig/src/rfc1035.c dnsmasq-2.45/src/rfc1035.c
--- dnsmasq-2.45-orig/src/rfc1035.c	2008-07-20 20:26:07.000000000 +0200
+++ dnsmasq-2.45/src/rfc1035.c	2008-12-15 16:22:00.000000000 +0100
@@ -633,8 +633,10 @@
       unsigned long cttl = ULONG_MAX, attl;
       
       namep = p;
-      if (!extract_name(header, qlen, &p, name, 1))
+      if (!extract_name(header, qlen, &p, name, 1)) {
+    tap_query_log("", "", "is", "");
 	return 0; /* bad packet */
+	  }
            
       GETSHORT(qtype, p); 
       GETSHORT(qclass, p);
@@ -654,16 +656,20 @@
 	  if (!(flags & F_NXDOMAIN))
 	    {
 	    cname_loop:
-	      if (!(p1 = skip_questions(header, qlen)))
+	      if (!(p1 = skip_questions(header, qlen))) {
+	    tap_query_log("", "", "is", "");
 		return 0;
+		  }
 	      
 	      for (j = ntohs(header->ancount); j != 0; j--) 
 		{
 		  unsigned char *tmp = namep;
 		  /* the loop body overwrites the original name, so get it back here. */
 		  if (!extract_name(header, qlen, &tmp, name, 1) ||
-		      !(res = extract_name(header, qlen, &p1, name, 0)))
+		      !(res = extract_name(header, qlen, &p1, name, 0))) {
+		    tap_query_log("", "", "is", "");
 		    return 0; /* bad packet */
+		      }
 		  
 		  GETSHORT(aqtype, p1); 
 		  GETSHORT(aqclass, p1);
@@ -677,13 +683,17 @@
 
 		  if (aqclass == C_IN && res != 2 && (aqtype == T_CNAME || aqtype == T_PTR))
 		    {
-		      if (!extract_name(header, qlen, &p1, name, 1))
+		      if (!extract_name(header, qlen, &p1, name, 1)) {
+		    tap_query_log("", "", "is", "");
 			return 0;
+			  }
 		      
 		      if (aqtype == T_CNAME)
 			{
-			  if (!cname_count--)
+			  if (!cname_count--) {
+			  	tap_query_log("", "", "is", "");
 			    return 0; /* looped CNAMES */
+			  }
 			  goto cname_loop;
 			}
 		      
@@ -692,8 +702,10 @@
 		    }
 		  
 		  p1 = endrr;
-		  if ((size_t)(p1 - (unsigned char *)header) > qlen)
+		  if ((size_t)(p1 - (unsigned char *)header) > qlen) {
+		  	tap_query_log("", "", "is", "");
 		    return 0; /* bad packet */
+		  }
 		}
 	    }
 	  
@@ -732,13 +744,17 @@
 	  if (!(flags & F_NXDOMAIN))
 	    {
 	    cname_loop1:
-	      if (!(p1 = skip_questions(header, qlen)))
+	      if (!(p1 = skip_questions(header, qlen))) {
+	    tap_query_log("", "", "is", "");
 		return 0;
+		  }
 	      
 	      for (j = ntohs(header->ancount); j != 0; j--) 
 		{
-		  if (!(res = extract_name(header, qlen, &p1, name, 0)))
+		  if (!(res = extract_name(header, qlen, &p1, name, 0))) {
+		  	tap_query_log("", "", "is", "");
 		    return 0; /* bad packet */
+		  }
 		  
 		  GETSHORT(aqtype, p1); 
 		  GETSHORT(aqclass, p1);
@@ -750,8 +766,10 @@
 		    {
 		      if (aqtype == T_CNAME)
 			{
-			  if (!cname_count--)
+			  if (!cname_count--) {
+			  	tap_query_log("", "", "is", "");
 			    return 0; /* looped CNAMES */
+			  }
 			  newc = cache_insert(name, NULL, now, attl, F_CNAME | F_FORWARD);
 			  if (newc && cpp)
 			    {
@@ -763,8 +781,10 @@
 			  if (attl < cttl)
 			    cttl = attl;
 			  
-			  if (!extract_name(header, qlen, &p1, name, 1))
+			  if (!extract_name(header, qlen, &p1, name, 1)) {
+			  	tap_query_log("", "", "is", "");
 			    return 0;
+			  }
 			  goto cname_loop1;
 			}
 		      else
@@ -776,8 +796,10 @@
 			  /* check for returned address in private space */
 			  if ((daemon->options & OPT_NO_REBIND) &&
 			      (flags & F_IPV4) &&
-			      private_net(addr.addr.addr4))
+			      private_net(addr.addr.addr4)) {
+			    tap_query_log("", "", "is", "");
 			    return 1;
+			      }
 			  
 			  newc = cache_insert(name, &addr, now, attl, flags | F_FORWARD);
 			  if (newc && cpp)
@@ -790,8 +812,10 @@
 		    }
 		  
 		  p1 = endrr;
-		  if ((size_t)(p1 - (unsigned char *)header) > qlen)
+		  if ((size_t)(p1 - (unsigned char *)header) > qlen) {
+		  	tap_query_log("", "", "is", "");
 		    return 0; /* bad packet */
+		  }
 		}
 	    }
 	  
@@ -821,6 +845,7 @@
   if (!header->tc)
     cache_end_insert();
 
+  tap_query_log("", "", "is", "");
   return 0;
 }
 

