📄 bind-9.3.2b1-dbus.patch
字号:
--- bind-9.3.2b1/lib/dns/rbt.c.dbus 2005-06-17 21:03:24.000000000 -0400+++ bind-9.3.2b1/lib/dns/rbt.c 2005-10-07 12:43:26.000000000 -0400@@ -2172,6 +2172,47 @@ dns_rbt_printtree(rbt->root, NULL, 0); } +static void+dns_rbt_traverse_tree(dns_rbtnode_t *root, dns_rbt_traverse_callback_t cb, void *cb_arg1, void *cb_arg2 ) {+/*+ * This is used ONLY to traverse the forward table by dbus_mgr at the moment.+ * Since the forward table is not likely to be large, this can be recursive.+ */+ dns_name_t name;+ dns_offsets_t offsets;+ char buf[DNS_NAME_MAXWIRE];+ isc_buffer_t buffer;++ if (root != NULL) {++ if (DOWN(root)) + dns_rbt_traverse_tree(DOWN(root), cb, cb_arg1, cb_arg2);++ if( LEFT(root) != NULL )+ dns_rbt_traverse_tree(LEFT(root), cb, cb_arg1, cb_arg2);++ if( RIGHT(root) != NULL )+ dns_rbt_traverse_tree(RIGHT(root), cb, cb_arg1, cb_arg2);++ if( DATA(root) == 0L )+ return;++ dns_name_init(&name, offsets);+ isc_buffer_init(&buffer, buf, DNS_NAME_MAXWIRE);+ dns_name_setbuffer( &name, &buffer);+ dns_rbt_fullnamefromnode(root, &name);+ + (*cb)(&name, DATA(root), cb_arg1, cb_arg2); + } +}++void dns_rbt_traverse( dns_rbt_t *rbt, dns_rbt_traverse_callback_t cb, void *cb_arg1, void *cb_arg2 )+{+ REQUIRE(VALID_RBT(rbt));++ dns_rbt_traverse_tree( rbt->root, cb, cb_arg1, cb_arg2 ); +}+ /* * Chain Functions */--- bind-9.3.2b1/lib/dns/forward.c.dbus 2005-03-16 22:58:30.000000000 -0500+++ bind-9.3.2b1/lib/dns/forward.c 2005-10-07 12:43:26.000000000 -0400@@ -200,3 +200,89 @@ } isc_mem_put(fwdtable->mctx, forwarders, sizeof(dns_forwarders_t)); }++/***+ *** new D-BUS Dynamic Forwarding Zones functions:+ ***/+isc_result_t+dns_fwdtable_delete(dns_fwdtable_t *fwdtable, dns_name_t *name )+{+ isc_result_t result;++ REQUIRE(VALID_FWDTABLE(fwdtable));++ RWLOCK(&fwdtable->rwlock, isc_rwlocktype_write);++ result = dns_rbt_deletename(fwdtable->table, name, ISC_FALSE);++ RWUNLOCK(&fwdtable->rwlock, isc_rwlocktype_write); ++ return (result);+}++isc_result_t+dns_fwdtable_find_closest(dns_fwdtable_t *fwdtable, + dns_name_t *name, + dns_name_t *foundname,+ dns_forwarders_t **forwardersp)+{+ isc_result_t result;++ REQUIRE(VALID_FWDTABLE(fwdtable));+ + RWLOCK(&fwdtable->rwlock, isc_rwlocktype_read);++ result = dns_rbt_findname(fwdtable->table, name, 0, foundname,+ (void **)forwardersp);+ + if(result == DNS_R_PARTIALMATCH)+ result = ISC_R_SUCCESS;++ RWUNLOCK(&fwdtable->rwlock, isc_rwlocktype_read);++ return (result);+}++isc_result_t+dns_fwdtable_find_exact(dns_fwdtable_t *fwdtable, dns_name_t *name,+ dns_forwarders_t **forwardersp)+{+ isc_result_t result;++ REQUIRE(VALID_FWDTABLE(fwdtable));++ REQUIRE(forwardersp != 0L);++ RWLOCK(&fwdtable->rwlock, isc_rwlocktype_read);++ result = dns_rbt_findname(fwdtable->table, name, 0, NULL,+ (void **)forwardersp);+ + if( result != ISC_R_SUCCESS )+ *forwardersp = 0L;++ RWUNLOCK(&fwdtable->rwlock, isc_rwlocktype_read);++ return (result);+}++static +void dns_fwdtable_traverse+( + dns_name_t *name,+ void *node_data,+ void *cbp,+ void *cb_arg+)+{+ dns_fwdtable_callback_t cb = (dns_fwdtable_callback_t) cbp;+ + (*cb)( name, node_data, cb_arg);+}++void dns_fwdtable_foreach(dns_fwdtable_t *fwdtable, dns_fwdtable_callback_t cb, void *cb_arg )+{+ REQUIRE(VALID_FWDTABLE(fwdtable));++ dns_rbt_traverse( fwdtable->table, dns_fwdtable_traverse, cb, cb_arg );+}--- bind-9.3.2b1/lib/dns/include/dns/forward.h.dbus 2005-03-16 22:58:31.000000000 -0500+++ bind-9.3.2b1/lib/dns/include/dns/forward.h 2005-10-07 12:43:26.000000000 -0400@@ -98,6 +98,37 @@ * all memory associated with the forwarding table is freed. */ ++/* These are ONLY used by dbus_mgr :+ */++isc_result_t+dns_fwdtable_delete( dns_fwdtable_t *fwdtable, dns_name_t *name );+/* + * Removes an entry from the forwarding table.+ */++isc_result_t+dns_fwdtable_find_exact(dns_fwdtable_t *fwdtable, dns_name_t *name,+ dns_forwarders_t **forwardersp);+/*+ * Finds an exact match for "name" in the forwarding table. + */++isc_result_t+dns_fwdtable_find_closest(dns_fwdtable_t *fwdtable, dns_name_t *name, dns_name_t *foundname,+ dns_forwarders_t **forwardersp);+/*+ * Finds the closest match for "*name" in the forwarding table, returning + * the actual name matching in *name if different to *name passed in. + */++typedef void (*dns_fwdtable_callback_t)( dns_name_t *, dns_forwarders_t *, void *);+void dns_fwdtable_foreach(dns_fwdtable_t *fwdtable, dns_fwdtable_callback_t cb, void * );+/* Invoke cb for each member of fwdtable + */++ ISC_LANG_ENDDECLS #endif /* DNS_FORWARD_H */--- bind-9.3.2b1/lib/dns/include/dns/rbt.h.dbus 2004-10-11 01:55:51.000000000 -0400+++ bind-9.3.2b1/lib/dns/include/dns/rbt.h 2005-10-07 12:43:26.000000000 -0400@@ -833,6 +833,17 @@ * <something_else> Any error result from dns_name_concatenate. */ ++typedef void (*dns_rbt_traverse_callback_t)( dns_name_t *name,+ void *node_data,+ void *cb_arg1,+ void *cb_arg2);++void dns_rbt_traverse( dns_rbt_t *rbt, dns_rbt_traverse_callback_t cb, void *cb_arg1, void *cb_arg2 );+/* tree traversal function (only used by D-BUS dynamic forwarding dbus_mgr at+ * the moment)+ */+ ISC_LANG_ENDDECLS #endif /* DNS_RBT_H */--- bind-9.3.2b1/lib/isc/unix/socket.c.dbus 2005-08-25 00:32:55.000000000 -0400+++ bind-9.3.2b1/lib/isc/unix/socket.c 2005-10-07 13:40:03.000000000 -0400@@ -148,6 +148,11 @@ ISC_LIST(isc_socketevent_t) recv_list; ISC_LIST(isc_socket_newconnev_t) accept_list; isc_socket_connev_t *connect_ev;+ + /* these are used only by isc_sockettype_fd sockets:*/+ isc_socketevent_t *read_ready_event;+ isc_socketevent_t *write_ready_event;+ isc_socketevent_t *selected_event; /* * Internal events. Posted when a descriptor is readable or@@ -304,7 +309,7 @@ static void wakeup_socket(isc_socketmgr_t *manager, int fd, int msg) {- isc_socket_t *sock;+ isc_socket_t *sock=0L; /* * This is a wakeup on a socket. If the socket is not in the@@ -1266,6 +1271,9 @@ sock->connected = 0; sock->connecting = 0; sock->bound = 0;+ sock->read_ready_event = 0L;+ sock->write_ready_event = 0L;+ sock->selected_event = 0L; /* * initialize the lock@@ -1378,13 +1386,16 @@ case isc_sockettype_tcp: sock->fd = socket(pf, SOCK_STREAM, IPPROTO_TCP); break;++ case isc_sockettype_fd:+ sock->fd = pf; } #ifdef F_DUPFD /* * Leave a space for stdio to work in. */- if (sock->fd >= 0 && sock->fd < 20) {+ if ( (type != isc_sockettype_fd) && (sock->fd >= 0) && (sock->fd < 20) ) { int new, tmp; new = fcntl(sock->fd, F_DUPFD, 20); tmp = errno;@@ -1438,7 +1449,7 @@ } } - if (make_nonblock(sock->fd) != ISC_R_SUCCESS) {+ if ((type != isc_sockettype_fd) && (make_nonblock(sock->fd) != ISC_R_SUCCESS)) { (void)close(sock->fd); free_socket(&sock); return (ISC_R_UNEXPECTED);@@ -1706,6 +1717,38 @@ isc_task_send(ev->ev_sender, (isc_event_t **)&iev); } +static+isc_event_t *dispatch_read_ready(isc_socketmgr_t *manager, isc_socket_t *sock)+{+ isc_event_t *dev = (isc_event_t*)sock->read_ready_event, *ev;+ + ev = isc_mem_get(manager->mctx, dev->ev_size);+ memcpy(ev,dev,dev->ev_size);+ ISC_LINK_INIT(ev,ev_link);+ isc_task_send(dev->ev_sender, &ev );+ return (isc_event_t *)sock->selected_event;+}++static+isc_event_t *dispatch_write_ready(isc_socketmgr_t *manager,isc_socket_t *sock)+{+ isc_event_t *dev = (isc_event_t*)sock->write_ready_event, *ev;+ ev = isc_mem_get(manager->mctx, dev->ev_size);+ memcpy(ev,dev,dev->ev_size);+ ISC_LINK_INIT(ev,ev_link);+ isc_task_send(dev->ev_sender, &ev );+ return (isc_event_t *)sock->selected_event;+}++static+void dispatch_selected(isc_socketmgr_t *manager, isc_event_t *dev)+{ isc_event_t *ev;+ ev = isc_mem_get(manager->mctx, dev->ev_size);+ memcpy(ev,dev,dev->ev_size);+ ISC_LINK_INIT(ev,ev_link);+ isc_task_send(dev->ev_sender, &ev );+}+ /* * Dequeue an item off the given socket's read queue, set the result code * in the done event to the one provided, and send it to the task it was@@ -2113,6 +2156,7 @@ int i; isc_socket_t *sock; isc_boolean_t unlock_sock;+ isc_event_t *sock_selected = 0L; REQUIRE(maxfd <= (int)FD_SETSIZE); @@ -2146,11 +2190,15 @@ unlock_sock = ISC_TRUE; LOCK(&sock->lock); if (!SOCK_DEAD(sock)) {+ if( sock->type != isc_sockettype_fd )+ { if (sock->listener) dispatch_accept(sock); else dispatch_recv(sock);- }+ }else + sock_selected = dispatch_read_ready(manager,sock);+ } FD_CLR(i, &manager->read_fds); } check_write:@@ -2164,16 +2212,24 @@ LOCK(&sock->lock); } if (!SOCK_DEAD(sock)) {+ if( sock->type != isc_sockettype_fd )+ { if (sock->connecting) dispatch_connect(sock); else dispatch_send(sock);+ }else + sock_selected = dispatch_write_ready(manager,sock); } FD_CLR(i, &manager->write_fds); } if (unlock_sock) UNLOCK(&sock->lock); }+ if( sock_selected != 0L )+ {+ dispatch_selected(manager, sock_selected);+ } } #ifdef ISC_PLATFORM_USETHREADS@@ -2192,7 +2248,7 @@ int cc; fd_set readfds; fd_set writefds;- int msg, fd;+ int msg, fd = -1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -