X-Git-Url: http://git.samba.org/?a=blobdiff_plain;f=source3%2Fnmbd%2Fasyncdns.c;h=0736a66fb8a9bc570aa050230ee3b01d90e2b4a0;hb=0860632d25c19dc111fce5b71d6517fafedf9ec1;hp=25bbcabe5c7ce61b9bdb0b5d1cb388d7b79ae9e5;hpb=d824b98f80ba186030cbb70b3a1e5daf80469ecd;p=metze%2Fsamba%2Fwip.git diff --git a/source3/nmbd/asyncdns.c b/source3/nmbd/asyncdns.c index 25bbcabe5c7c..0736a66fb8a9 100644 --- a/source3/nmbd/asyncdns.c +++ b/source3/nmbd/asyncdns.c @@ -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 . */ #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); @@ -160,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(); } @@ -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) { @@ -286,7 +290,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; @@ -318,7 +322,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 +332,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);