s3-nmbd: Remove obsolete signal type cast.
[ira/wip.git] / source3 / nmbd / asyncdns.c
index 25bbcabe5c7ce61b9bdb0b5d1cb388d7b79ae9e5..21ac5a0ff44a8f86835fd1523f50faf4e0179bdc 100644 (file)
@@ -14,8 +14,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
    */
 
 #include "includes.h"
@@ -88,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);
@@ -158,7 +162,13 @@ void start_async_dns(void)
        CatchSignal(SIGUSR2, SIG_IGN);
        CatchSignal(SIGUSR1, SIG_IGN);
        CatchSignal(SIGHUP, SIG_IGN);
-        CatchSignal(SIGTERM, SIGNAL_CAST sig_term );
+        CatchSignal(SIGTERM, sig_term);
+
+       if (!NT_STATUS_IS_OK(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();
 }
@@ -167,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, 
@@ -178,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;
 
@@ -195,31 +205,25 @@ 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;
 
-        /* Allow SIGTERM to kill us. */
-        BlockSignals(False, SIGTERM);
-
        if (!process_exists_by_pid(child_pid)) {
                close(fd_in);
                close(fd_out);
                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;
-               }
-                BlockSignals(True, SIGTERM);
+       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;
                return;
        }
 
-        BlockSignals(True, SIGTERM);
-
        namerec = add_dns_result(&r.name, r.result);
 
        if (dns_current) {
@@ -254,13 +258,8 @@ void run_dns_queue(void)
                        in_dns = 0;
                        p->locked = False;
 
-                       if (p->prev)
-                               p->prev->next = p->next;
-                       else
-                               dns_queue = p->next;
-                       if (p->next)
-                               p->next->prev = p->prev;
                        p2 = p->next;
+                       DLIST_REMOVE(dns_queue, p);
                        free_packet(p);
                        p = p2;
                } else {
@@ -270,10 +269,7 @@ void run_dns_queue(void)
 
        if (dns_queue) {
                dns_current = dns_queue;
-               dns_queue = dns_queue->next;
-               if (dns_queue)
-                       dns_queue->prev = NULL;
-               dns_current->next = NULL;
+               DLIST_REMOVE(dns_queue, dns_queue);
 
                if (!write_child(dns_current)) {
                        DEBUG(3,("failed to send DNS query to child!\n"));
@@ -286,7 +282,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;
@@ -300,11 +296,7 @@ BOOL queue_dns_query(struct packet_struct *p,struct nmb_name *question)
                p->locked = True;
        } else {
                p->locked = True;
-               p->next = dns_queue;
-               p->prev = NULL;
-               if (p->next)
-                       p->next->prev = p;
-               dns_queue = p;
+               DLIST_ADD(dns_queue, p);
        }
 
        DEBUG(3,("added DNS query for %s\n", nmb_namestr(question)));
@@ -318,7 +310,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;
@@ -328,14 +320,8 @@ BOOL queue_dns_query(struct packet_struct *p,struct nmb_name *question)
 
        DEBUG(3,("DNS search for %s - ", nmb_namestr(question)));
 
-        /* Unblock TERM signal so we can be killed in DNS lookup. */
-        BlockSignals(False, SIGTERM);
-
        dns_ip.s_addr = interpret_addr(qname);
 
-        /* Re-block TERM signal. */
-        BlockSignals(True, SIGTERM);
-
        namerec = add_dns_result(question, dns_ip);
        if(namerec == NULL) {
                send_wins_name_query_response(NAM_ERR, p, NULL);