dbus_mgr.c
来自「非常好的dns解析软件」· C语言 代码 · 共 2,442 行 · 第 1/5 页
C
2,442 行
if( iparray != 0L ) { if (length == sizeof( struct in_addr )) { nsSA = isc_mem_get(mgr->mctx, sizeof(isc_sockaddr_t)); if( nsSA != 0L ) { memset(nsSA,'\0', sizeof(isc_sockaddr_t)); nsSA_Q = nsSA; memcpy(&(nsSA->type.sin.sin_addr), iparray, sizeof( struct in_addr )); nsSA->type.sa.sa_family = AF_INET; nsSA->length = sizeof( nsSA->type.sin ); } }else if (length == sizeof( struct in6_addr )) { nsSA = isc_mem_get(mgr->mctx, sizeof(isc_sockaddr_t)); if( nsSA != 0L ) { memset(nsSA,'\0', sizeof(isc_sockaddr_t)); nsSA_Q = nsSA; memcpy(&(nsSA->type.sin6.sin6_addr), iparray, sizeof( struct in6_addr )); nsSA->type.sa.sa_family = AF_INET6; nsSA->length = sizeof( nsSA->type.sin6 ); } } } } break; case TYPE_STRING: ip = 0L; dbus_svc_message_next_arg(dbus, iter, &(ip)); if( ip != 0L ) { length = strlen(ip); if( strspn(ip, "0123456789.") == length ) { nsSA = isc_mem_get(mgr->mctx, sizeof(isc_sockaddr_t)); if( nsSA != 0L) { memset(nsSA,'\0', sizeof(isc_sockaddr_t)); if( inet_pton( AF_INET, ip, &(nsSA->type.sin.sin_addr)) ) { nsSA->type.sa.sa_family = AF_INET; nsSA->length = sizeof(nsSA->type.sin); nsSA_Q = nsSA; } } }else if( strspn(ip, "0123456789AaBbCcDdEeFf:.") == length) { nsSA = isc_mem_get(mgr->mctx, sizeof(isc_sockaddr_t)); if( nsSA != 0L ) { memset(nsSA,'\0', sizeof(isc_sockaddr_t)); if( inet_pton( AF_INET6, ip, &(nsSA->type.sin6.sin6_addr)) ) { nsSA->type.sa.sa_family = AF_INET6; nsSA->length = sizeof(nsSA->type.sin6); nsSA_Q = nsSA; } } } } break; case TYPE_UINT16: if( (nsSA == 0L) || (nsSA->type.sa.sa_family == AF_UNSPEC) ) break; else if( nsSA->type.sa.sa_family == AF_INET ) dbus_svc_message_next_arg(dbus, iter, &(nsSA->type.sin.sin_port)); else if( nsSA->type.sa.sa_family == AF_INET6 ) dbus_svc_message_next_arg(dbus, iter, &(nsSA->type.sin6.sin6_port)); break; case TYPE_BYTE: dbus_svc_message_next_arg(dbus, iter, fwdpolicy); if(*fwdpolicy > dns_fwdpolicy_only) *fwdpolicy = dns_fwdpolicy_only; break; default: if(nsSA != 0L) nsSA->type.sa.sa_family = AF_UNSPEC; sprintf(error_message,"Unhandled argument type: %c", argType); break; } if( (nsSA != 0L) &&(nsSA->type.sa.sa_family == AF_UNSPEC) ) { sprintf(error_name, "com.redhat.named.InvalidArgument"); if( error_message[0]=='\0') { if( nsSA == 0L ) sprintf(error_message,"Missing IP Address Name Server argument"); else sprintf(error_message,"Bad IP Address Name Server argument"); } if( nsSA != 0L ) isc_mem_put(mgr->mctx, nsSA, sizeof(isc_sockaddr_t)); nsSA = 0L; for( nsSA = ISC_LIST_HEAD( *saList ); (nsSA != 0L); nsSA = ISC_LIST_HEAD( *saList ) ) { if(ISC_LINK_LINKED(nsSA, link)) ISC_LIST_DEQUEUE( *saList, nsSA, link ); isc_mem_put( mgr->mctx, nsSA, sizeof( isc_sockaddr_t ) ); } ISC_LIST_INIT(*saList); return ISC_R_FAILURE; } if( nsSA != 0L ) { if( nsSA->type.sin.sin_port == 0 ) { if( ns_g_port != 0L ) nsSA->type.sin.sin_port = htons(ns_g_port); else { result = ns_config_getport(ns_g_config, &(port) ); if( result != ISC_R_SUCCESS ) port = 53; nsSA->type.sin.sin_port = htons( port ); } } if( nsSA_Q != 0L ) { ISC_LINK_INIT(nsSA,link); ISC_LIST_ENQUEUE(*saList, nsSA, link); nsSA_Q = 0L; } } argType = dbus_svc_message_next_arg_type( dbus, iter ); } while ( argType != TYPE_INVALID ); return ISC_R_SUCCESS;}static voiddbus_mgr_handle_set_forwarders( ns_dbus_mgr_t *mgr, DBUS_SVC dbus, uint8_t reply_expected, uint32_t serial, const char *path, const char *member, const char *interface, const char *sender, dbus_svc_MessageHandle msg){ dbus_svc_MessageIterator iter; char error_name[1024]="", error_message[1024]="", *domains=0L; uint32_t argType, new_serial; DNSNameList nameList; dns_name_t *dnsName; SockAddrList saList; isc_sockaddr_t *nsSA; isc_result_t result; uint8_t fwdpolicy = dns_fwdpolicy_only; iter = dbus_svc_message_iterator_new( dbus, msg ); if( iter == 0L ) { if( reply_expected ) { sprintf(error_name, "com.redhat.named.InvalidArguments"); sprintf(error_message,"SetForwarders requires DNS name and nameservers arguments."); dbus_svc_send( dbus, ERROR, serial, &new_serial, sender, path, interface, member, TYPE_STRING, error_name, TYPE_STRING, error_message, TYPE_INVALID ); } return; } argType = dbus_svc_message_next_arg_type( dbus, iter ); if( argType != TYPE_STRING ) { if( reply_expected ) { sprintf(error_name, "com.redhat.named.InvalidArguments"); sprintf(error_message,"SetForwarders requires DNS name string initial argument."); dbus_svc_send( dbus, ERROR, serial, &new_serial, sender, path, interface, member, TYPE_STRING, error_name, TYPE_STRING, error_message, TYPE_INVALID ); } return; } dbus_svc_message_next_arg( dbus, iter, &domains ); if( ( domains == 0L ) || (*domains == '\0') ) { if( reply_expected ) { sprintf(error_name, "com.redhat.named.InvalidArguments"); sprintf(error_message,"SetForwarders requires DNS name string initial argument."); dbus_svc_send( dbus, ERROR, serial, &new_serial, sender, path, interface, member, TYPE_STRING, error_name, TYPE_STRING, error_message, TYPE_INVALID ); } return; } dbus_mgr_get_name_list( mgr, domains, &nameList, error_name, error_message ); if( error_name[0] != '\0' ) { if( reply_expected ) { dbus_svc_send( dbus, ERROR, serial, &new_serial, sender, path, interface, member, TYPE_STRING, error_name, TYPE_STRING, error_message, TYPE_INVALID ); } return; } if( ISC_LIST_HEAD( nameList ) == 0L ) return; result = dbus_mgr_get_sa_list( mgr, iter, &saList , &fwdpolicy, error_name, error_message ); if( result == ISC_R_SUCCESS ) { result = dbus_mgr_set_forwarders( mgr, &nameList, &saList, fwdpolicy ); if( result != ISC_R_SUCCESS ) { if( reply_expected ) { sprintf(error_name, "com.redhat.named.Failure"); sprintf(error_message, isc_result_totext(result)); dbus_svc_send( dbus, ERROR, serial, &new_serial, sender, path, interface, member, TYPE_STRING, error_name, TYPE_STRING, error_message, TYPE_INVALID ); } }else if( reply_expected ) dbus_svc_send( dbus, RETURN, serial, &new_serial, sender, path, interface, member, TYPE_UINT32, &result, TYPE_INVALID ); }else { if( reply_expected ) { dbus_svc_send( dbus, ERROR, serial, &new_serial, sender, path, interface, member, TYPE_STRING, error_name, TYPE_STRING, error_message, TYPE_INVALID ); } } 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 ) ); } for( nsSA = ISC_LIST_HEAD(saList); (nsSA != 0L) ; nsSA = ISC_LIST_HEAD(saList) ) { if( ISC_LINK_LINKED(nsSA,link) ) ISC_LIST_DEQUEUE( saList, nsSA, link ); isc_mem_put(mgr->mctx, nsSA, sizeof(isc_sockaddr_t)); }}static int dbus_mgr_msg_append_dns_name( DBUS_SVC dbus, dbus_svc_MessageHandle msg, dns_name_t *name){ char nameBuf[ DNS_NAME_FORMATSIZE ]="", *nameP=&(nameBuf[0]); dns_name_format(name, nameP, DNS_NAME_FORMATSIZE ); if( *nameP == '\0' ) return 0; return dbus_svc_message_append_args( dbus, msg, TYPE_STRING, &nameP, TYPE_INVALID ) > 0;}typedef enum dbmoi_e{ OUTPUT_BINARY, OUTPUT_TEXT } DBusMgrOutputInterface;static int dbus_mgr_msg_append_forwarders( DBUS_SVC dbus, dbus_svc_MessageHandle msg, dns_forwarders_t *fwdr, DBusMgrOutputInterface outputType){ isc_sockaddr_t *sa; char policyBuf[16]="", *pbp[1]={&(policyBuf[0])}, addressBuf[64]="", *abp[1]={&(addressBuf[0])}; uint8_t *byteArray[1]; if( outputType == OUTPUT_BINARY ) { if(!dbus_svc_message_append_args ( dbus, msg, TYPE_BYTE, &(fwdr->fwdpolicy), TYPE_INVALID ) ) return 0; }else if( outputType == OUTPUT_TEXT ) { sprintf(policyBuf,"%s", (fwdr->fwdpolicy == dns_fwdpolicy_none) ? "none" : (fwdr->fwdpolicy == dns_fwdpolicy_first) ? "first" : "only" ); if(!dbus_svc_message_append_args ( dbus, msg, TYPE_STRING, pbp, TYPE_INVALID ) ) return 0; }else return 0; for( sa = ISC_LIST_HEAD(fwdr->addrs); sa != 0L; sa = ISC_LIST_NEXT(sa, link) ) { if( outputType == OUTPUT_BINARY ) { if( sa->type.sa.sa_family == AF_INET ) { if(!dbus_svc_message_append_args ( dbus, msg, TYPE_UINT32, &(sa->type.sin.sin_addr.s_addr), TYPE_INVALID ) ) return 0; if(!dbus_svc_message_append_args ( dbus, msg, TYPE_UINT16, &(sa->type.sin.sin_port), TYPE_INVALID ) ) return 0; }else if( sa->type.sa.sa_family == AF_INET6 ) { byteArray[0] = (uint8_t*)&(sa->type.sin6.sin6_addr); if(!dbus_svc_message_append_args ( dbus, msg, TYPE_ARRAY, TYPE_BYTE, &byteArray, sizeof(struct in6_addr), TYPE_INVALID ) ) return 0; if(!dbus_svc_message_append_args ( dbus, msg, TYPE_UINT16, &(sa->type.sin6.sin6_port), TYPE_INVALID ) ) return 0; }else continue; }else if( outputType == OUTPUT_TEXT ) { if( sa->type.sa.sa_family == AF_INET ) { if( inet_ntop( AF_INET, &(sa->type.sin.sin_addr), addressBuf, sizeof(addressBuf)) == 0L ) continue; if(!dbus_svc_message_append_args ( dbus, msg, TYPE_STRING, abp, TYPE_INVALID ) ) return 0; sprintf(addressBuf, "%hu", ntohs( sa->type.sin.sin_port )); if(!dbus_svc_message_append_args ( dbus, msg, TYPE_STRING, abp, TYPE_INVALID ) ) return 0; }else if( sa->type.sa.sa_family == AF_INET6 ) { if( inet_ntop( AF_INET6, &(sa->type.sin6.sin6_addr), addressBuf, sizeof(addressBuf)) == 0L ) continue; if(!dbus_svc_message_append_args ( dbus, msg, TYPE_STRING, abp, TYPE_INVALID ) ) return 0; sprintf(addressBuf, "%hu", ntohs( sa->type.sin6.sin6_port )); if(!dbus_svc_message_append_args ( dbus, msg, TYPE_STRING, abp, TYPE_INVALID ) ) return 0; }else continue; }else return 0; } return 1;}typedef struct dbm_m_s{ DBUS_SVC dbus; dbus_svc_MessageHandle msg; DBusMgrOutputInterface outputType;} DBusMgrMsg;staticvoid forwarders_to_msg( dns_name_t *name, dns_forwarders_t *fwdr, void *mp ){ DBusMgrMsg *m = mp; if( (fwdr == 0L) || (name == 0L) || (mp == 0L)) return; dbus_mgr_msg_append_dns_name ( m->dbus, m->msg, name ); dbus_mgr_msg_append_forwarders( m->dbus, m->msg, fwdr, m->outputType ); }static voiddbus_mgr_handle_list_forwarders( DBUS_SVC dbus, uint8_t reply_expected, uint32_t serial, const char *path, const char *member, const char *interface, const char *sender, dbus_svc_MessageHandle msg){ char error_name[1024], error_message[1024]; DBusMgrMsg m; uint32_t new_serial; dns_fwdtable_t *fwdtable = dbus_mgr_get_fwdtable(); DBusMgrOutputInterface outputType = OUTPUT_BINARY; uint32_t length = strlen(interface); if( !reply_expected ) return; if( (length > 4) && (strcmp(interface + (length - 4), "text")==0)) outputType = OUTPUT_TEXT; if( fwdtable == 0L ) { sprintf(error_name,"com.redhat.dbus.Failure"); sprintf(error_message, "%s", isc_result_totext(ISC_R_NOPERM));
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?