Commit 1d92d8a2 authored by Brian Wellington's avatar Brian Wellington
Browse files

792. [cleanup] Replace the OMAPI command channel protocol with a

			simpler one.
parent 11ba7973
792. [cleanup] Replace the OMAPI command channel protocol with a
simpler one.
791. [bug] The command channel now works over IPv6. 791. [bug] The command channel now works over IPv6.
790. [bug] Wildcards created using dynamic update or IXFR 790. [bug] Wildcards created using dynamic update or IXFR
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
# $Id: Makefile.in,v 1.70 2001/03/06 02:40:11 bwelling Exp $ # $Id: Makefile.in,v 1.71 2001/03/27 00:44:30 bwelling Exp $
srcdir = @srcdir@ srcdir = @srcdir@
VPATH = @srcdir@ VPATH = @srcdir@
...@@ -32,37 +32,38 @@ DBDRIVER_INCLUDES = ...@@ -32,37 +32,38 @@ DBDRIVER_INCLUDES =
DBDRIVER_LIBS = DBDRIVER_LIBS =
CINCLUDES = -I${srcdir}/include -I${srcdir}/unix/include \ CINCLUDES = -I${srcdir}/include -I${srcdir}/unix/include \
${LWRES_INCLUDES} ${OMAPI_INCLUDES} ${DNS_INCLUDES} \ ${LWRES_INCLUDES} ${DNS_INCLUDES} \
${ISCCFG_INCLUDES} ${ISC_INCLUDES} ${DBDRIVER_INCLUDES} ${ISCCFG_INCLUDES} ${ISCCC_INCLUDES} ${ISC_INCLUDES} \
${DBDRIVER_INCLUDES}
CDEFINES = CDEFINES =
CWARNINGS = CWARNINGS =
OMAPILIBS = ../../lib/omapi/libomapi.@A@
DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_OPENSSL_LIBS@ @DNS_GSSAPI_LIBS@ DNSLIBS = ../../lib/dns/libdns.@A@ @DNS_OPENSSL_LIBS@ @DNS_GSSAPI_LIBS@
ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@ ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@
ISCCCLIBS = ../../lib/isccc/libisccc.@A@
ISCLIBS = ../../lib/isc/libisc.@A@ ISCLIBS = ../../lib/isc/libisc.@A@
LWRESLIBS = ../../lib/lwres/liblwres.@A@ LWRESLIBS = ../../lib/lwres/liblwres.@A@
OMAPIDEPLIBS = ../../lib/omapi/libomapi.@A@
DNSDEPLIBS = ../../lib/dns/libdns.@A@ DNSDEPLIBS = ../../lib/dns/libdns.@A@
ISCCFGDEPLIBS = ../../lib/isccfg/libisccfg.@A@ ISCCFGDEPLIBS = ../../lib/isccfg/libisccfg.@A@
ISCCCDEPLIBS = ../../lib/isccc/libisccc.@A@
ISCDEPLIBS = ../../lib/isc/libisc.@A@ ISCDEPLIBS = ../../lib/isc/libisc.@A@
LWRESDEPLIBS = ../../lib/lwres/liblwres.@A@ LWRESDEPLIBS = ../../lib/lwres/liblwres.@A@
DEPLIBS = ${LWRESDEPLIBS} ${OMAPIDEPLIBS} ${DNSDEPLIBS} \ DEPLIBS = ${LWRESDEPLIBS} ${DNSDEPLIBS} \
${ISCCFGDEPLIBS} ${ISCDEPLIBS} ${ISCCFGDEPLIBS} ${ISCCCDEPLIBS} ${ISCDEPLIBS}
LIBS = ${LWRESLIBS} ${OMAPILIBS} ${DNSLIBS} \ LIBS = ${LWRESLIBS} ${DNSLIBS} \
${ISCCFGLIBS} ${ISCLIBS} ${DBDRIVER_LIBS} @LIBS@ ${ISCCFGLIBS} ${ISCCCLIBS} ${ISCLIBS} ${DBDRIVER_LIBS} @LIBS@
SUBDIRS = unix SUBDIRS = unix
TARGETS = named lwresd TARGETS = named lwresd
OBJS = aclconf.@O@ client.@O@ config.@O@ interfacemgr.@O@ \ OBJS = aclconf.@O@ client.@O@ config.@O@ control.@O@ controlconf.@O@ interfacemgr.@O@ \
listenlist.@O@ log.@O@ logconf.@O@ main.@O@ notify.@O@ \ listenlist.@O@ log.@O@ logconf.@O@ main.@O@ notify.@O@ \
omapi.@O@ omapiconf.@O@ query.@O@ server.@O@ sortlist.@O@ \ query.@O@ server.@O@ sortlist.@O@ \
tkeyconf.@O@ tsigconf.@O@ update.@O@ xfrout.@O@ \ tkeyconf.@O@ tsigconf.@O@ update.@O@ xfrout.@O@ \
zoneconf.@O@ \ zoneconf.@O@ \
lwaddr.@O@ lwresd.@O@ lwdclient.@O@ lwderror.@O@ lwdgabn.@O@ \ lwaddr.@O@ lwresd.@O@ lwdclient.@O@ lwderror.@O@ lwdgabn.@O@ \
...@@ -71,9 +72,9 @@ OBJS = aclconf.@O@ client.@O@ config.@O@ interfacemgr.@O@ \ ...@@ -71,9 +72,9 @@ OBJS = aclconf.@O@ client.@O@ config.@O@ interfacemgr.@O@ \
UOBJS = unix/os.@O@ UOBJS = unix/os.@O@
SRCS = aclconf.c client.c config.c interfacemgr.c \ SRCS = aclconf.c client.c config.c control.c controlconf.c interfacemgr.c \
listenlist.c log.c logconf.c main.c notify.c \ listenlist.c log.c logconf.c main.c notify.c \
omapi.c omapiconf.c query.c server.c sortlist.c \ query.c server.c sortlist.c \
tkeyconf.c tsigconf.c update.c xfrout.c \ tkeyconf.c tsigconf.c update.c xfrout.c \
zoneconf.c \ zoneconf.c \
lwaddr.c lwresd.c lwdclient.c lwderror.c lwdgabn.c \ lwaddr.c lwresd.c lwdclient.c lwderror.c lwdgabn.c \
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: globals.h,v 1.53 2001/03/04 21:21:32 bwelling Exp $ */ /* $Id: globals.h,v 1.54 2001/03/27 00:44:36 bwelling Exp $ */
#ifndef NAMED_GLOBALS_H #ifndef NAMED_GLOBALS_H
#define NAMED_GLOBALS_H 1 #define NAMED_GLOBALS_H 1
...@@ -28,8 +28,6 @@ ...@@ -28,8 +28,6 @@
#include <dns/zone.h> #include <dns/zone.h>
#include <omapi/types.h>
#include <named/types.h> #include <named/types.h>
#undef EXTERN #undef EXTERN
...@@ -54,7 +52,6 @@ EXTERN isc_entropy_t * ns_g_entropy INIT(NULL); ...@@ -54,7 +52,6 @@ EXTERN isc_entropy_t * ns_g_entropy INIT(NULL);
*/ */
EXTERN isc_timermgr_t * ns_g_timermgr INIT(NULL); EXTERN isc_timermgr_t * ns_g_timermgr INIT(NULL);
EXTERN isc_socketmgr_t * ns_g_socketmgr INIT(NULL); EXTERN isc_socketmgr_t * ns_g_socketmgr INIT(NULL);
EXTERN omapi_object_t * ns_g_omapimgr INIT(NULL);
EXTERN cfg_parser_t * ns_g_parser INIT(NULL); EXTERN cfg_parser_t * ns_g_parser INIT(NULL);
EXTERN const char * ns_g_version INIT(VERSION); EXTERN const char * ns_g_version INIT(VERSION);
EXTERN in_port_t ns_g_port INIT(0); EXTERN in_port_t ns_g_port INIT(0);
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: log.h,v 1.17 2001/01/09 21:40:17 bwelling Exp $ */ /* $Id: log.h,v 1.18 2001/03/27 00:44:38 bwelling Exp $ */
#ifndef NAMED_LOG_H #ifndef NAMED_LOG_H
#define NAMED_LOG_H 1 #define NAMED_LOG_H 1
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
#define NS_LOGMODULE_XFER_IN (&ns_g_modules[6]) #define NS_LOGMODULE_XFER_IN (&ns_g_modules[6])
#define NS_LOGMODULE_XFER_OUT (&ns_g_modules[7]) #define NS_LOGMODULE_XFER_OUT (&ns_g_modules[7])
#define NS_LOGMODULE_NOTIFY (&ns_g_modules[8]) #define NS_LOGMODULE_NOTIFY (&ns_g_modules[8])
#define NS_LOGMODULE_OMAPI (&ns_g_modules[9]) #define NS_LOGMODULE_CONTROL (&ns_g_modules[9])
#define NS_LOGMODULE_LWRESD (&ns_g_modules[10]) #define NS_LOGMODULE_LWRESD (&ns_g_modules[10])
isc_result_t isc_result_t
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: log.c,v 1.30 2001/03/13 03:04:09 gson Exp $ */ /* $Id: log.c,v 1.31 2001/03/27 00:44:31 bwelling Exp $ */
#include <config.h> #include <config.h>
...@@ -52,7 +52,7 @@ static isc_logmodule_t modules[] = { ...@@ -52,7 +52,7 @@ static isc_logmodule_t modules[] = {
{ "xfer-in", 0 }, { "xfer-in", 0 },
{ "xfer-out", 0 }, { "xfer-out", 0 },
{ "notify", 0 }, { "notify", 0 },
{ "omapi", 0 }, { "control", 0 },
{ "lwresd", 0 }, { "lwresd", 0 },
{ NULL, 0 } { NULL, 0 }
}; };
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: main.c,v 1.105 2001/03/06 02:40:13 bwelling Exp $ */ /* $Id: main.c,v 1.106 2001/03/27 00:44:33 bwelling Exp $ */
#include <config.h> #include <config.h>
...@@ -33,20 +33,24 @@ ...@@ -33,20 +33,24 @@
#include <isc/timer.h> #include <isc/timer.h>
#include <isc/util.h> #include <isc/util.h>
#include <isccc/result.h>
#include <dns/dispatch.h> #include <dns/dispatch.h>
#include <dst/result.h> #include <dns/result.h>
#include <dns/view.h> #include <dns/view.h>
#include <dst/result.h>
/* /*
* Defining NS_MAIN provides storage declarations (rather than extern) * Defining NS_MAIN provides storage declarations (rather than extern)
* for variables in named/globals.h. * for variables in named/globals.h.
*/ */
#define NS_MAIN 1 #define NS_MAIN 1
#include <named/control.h>
#include <named/globals.h> /* Explicit, though named/log.h includes it. */ #include <named/globals.h> /* Explicit, though named/log.h includes it. */
#include <named/interfacemgr.h> #include <named/interfacemgr.h>
#include <named/log.h> #include <named/log.h>
#include <named/omapi.h>
#include <named/os.h> #include <named/os.h>
#include <named/server.h> #include <named/server.h>
#include <named/lwresd.h> #include <named/lwresd.h>
...@@ -417,10 +421,10 @@ static void ...@@ -417,10 +421,10 @@ static void
destroy_managers(void) { destroy_managers(void) {
if (!ns_g_lwresdonly) if (!ns_g_lwresdonly)
/* /*
* The omapi listeners need to be stopped here so that * The command channel listeners need to be stopped here so
* isc_taskmgr_destroy() won't block on the omapi task. * that isc_taskmgr_destroy() won't block on the server task.
*/ */
ns_omapi_shutdown(ISC_TRUE); ns_control_shutdown(ISC_TRUE);
ns_lwresd_shutdown(); ns_lwresd_shutdown();
...@@ -498,13 +502,6 @@ setup(void) { ...@@ -498,13 +502,6 @@ setup(void) {
/* xxdb_init(); */ /* xxdb_init(); */
ns_server_create(ns_g_mctx, &ns_g_server); ns_server_create(ns_g_mctx, &ns_g_server);
if (!ns_g_lwresdonly) {
result = ns_omapi_init();
if (result != ISC_R_SUCCESS)
ns_main_earlyfatal("ns_omapi_init() failed: %s",
isc_result_totext(result));
}
} }
static void static void
...@@ -546,6 +543,7 @@ main(int argc, char *argv[]) { ...@@ -546,6 +543,7 @@ main(int argc, char *argv[]) {
dns_result_register(); dns_result_register();
dst_result_register(); dst_result_register();
isccc_result_register();
parse_command_line(argc, argv); parse_command_line(argc, argv);
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: server.c,v 1.311 2001/03/26 23:03:05 gson Exp $ */ /* $Id: server.c,v 1.312 2001/03/27 00:44:34 bwelling Exp $ */
#include <config.h> #include <config.h>
...@@ -60,11 +60,11 @@ ...@@ -60,11 +60,11 @@
#include <named/client.h> #include <named/client.h>
#include <named/config.h> #include <named/config.h>
#include <named/control.h>
#include <named/interfacemgr.h> #include <named/interfacemgr.h>
#include <named/log.h> #include <named/log.h>
#include <named/logconf.h> #include <named/logconf.h>
#include <named/lwresd.h> #include <named/lwresd.h>
#include <named/omapi.h>
#include <named/os.h> #include <named/os.h>
#include <named/server.h> #include <named/server.h>
#include <named/tkeyconf.h> #include <named/tkeyconf.h>
...@@ -1855,9 +1855,9 @@ load_configuration(const char *filename, ns_server_t *server, ...@@ -1855,9 +1855,9 @@ load_configuration(const char *filename, ns_server_t *server,
} }
/* /*
* Bind the OMAPI port(s). * Bind the control port(s).
*/ */
CHECKM(ns_omapi_configure(ns_g_mctx, config, &aclconfctx), CHECKM(ns_control_configure(ns_g_mctx, config, &aclconfctx),
"binding control channel(s)"); "binding control channel(s)");
/* /*
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
# $Id: Makefile.in,v 1.20 2001/02/16 04:17:00 tale Exp $ # $Id: Makefile.in,v 1.21 2001/03/27 00:44:41 bwelling Exp $
srcdir = @srcdir@ srcdir = @srcdir@
VPATH = @srcdir@ VPATH = @srcdir@
...@@ -24,23 +24,22 @@ top_srcdir = @top_srcdir@ ...@@ -24,23 +24,22 @@ top_srcdir = @top_srcdir@
@BIND9_INCLUDES@ @BIND9_INCLUDES@
CINCLUDES = -I${top_srcdir}/bin/named/include \ CINCLUDES = -I${top_srcdir}/bin/named/include \
${ISC_INCLUDES} ${ISCCFG_INCLUDES} \ ${ISC_INCLUDES} ${ISCCC_INCLUDES} ${ISCCFG_INCLUDES}
${DNS_INCLUDES} ${OMAPI_INCLUDES}
CDEFINES = CDEFINES =
CWARNINGS = CWARNINGS =
OMAPILIBS = ../../lib/omapi/libomapi.@A@
ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@ ISCCFGLIBS = ../../lib/isccfg/libisccfg.@A@
ISCCCLIBS = ../../lib/isccc/libisccc.@A@
ISCLIBS = ../../lib/isc/libisc.@A@ ISCLIBS = ../../lib/isc/libisc.@A@
OMAPIDEPLIBS = ../../lib/omapi/libomapi.@A@ ISCCFGDEPLIBS = ../../lib/isccfg/libisccfg.@A@
ISCDEPLIBS = ../../lib/isccfg/libisccfg.@A@ ISCCCDEPLIBS = ../../lib/isccc/libisccc.@A@
ISCDEPLIBS = ../../lib/isc/libisc.@A@ ISCDEPLIBS = ../../lib/isc/libisc.@A@
DEPLIBS = ${OMAPIDEPLIBS} ${ISCCFGLIBS} ${ISCDEPLIBS} DEPLIBS = ${ISCCFGDEPLIBS} ${ISCCCDEPLIBS} ${ISCDEPLIBS}
LIBS = ${OMAPILIBS} ${ISCCFGLIBS} ${ISCLIBS} @LIBS@ LIBS = ${ISCCFGLIBS} ${ISCCCLIBS} ${ISCLIBS} @LIBS@
TARGETS = rndc TARGETS = rndc
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: rndc.c,v 1.43 2001/03/22 00:07:01 bwelling Exp $ */ /* $Id: rndc.c,v 1.44 2001/03/27 00:44:42 bwelling Exp $ */
/* /*
* Principal Author: DCL * Principal Author: DCL
...@@ -24,36 +24,59 @@ ...@@ -24,36 +24,59 @@
#include <config.h> #include <config.h>
#include <stdlib.h> #include <stdlib.h>
#include <netdb.h>
#include <isc/base64.h> #include <isc/app.h>
#include <isc/buffer.h> #include <isc/buffer.h>
#include <isc/commandline.h> #include <isc/commandline.h>
#include <isc/log.h> #include <isc/log.h>
#include <isc/mem.h> #include <isc/mem.h>
#include <isc/socket.h> #include <isc/socket.h>
#include <isc/stdtime.h>
#include <isc/string.h> #include <isc/string.h>
#include <isc/task.h> #include <isc/task.h>
#include <isc/util.h> #include <isc/util.h>
#include <isccfg/cfg.h> #include <isccfg/cfg.h>
#include <named/omapi.h> #include <isccc/alist.h>
#include <isccc/base64.h>
#include <isccc/cc.h>
#include <isccc/ccmsg.h>
#include <isccc/result.h>
#include <isccc/sexpr.h>
#include <isccc/types.h>
#include <isccc/util.h>
#include <named/control.h>
#ifdef HAVE_ADDRINFO
#ifdef HAVE_GETADDRINFO
#ifdef HAVE_GAISTRERROR
#define USE_GETADDRINFO
#endif
#endif
#endif
#ifndef USE_GETADDRINFO
extern int h_errno;
#endif
static const char *progname; static const char *progname;
static const char *conffile = RNDC_SYSCONFDIR "/rndc.conf"; static const char *conffile = RNDC_SYSCONFDIR "/rndc.conf";
static const char *version = VERSION; static const char *version = VERSION;
static unsigned int remoteport = NS_CONTROL_PORT;
static const char *servername = NULL;
static isc_socketmgr_t *socketmgr = NULL;
static unsigned char databuf[2048];
static isccc_ccmsg_t ccmsg;
static char *args;
static isc_boolean_t have_ipv4, have_ipv6;
static isccc_region_t secret;
static isc_boolean_t verbose; static isc_boolean_t verbose;
static isc_boolean_t failed = ISC_FALSE;
static isc_mem_t *mctx; static isc_mem_t *mctx;
char *command;
typedef struct ndc_object {
OMAPI_OBJECT_PREAMBLE;
} ndc_object_t;
#define REGION_FMT(x) (int)(x)->length, (x)->base
static ndc_object_t ndc_g_ndc;
static omapi_objecttype_t *ndc_type;
static void static void
notify(const char *fmt, ...) { notify(const char *fmt, ...) {
...@@ -67,188 +90,6 @@ notify(const char *fmt, ...) { ...@@ -67,188 +90,6 @@ notify(const char *fmt, ...) {
} }
} }
/*
* Send a control command to the server. 'command' is the command
* name, and 'args' is a space-delimited sequence of words, the
* first being the command name itself.
*/
static isc_result_t
send_command(omapi_object_t *manager, char *command, char *args) {
omapi_object_t *message = NULL;
isc_result_t result;
REQUIRE(manager != NULL && command != NULL);
/*
* Create a new message object to store the information that will
* be sent to the server.
*/
result = omapi_message_create(&message);
if (result != ISC_R_SUCCESS)
return (result);
/*
* Specify the OPEN operation, with the UPDATE option if requested.
*/
result = omapi_object_setinteger(message, "op", OMAPI_OP_OPEN);
if (result == ISC_R_SUCCESS)
result = omapi_object_setboolean(message, "update", ISC_TRUE);
/*
* Tell the server the type of the object being opened; it needs
* to know this so that it can apply the proper object methods
* for lookup/setvalue.
*/
if (result == ISC_R_SUCCESS)
result = omapi_object_setstring(message, "type",
NS_OMAPI_CONTROL);
/*
* Associate the ndc object with the message, so that it will have its
* values stuffed in the message. Without it, the OPEN operation will
* fail because there is no name/value pair to use as a key for looking
* up the desired object at the server; this is true even though the
* particular object being accessed on the server does not need a key
* to be found.
*
* This object will also have its signal handler called with a
* "status" signal that sends the result of the operation on the
* server.
*/
if (result == ISC_R_SUCCESS)
result = omapi_object_setobject(message, "object",
(omapi_object_t *)&ndc_g_ndc);
/*
* Create a generic object to be the outer object for ndc_g_ndc, to
* handle the job of storing the command and stuffing it into the
* message.
*
* XXXDCL provide API so client does not need to refer to the
* outer member -- does not even need to know about how the whole
* outer/inner thing works.
*/
if (result == ISC_R_SUCCESS)
result = omapi_object_create(&ndc_g_ndc.outer, NULL, 0);
/*
* Set the command being sent.
*/
result = omapi_object_setstring((omapi_object_t *)&ndc_g_ndc,
command, args);
if (result == ISC_R_SUCCESS) {
/*
* Add the new message to the list of known messages. When the
* server's response comes back, the client will verify that
* the response was for a message it really sent.
*/
omapi_message_register(message);
/*
* Deliver the message to the server and await its
* response.
*/
result = omapi_message_send(message, manager);
}
/*
* Free the generic object and the message.
*/
if (ndc_g_ndc.outer != NULL)
omapi_object_dereference(&ndc_g_ndc.outer);
omapi_message_unregister(message);
omapi_object_dereference(&message);
return (result);
}
/*
* The signal handler gets the "status" signals when the server's response
* is processed. It also gets the "updated" signal after all the values
* from the server have been incorporated via ndc_setvalue.
*/
static isc_result_t
ndc_signalhandler(omapi_object_t *handle, const char *name, va_list ap) {
ndc_object_t *ndc;
omapi_value_t *tv;
isc_region_t region;
isc_result_t result;
REQUIRE(handle->type == ndc_type);
ndc = (ndc_object_t *)handle;
notify("ndc_signalhandler: %s", name);
if (strcmp(name, "status") == 0) {
/*
* "status" is signalled with the result of the message's
* operation.