| |
| |
| @@ -136,6 +136,10 @@ struct isc_socket_connev { |
| #define ISC_SOCKEVENT_NEWCONN (ISC_EVENTCLASS_SOCKET + 3) |
| #define ISC_SOCKEVENT_CONNECT (ISC_EVENTCLASS_SOCKET + 4) |
| |
| +#define ISC_SOCKEVENT_READ_READY (ISC_EVENTCLASS_SOCKET + 5) |
| +#define ISC_SOCKEVENT_WRITE_READY (ISC_EVENTCLASS_SOCKET + 6) |
| +#define ISC_SOCKEVENT_SELECTED (ISC_EVENTCLASS_SOCKET + 7) |
| + |
| /* |
| * Internal events. |
| */ |
| @@ -147,6 +151,7 @@ typedef enum { |
| isc_sockettype_tcp = 2, |
| isc_sockettype_unix = 3, |
| isc_sockettype_fdwatch = 4, |
| + isc_sockettype_fd = 8 |
| } isc_sockettype_t; |
| |
| /*@{*/ |
| @@ -823,6 +828,54 @@ isc_socketmgr_renderxml(isc_socketmgr_t |
| |
| #endif /* HAVE_LIBXML2 */ |
| |
| +isc_socketevent_t* |
| +isc_socket_fd_handle_reads( isc_socket_t *sock, isc_socketevent_t *dev ); |
| +/* register the "dev" event to be sent when the isc_sockettype_fd sock |
| + * was select()-ed for read. If there is already an event registered, it |
| + * is returned, otherwise 0 is returned. If dev is 0, removes any existing |
| + * registered event. |
| + */ |
| + |
| +isc_socketevent_t* |
| +isc_socket_fd_handle_writes( isc_socket_t *sock, isc_socketevent_t *dev ); |
| +/* register the "dev" event to be sent when the isc_sockettype_fd sock |
| + * was select()-ed for write. If there is already an event registered, it |
| + * is returned, otherwise 0 is returned. If dev is 0, removes any existing |
| + * registered event. |
| + */ |
| + |
| +isc_socketevent_t* |
| +isc_socket_fd_handle_selected( isc_socket_t *sock, isc_socketevent_t *dev ); |
| +/* register the "dev" event to be sent when ALL isc_sockettype_fd sockets |
| + * have been select()-ed . If there is already an event registered, it |
| + * is returned, otherwise 0 is returned. If dev is 0, removes any existing |
| + * registered event. |
| + */ |
| + |
| +isc_socketevent_t* |
| +isc_socket_fd_handle_reads( isc_socket_t *sock, isc_socketevent_t *dev ); |
| +/* register the "dev" event to be sent when the isc_sockettype_fd sock |
| + * was select()-ed for read. If there is already an event registered, it |
| + * is returned, otherwise 0 is returned. If dev is 0, removes any existing |
| + * registered event. |
| + */ |
| + |
| +isc_socketevent_t* |
| +isc_socket_fd_handle_writes( isc_socket_t *sock, isc_socketevent_t *dev ); |
| +/* register the "dev" event to be sent when the isc_sockettype_fd sock |
| + * was select()-ed for write. If there is already an event registered, it |
| + * is returned, otherwise 0 is returned. If dev is 0, removes any existing |
| + * registered event. |
| + */ |
| + |
| +isc_socketevent_t* |
| +isc_socket_fd_handle_selected( isc_socket_t *sock, isc_socketevent_t *dev ); |
| +/* register the "dev" event to be sent when ALL isc_sockettype_fd sockets |
| + * have been select()-ed . If there is already an event registered, it |
| + * is returned, otherwise 0 is returned. If dev is 0, removes any existing |
| + * registered event. |
| + */ |
| + |
| ISC_LANG_ENDDECLS |
| |
| #endif /* ISC_SOCKET_H */ |
| |
| |
| @@ -176,6 +176,11 @@ struct isc_socket { |
| 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 |
| @@ -340,7 +345,7 @@ socket_log(isc_socket_t *sock, isc_socka |
| |
| 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 |
| @@ -1341,6 +1346,9 @@ allocate_socket(isc_socketmgr_t *manager |
| 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 |
| @@ -1499,6 +1507,8 @@ isc_socket_create(isc_socketmgr_t *manag |
| case isc_sockettype_fdwatch: |
| INSIST(type != isc_sockettype_fdwatch); |
| break; |
| + case isc_sockettype_fd: |
| + sock->fd = pf; |
| } |
| if (sock->fd == -1 && errno == EINTR && try++ < 42) |
| goto again; |
| @@ -1507,7 +1517,7 @@ isc_socket_create(isc_socketmgr_t *manag |
| /* |
| * 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; |
| @@ -1561,7 +1571,7 @@ isc_socket_create(isc_socketmgr_t *manag |
| } |
| } |
| |
| - 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); |
| @@ -1933,6 +1943,38 @@ dispatch_connect(isc_socket_t *sock) { |
| 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 |
| @@ -2420,6 +2462,7 @@ process_fds(isc_socketmgr_t *manager, in |
| int i; |
| isc_socket_t *sock; |
| isc_boolean_t unlock_sock; |
| + isc_event_t *sock_selected = 0L; |
| |
| REQUIRE(maxfd <= (int)FD_SETSIZE); |
| |
| @@ -2456,11 +2499,15 @@ process_fds(isc_socketmgr_t *manager, in |
| 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: |
| @@ -2474,16 +2521,24 @@ process_fds(isc_socketmgr_t *manager, in |
| 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 |
| @@ -2502,7 +2557,7 @@ watcher(void *uap) { |
| int cc; |
| fd_set readfds; |
| fd_set writefds; |
| - int msg, fd; |
| + int msg, fd = -1; |
| int maxfd; |
| char strbuf[ISC_STRERRORSIZE]; |
| |
| @@ -4165,3 +4220,56 @@ isc_socketmgr_renderxml(isc_socketmgr_t |
| UNLOCK(&mgr->lock); |
| } |
| #endif /* HAVE_LIBXML2 */ |
| + |
| +isc_socketevent_t* |
| +isc_socket_fd_handle_reads( isc_socket_t *sock, isc_socketevent_t *dev ) |
| +{ |
| + REQUIRE(VALID_SOCKET(sock)); |
| + if(dev != 0L) |
| + { |
| + sock->references=1; |
| + sock->read_ready_event = dev; |
| + select_poke(sock->manager, sock->fd, SELECT_POKE_READ); |
| + }else |
| + { |
| + dev = sock->read_ready_event ; |
| + sock->read_ready_event = 0L ; |
| + } |
| + return dev; |
| +} |
| + |
| +isc_socketevent_t* |
| +isc_socket_fd_handle_writes( isc_socket_t *sock, isc_socketevent_t *dev ) |
| +{ |
| + REQUIRE(VALID_SOCKET(sock)); |
| + if(dev != 0L) |
| + { |
| + sock->references=1; |
| + sock->write_ready_event = dev; |
| + select_poke(sock->manager, sock->fd, SELECT_POKE_WRITE); |
| + }else |
| + { |
| + dev = sock->write_ready_event; |
| + sock->write_ready_event = 0L; |
| + } |
| + return dev; |
| +} |
| + |
| +isc_socketevent_t* |
| +isc_socket_fd_handle_selected( isc_socket_t *sock, isc_socketevent_t *dev ) |
| +{ |
| + REQUIRE(VALID_SOCKET(sock)); |
| + if(dev != 0L) |
| + { |
| + sock->references=1; |
| + sock->selected_event = dev; |
| + }else |
| + { |
| + dev = sock->selected_event; |
| + sock->selected_event = 0L; |
| + sock->references=0; |
| + destroy(&sock); |
| + } |
| + return dev; |
| +} |
| + |
| |
| |
| @@ -197,3 +197,89 @@ auto_detach(void *data, void *arg) { |
| } |
| 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 ); |
| +} |
| |
| |
| @@ -2175,6 +2175,47 @@ dns_rbt_printall(dns_rbt_t *rbt) { |
| 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 |
| */ |
| |
| |
| @@ -911,6 +911,17 @@ dns_rbtnodechain_next(dns_rbtnodechain_t |
| } while (0) |
| #endif /* DNS_RBT_USEISCREFCOUNT */ |
| |
| + |
| +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 */ |
| |
| |
| @@ -113,6 +113,37 @@ dns_fwdtable_destroy(dns_fwdtable_t **fw |
| * \li 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 */ |
| |
| |
| @@ -248,7 +248,8 @@ usage(void) { |
| "usage: named [-4|-6] [-c conffile] [-d debuglevel] " |
| "[-f|-g] [-n number_of_cpus]\n" |
| " [-p port] [-s] [-t chrootdir] [-u username]\n" |
| - " [-m {usage|trace|record|size|mctx}]\n"); |
| + " [-m {usage|trace|record|size|mctx}]\n" |
| + " [-D ]\n"); |
| } |
| |
| static void |
| @@ -356,7 +357,7 @@ parse_command_line(int argc, char *argv[ |
| |
| isc_commandline_errprint = ISC_FALSE; |
| while ((ch = isc_commandline_parse(argc, argv, |
| - "46c:C:d:fgi:lm:n:N:p:P:st:u:vx:")) != -1) { |
| + "46c:C:d:fgi:lm:n:N:p:P:st:u:vx:D")) != -1) { |
| switch (ch) { |
| case '4': |
| if (disable4) |
| @@ -445,6 +446,9 @@ parse_command_line(int argc, char *argv[ |
| case 'v': |
| printf("BIND %s\n", ns_g_version); |
| exit(0); |
| + case 'D': |
| + ns_g_dbus = 1; |
| + break; |
| case '?': |
| usage(); |
| if (isc_commandline_option == '?') |
| |
| |
| @@ -44,6 +44,7 @@ static isc_logcategory_t categories[] = |
| { "queries", 0 }, |
| { "unmatched", 0 }, |
| { "update-security", 0 }, |
| + { "dbus", 0 }, |
| { NULL, 0 } |
| }; |
| |
| @@ -63,6 +64,7 @@ static isc_logmodule_t modules[] = { |
| { "notify", 0 }, |
| { "control", 0 }, |
| { "lwresd", 0 }, |
| + { "dbus", 0 }, |
| { NULL, 0 } |
| }; |
| |
| |
| |
| @@ -102,6 +102,8 @@ struct ns_server { |
| |
| isc_httpdmgr_t *httpd; |
| isc_sockaddr_t httpd_sockaddr; |
| + |
| + ns_dbus_mgr_t * dbus_mgr; |
| }; |
| |
| #define NS_SERVER_MAGIC ISC_MAGIC('S','V','E','R') |
| |
| |
| @@ -42,4 +42,6 @@ typedef struct ns_controls ns_controls_ |
| typedef struct ns_dispatch ns_dispatch_t; |
| typedef ISC_LIST(ns_dispatch_t) ns_dispatchlist_t; |
| |
| +typedef struct ns_dbus_mgr ns_dbus_mgr_t ; |
| + |
| #endif /* NAMED_TYPES_H */ |
| |
| |
| @@ -115,6 +115,8 @@ EXTERN const char * ns_g_username INIT |
| EXTERN int ns_g_listen INIT(3); |
| EXTERN isc_time_t ns_g_boottime; |
| |
| +EXTERN int ns_g_dbus INIT(0); |
| + |
| #undef EXTERN |
| #undef INIT |
| |
| |
| |
| @@ -36,6 +36,7 @@ |
| #define NS_LOGCATEGORY_QUERIES (&ns_g_categories[4]) |
| #define NS_LOGCATEGORY_UNMATCHED (&ns_g_categories[5]) |
| #define NS_LOGCATEGORY_UPDATE_SECURITY (&ns_g_categories[6]) |
| +#define NS_LOGCATEGORY_DBUS (&ns_g_categories[7]) |
| |
| /* |
| * Backwards compatibility. |
| @@ -53,6 +54,7 @@ |
| #define NS_LOGMODULE_NOTIFY (&ns_g_modules[8]) |
| #define NS_LOGMODULE_CONTROL (&ns_g_modules[9]) |
| #define NS_LOGMODULE_LWRESD (&ns_g_modules[10]) |
| +#define NS_LOGMODULE_DBUS (&ns_g_modules[11]) |
| |
| isc_result_t |
| ns_log_init(isc_boolean_t safe); |
| |
| |
| @@ -171,6 +171,8 @@ struct zonelistentry { |
| ISC_LINK(struct zonelistentry) link; |
| }; |
| |
| +#include <named/dbus_mgr.h> |
| + |
| /* |
| * These zones should not leak onto the Internet. |
| */ |
| @@ -2103,12 +2105,12 @@ configure_forward(const cfg_obj_t *confi |
| if (result != ISC_R_SUCCESS) { |
| char namebuf[DNS_NAME_FORMATSIZE]; |
| dns_name_format(origin, namebuf, sizeof(namebuf)); |
| - cfg_obj_log(forwarders, ns_g_lctx, ISC_LOG_WARNING, |
| - "could not set up forwarding for domain '%s': %s", |
| + cfg_obj_log(forwarders, ns_g_lctx, ISC_LOG_NOTICE, |
| + "setting up forwarding failed for domain '%s': %s", |
| namebuf, isc_result_totext(result)); |
| goto cleanup; |
| } |
| - |
| + |
| result = ISC_R_SUCCESS; |
| |
| cleanup: |
| @@ -3586,6 +3588,20 @@ run_server(isc_task_t *task, isc_event_t |
| |
| CHECKFATAL(load_zones(server, ISC_FALSE), "loading zones"); |
| |
| + server->dbus_mgr = 0L; |
| + if( ns_g_dbus ) |
| + if( dbus_mgr_create |
| + ( ns_g_mctx, ns_g_taskmgr, ns_g_socketmgr, ns_g_timermgr, |
| + &server->dbus_mgr |
| + ) != ISC_R_SUCCESS |
| + ) |
| + { |
| + isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, |
| + NS_LOGMODULE_SERVER, ISC_LOG_WARNING, |
| + "dbus_mgr initialization failed. D-BUS service is disabled." |
| + ); |
| + } |
| + |
| ns_os_started(); |
| isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER, |
| ISC_LOG_NOTICE, "running"); |
| @@ -3654,6 +3670,9 @@ shutdown_server(isc_task_t *task, isc_ev |
| |
| dns_db_detach(&server->in_roothints); |
| |
| + if( server->dbus_mgr != 0L ) |
| + dbus_mgr_shutdown(server->dbus_mgr); |
| + |
| isc_task_endexclusive(server->task); |
| |
| isc_task_detach(&server->task); |
| |
| |
| @@ -43,6 +43,9 @@ CINCLUDES = -I${srcdir}/include -I${srcd |
| ${ISCCFG_INCLUDES} ${ISCCC_INCLUDES} ${ISC_INCLUDES} \ |
| ${DLZDRIVER_INCLUDES} ${DBDRIVER_INCLUDES} |
| |
| +DBUS_INCLUDES = \ |
| + -I/usr/lib/dbus-1.0/include -I/usr/include/dbus-1.0 |
| + |
| CDEFINES = @USE_DLZ@ |
| |
| CWARNINGS = |
| @@ -60,6 +63,7 @@ ISCCCDEPLIBS = ../../lib/isccc/libisccc. |
| ISCDEPLIBS = ../../lib/isc/libisc.@A@ |
| LWRESDEPLIBS = ../../lib/lwres/liblwres.@A@ |
| BIND9DEPLIBS = ../../lib/bind9/libbind9.@A@ |
| +DBUSLIBS= -ldbus-1 |
| |
| DEPLIBS = ${LWRESDEPLIBS} ${DNSDEPLIBS} ${BIND9DEPLIBS} \ |
| ${ISCCFGDEPLIBS} ${ISCCCDEPLIBS} ${ISCDEPLIBS} |
| @@ -80,6 +84,7 @@ OBJS = builtin.o client.o config.o cont |
| zoneconf.o \ |
| lwaddr.o lwresd.o lwdclient.o lwderror.o lwdgabn.o \ |
| lwdgnba.o lwdgrbn.o lwdnoop.o lwsearch.o \ |
| + dbus_service.o dbus_mgr.o \ |
| ${DLZDRIVER_OBJS} ${DBDRIVER_OBJS} |
| |
| UOBJS = unix/os.o |
| @@ -94,6 +99,7 @@ SRCS = builtin.c client.c config.c cont |
| zoneconf.c \ |
| lwaddr.c lwresd.c lwdclient.c lwderror.c lwdgabn.c \ |
| lwdgnba.c lwdgrbn.c lwdnoop.c lwsearch.c \ |
| + dbus_service.c dbus_mgr.c \ |
| ${DLZDRIVER_SRCS} ${DBDRIVER_SRCS} |
| |
| MANPAGES = named.8 lwresd.8 named.conf.5 |
| @@ -122,9 +128,14 @@ config.o: config.c |
| -DNS_LOCALSTATEDIR=\"${localstatedir}\" \ |
| -c ${srcdir}/config.c |
| |
| +dbus_service.o: dbus_service.c |
| + ${LIBTOOL_MODE_COMPILE} ${CC} ${ALL_CFLAGS} \ |
| + ${DBUS_INCLUDES} \ |
| + -c ${srcdir}/dbus_service.c |
| + |
| named@EXEEXT@: ${OBJS} ${UOBJS} ${DEPLIBS} |
| ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \ |
| - ${OBJS} ${UOBJS} ${LIBS} |
| + ${OBJS} ${UOBJS} ${LIBS} ${DBUSLIBS} |
| |
| lwresd@EXEEXT@: named@EXEEXT@ |
| rm -f lwresd@EXEEXT@ |
| |
| |
| @@ -33,7 +33,7 @@ |
| named \- Internet domain name server |
| .SH "SYNOPSIS" |
| .HP 6 |
| -\fBnamed\fR [\fB\-4\fR] [\fB\-6\fR] [\fB\-c\ \fR\fB\fIconfig\-file\fR\fR] [\fB\-d\ \fR\fB\fIdebug\-level\fR\fR] [\fB\-f\fR] [\fB\-g\fR] [\fB\-m\ \fR\fB\fIflag\fR\fR] [\fB\-n\ \fR\fB\fI#cpus\fR\fR] [\fB\-p\ \fR\fB\fIport\fR\fR] [\fB\-s\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] [\fB\-u\ \fR\fB\fIuser\fR\fR] [\fB\-v\fR] [\fB\-x\ \fR\fB\fIcache\-file\fR\fR] |
| +\fBnamed\fR [\fB\-4\fR] [\fB\-6\fR] [\fB\-c\ \fR\fB\fIconfig\-file\fR\fR] [\fB\-d\ \fR\fB\fIdebug\-level\fR\fR] [\fB\-f\fR] [\fB\-g\fR] [\fB\-m\ \fR\fB\fIflag\fR\fR] [\fB\-n\ \fR\fB\fI#cpus\fR\fR] [\fB\-p\ \fR\fB\fIport\fR\fR] [\fB\-s\fR] [\fB\-t\ \fR\fB\fIdirectory\fR\fR] [\fB\-u\ \fR\fB\fIuser\fR\fR] [\fB\-v\fR] [\fB\-x\ \fR\fB\fIcache\-file\fR\fR] [\fB\-D\fR] |
| .SH "DESCRIPTION" |
| .PP |
| \fBnamed\fR |
| @@ -181,6 +181,13 @@ into the cache of the default view. |
| This option must not be used. It is only of interest to BIND 9 developers and may be removed or changed in a future release. |
| .RE |
| .RE |
| +.sp |
| +.TP |
| +\fB\-D\fR |
| +Enable dynamic management of the forwarding table with D-BUS |
| +messages. This option is required for Red Hat NetworkManager |
| +support. See doc/README.DBUS . |
| +.sp |
| .SH "SIGNALS" |
| .PP |
| In routine operation, signals should not be used to control the nameserver; |