diff --git a/CHANGES b/CHANGES index 887f29b2a5..caaabd520b 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,5 @@ -4433. [placeholder] +4433. [cleanup] Report an error when passing an invalid option or + view name to "rndc dumpdb". [RT #42958] 4432. [test] Hide rndc output on expected failures in logfileconfig system test. [RT #27996] diff --git a/bin/named/control.c b/bin/named/control.c index bd2f36b680..5d9027a6ad 100644 --- a/bin/named/control.c +++ b/bin/named/control.c @@ -207,7 +207,7 @@ ns_control_docommand(isccc_sexpr_t *message, isc_boolean_t readonly, } else if (command_compare(command, NS_COMMAND_QUERYLOG)) { result = ns_server_togglequerylog(ns_g_server, lex); } else if (command_compare(command, NS_COMMAND_DUMPDB)) { - ns_server_dumpdb(ns_g_server, lex); + ns_server_dumpdb(ns_g_server, lex, text); result = ISC_R_SUCCESS; } else if (command_compare(command, NS_COMMAND_SECROOTS)) { result = ns_server_dumpsecroots(ns_g_server, lex, text); diff --git a/bin/named/include/named/server.h b/bin/named/include/named/server.h index 8fd3899a7d..8550cba424 100644 --- a/bin/named/include/named/server.h +++ b/bin/named/include/named/server.h @@ -596,7 +596,7 @@ ns_server_dumpstats(ns_server_t *server); * Dump the current cache to the dump file. */ isc_result_t -ns_server_dumpdb(ns_server_t *server, isc_lex_t *lex); +ns_server_dumpdb(ns_server_t *server, isc_lex_t *lex, isc_buffer_t **text); /*% * Dump the current security roots to the secroots file. diff --git a/bin/named/server.c b/bin/named/server.c index e0ebf18f98..743ef3ad8f 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -9478,12 +9478,13 @@ dumpdone(void *arg, isc_result_t result) { } isc_result_t -ns_server_dumpdb(ns_server_t *server, isc_lex_t *lex) { +ns_server_dumpdb(ns_server_t *server, isc_lex_t *lex, isc_buffer_t **text) { struct dumpcontext *dctx = NULL; dns_view_t *view; isc_result_t result; char *ptr; const char *sep; + isc_boolean_t found; /* Skip the command name. */ ptr = next_token(lex, NULL); @@ -9557,15 +9558,26 @@ ns_server_dumpdb(ns_server_t *server, isc_lex_t *lex) { } nextview: + found = ISC_FALSE; for (view = ISC_LIST_HEAD(server->viewlist); view != NULL; view = ISC_LIST_NEXT(view, link)) { if (ptr != NULL && strcmp(view->name, ptr) != 0) continue; + found = ISC_TRUE; CHECK(add_view_tolist(dctx, view)); } if (ptr != NULL) { + if (!found) { + putstr(text, "view '"); + putstr(text, ptr); + putstr(text, "' not found"); + putnull(text); + result = ISC_R_NOTFOUND; + dumpdone(dctx, result); + return (result); + } ptr = next_token(lex, NULL); if (ptr != NULL) goto nextview;