dbus_mgr.c

来自「非常好的dns解析软件」· C语言 代码 · 共 2,442 行 · 第 1/5 页

C
2,442
字号
    dbus_mgr_log_err( "D-BUS service disabled." );    if( mgr->timer != 0L )    {	isc_timer_reset(mgr->timer,			isc_timertype_ticker,			&tick, &tock, ISC_TRUE	               );    }else    if( isc_timer_create	(   mgr->timermgr,	    isc_timertype_ticker,	    &tick, &tock,	    mgr->task,	    dbus_mgr_restart_dbus,	    mgr,	    &(mgr->timer)	) != ISC_R_SUCCESS      )    {	dbus_mgr_log_err( "D-BUS service cannot be restored." );    }}static void dbus_mgr_dbus_shutdown_handler ( ns_dbus_mgr_t *mgr ){     isc_event_t *dbus_shutdown_event = 	isc_event_allocate	(   mgr->mctx, 	    mgr->task, 	    1,	    dbus_mgr_handle_dbus_shutdown_event,	    mgr,	    sizeof(isc_event_t)	 );    if( dbus_shutdown_event != 0L )    {	isc_task_purgerange(mgr->task, 0L, ISC_SOCKEVENT_READ_READY, ISC_SOCKEVENT_SELECTED, 0L);	isc_task_send( mgr->task, &dbus_shutdown_event );    }else	dbus_mgr_log_err("unable to allocate dbus shutdown event");}staticdns_view_t *dbus_mgr_get_localhost_view(void){    dns_view_t       *view;    isc_netaddr_t    localhost = { AF_INET, { { htonl( ( 127 << 24 ) | 1 ) } }, 0 };    int              match;    for (view = ISC_LIST_HEAD(ns_g_server->viewlist);	 view != NULL;	 view = ISC_LIST_NEXT(view, link)        )    {		/* return first view matching "localhost" source and dest */	if(( (view->matchclients != 0L )   /* 0L: accept "any" */	   &&(( dns_acl_match( &localhost, 			     NULL, /* unsigned queries */			     view->matchclients,		  	     &(ns_g_server->aclenv),			     &match, 			     NULL  /* no match list */		            ) != ISC_R_SUCCESS	      ) || (match <= 0)	     )	    ) 	 ||( (view->matchdestinations != 0L )   /* 0L: accept "any" */	   &&(( dns_acl_match( &localhost, 			     NULL, /* unsigned queries */			     view->matchdestinations,		  	     &(ns_g_server->aclenv),			     &match, 			     NULL  /* no match list */		            ) != ISC_R_SUCCESS	      ) || (match <= 0)	     )	    )	  ) continue;			break;    }    return view;}staticdns_fwdtable_t *dbus_mgr_get_fwdtable(void){    dns_view_t *view = dbus_mgr_get_localhost_view();    if( view != 0L )	return view->fwdtable;    return 0L;}staticdns_fwdtable_t *dbus_mgr_get_view_and_fwdtable( dns_view_t **viewp ){    *viewp = dbus_mgr_get_localhost_view();    if( *viewp != 0L )	return (*viewp)->fwdtable;    return 0L;}static int dbus_mgr_ifwdr_comparator( const void *p1, const void *p2 ){    char  n1buf[ DNS_NAME_FORMATSIZE ]="", *n1p=&(n1buf[0]),	  n2buf[ DNS_NAME_FORMATSIZE ]="", *n2p=&(n2buf[0]);    dns_name_t *dn1;    dns_name_t *dn2;    DE_CONST(&(((const DBusMgrInitialFwdr*)p1)->dn), dn1);    DE_CONST(&(((const DBusMgrInitialFwdr*)p2)->dn), dn2);    dns_name_format(dn1, n1p, DNS_NAME_FORMATSIZE );        dns_name_format(dn2, n2p, DNS_NAME_FORMATSIZE );        return strcmp(n1buf, n2buf);}static int dbus_mgr_dhc_if_comparator( const void *p1, const void *p2 );static void dbus_mgr_record_initial_forwarder( dns_name_t *name, dns_forwarders_t *fwdr, void *mp ){    ns_dbus_mgr_t *mgr = mp;    isc_sockaddr_t *sa, *nsa;    DBusMgrInitialFwdr *ifwdr;     if( ISC_LIST_HEAD(fwdr->addrs) == 0L) 	return;    if( (ifwdr = isc_mem_get(mgr->mctx, sizeof(DBusMgrInitialFwdr))) == 0L)	return;    ifwdr->fwdpolicy = fwdr->fwdpolicy;    dns_name_init(&(ifwdr->dn), NULL);    if( dns_name_dupwithoffsets(name, mgr->mctx, &(ifwdr->dn)) != ISC_R_SUCCESS )	return;    ISC_LIST_INIT(ifwdr->sa);        for( sa = ISC_LIST_HEAD(fwdr->addrs);	 sa != 0L;	 sa = ISC_LIST_NEXT(sa,link)       )    {	nsa = isc_mem_get(mgr->mctx, sizeof(isc_sockaddr_t));	if( nsa == 0L ) 	    return;	*nsa = *sa;	ISC_LINK_INIT(nsa, link);	ISC_LIST_APPEND(ifwdr->sa, nsa, link);    }    ISC_LINK_INIT(ifwdr, link);    tsearch( ifwdr, &(mgr->ifwdt), dbus_mgr_ifwdr_comparator);} static isc_result_tdbus_mgr_record_initial_fwdtable( ns_dbus_mgr_t *mgr ){    dns_fwdtable_t *fwdtable = dbus_mgr_get_fwdtable();        if( fwdtable == 0L )	return ISC_R_SUCCESS; /* no initial fwdtable */    dns_fwdtable_foreach( fwdtable, dbus_mgr_record_initial_forwarder, mgr);    return ISC_R_SUCCESS;}static voiddbus_mgr_free_initial_forwarder( void *p ){   DBusMgrInitialFwdr *ifwdr = p;   isc_sockaddr_t *sa;   dns_name_free(&(ifwdr->dn), ns_g_mctx);   for( sa = ISC_LIST_HEAD( ifwdr->sa );	sa != 0L;	sa = ISC_LIST_HEAD( ifwdr->sa )      )   {       if( ISC_LINK_LINKED(sa, link) )	   ISC_LIST_UNLINK(ifwdr->sa, sa, link);       isc_mem_put(ns_g_mctx, sa, sizeof(isc_sockaddr_t));   }   isc_mem_put(ns_g_mctx, ifwdr, sizeof(DBusMgrInitialFwdr));}static voiddbus_mgr_free_initial_fwdtable( ns_dbus_mgr_t *mgr ){    tdestroy(mgr->ifwdt, dbus_mgr_free_initial_forwarder);    mgr->ifwdt = 0L;}static voiddbus_mgr_log_forwarders( const char *pfx, dns_name_t *name, SockAddrList *saList){    isc_sockaddr_t   *sa;    char nameP[DNS_NAME_FORMATSIZE], addrP[128];    int s=0;    dns_name_format(name, nameP, DNS_NAME_FORMATSIZE );        for( sa = ISC_LIST_HEAD(*saList);	 sa != 0L;	 sa = ISC_LIST_NEXT(sa,link)	)    {	isc_sockaddr_format(sa, addrP, 128);	dbus_mgr_log_info("%s zone %s server %d: %s", pfx, nameP, s++, addrP);    }		}staticisc_result_t dbus_mgr_set_forwarders(       ns_dbus_mgr_t *mgr,    DNSNameList *nameList,    SockAddrList *saList,    dns_fwdpolicy_t fwdpolicy){    isc_result_t   result = ISC_R_SUCCESS;        dns_fwdtable_t *fwdtable;    dns_view_t     *view=0L;    dns_name_t     *dnsName;    isc_sockaddr_t   *sa, *nsa;    dns_forwarders_t *fwdr=0L;    fwdtable = dbus_mgr_get_view_and_fwdtable(&view);    if( fwdtable == 0L )    {	if( ISC_LIST_HEAD(*saList) == 0L )	    return ISC_R_SUCCESS;/* deletion not required */	view = dbus_mgr_get_localhost_view();	if( view == 0L )	    return ISC_R_NOPERM; /* if configuration does not allow localhost clients,				  * then we really shouldn't be creating a forwarding table.				  */	result = isc_task_beginexclusive(mgr->task);	if( result == ISC_R_SUCCESS )	{	    result = dns_fwdtable_create( mgr->mctx, &(view->fwdtable) );	    isc_task_endexclusive(mgr->task);	    if( result != ISC_R_SUCCESS )		return result;	    if( view->fwdtable == 0L )		return ISC_R_NOMEMORY;	    if( isc_log_getdebuglevel(ns_g_lctx) >= 1 )		dbus_mgr_log_info("Created forwarder table.");	}    }	    for( dnsName = ISC_LIST_HEAD(*nameList);	 dnsName != NULL;	 dnsName = ISC_LIST_NEXT(dnsName,link)	)    {   		fwdr = 0L;	if( ( dns_fwdtable_find_exact( fwdtable, dnsName, &fwdr ) != ISC_R_SUCCESS )	  ||( fwdr == 0L )	  )	{ 	    if( ISC_LIST_HEAD( *saList )  == 0L )		continue;	   /* no forwarders for name - add forwarders */	    result = isc_task_beginexclusive(mgr->task);	    if( result == ISC_R_SUCCESS )	    {		result = dns_fwdtable_add( fwdtable, dnsName, 					   (isc_sockaddrlist_t*)saList, 					   fwdpolicy					 ) ;		if( view != 0L )		    dns_view_flushcache( view );		isc_task_endexclusive(mgr->task);			if( result != ISC_R_SUCCESS )		    return result;		if( isc_log_getdebuglevel(ns_g_lctx) >= 1 )		    dbus_mgr_log_forwarders("Created forwarder",dnsName, saList);	    }	    continue;	}	if( ISC_LIST_HEAD( *saList ) == 0L )	{ /* empty forwarders list - delete forwarder entry */	    if( isc_log_getdebuglevel(ns_g_lctx) >= 1 )		dbus_mgr_log_forwarders("Deleting forwarder", dnsName, (SockAddrList*)&(fwdr->addrs));	    result = isc_task_beginexclusive(mgr->task);	    if( result == ISC_R_SUCCESS )	    {		result = dns_fwdtable_delete( fwdtable, dnsName );		if( view != 0L )		    dns_view_flushcache( view );		isc_task_endexclusive(mgr->task);		if( result != ISC_R_SUCCESS )		    return result;		    }	    continue;	}		result = isc_task_beginexclusive(mgr->task);	if( result == ISC_R_SUCCESS )	{	 	   	    fwdr->fwdpolicy = fwdpolicy;	    if( isc_log_getdebuglevel(ns_g_lctx) >= 1 )		dbus_mgr_log_forwarders("Removing forwarder", dnsName, (SockAddrList*)&(fwdr->addrs));	    	    for( sa = ISC_LIST_HEAD(fwdr->addrs);		 sa != 0L ;		 sa = ISC_LIST_HEAD(fwdr->addrs)	       )	    {		if( ISC_LINK_LINKED(sa, link) )		    ISC_LIST_UNLINK(fwdr->addrs, sa, link);		isc_mem_put(mgr->mctx, sa, sizeof(isc_sockaddr_t));	    }	    ISC_LIST_INIT( fwdr->addrs );	    	    for( sa = ISC_LIST_HEAD(*saList);		 sa != 0L;		 sa = ISC_LIST_NEXT(sa,link)	       )	    {		nsa = isc_mem_get(mgr->mctx, sizeof(isc_sockaddr_t));		if( nsa == 0L )		{		    result = ISC_R_NOMEMORY;		    break;		}		*nsa = *sa;		ISC_LINK_INIT( nsa, link );		ISC_LIST_APPEND( fwdr->addrs, nsa, link );	    }	    	    if( view != 0L )		dns_view_flushcache( view );	    isc_task_endexclusive(mgr->task);	    if( isc_log_getdebuglevel(ns_g_lctx) >= 1 )		dbus_mgr_log_forwarders("Added forwarder", dnsName, (SockAddrList*)&(fwdr->addrs));	}else	    return result;    }    return (result);}static voiddbus_mgr_get_name_list(     ns_dbus_mgr_t *mgr,    char *domains,     DNSNameList *nameList,    char *error_name,    char *error_message){    char *name, *endName, *endp;    dns_fixedname_t *fixedname;    dns_name_t      *dnsName;    isc_buffer_t     buffer;    isc_result_t     result;    uint32_t total_length;        total_length = strlen(domains);    endp = domains + total_length;    ISC_LIST_INIT( *nameList );    for( name =   domains + strspn(domains," \t\n"),	 endName = name + strcspn(name," \t\n");	 (name < endp) && (endName <= endp); 	 name =  endName + 1 + strspn(endName+1," \t\n"),	 endName = name + strcspn(name," \t\n")       )    {  /* name loop */	*endName = '\0';	isc_buffer_init( &buffer, name, endName - name );	isc_buffer_add(&buffer, endName - name);				fixedname = isc_mem_get( mgr->mctx, sizeof( dns_fixedname_t ));	dns_fixedname_init(fixedname);	dnsName = dns_fixedname_name(fixedname);	result= dns_name_fromtext	        (  dnsName, &buffer, ( *(endp-1) != '.') ? dns_rootname : NULL, ISC_FALSE, NULL		); 	if( result != ISC_R_SUCCESS )	{	    sprintf(error_name, "com.redhat.named.InvalidArgument");	    sprintf(error_message,"Invalid DNS name initial argument: %s", name);	    	    isc_mem_put( mgr->mctx, fixedname, sizeof( dns_fixedname_t ) );	    for( dnsName = ISC_LIST_HEAD( *nameList );		 (dnsName != 0L);		 dnsName = ISC_LIST_HEAD( *nameList )	       )	    {		if( ISC_LINK_LINKED(dnsName,link) )		    ISC_LIST_DEQUEUE( *nameList, dnsName, link );		isc_mem_put( mgr->mctx, dnsName, sizeof( dns_fixedname_t ) );	    }	    ISC_LIST_INIT(*nameList);	    return;	}	ISC_LINK_INIT(dnsName, link);	ISC_LIST_ENQUEUE( *nameList, dnsName, link );    }}static isc_result_tdbus_mgr_get_sa_list(    ns_dbus_mgr_t *mgr,    dbus_svc_MessageIterator iter,    SockAddrList *saList ,    uint8_t *fwdpolicy,    char *error_name,    char *error_message){    DBUS_SVC dbus = mgr->dbus;    isc_sockaddr_t *nsSA=0L, *nsSA_Q=0L;    uint32_t argType = dbus_svc_message_next_arg_type( dbus, iter ), 	     length;        isc_result_t result;    in_port_t port;    char *ip;    uint8_t *iparray=0L;    ISC_LIST_INIT(*saList);    if( argType == TYPE_INVALID ) 	return ISC_R_SUCCESS; /* address list "removal" */       do    {	switch( argType )	{	case TYPE_UINT32:	    nsSA = isc_mem_get(mgr->mctx, sizeof(isc_sockaddr_t));	    if( nsSA != 0L )	    {		memset(nsSA,'\0', sizeof(isc_sockaddr_t));		nsSA_Q = nsSA;		dbus_svc_message_next_arg(dbus, iter, &(nsSA->type.sin.sin_addr.s_addr));			nsSA->type.sa.sa_family = AF_INET;		nsSA->length = sizeof( nsSA->type.sin );	    }	    break;	case TYPE_ARRAY:	    argType = dbus_svc_message_element_type( dbus, iter );	    if( argType == TYPE_BYTE )	    {		iparray = 0L;		length = 0;		dbus_svc_message_get_elements(dbus, iter, &length, &iparray);		

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?