rndc.c revision 80b67b3a4f2d9fc7fdd32a50edc67ff189894da2
615eff12e0e3565c52758292e10080a25d872941William King/*
ca41b452ede6feaa9d8739ec3cae19389a7b0d03Bob Halley * Copyright (C) 2000, 2001 Internet Software Consortium.
615eff12e0e3565c52758292e10080a25d872941William King *
615eff12e0e3565c52758292e10080a25d872941William King * Permission to use, copy, modify, and distribute this software for any
615eff12e0e3565c52758292e10080a25d872941William King * purpose with or without fee is hereby granted, provided that the above
615eff12e0e3565c52758292e10080a25d872941William King * copyright notice and this permission notice appear in all copies.
615eff12e0e3565c52758292e10080a25d872941William King *
615eff12e0e3565c52758292e10080a25d872941William King * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
615eff12e0e3565c52758292e10080a25d872941William King * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
615eff12e0e3565c52758292e10080a25d872941William King * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
615eff12e0e3565c52758292e10080a25d872941William King * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
615eff12e0e3565c52758292e10080a25d872941William King * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
615eff12e0e3565c52758292e10080a25d872941William King * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
615eff12e0e3565c52758292e10080a25d872941William King * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
615eff12e0e3565c52758292e10080a25d872941William King * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
615eff12e0e3565c52758292e10080a25d872941William King */
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William King/* $Id: rndc.c,v 1.69 2001/07/23 02:58:22 mayer Exp $ */
615eff12e0e3565c52758292e10080a25d872941William King
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence/*
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence * Principal Author: DCL
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence */
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William King#include <config.h>
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
615eff12e0e3565c52758292e10080a25d872941William King#include <stdlib.h>
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William King#include <isc/app.h>
615eff12e0e3565c52758292e10080a25d872941William King#include <isc/buffer.h>
615eff12e0e3565c52758292e10080a25d872941William King#include <isc/commandline.h>
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence#include <isc/file.h>
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington#include <isc/log.h>
615eff12e0e3565c52758292e10080a25d872941William King#include <isc/mem.h>
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence#include <isc/netdb.h>
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence#include <isc/socket.h>
fd9f6afdff9faf55411dfd5f828529601cab0511Andreas Gustafsson#include <isc/stdtime.h>
615eff12e0e3565c52758292e10080a25d872941William King#include <isc/string.h>
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington#include <isc/task.h>
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington#include <isc/thread.h>
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington#include <isc/util.h>
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William King#include <isccfg/cfg.h>
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William King#include <isccc/alist.h>
615eff12e0e3565c52758292e10080a25d872941William King#include <isccc/base64.h>
615eff12e0e3565c52758292e10080a25d872941William King#include <isccc/cc.h>
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence#include <isccc/ccmsg.h>
615eff12e0e3565c52758292e10080a25d872941William King#include <isccc/result.h>
615eff12e0e3565c52758292e10080a25d872941William King#include <isccc/sexpr.h>
615eff12e0e3565c52758292e10080a25d872941William King#include <isccc/types.h>
615eff12e0e3565c52758292e10080a25d872941William King#include <isccc/util.h>
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William King#include "util.h"
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William King#ifdef HAVE_ADDRINFO
615eff12e0e3565c52758292e10080a25d872941William King#ifdef HAVE_GETADDRINFO
615eff12e0e3565c52758292e10080a25d872941William King#ifdef HAVE_GAISTRERROR
615eff12e0e3565c52758292e10080a25d872941William King#define USE_GETADDRINFO
615eff12e0e3565c52758292e10080a25d872941William King#define HAVE_H_ERRNO
615eff12e0e3565c52758292e10080a25d872941William King#endif
615eff12e0e3565c52758292e10080a25d872941William King#endif
615eff12e0e3565c52758292e10080a25d872941William King#endif
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William King#ifndef HAVE_H_ERRNO
615eff12e0e3565c52758292e10080a25d872941William King#define HAVE_H_ERRNO
615eff12e0e3565c52758292e10080a25d872941William Kingextern int h_errno;
615eff12e0e3565c52758292e10080a25d872941William King#endif
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William Kingchar *progname;
615eff12e0e3565c52758292e10080a25d872941William Kingisc_boolean_t verbose;
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William Kingstatic const char *admin_conffile;
615eff12e0e3565c52758292e10080a25d872941William Kingstatic const char *auto_conffile = NS_LOCALSTATEDIR "/run/named.key";
615eff12e0e3565c52758292e10080a25d872941William Kingstatic const char *version = VERSION;
615eff12e0e3565c52758292e10080a25d872941William Kingstatic const char *servername = NULL;
615eff12e0e3565c52758292e10080a25d872941William Kingstatic unsigned int remoteport = NS_CONTROL_PORT;
615eff12e0e3565c52758292e10080a25d872941William Kingstatic isc_socketmgr_t *socketmgr = NULL;
615eff12e0e3565c52758292e10080a25d872941William Kingstatic unsigned char databuf[2048];
615eff12e0e3565c52758292e10080a25d872941William Kingstatic isccc_ccmsg_t ccmsg;
615eff12e0e3565c52758292e10080a25d872941William Kingstatic isccc_region_t secret;
615eff12e0e3565c52758292e10080a25d872941William Kingstatic isc_boolean_t failed = ISC_FALSE;
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellingtonstatic isc_mem_t *mctx;
615eff12e0e3565c52758292e10080a25d872941William Kingstatic int sends, recvs, connects;
4124057bf54f0fc75b06b35487130bbd9249ee7fBrian Wellingtonstatic char *command;
1b6d529cb5ee0ad44f8518e1b8c2cbca54bbdf18David Lawrencestatic char *args;
615eff12e0e3565c52758292e10080a25d872941William Kingstatic char program[256];
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William Kingstatic void
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellingtonusage(int status) {
615eff12e0e3565c52758292e10080a25d872941William King fprintf(stderr, "\
6e49e91bd08778d7eae45a2229dcf41ed97cc636David LawrenceUsage: %s [-c config] [-s server] [-p port] [-y key] [-V] command\n\
6e49e91bd08778d7eae45a2229dcf41ed97cc636David Lawrence\n\
615eff12e0e3565c52758292e10080a25d872941William Kingcommand is one of the following:\n\
6e49e91bd08778d7eae45a2229dcf41ed97cc636David Lawrence\n\
615eff12e0e3565c52758292e10080a25d872941William King reload Reload configuration file and zones.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington reload zone [class [view]]\n\
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington Reload a single zone.\n\
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington refresh zone [class [view]]\n\
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington Schedule immediate maintenance for a zone.\n\
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington reconfig Reload configuration file and new zones only.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington stats Write server statistics to the statistics file.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington querylog Toggle query logging.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington dumpdb Dump cache(s) to the dump file (named_dump.db).\n\
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington stop Save pending updates to master files and stop the server.\n\
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington halt Stop the server without saving pending updates.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington trace Increment debugging level by one.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington trace level Change the debugging level.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington notrace Set debugging level to 0.\n\
446aa1ec8cb8f231d8649cfd705c90c6d0976143David Lawrence flush Flushes all of the server's caches.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington flush [view] Flushes the server's cache for a view.\n\
b3ef06344abad0105be99b622e615dcbd87911e1Brian Wellington status Display status of the server.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington *restart Restart the server.\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington\n\
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington* == not yet implemented\n\
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian WellingtonVersion: %s\n",
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington progname, version);
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington
615eff12e0e3565c52758292e10080a25d872941William King exit(status);
b3ef06344abad0105be99b622e615dcbd87911e1Brian Wellington}
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William Kingstatic void
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellingtonget_address(const char *host, in_port_t port, isc_sockaddr_t *sockaddr) {
615eff12e0e3565c52758292e10080a25d872941William King struct in_addr in4;
6e49e91bd08778d7eae45a2229dcf41ed97cc636David Lawrence struct in6_addr in6;
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington isc_boolean_t have_ipv6;
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington#ifdef USE_GETADDRINFO
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington struct addrinfo *res = NULL, hints;
446aa1ec8cb8f231d8649cfd705c90c6d0976143David Lawrence int result;
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington#else
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington struct hostent *he;
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington#endif
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington have_ipv6 = ISC_TF(isc_net_probeipv6() == ISC_R_SUCCESS);
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington
446aa1ec8cb8f231d8649cfd705c90c6d0976143David Lawrence /*
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington * Assume we have v4 if we don't have v6, since setup_libs
b3ef06344abad0105be99b622e615dcbd87911e1Brian Wellington * fatal()'s out if we don't have either.
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington */
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington if (have_ipv6 && inet_pton(AF_INET6, host, &in6) == 1)
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington isc_sockaddr_fromin6(sockaddr, &in6, port);
615eff12e0e3565c52758292e10080a25d872941William King else if (inet_pton(AF_INET, host, &in4) == 1)
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington isc_sockaddr_fromin(sockaddr, &in4, port);
446aa1ec8cb8f231d8649cfd705c90c6d0976143David Lawrence else {
446aa1ec8cb8f231d8649cfd705c90c6d0976143David Lawrence#ifdef USE_GETADDRINFO
615eff12e0e3565c52758292e10080a25d872941William King memset(&hints, 0, sizeof(hints));
b3ef06344abad0105be99b622e615dcbd87911e1Brian Wellington if (!have_ipv6)
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington hints.ai_family = PF_INET;
615eff12e0e3565c52758292e10080a25d872941William King else if (isc_net_probeipv4() != ISC_R_SUCCESS)
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington hints.ai_family = PF_INET6;
615eff12e0e3565c52758292e10080a25d872941William King else
615eff12e0e3565c52758292e10080a25d872941William King hints.ai_family = PF_UNSPEC;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_app_block();
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington result = getaddrinfo(host, NULL, &hints, &res);
4124057bf54f0fc75b06b35487130bbd9249ee7fBrian Wellington isc_app_unblock();
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington if (result != 0)
c50936eb40263b65ebf6afe4e6556e2dc67c10e4Brian Wellington fatal("Couldn't find server '%s': %s",
4124057bf54f0fc75b06b35487130bbd9249ee7fBrian Wellington host, gai_strerror(result));
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington memcpy(&sockaddr->type.sa, res->ai_addr, res->ai_addrlen);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington sockaddr->length = res->ai_addrlen;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_sockaddr_setport(sockaddr, port);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington freeaddrinfo(res);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington#else
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_app_block();
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington he = gethostbyname(host);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_app_unblock();
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington if (he == NULL)
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington fatal("Couldn't find server '%s' (h_errno=%d)",
fd9f6afdff9faf55411dfd5f828529601cab0511Andreas Gustafsson host, h_errno);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington INSIST(he->h_addrtype == AF_INET);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_sockaddr_fromin(sockaddr,
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington (struct in_addr *)(he->h_addr_list[0]),
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington port);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington#endif
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington }
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington}
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington
b3ef06344abad0105be99b622e615dcbd87911e1Brian Wellingtonstatic void
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellingtonrndc_senddone(isc_task_t *task, isc_event_t *event) {
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_socketevent_t *sevent = (isc_socketevent_t *)event;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington UNUSED(task);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington sends--;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington if (sevent->result != ISC_R_SUCCESS)
b3ef06344abad0105be99b622e615dcbd87911e1Brian Wellington fatal("send failed: %s", isc_result_totext(sevent->result));
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_event_free(&event);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington}
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellingtonstatic void
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellingtonrndc_recvdone(isc_task_t *task, isc_event_t *event) {
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_socket_t *sock = ccmsg.sock;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isccc_sexpr_t *response = NULL;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isccc_sexpr_t *data;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isccc_region_t source;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington char *errormsg = NULL;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington char *textmsg = NULL;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_result_t result;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington recvs--;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington if (ccmsg.result == ISC_R_EOF)
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington fatal("connection to remote host closed\n"
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington "This may indicate that the remote server is using "
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington "an older version of the\n"
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington "command protocol, this host is not authorized "
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington "to connect, or the key is invalid.");
b3ef06344abad0105be99b622e615dcbd87911e1Brian Wellington
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington if (ccmsg.result != ISC_R_SUCCESS)
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington fatal("recv failed: %s", isc_result_totext(ccmsg.result));
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington source.rstart = isc_buffer_base(&ccmsg.buffer);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington source.rend = isc_buffer_used(&ccmsg.buffer);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington DO("parse message", isccc_cc_fromwire(&source, &response, &secret));
b3ef06344abad0105be99b622e615dcbd87911e1Brian Wellington
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington data = isccc_alist_lookup(response, "_data");
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington if (data == NULL)
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington fatal("no data section in response");
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington result = isccc_cc_lookupstring(data, "err", &errormsg);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington if (result == ISC_R_SUCCESS) {
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington failed = ISC_TRUE;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington fprintf(stderr, "%s: '%s' failed: %s\n",
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington progname, command, errormsg);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington }
6e49e91bd08778d7eae45a2229dcf41ed97cc636David Lawrence else if (result != ISC_R_NOTFOUND)
81ab85fd39c3f6c781ecac725d830364a311479dBrian Wellington fprintf(stderr, "%s: parsing response failed: %s\n",
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington progname, isc_result_totext(result));
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington result = isccc_cc_lookupstring(data, "text", &textmsg);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington if (result == ISC_R_SUCCESS)
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington printf("%s\n", textmsg);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington else if (result != ISC_R_NOTFOUND)
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington fprintf(stderr, "%s: parsing response failed: %s\n",
6e49e91bd08778d7eae45a2229dcf41ed97cc636David Lawrence progname, isc_result_totext(result));
81ab85fd39c3f6c781ecac725d830364a311479dBrian Wellington
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_event_free(&event);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isccc_sexpr_free(&response);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_socket_detach(&sock);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_task_shutdown(task);
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_app_shutdown();
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington}
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington
6e49e91bd08778d7eae45a2229dcf41ed97cc636David Lawrencestatic void
6e49e91bd08778d7eae45a2229dcf41ed97cc636David Lawrencerndc_connected(isc_task_t *task, isc_event_t *event) {
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_socketevent_t *sevent = (isc_socketevent_t *)event;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_socket_t *sock = event->ev_sender;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isccc_sexpr_t *request = NULL;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isccc_sexpr_t *data;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isccc_time_t now;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isccc_region_t message;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_region_t r;
c50936eb40263b65ebf6afe4e6556e2dc67c10e4Brian Wellington isc_uint32_t len;
c50936eb40263b65ebf6afe4e6556e2dc67c10e4Brian Wellington isc_buffer_t b;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington isc_result_t result;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington
615eff12e0e3565c52758292e10080a25d872941William King connects--;
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence if (sevent->result != ISC_R_SUCCESS)
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence fatal("connect failed: %s", isc_result_totext(sevent->result));
c50936eb40263b65ebf6afe4e6556e2dc67c10e4Brian Wellington
4124057bf54f0fc75b06b35487130bbd9249ee7fBrian Wellington isc_stdtime_get(&now);
615eff12e0e3565c52758292e10080a25d872941William King srandom(now + isc_thread_self());
615eff12e0e3565c52758292e10080a25d872941William King DO("create message", isccc_cc_createmessage(1, NULL, NULL, random(),
615eff12e0e3565c52758292e10080a25d872941William King now, now + 60, &request));
615eff12e0e3565c52758292e10080a25d872941William King data = isccc_alist_lookup(request, "_data");
615eff12e0e3565c52758292e10080a25d872941William King if (data == NULL)
615eff12e0e3565c52758292e10080a25d872941William King fatal("_data section missing");
615eff12e0e3565c52758292e10080a25d872941William King if (isccc_cc_definestring(data, "type", args) == NULL)
615eff12e0e3565c52758292e10080a25d872941William King fatal("out of memory");
615eff12e0e3565c52758292e10080a25d872941William King message.rstart = databuf + 4;
615eff12e0e3565c52758292e10080a25d872941William King message.rend = databuf + sizeof(databuf);
615eff12e0e3565c52758292e10080a25d872941William King DO("render message", isccc_cc_towire(request, &message, &secret));
615eff12e0e3565c52758292e10080a25d872941William King len = sizeof(databuf) - REGION_SIZE(message);
b3ef06344abad0105be99b622e615dcbd87911e1Brian Wellington isc_buffer_init(&b, databuf, 4);
a7d792804f564aa0889a94f64913b11bffd9738cBrian Wellington isc_buffer_putuint32(&b, len - 4);
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence r.length = len;
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence r.base = databuf;
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William King isccc_ccmsg_init(mctx, sock, &ccmsg);
615eff12e0e3565c52758292e10080a25d872941William King isccc_ccmsg_setmaxsize(&ccmsg, 1024);
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William King DO("schedule recv", isccc_ccmsg_readmessage(&ccmsg, task,
615eff12e0e3565c52758292e10080a25d872941William King rndc_recvdone, NULL));
615eff12e0e3565c52758292e10080a25d872941William King recvs++;
615eff12e0e3565c52758292e10080a25d872941William King DO("send message", isc_socket_send(sock, &r, task, rndc_senddone,
615eff12e0e3565c52758292e10080a25d872941William King NULL));
615eff12e0e3565c52758292e10080a25d872941William King sends++;
615eff12e0e3565c52758292e10080a25d872941William King isc_event_free(&event);
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William King}
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William Kingstatic void
615eff12e0e3565c52758292e10080a25d872941William Kingrndc_start(isc_task_t *task, isc_event_t *event) {
615eff12e0e3565c52758292e10080a25d872941William King isc_sockaddr_t addr;
615eff12e0e3565c52758292e10080a25d872941William King isc_socket_t *sock = NULL;
b3ef06344abad0105be99b622e615dcbd87911e1Brian Wellington isc_result_t result;
615eff12e0e3565c52758292e10080a25d872941William King char socktext[ISC_SOCKADDR_FORMATSIZE];
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence isc_event_free(&event);
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William King get_address(servername, (in_port_t) remoteport, &addr);
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William King isc_sockaddr_format(&addr, socktext, sizeof(socktext));
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington notify("using server %s (%s)", servername, socktext);
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William King DO("create socket", isc_socket_create(socketmgr,
615eff12e0e3565c52758292e10080a25d872941William King isc_sockaddr_pf(&addr),
c50936eb40263b65ebf6afe4e6556e2dc67c10e4Brian Wellington isc_sockettype_tcp, &sock));
615eff12e0e3565c52758292e10080a25d872941William King DO("connect", isc_socket_connect(sock, &addr, task, rndc_connected,
615eff12e0e3565c52758292e10080a25d872941William King NULL));
615eff12e0e3565c52758292e10080a25d872941William King connects++;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington}
4124057bf54f0fc75b06b35487130bbd9249ee7fBrian Wellington
c50936eb40263b65ebf6afe4e6556e2dc67c10e4Brian Wellingtonstatic void
615eff12e0e3565c52758292e10080a25d872941William Kingparse_config(isc_mem_t *mctx, isc_log_t *log, cfg_parser_t **pctxp,
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington cfg_obj_t **config)
a7d792804f564aa0889a94f64913b11bffd9738cBrian Wellington{
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence isc_result_t result;
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence const char *conffile = admin_conffile;
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William King if (! isc_file_exists(conffile)) {
615eff12e0e3565c52758292e10080a25d872941William King conffile = auto_conffile;
615eff12e0e3565c52758292e10080a25d872941William King
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington if (! isc_file_exists(conffile))
4fe8755480c108a1232b7189fd5434ab35a6b623Brian Wellington fatal("neither %s nor %s was found",
c50936eb40263b65ebf6afe4e6556e2dc67c10e4Brian Wellington admin_conffile, auto_conffile);
615eff12e0e3565c52758292e10080a25d872941William King }
615eff12e0e3565c52758292e10080a25d872941William King
615eff12e0e3565c52758292e10080a25d872941William King DO("create parser", cfg_parser_create(mctx, log, pctxp));
615eff12e0e3565c52758292e10080a25d872941William King
1b6d529cb5ee0ad44f8518e1b8c2cbca54bbdf18David Lawrence /*
615eff12e0e3565c52758292e10080a25d872941William King * The parser will output its own errors, so DO() is not used.
615eff12e0e3565c52758292e10080a25d872941William King */
615eff12e0e3565c52758292e10080a25d872941William King result = cfg_parse_file(*pctxp, conffile, &cfg_type_rndcconf, config);
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington
615eff12e0e3565c52758292e10080a25d872941William King if (result != ISC_R_SUCCESS)
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence exit(1);
615eff12e0e3565c52758292e10080a25d872941William King}
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellingtonint
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellingtonmain(int argc, char **argv) {
615eff12e0e3565c52758292e10080a25d872941William King isc_boolean_t show_final_mem = ISC_FALSE;
615eff12e0e3565c52758292e10080a25d872941William King isc_result_t result = ISC_R_SUCCESS;
615eff12e0e3565c52758292e10080a25d872941William King isc_taskmgr_t *taskmgr = NULL;
615eff12e0e3565c52758292e10080a25d872941William King isc_task_t *task = NULL;
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington isc_log_t *log = NULL;
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington isc_logconfig_t *logconfig = NULL;
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington isc_logdestination_t logdest;
615eff12e0e3565c52758292e10080a25d872941William King cfg_parser_t *pctx = NULL;
615eff12e0e3565c52758292e10080a25d872941William King cfg_obj_t *config = NULL;
615eff12e0e3565c52758292e10080a25d872941William King cfg_obj_t *options = NULL;
615eff12e0e3565c52758292e10080a25d872941William King cfg_obj_t *servers = NULL;
615eff12e0e3565c52758292e10080a25d872941William King cfg_obj_t *server = NULL;
615eff12e0e3565c52758292e10080a25d872941William King cfg_obj_t *defkey = NULL;
615eff12e0e3565c52758292e10080a25d872941William King cfg_obj_t *keys = NULL;
615eff12e0e3565c52758292e10080a25d872941William King cfg_obj_t *key = NULL;
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence cfg_obj_t *defport = NULL;
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence cfg_obj_t *secretobj = NULL;
615eff12e0e3565c52758292e10080a25d872941William King cfg_obj_t *algorithmobj = NULL;
615eff12e0e3565c52758292e10080a25d872941William King cfg_listelt_t *elt;
615eff12e0e3565c52758292e10080a25d872941William King const char *keyname = NULL;
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington const char *secretstr;
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington const char *algorithm;
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington isc_boolean_t portset = ISC_FALSE;
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington char secretarray[1024];
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington char *p;
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington size_t argslen;
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington int ch;
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington int i;
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington admin_conffile = RNDC_SYSCONFDIR "/rndc.conf"; isc_app_start();
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington result = isc_file_progname(*argv, program, sizeof(program));
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington if (result != ISC_R_SUCCESS)
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington memcpy(progname, "rndc", 5);
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington progname = program;
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington while ((ch = isc_commandline_parse(argc, argv, "c:Mmp:s:Vy:"))
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington != -1) {
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington switch (ch) {
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington case 'c':
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington admin_conffile = isc_commandline_argument;
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington break;
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington case 'M':
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington isc_mem_debugging = 1;
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington break;
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington
615eff12e0e3565c52758292e10080a25d872941William King case 'm':
0942b8e0d660895ae96ffbd447fd0290fe60539cMichael Graff show_final_mem = ISC_TRUE;
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington break;
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington case 'p':
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington remoteport = atoi(isc_commandline_argument);
11836b7a55fa62ee6628e4e41845a0ef7084e383David Lawrence if (remoteport > 65535)
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington fatal("port '%s' out of range",
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington isc_commandline_argument);
a7d792804f564aa0889a94f64913b11bffd9738cBrian Wellington portset = ISC_TRUE;
0942b8e0d660895ae96ffbd447fd0290fe60539cMichael Graff break;
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington
a7d792804f564aa0889a94f64913b11bffd9738cBrian Wellington case 's':
615eff12e0e3565c52758292e10080a25d872941William King servername = isc_commandline_argument;
0942b8e0d660895ae96ffbd447fd0290fe60539cMichael Graff break;
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington case 'V':
8d0470dbdb0953796a4ccad60db635bcb6bc9086Bob Halley verbose = ISC_TRUE;
0942b8e0d660895ae96ffbd447fd0290fe60539cMichael Graff break;
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington case 'y':
8d0470dbdb0953796a4ccad60db635bcb6bc9086Bob Halley keyname = isc_commandline_argument;
615eff12e0e3565c52758292e10080a25d872941William King break;
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington case '?':
11836b7a55fa62ee6628e4e41845a0ef7084e383David Lawrence usage(0);
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington break;
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington default:
a9bc95f22ef2dd4a12e79be99412c9f18b814a5dBrian Wellington fatal("unexpected error parsing command arguments: "
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington "got %c\n", ch);
615eff12e0e3565c52758292e10080a25d872941William King break;
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington }
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington }
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence argc -= isc_commandline_index;
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence argv += isc_commandline_index;
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence if (argc < 1)
7c37bc1a67a80209e05f6b1c01fa7fde7d0dd200Brian Wellington usage(1);
615eff12e0e3565c52758292e10080a25d872941William King
b3ef06344abad0105be99b622e615dcbd87911e1Brian Wellington DO("create memory context", isc_mem_create(0, 0, &mctx));
b3ef06344abad0105be99b622e615dcbd87911e1Brian Wellington DO("create socket manager", isc_socketmgr_create(mctx, &socketmgr));
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington DO("create task manager", isc_taskmgr_create(mctx, 1, 0, &taskmgr));
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington DO("create task", isc_task_create(taskmgr, 0, &task));
b869f35f43100c71c6d06bd23934b4a2c5ed4cb7Brian Wellington
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington DO("create logging context", isc_log_create(mctx, &log, &logconfig));
79d91e915023ffa5fac1bb2f91f19210bb18407cBrian Wellington isc_log_setcontext(log);
615eff12e0e3565c52758292e10080a25d872941William King DO("setting log tag", isc_log_settag(logconfig, progname));
615eff12e0e3565c52758292e10080a25d872941William King logdest.file.stream = stderr;
615eff12e0e3565c52758292e10080a25d872941William King logdest.file.name = NULL;
615eff12e0e3565c52758292e10080a25d872941William King logdest.file.versions = ISC_LOG_ROLLNEVER;
615eff12e0e3565c52758292e10080a25d872941William King logdest.file.maximum_size = 0;
615eff12e0e3565c52758292e10080a25d872941William King DO("creating log channel",
615eff12e0e3565c52758292e10080a25d872941William King isc_log_createchannel(logconfig, "stderr",
615eff12e0e3565c52758292e10080a25d872941William King ISC_LOG_TOFILEDESC, ISC_LOG_INFO, &logdest,
615eff12e0e3565c52758292e10080a25d872941William King ISC_LOG_PRINTTAG|ISC_LOG_PRINTLEVEL));
615eff12e0e3565c52758292e10080a25d872941William King DO("enabling log channel", isc_log_usechannel(logconfig, "stderr",
615eff12e0e3565c52758292e10080a25d872941William King NULL, NULL));
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King parse_config(mctx, log, &pctx, &config);
ed019cabc1cc75d4412010c331876e4ae5080a4dDavid Lawrence
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King (void)cfg_map_get(config, "options", &options);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King if (servername == NULL && options != NULL) {
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence cfg_obj_t *defserverobj = NULL;
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence (void)cfg_map_get(options, "default-server", &defserverobj);
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence if (defserverobj != NULL)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King servername = cfg_obj_asstring(defserverobj);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King }
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King if (servername == NULL)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King fatal("no server specified and no default");
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King cfg_map_get(config, "server", &servers);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King if (servers != NULL) {
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King for (elt = cfg_list_first(servers);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King elt != NULL;
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King elt = cfg_list_next(elt))
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King {
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King const char *name;
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King server = cfg_listelt_value(elt);
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence name = cfg_obj_asstring(cfg_map_getname(server));
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence if (strcasecmp(name, servername) == 0)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King break;
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King server = NULL;
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King }
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King }
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King /*
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King * Look for the name of the key to use.
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King */
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King if (keyname != NULL)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King ; /* Was set on command line, do nothing. */
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King else if (server != NULL) {
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King DO("get key for server", cfg_map_get(server, "key", &defkey));
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King keyname = cfg_obj_asstring(defkey);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King } else if (options != NULL) {
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King DO("get default key", cfg_map_get(options, "default-key",
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King &defkey));
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King keyname = cfg_obj_asstring(defkey);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King } else
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King fatal("no key for server and no default");
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King /*
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King * Get the key's definition.
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King */
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King DO("get config key list", cfg_map_get(config, "key", &keys));
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King for (elt = cfg_list_first(keys);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King elt != NULL;
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King elt = cfg_list_next(elt))
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King {
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King key = cfg_listelt_value(elt);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King if (strcasecmp(cfg_obj_asstring(cfg_map_getname(key)),
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King keyname) == 0)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King break;
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King }
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King if (elt == NULL)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King fatal("no key definition for name %s", keyname);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King (void)cfg_map_get(key, "secret", &secretobj);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King (void)cfg_map_get(key, "algorithm", &algorithmobj);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King if (secretobj == NULL || algorithmobj == NULL)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King fatal("key must have algorithm and secret");
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King secretstr = cfg_obj_asstring(secretobj);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King algorithm = cfg_obj_asstring(algorithmobj);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King if (strcasecmp(algorithm, "hmac-md5") != 0)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King fatal("unsupported algorithm: %s", algorithm);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King secret.rstart = (unsigned char *)secretarray;
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King secret.rend = (unsigned char *)secretarray + sizeof(secretarray);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King DO("decode base64 secret", isccc_base64_decode(secretstr, &secret));
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King secret.rend = secret.rstart;
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King secret.rstart = (unsigned char *)secretarray;
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King /*
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King * Find the port to connect to.
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence */
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence if (portset)
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence ; /* Was set on command line, do nothing. */
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King else {
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King if (server != NULL)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King (void)cfg_map_get(server, "port", &defport);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King if (defport == NULL && options != NULL)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King cfg_map_get(options, "default-port", &defport);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King }
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King if (defport != NULL) {
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King remoteport = cfg_obj_asuint32(defport);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King if (remoteport > 65535)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King fatal("port %d out of range", remoteport);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King } else if (!portset)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King remoteport = NS_CONTROL_PORT;
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King isccc_result_register();
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King command = *argv;
18670af94df89d403465aecc607f3e860acb5931Bob Halley
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King /*
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King * Convert argc/argv into a space-delimited command string
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King * similar to what the user might enter in interactive mode
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King * (if that were implemented).
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King */
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King argslen = 0;
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King for (i = 0; i < argc; i++)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King argslen += strlen(argv[i]) + 1;
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King args = isc_mem_get(mctx, argslen);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King if (args == NULL)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King DO("isc_mem_get", ISC_R_NOMEMORY);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King p = args;
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King for (i = 0; i < argc; i++) {
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King size_t len = strlen(argv[i]);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King memcpy(p, argv[i], len);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King p += len;
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King *p++ = ' ';
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King }
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King p--;
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King *p++ = '\0';
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King INSIST(p == args + argslen);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King notify(command);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King if (strcmp(command, "restart") == 0)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King fatal("'%s' is not implemented", command);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King DO("post event", isc_app_onrun(mctx, task, rndc_start, NULL));
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King isc_app_run();
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King if (connects > 0 || sends > 0 || recvs > 0)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King isc_socket_cancel(ccmsg.sock, task, ISC_SOCKCANCEL_ALL);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King isc_task_detach(&task);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King isc_taskmgr_destroy(&taskmgr);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King isc_socketmgr_destroy(&socketmgr);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King isc_log_destroy(&log);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King isc_log_setcontext(NULL);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King cfg_obj_destroy(pctx, &config);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King cfg_parser_destroy(&pctx);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King isc_mem_put(mctx, args, argslen);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King isccc_ccmsg_invalidate(&ccmsg);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King if (show_final_mem)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King isc_mem_stats(mctx, stderr);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King isc_mem_destroy(&mctx);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King if (failed)
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King return (1);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King return (0);
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King}
e5966f9b9a13fc83afaf9b74ac1f7eea6a647817William King