Merge branch 'master' of ssh://git.samba.org/data/git/samba
[ira/wip.git] / source3 / nmbd / asyncdns.c
index f572aefc784081e2d8b5243a10fdb5175192a1ce..baa88bc44b5be24d6a392329eb8cbef78f897d17 100644 (file)
@@ -87,8 +87,13 @@ static void asyncdns_process(void)
        DEBUGLEVEL = -1;
 
        while (1) {
-               if (read_data(fd_in, (char *)&r, sizeof(r)) != sizeof(r)) 
+               NTSTATUS status;
+
+               status = read_data(fd_in, (char *)&r, sizeof(r));
+
+               if (!NT_STATUS_IS_OK(status)) {
                        break;
+               }
 
                pull_ascii_nstring( qname, sizeof(qname), r.name.name);
                r.result.s_addr = interpret_addr(qname);
@@ -159,6 +164,12 @@ void start_async_dns(void)
        CatchSignal(SIGHUP, SIG_IGN);
         CatchSignal(SIGTERM, SIGNAL_CAST sig_term );
 
+       if (!reinit_after_fork(nmbd_messaging_context(),
+                              nmbd_event_context(), true)) {
+               DEBUG(0,("reinit_after_fork() failed\n"));
+               smb_panic("reinit_after_fork() failed");
+       }
+
        asyncdns_process();
 }
 
@@ -166,7 +177,7 @@ void start_async_dns(void)
 /***************************************************************************
 check if a particular name is already being queried
   ****************************************************************************/
-static BOOL query_current(struct query_record *r)
+static bool query_current(struct query_record *r)
 {
        return dns_current &&
                nmb_name_equal(&r->name, 
@@ -177,7 +188,7 @@ static BOOL query_current(struct query_record *r)
 /***************************************************************************
   write a query to the child process
   ****************************************************************************/
-static BOOL write_child(struct packet_struct *p)
+static bool write_child(struct packet_struct *p)
 {
        struct query_record r;
 
@@ -194,7 +205,7 @@ void run_dns_queue(void)
        struct query_record r;
        struct packet_struct *p, *p2;
        struct name_record *namerec;
-       int size;
+       NTSTATUS status;
 
        if (fd_in == -1)
                return;
@@ -208,11 +219,11 @@ void run_dns_queue(void)
                start_async_dns();
        }
 
-       if ((size=read_data(fd_in, (char *)&r, sizeof(r))) != sizeof(r)) {
-               if (size) {
-                       DEBUG(0,("Incomplete DNS answer from child!\n"));
-                       fd_in = -1;
-               }
+       status = read_data(fd_in, (char *)&r, sizeof(r));
+
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0, ("read from child failed: %s\n", nt_errstr(status)));
+               fd_in = -1;
                 BlockSignals(True, SIGTERM);
                return;
        }
@@ -285,7 +296,7 @@ void run_dns_queue(void)
 queue a DNS query
   ****************************************************************************/
 
-BOOL queue_dns_query(struct packet_struct *p,struct nmb_name *question)
+bool queue_dns_query(struct packet_struct *p,struct nmb_name *question)
 {
        if (in_dns || fd_in == -1)
                return False;
@@ -317,7 +328,7 @@ BOOL queue_dns_query(struct packet_struct *p,struct nmb_name *question)
   we use this when we can't do async DNS lookups
   ****************************************************************************/
 
-BOOL queue_dns_query(struct packet_struct *p,struct nmb_name *question)
+bool queue_dns_query(struct packet_struct *p,struct nmb_name *question)
 {
        struct name_record *namerec = NULL;
        struct in_addr dns_ip;