summaryrefslogtreecommitdiff
path: root/usr.sbin/bind
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/bind')
-rw-r--r--usr.sbin/bind/lib/isc/Makefile.in4
-rw-r--r--usr.sbin/bind/lib/isc/httpd.c1129
-rw-r--r--usr.sbin/bind/lib/isc/include/isc/Makefile.in7
-rw-r--r--usr.sbin/bind/lib/isc/include/isc/httpd.h86
-rw-r--r--usr.sbin/bind/lib/isc/include/isc/json.h49
-rw-r--r--usr.sbin/bind/lib/isc/include/isc/mem.h20
-rw-r--r--usr.sbin/bind/lib/isc/include/isc/socket.h22
-rw-r--r--usr.sbin/bind/lib/isc/include/isc/task.h16
-rw-r--r--usr.sbin/bind/lib/isc/include/isc/xml.h41
-rw-r--r--usr.sbin/bind/lib/isc/mem.c327
-rw-r--r--usr.sbin/bind/lib/isc/task.c206
-rw-r--r--usr.sbin/bind/lib/isc/unix/socket.c281
12 files changed, 19 insertions, 2169 deletions
diff --git a/usr.sbin/bind/lib/isc/Makefile.in b/usr.sbin/bind/lib/isc/Makefile.in
index 890d26b100f..5b0d12321a2 100644
--- a/usr.sbin/bind/lib/isc/Makefile.in
+++ b/usr.sbin/bind/lib/isc/Makefile.in
@@ -49,7 +49,7 @@ OBJS = @ISC_EXTRA_OBJS@ @ISC_PK11_O@ @ISC_PK11_RESULT_O@ \
bind9.@O@ buffer.@O@ bufferlist.@O@ \
commandline.@O@ counter.@O@ crc64.@O@ error.@O@ event.@O@ \
hash.@O@ heap.@O@ hex.@O@ hmacmd5.@O@ hmacsha.@O@ \
- httpd.@O@ inet_aton.@O@ iterated_hash.@O@ \
+ inet_aton.@O@ iterated_hash.@O@ \
lex.@O@ lfsr.@O@ lib.@O@ log.@O@ \
md5.@O@ mem.@O@ mutexblock.@O@ \
netaddr.@O@ netscope.@O@ pool.@O@ ondestroy.@O@ \
@@ -66,7 +66,7 @@ SRCS = @ISC_EXTRA_SRCS@ @ISC_PK11_C@ @ISC_PK11_RESULT_C@ \
aes.c assertions.c base32.c base64.c bind9.c \
buffer.c bufferlist.c commandline.c counter.c crc64.c \
error.c event.c heap.c hex.c hmacmd5.c hmacsha.c \
- httpd.c inet_aton.c iterated_hash.c \
+ inet_aton.c iterated_hash.c \
lex.c lfsr.c lib.c log.c \
md5.c mem.c mutexblock.c \
netaddr.c netscope.c pool.c ondestroy.c \
diff --git a/usr.sbin/bind/lib/isc/httpd.c b/usr.sbin/bind/lib/isc/httpd.c
deleted file mode 100644
index 4b33468bcb5..00000000000
--- a/usr.sbin/bind/lib/isc/httpd.c
+++ /dev/null
@@ -1,1129 +0,0 @@
-/*
- * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
- * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
- * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-/* $Id: httpd.c,v 1.4 2020/01/09 18:17:19 florian Exp $ */
-
-/*! \file */
-
-#include <config.h>
-
-#include <isc/buffer.h>
-#include <isc/httpd.h>
-#include <isc/mem.h>
-
-#include <isc/socket.h>
-#include <isc/string.h>
-#include <isc/task.h>
-#include <isc/time.h>
-#include <isc/util.h>
-
-#include <string.h>
-
-/*%
- * TODO:
- *
- * o Put in better checks to make certain things are passed in correctly.
- * This includes a magic number for externally-visible structures,
- * checking for NULL-ness before dereferencing, etc.
- * o Make the URL processing external functions which will fill-in a buffer
- * structure we provide, or return an error and we will render a generic
- * page and close the client.
- */
-
-#define MSHUTTINGDOWN(cm) ((cm->flags & ISC_HTTPDMGR_FLAGSHUTTINGDOWN) != 0)
-#define MSETSHUTTINGDOWN(cm) (cm->flags |= ISC_HTTPDMGR_FLAGSHUTTINGDOWN)
-
-#ifdef DEBUG_HTTPD
-#define ENTER(x) do { fprintf(stderr, "ENTER %s\n", (x)); } while (0)
-#define EXIT(x) do { fprintf(stderr, "EXIT %s\n", (x)); } while (0)
-#define NOTICE(x) do { fprintf(stderr, "NOTICE %s\n", (x)); } while (0)
-#else
-#define ENTER(x) do { } while(0)
-#define EXIT(x) do { } while(0)
-#define NOTICE(x) do { } while(0)
-#endif
-
-#define HTTP_RECVLEN 1024
-#define HTTP_SENDGROW 1024
-#define HTTP_SEND_MAXLEN 10240
-
-#define HTTPD_CLOSE 0x0001 /* Got a Connection: close header */
-#define HTTPD_FOUNDHOST 0x0002 /* Got a Host: header */
-#define HTTPD_KEEPALIVE 0x0004 /* Got a Connection: Keep-Alive */
-
-/*% http client */
-struct isc_httpd {
- isc_httpdmgr_t *mgr; /*%< our parent */
- ISC_LINK(isc_httpd_t) link;
- unsigned int state;
- isc_socket_t *sock;
-
- /*%
- * Received data state.
- */
- char recvbuf[HTTP_RECVLEN]; /*%< receive buffer */
- uint32_t recvlen; /*%< length recv'd */
- char *headers; /*%< set in process_request() */
- unsigned int method;
- char *url;
- char *querystring;
- char *protocol;
-
- /*
- * Flags on the httpd client.
- */
- int flags;
-
- /*%
- * Transmit data state.
- *
- * This is the data buffer we will transmit.
- *
- * This free function pointer is filled in by the rendering function
- * we call. The free function is called after the data is transmitted
- * to the client.
- *
- * The bufflist is the list of buffers we are currently transmitting.
- * The headerdata is where we render our headers to. If we run out of
- * space when rendering a header, we will change the size of our
- * buffer. We will not free it until we are finished, and will
- * allocate an additional HTTP_SENDGROW bytes per header space grow.
- *
- * We currently use two buffers total, one for the headers (which
- * we manage) and another for the client to fill in (which it manages,
- * it provides the space for it, etc) -- we will pass that buffer
- * structure back to the caller, who is responsible for managing the
- * space it may have allocated as backing store for it. This second
- * buffer is bodybuffer, and we only allocate the buffer itself, not
- * the backing store.
- */
- isc_bufferlist_t bufflist;
- char *headerdata; /*%< send header buf */
- unsigned int headerlen; /*%< current header buffer size */
- isc_buffer_t headerbuffer;
-
- const char *mimetype;
- unsigned int retcode;
- const char *retmsg;
- isc_buffer_t bodybuffer;
- isc_httpdfree_t *freecb;
- void *freecb_arg;
-};
-
-/*% lightweight socket manager for httpd output */
-struct isc_httpdmgr {
- isc_mem_t *mctx;
- isc_socket_t *sock; /*%< listening socket */
- isc_task_t *task; /*%< owning task */
- isc_timermgr_t *timermgr;
-
- isc_httpdclientok_t *client_ok; /*%< client validator */
- isc_httpdondestroy_t *ondestroy; /*%< cleanup callback */
- void *cb_arg; /*%< argument for the above */
-
- unsigned int flags;
- ISC_LIST(isc_httpd_t) running; /*%< running clients */
-
- isc_mutex_t lock;
-
- ISC_LIST(isc_httpdurl_t) urls; /*%< urls we manage */
- isc_httpdaction_t *render_404;
- isc_httpdaction_t *render_500;
-};
-
-/*%
- * HTTP methods.
- */
-#define ISC_HTTPD_METHODUNKNOWN 0
-#define ISC_HTTPD_METHODGET 1
-#define ISC_HTTPD_METHODPOST 2
-
-/*%
- * Client states.
- *
- * _IDLE The client is not doing anything at all. This state should
- * only occur just after creation, and just before being
- * destroyed.
- *
- * _RECV The client is waiting for data after issuing a socket recv().
- *
- * _RECVDONE Data has been received, and is being processed.
- *
- * _SEND All data for a response has completed, and a reply was
- * sent via a socket send() call.
- *
- * _SENDDONE Send is completed.
- *
- * Badly formatted state table:
- *
- * IDLE -> RECV when client has a recv() queued.
- *
- * RECV -> RECVDONE when recvdone event received.
- *
- * RECVDONE -> SEND if the data for a reply is at hand.
- *
- * SEND -> RECV when a senddone event was received.
- *
- * At any time -> RECV on error. If RECV fails, the client will
- * self-destroy, closing the socket and freeing memory.
- */
-#define ISC_HTTPD_STATEIDLE 0
-#define ISC_HTTPD_STATERECV 1
-#define ISC_HTTPD_STATERECVDONE 2
-#define ISC_HTTPD_STATESEND 3
-#define ISC_HTTPD_STATESENDDONE 4
-
-#define ISC_HTTPD_ISRECV(c) ((c)->state == ISC_HTTPD_STATERECV)
-#define ISC_HTTPD_ISRECVDONE(c) ((c)->state == ISC_HTTPD_STATERECVDONE)
-#define ISC_HTTPD_ISSEND(c) ((c)->state == ISC_HTTPD_STATESEND)
-#define ISC_HTTPD_ISSENDDONE(c) ((c)->state == ISC_HTTPD_STATESENDDONE)
-
-/*%
- * Overall magic test that means we're not idle.
- */
-#define ISC_HTTPD_SETRECV(c) ((c)->state = ISC_HTTPD_STATERECV)
-#define ISC_HTTPD_SETRECVDONE(c) ((c)->state = ISC_HTTPD_STATERECVDONE)
-#define ISC_HTTPD_SETSEND(c) ((c)->state = ISC_HTTPD_STATESEND)
-#define ISC_HTTPD_SETSENDDONE(c) ((c)->state = ISC_HTTPD_STATESENDDONE)
-
-static void isc_httpd_accept(isc_task_t *, isc_event_t *);
-static void isc_httpd_recvdone(isc_task_t *, isc_event_t *);
-static void isc_httpd_senddone(isc_task_t *, isc_event_t *);
-static void destroy_client(isc_httpd_t **);
-static isc_result_t process_request(isc_httpd_t *, int);
-static void httpdmgr_destroy(isc_httpdmgr_t *);
-static isc_result_t grow_headerspace(isc_httpd_t *);
-static void reset_client(isc_httpd_t *httpd);
-
-static isc_httpdaction_t render_404;
-static isc_httpdaction_t render_500;
-
-static void
-destroy_client(isc_httpd_t **httpdp) {
- isc_httpd_t *httpd = *httpdp;
- isc_httpdmgr_t *httpdmgr = httpd->mgr;
-
- *httpdp = NULL;
-
- LOCK(&httpdmgr->lock);
-
- isc_socket_detach(&httpd->sock);
- ISC_LIST_UNLINK(httpdmgr->running, httpd, link);
-
- if (httpd->headerlen > 0)
- isc_mem_put(httpdmgr->mctx, httpd->headerdata,
- httpd->headerlen);
-
- isc_mem_put(httpdmgr->mctx, httpd, sizeof(isc_httpd_t));
-
- UNLOCK(&httpdmgr->lock);
-
- httpdmgr_destroy(httpdmgr);
-}
-
-isc_result_t
-isc_httpdmgr_create(isc_mem_t *mctx, isc_socket_t *sock, isc_task_t *task,
- isc_httpdclientok_t *client_ok,
- isc_httpdondestroy_t *ondestroy, void *cb_arg,
- isc_timermgr_t *tmgr, isc_httpdmgr_t **httpdmgrp)
-{
- isc_result_t result;
- isc_httpdmgr_t *httpdmgr;
-
- REQUIRE(mctx != NULL);
- REQUIRE(sock != NULL);
- REQUIRE(task != NULL);
- REQUIRE(tmgr != NULL);
- REQUIRE(httpdmgrp != NULL && *httpdmgrp == NULL);
-
- httpdmgr = isc_mem_get(mctx, sizeof(isc_httpdmgr_t));
- if (httpdmgr == NULL)
- return (ISC_R_NOMEMORY);
-
- result = isc_mutex_init(&httpdmgr->lock);
- if (result != ISC_R_SUCCESS) {
- isc_mem_put(mctx, httpdmgr, sizeof(isc_httpdmgr_t));
- return (result);
- }
- httpdmgr->mctx = NULL;
- isc_mem_attach(mctx, &httpdmgr->mctx);
- httpdmgr->sock = NULL;
- isc_socket_attach(sock, &httpdmgr->sock);
- httpdmgr->task = NULL;
- isc_task_attach(task, &httpdmgr->task);
- httpdmgr->timermgr = tmgr; /* XXXMLG no attach function? */
- httpdmgr->client_ok = client_ok;
- httpdmgr->ondestroy = ondestroy;
- httpdmgr->cb_arg = cb_arg;
- httpdmgr->flags = 0;
-
- ISC_LIST_INIT(httpdmgr->running);
- ISC_LIST_INIT(httpdmgr->urls);
-
- /* XXXMLG ignore errors on isc_socket_listen() */
- result = isc_socket_listen(sock, SOMAXCONN);
- if (result != ISC_R_SUCCESS) {
- UNEXPECTED_ERROR(__FILE__, __LINE__,
- "isc_socket_listen() failed: %s",
- isc_result_totext(result));
- goto cleanup;
- }
-
- (void)isc_socket_filter(sock, "httpready");
-
- result = isc_socket_accept(sock, task, isc_httpd_accept, httpdmgr);
- if (result != ISC_R_SUCCESS)
- goto cleanup;
-
- httpdmgr->render_404 = render_404;
- httpdmgr->render_500 = render_500;
-
- *httpdmgrp = httpdmgr;
- return (ISC_R_SUCCESS);
-
- cleanup:
- isc_task_detach(&httpdmgr->task);
- isc_socket_detach(&httpdmgr->sock);
- isc_mem_detach(&httpdmgr->mctx);
- (void)isc_mutex_destroy(&httpdmgr->lock);
- isc_mem_put(mctx, httpdmgr, sizeof(isc_httpdmgr_t));
- return (result);
-}
-
-static void
-httpdmgr_destroy(isc_httpdmgr_t *httpdmgr) {
- isc_mem_t *mctx;
- isc_httpdurl_t *url;
-
- ENTER("httpdmgr_destroy");
-
- LOCK(&httpdmgr->lock);
-
- if (!MSHUTTINGDOWN(httpdmgr)) {
- NOTICE("httpdmgr_destroy not shutting down yet");
- UNLOCK(&httpdmgr->lock);
- return;
- }
-
- /*
- * If all clients are not shut down, don't do anything yet.
- */
- if (!ISC_LIST_EMPTY(httpdmgr->running)) {
- NOTICE("httpdmgr_destroy clients still active");
- UNLOCK(&httpdmgr->lock);
- return;
- }
-
- NOTICE("httpdmgr_destroy detaching socket, task, and timermgr");
-
- isc_socket_detach(&httpdmgr->sock);
- isc_task_detach(&httpdmgr->task);
- httpdmgr->timermgr = NULL;
-
- /*
- * Clear out the list of all actions we know about. Just free the
- * memory.
- */
- url = ISC_LIST_HEAD(httpdmgr->urls);
- while (url != NULL) {
- isc_mem_free(httpdmgr->mctx, url->url);
- ISC_LIST_UNLINK(httpdmgr->urls, url, link);
- isc_mem_put(httpdmgr->mctx, url, sizeof(isc_httpdurl_t));
- url = ISC_LIST_HEAD(httpdmgr->urls);
- }
-
- UNLOCK(&httpdmgr->lock);
- (void)isc_mutex_destroy(&httpdmgr->lock);
-
- if (httpdmgr->ondestroy != NULL)
- (httpdmgr->ondestroy)(httpdmgr->cb_arg);
-
- mctx = httpdmgr->mctx;
- isc_mem_putanddetach(&mctx, httpdmgr, sizeof(isc_httpdmgr_t));
-
- EXIT("httpdmgr_destroy");
-}
-
-#define LENGTHOK(s) (httpd->recvbuf - (s) < (int)httpd->recvlen)
-#define BUFLENOK(s) (httpd->recvbuf - (s) < HTTP_RECVLEN)
-
-/*
- * Look for the given header in headers.
- * If value is specified look for it terminated with a character in eov.
- */
-static isc_boolean_t
-have_header(isc_httpd_t *httpd, const char *header, const char *value,
- const char *eov)
-{
- char *cr, *nl, *h;
- size_t hlen, vlen = 0;
-
- h = httpd->headers;
- hlen = strlen(header);
- if (value != NULL) {
- INSIST(eov != NULL);
- vlen = strlen(value);
- }
-
- for (;;) {
- if (strncasecmp(h, header, hlen) != 0) {
- /*
- * Skip to next line;
- */
- cr = strchr(h, '\r');
- if (cr != NULL && cr[1] == '\n')
- cr++;
- nl = strchr(h, '\n');
-
- /* last header? */
- h = cr;
- if (h == NULL || (nl != NULL && nl < h))
- h = nl;
- if (h == NULL)
- return (ISC_FALSE);
- h++;
- continue;
- }
-
- if (value == NULL)
- return (ISC_TRUE);
-
- /*
- * Skip optional leading white space.
- */
- h += hlen;
- while (*h == ' ' || *h == '\t')
- h++;
- /*
- * Terminate token search on NULL or EOL.
- */
- while (*h != 0 && *h != '\r' && *h != '\n') {
- if (strncasecmp(h, value, vlen) == 0)
- if (strchr(eov, h[vlen]) != NULL)
- return (ISC_TRUE);
- /*
- * Skip to next token.
- */
- h += strcspn(h, eov);
- if (h[0] == '\r' && h[1] == '\n')
- h++;
- if (h[0] != 0)
- h++;
- }
- return (ISC_FALSE);
- }
-}
-
-static isc_result_t
-process_request(isc_httpd_t *httpd, int length) {
- char *s;
- char *p;
- int delim;
-
- ENTER("request");
-
- httpd->recvlen += length;
-
- httpd->recvbuf[httpd->recvlen] = 0;
- httpd->headers = NULL;
-
- /*
- * If we don't find a blank line in our buffer, return that we need
- * more data.
- */
- s = strstr(httpd->recvbuf, "\r\n\r\n");
- delim = 2;
- if (s == NULL) {
- s = strstr(httpd->recvbuf, "\n\n");
- delim = 1;
- }
- if (s == NULL)
- return (ISC_R_NOTFOUND);
-
- /*
- * NUL terminate request at the blank line.
- */
- s[delim] = 0;
-
- /*
- * Determine if this is a POST or GET method. Any other values will
- * cause an error to be returned.
- */
- if (strncmp(httpd->recvbuf, "GET ", 4) == 0) {
- httpd->method = ISC_HTTPD_METHODGET;
- p = httpd->recvbuf + 4;
- } else if (strncmp(httpd->recvbuf, "POST ", 5) == 0) {
- httpd->method = ISC_HTTPD_METHODPOST;
- p = httpd->recvbuf + 5;
- } else {
- return (ISC_R_RANGE);
- }
-
- /*
- * From now on, p is the start of our buffer.
- */
-
- /*
- * Extract the URL.
- */
- s = p;
- while (LENGTHOK(s) && BUFLENOK(s) &&
- (*s != '\n' && *s != '\r' && *s != '\0' && *s != ' '))
- s++;
- if (!LENGTHOK(s))
- return (ISC_R_NOTFOUND);
- if (!BUFLENOK(s))
- return (ISC_R_NOMEMORY);
- *s = 0;
-
- /*
- * Make the URL relative.
- */
- if ((strncmp(p, "http:/", 6) == 0)
- || (strncmp(p, "https:/", 7) == 0)) {
- /* Skip first / */
- while (*p != '/' && *p != 0)
- p++;
- if (*p == 0)
- return (ISC_R_RANGE);
- p++;
- /* Skip second / */
- while (*p != '/' && *p != 0)
- p++;
- if (*p == 0)
- return (ISC_R_RANGE);
- p++;
- /* Find third / */
- while (*p != '/' && *p != 0)
- p++;
- if (*p == 0) {
- p--;
- *p = '/';
- }
- }
-
- httpd->url = p;
- p = s + 1;
- s = p;
-
- /*
- * Now, see if there is a ? mark in the URL. If so, this is
- * part of the query string, and we will split it from the URL.
- */
- httpd->querystring = strchr(httpd->url, '?');
- if (httpd->querystring != NULL) {
- *(httpd->querystring) = 0;
- httpd->querystring++;
- }
-
- /*
- * Extract the HTTP/1.X protocol. We will bounce on anything but
- * HTTP/1.0 or HTTP/1.1 for now.
- */
- while (LENGTHOK(s) && BUFLENOK(s) &&
- (*s != '\n' && *s != '\r' && *s != '\0'))
- s++;
- if (!LENGTHOK(s))
- return (ISC_R_NOTFOUND);
- if (!BUFLENOK(s))
- return (ISC_R_NOMEMORY);
- /*
- * Check that we have the expected eol delimiter.
- */
- if (strncmp(s, delim == 1 ? "\n" : "\r\n", delim) != 0)
- return (ISC_R_RANGE);
- *s = 0;
- if ((strncmp(p, "HTTP/1.0", 8) != 0)
- && (strncmp(p, "HTTP/1.1", 8) != 0))
- return (ISC_R_RANGE);
- httpd->protocol = p;
- p = s + delim; /* skip past eol */
- s = p;
-
- httpd->headers = s;
-
- if (have_header(httpd, "Connection:", "close", ", \t\r\n"))
- httpd->flags |= HTTPD_CLOSE;
-
- if (have_header(httpd, "Host:", NULL, NULL))
- httpd->flags |= HTTPD_FOUNDHOST;
-
- if (strncmp(httpd->protocol, "HTTP/1.0", 8) == 0) {
- if (have_header(httpd, "Connection:", "Keep-Alive",
- ", \t\r\n"))
- httpd->flags |= HTTPD_KEEPALIVE;
- else
- httpd->flags |= HTTPD_CLOSE;
- }
-
- /*
- * Standards compliance hooks here.
- */
- if (strcmp(httpd->protocol, "HTTP/1.1") == 0
- && ((httpd->flags & HTTPD_FOUNDHOST) == 0))
- return (ISC_R_RANGE);
-
- EXIT("request");
-
- return (ISC_R_SUCCESS);
-}
-
-static void
-isc_httpd_accept(isc_task_t *task, isc_event_t *ev) {
- isc_result_t result;
- isc_httpdmgr_t *httpdmgr = ev->ev_arg;
- isc_httpd_t *httpd;
- isc_region_t r;
- isc_socket_newconnev_t *nev = (isc_socket_newconnev_t *)ev;
- isc_sockaddr_t peeraddr;
-
- ENTER("accept");
-
- LOCK(&httpdmgr->lock);
- if (MSHUTTINGDOWN(httpdmgr)) {
- NOTICE("accept shutting down, goto out");
- goto out;
- }
-
- if (nev->result == ISC_R_CANCELED) {
- NOTICE("accept canceled, goto out");
- goto out;
- }
-
- if (nev->result != ISC_R_SUCCESS) {
- /* XXXMLG log failure */
- NOTICE("accept returned failure, goto requeue");
- goto requeue;
- }
-
- (void)isc_socket_getpeername(nev->newsocket, &peeraddr);
- if (httpdmgr->client_ok != NULL &&
- !(httpdmgr->client_ok)(&peeraddr, httpdmgr->cb_arg)) {
- isc_socket_detach(&nev->newsocket);
- goto requeue;
- }
-
- httpd = isc_mem_get(httpdmgr->mctx, sizeof(isc_httpd_t));
- if (httpd == NULL) {
- /* XXXMLG log failure */
- NOTICE("accept failed to allocate memory, goto requeue");
- isc_socket_detach(&nev->newsocket);
- goto requeue;
- }
-
- httpd->mgr = httpdmgr;
- ISC_LINK_INIT(httpd, link);
- ISC_LIST_APPEND(httpdmgr->running, httpd, link);
- ISC_HTTPD_SETRECV(httpd);
- httpd->sock = nev->newsocket;
- isc_socket_setname(httpd->sock, "httpd", NULL);
- httpd->flags = 0;
-
- /*
- * Initialize the buffer for our headers.
- */
- httpd->headerdata = isc_mem_get(httpdmgr->mctx, HTTP_SENDGROW);
- if (httpd->headerdata == NULL) {
- isc_mem_put(httpdmgr->mctx, httpd, sizeof(isc_httpd_t));
- isc_socket_detach(&nev->newsocket);
- goto requeue;
- }
- httpd->headerlen = HTTP_SENDGROW;
- isc_buffer_init(&httpd->headerbuffer, httpd->headerdata,
- httpd->headerlen);
-
- ISC_LIST_INIT(httpd->bufflist);
-
- isc_buffer_initnull(&httpd->bodybuffer);
- reset_client(httpd);
-
- r.base = (unsigned char *)httpd->recvbuf;
- r.length = HTTP_RECVLEN - 1;
- result = isc_socket_recv(httpd->sock, &r, 1, task, isc_httpd_recvdone,
- httpd);
- /* FIXME!!! */
- POST(result);
- NOTICE("accept queued recv on socket");
-
- requeue:
- result = isc_socket_accept(httpdmgr->sock, task, isc_httpd_accept,
- httpdmgr);
- if (result != ISC_R_SUCCESS) {
- /* XXXMLG what to do? Log failure... */
- NOTICE("accept could not reaccept due to failure");
- }
-
- out:
- UNLOCK(&httpdmgr->lock);
-
- httpdmgr_destroy(httpdmgr);
-
- isc_event_free(&ev);
-
- EXIT("accept");
-}
-
-static isc_result_t
-render_404(const char *url, isc_httpdurl_t *urlinfo,
- const char *querystring, const char *headers, void *arg,
- unsigned int *retcode, const char **retmsg,
- const char **mimetype, isc_buffer_t *b,
- isc_httpdfree_t **freecb, void **freecb_args)
-{
- static char msg[] = "No such URL.\r\n";
-
- UNUSED(url);
- UNUSED(urlinfo);
- UNUSED(querystring);
- UNUSED(headers);
- UNUSED(arg);
-
- *retcode = 404;
- *retmsg = "No such URL";
- *mimetype = "text/plain";
- isc_buffer_reinit(b, msg, strlen(msg));
- isc_buffer_add(b, strlen(msg));
- *freecb = NULL;
- *freecb_args = NULL;
-
- return (ISC_R_SUCCESS);
-}
-
-static isc_result_t
-render_500(const char *url, isc_httpdurl_t *urlinfo,
- const char *querystring, const char *headers, void *arg,
- unsigned int *retcode, const char **retmsg,
- const char **mimetype, isc_buffer_t *b,
- isc_httpdfree_t **freecb, void **freecb_args)
-{
- static char msg[] = "Internal server failure.\r\n";
-
- UNUSED(url);
- UNUSED(urlinfo);
- UNUSED(querystring);
- UNUSED(headers);
- UNUSED(arg);
-
- *retcode = 500;
- *retmsg = "Internal server failure";
- *mimetype = "text/plain";
- isc_buffer_reinit(b, msg, strlen(msg));
- isc_buffer_add(b, strlen(msg));
- *freecb = NULL;
- *freecb_args = NULL;
-
- return (ISC_R_SUCCESS);
-}
-
-static void
-isc_httpd_recvdone(isc_task_t *task, isc_event_t *ev) {
- isc_region_t r;
- isc_result_t result;
- isc_httpd_t *httpd = ev->ev_arg;
- isc_socketevent_t *sev = (isc_socketevent_t *)ev;
- isc_httpdurl_t *url;
- isc_time_t now;
- char datebuf[ISC_FORMATHTTPTIMESTAMP_SIZE];
-
- ENTER("recv");
-
- INSIST(ISC_HTTPD_ISRECV(httpd));
-
- if (sev->result != ISC_R_SUCCESS) {
- NOTICE("recv destroying client");
- destroy_client(&httpd);
- goto out;
- }
-
- result = process_request(httpd, sev->n);
- if (result == ISC_R_NOTFOUND) {
- if (httpd->recvlen >= HTTP_RECVLEN - 1) {
- destroy_client(&httpd);
- goto out;
- }
- r.base = (unsigned char *)httpd->recvbuf + httpd->recvlen;
- r.length = HTTP_RECVLEN - httpd->recvlen - 1;
- /* check return code? */
- (void)isc_socket_recv(httpd->sock, &r, 1, task,
- isc_httpd_recvdone, httpd);
- goto out;
- } else if (result != ISC_R_SUCCESS) {
- destroy_client(&httpd);
- goto out;
- }
-
- ISC_HTTPD_SETSEND(httpd);
-
- /*
- * XXXMLG Call function here. Provide an add-header function
- * which will append the common headers to a response we generate.
- */
- isc_buffer_initnull(&httpd->bodybuffer);
- isc_time_now(&now);
- isc_time_formathttptimestamp(&now, datebuf, sizeof(datebuf));
- url = ISC_LIST_HEAD(httpd->mgr->urls);
- while (url != NULL) {
- if (strcmp(httpd->url, url->url) == 0)
- break;
- url = ISC_LIST_NEXT(url, link);
- }
- if (url == NULL)
- result = httpd->mgr->render_404(httpd->url, NULL,
- httpd->querystring,
- NULL, NULL,
- &httpd->retcode,
- &httpd->retmsg,
- &httpd->mimetype,
- &httpd->bodybuffer,
- &httpd->freecb,
- &httpd->freecb_arg);
- else
- result = url->action(httpd->url, url,
- httpd->querystring,
- httpd->headers,
- url->action_arg,
- &httpd->retcode, &httpd->retmsg,
- &httpd->mimetype, &httpd->bodybuffer,
- &httpd->freecb, &httpd->freecb_arg);
- if (result != ISC_R_SUCCESS) {
- result = httpd->mgr->render_500(httpd->url, url,
- httpd->querystring,
- NULL, NULL,
- &httpd->retcode,
- &httpd->retmsg,
- &httpd->mimetype,
- &httpd->bodybuffer,
- &httpd->freecb,
- &httpd->freecb_arg);
- RUNTIME_CHECK(result == ISC_R_SUCCESS);
- }
-
- isc_httpd_response(httpd);
- if ((httpd->flags & HTTPD_KEEPALIVE) != 0)
- isc_httpd_addheader(httpd, "Connection", "Keep-Alive");
- isc_httpd_addheader(httpd, "Content-Type", httpd->mimetype);
- isc_httpd_addheader(httpd, "Date", datebuf);
- isc_httpd_addheader(httpd, "Expires", datebuf);
-
- if (url != NULL && url->isstatic) {
- char loadbuf[ISC_FORMATHTTPTIMESTAMP_SIZE];
- isc_time_formathttptimestamp(&url->loadtime,
- loadbuf, sizeof(loadbuf));
- isc_httpd_addheader(httpd, "Last-Modified", loadbuf);
- isc_httpd_addheader(httpd, "Cache-Control: public", NULL);
- } else {
- isc_httpd_addheader(httpd, "Last-Modified", datebuf);
- isc_httpd_addheader(httpd, "Pragma: no-cache", NULL);
- isc_httpd_addheader(httpd, "Cache-Control: no-cache", NULL);
- }
-
- isc_httpd_addheader(httpd, "Server: libisc", NULL);
- isc_httpd_addheaderuint(httpd, "Content-Length",
- isc_buffer_usedlength(&httpd->bodybuffer));
- isc_httpd_endheaders(httpd); /* done */
-
- ISC_LIST_APPEND(httpd->bufflist, &httpd->headerbuffer, link);
- /*
- * Link the data buffer into our send queue, should we have any data
- * rendered into it. If no data is present, we won't do anything
- * with the buffer.
- */
- if (isc_buffer_length(&httpd->bodybuffer) > 0)
- ISC_LIST_APPEND(httpd->bufflist, &httpd->bodybuffer, link);
-
- /* check return code? */
- (void)isc_socket_sendv(httpd->sock, &httpd->bufflist, task,
- isc_httpd_senddone, httpd);
-
- out:
- isc_event_free(&ev);
- EXIT("recv");
-}
-
-void
-isc_httpdmgr_shutdown(isc_httpdmgr_t **httpdmgrp) {
- isc_httpdmgr_t *httpdmgr;
- isc_httpd_t *httpd;
- httpdmgr = *httpdmgrp;
- *httpdmgrp = NULL;
-
- ENTER("isc_httpdmgr_shutdown");
-
- LOCK(&httpdmgr->lock);
-
- MSETSHUTTINGDOWN(httpdmgr);
-
- isc_socket_cancel(httpdmgr->sock, httpdmgr->task, ISC_SOCKCANCEL_ALL);
-
- httpd = ISC_LIST_HEAD(httpdmgr->running);
- while (httpd != NULL) {
- isc_socket_cancel(httpd->sock, httpdmgr->task,
- ISC_SOCKCANCEL_ALL);
- httpd = ISC_LIST_NEXT(httpd, link);
- }
-
- UNLOCK(&httpdmgr->lock);
-
- EXIT("isc_httpdmgr_shutdown");
-}
-
-static isc_result_t
-grow_headerspace(isc_httpd_t *httpd) {
- char *newspace;
- unsigned int newlen;
- isc_region_t r;
-
- newlen = httpd->headerlen + HTTP_SENDGROW;
- if (newlen > HTTP_SEND_MAXLEN)
- return (ISC_R_NOSPACE);
-
- newspace = isc_mem_get(httpd->mgr->mctx, newlen);
- if (newspace == NULL)
- return (ISC_R_NOMEMORY);
- isc_buffer_region(&httpd->headerbuffer, &r);
- isc_buffer_reinit(&httpd->headerbuffer, newspace, newlen);
-
- isc_mem_put(httpd->mgr->mctx, r.base, r.length);
-
- return (ISC_R_SUCCESS);
-}
-
-isc_result_t
-isc_httpd_response(isc_httpd_t *httpd) {
- isc_result_t result;
- unsigned int needlen;
-
- needlen = strlen(httpd->protocol) + 1; /* protocol + space */
- needlen += 3 + 1; /* room for response code, always 3 bytes */
- needlen += strlen(httpd->retmsg) + 2; /* return msg + CRLF */
-
- while (isc_buffer_availablelength(&httpd->headerbuffer) < needlen) {
- result = grow_headerspace(httpd);
- if (result != ISC_R_SUCCESS)
- return (result);
- }
-
- snprintf(isc_buffer_used(&httpd->headerbuffer),
- (int)isc_buffer_availablelength(&httpd->headerbuffer),
- "%s %03u %s\r\n", httpd->protocol, httpd->retcode,
- httpd->retmsg);
- isc_buffer_add(&httpd->headerbuffer, needlen);
-
- return (ISC_R_SUCCESS);
-}
-
-isc_result_t
-isc_httpd_addheader(isc_httpd_t *httpd, const char *name,
- const char *val)
-{
- isc_result_t result;
- unsigned int needlen;
-
- needlen = strlen(name); /* name itself */
- if (val != NULL)
- needlen += 2 + strlen(val); /* :<space> and val */
- needlen += 2; /* CRLF */
-
- while (isc_buffer_availablelength(&httpd->headerbuffer) < needlen) {
- result = grow_headerspace(httpd);
- if (result != ISC_R_SUCCESS)
- return (result);
- }
-
- if (val != NULL)
- snprintf(isc_buffer_used(&httpd->headerbuffer),
- isc_buffer_availablelength(&httpd->headerbuffer),
- "%s: %s\r\n", name, val);
- else
- snprintf(isc_buffer_used(&httpd->headerbuffer),
- isc_buffer_availablelength(&httpd->headerbuffer),
- "%s\r\n", name);
-
- isc_buffer_add(&httpd->headerbuffer, needlen);
-
- return (ISC_R_SUCCESS);
-}
-
-isc_result_t
-isc_httpd_endheaders(isc_httpd_t *httpd) {
- isc_result_t result;
-
- while (isc_buffer_availablelength(&httpd->headerbuffer) < 2) {
- result = grow_headerspace(httpd);
- if (result != ISC_R_SUCCESS)
- return (result);
- }
-
- snprintf(isc_buffer_used(&httpd->headerbuffer),
- isc_buffer_availablelength(&httpd->headerbuffer), "\r\n");
- isc_buffer_add(&httpd->headerbuffer, 2);
-
- return (ISC_R_SUCCESS);
-}
-
-isc_result_t
-isc_httpd_addheaderuint(isc_httpd_t *httpd, const char *name, int val) {
- isc_result_t result;
- unsigned int needlen;
- char buf[sizeof "18446744073709551616"];
-
- snprintf(buf, sizeof(buf), "%d", val);
-
- needlen = strlen(name); /* name itself */
- needlen += 2 + strlen(buf); /* :<space> and val */
- needlen += 2; /* CRLF */
-
- while (isc_buffer_availablelength(&httpd->headerbuffer) < needlen) {
- result = grow_headerspace(httpd);
- if (result != ISC_R_SUCCESS)
- return (result);
- }
-
- snprintf(isc_buffer_used(&httpd->headerbuffer),
- isc_buffer_availablelength(&httpd->headerbuffer),
- "%s: %s\r\n", name, buf);
-
- isc_buffer_add(&httpd->headerbuffer, needlen);
-
- return (ISC_R_SUCCESS);
-}
-
-static void
-isc_httpd_senddone(isc_task_t *task, isc_event_t *ev) {
- isc_httpd_t *httpd = ev->ev_arg;
- isc_region_t r;
- isc_socketevent_t *sev = (isc_socketevent_t *)ev;
-
- ENTER("senddone");
- INSIST(ISC_HTTPD_ISSEND(httpd));
-
- /*
- * First, unlink our header buffer from the socket's bufflist. This
- * is sort of an evil hack, since we know our buffer will be there,
- * and we know it's address, so we can just remove it directly.
- */
- NOTICE("senddone unlinked header");
- ISC_LIST_UNLINK(sev->bufferlist, &httpd->headerbuffer, link);
-
- /*
- * We will always want to clean up our receive buffer, even if we
- * got an error on send or we are shutting down.
- *
- * We will pass in the buffer only if there is data in it. If
- * there is no data, we will pass in a NULL.
- */
- if (httpd->freecb != NULL) {
- isc_buffer_t *b = NULL;
- if (isc_buffer_length(&httpd->bodybuffer) > 0) {
- b = &httpd->bodybuffer;
- httpd->freecb(b, httpd->freecb_arg);
- }
- NOTICE("senddone free callback performed");
- }
- if (ISC_LINK_LINKED(&httpd->bodybuffer, link)) {
- ISC_LIST_UNLINK(sev->bufferlist, &httpd->bodybuffer, link);
- NOTICE("senddone body buffer unlinked");
- }
-
- if (sev->result != ISC_R_SUCCESS) {
- destroy_client(&httpd);
- goto out;
- }
-
- if ((httpd->flags & HTTPD_CLOSE) != 0) {
- destroy_client(&httpd);
- goto out;
- }
-
- ISC_HTTPD_SETRECV(httpd);
-
- NOTICE("senddone restarting recv on socket");
-
- reset_client(httpd);
-
- r.base = (unsigned char *)httpd->recvbuf;
- r.length = HTTP_RECVLEN - 1;
- /* check return code? */
- (void)isc_socket_recv(httpd->sock, &r, 1, task,
- isc_httpd_recvdone, httpd);
-
-out:
- isc_event_free(&ev);
- EXIT("senddone");
-}
-
-static void
-reset_client(isc_httpd_t *httpd) {
- /*
- * Catch errors here. We MUST be in RECV mode, and we MUST NOT have
- * any outstanding buffers. If we have buffers, we have a leak.
- */
- INSIST(ISC_HTTPD_ISRECV(httpd));
- INSIST(!ISC_LINK_LINKED(&httpd->headerbuffer, link));
- INSIST(!ISC_LINK_LINKED(&httpd->bodybuffer, link));
-
- httpd->recvbuf[0] = 0;
- httpd->recvlen = 0;
- httpd->headers = NULL;
- httpd->method = ISC_HTTPD_METHODUNKNOWN;
- httpd->url = NULL;
- httpd->querystring = NULL;
- httpd->protocol = NULL;
- httpd->flags = 0;
-
- isc_buffer_clear(&httpd->headerbuffer);
- isc_buffer_invalidate(&httpd->bodybuffer);
-}
-
-isc_result_t
-isc_httpdmgr_addurl(isc_httpdmgr_t *httpdmgr, const char *url,
- isc_httpdaction_t *func, void *arg)
-{
- return (isc_httpdmgr_addurl2(httpdmgr, url, ISC_FALSE, func, arg));
-}
-
-isc_result_t
-isc_httpdmgr_addurl2(isc_httpdmgr_t *httpdmgr, const char *url,
- isc_boolean_t isstatic,
- isc_httpdaction_t *func, void *arg)
-{
- isc_httpdurl_t *item;
-
- if (url == NULL) {
- httpdmgr->render_404 = func;
- return (ISC_R_SUCCESS);
- }
-
- item = isc_mem_get(httpdmgr->mctx, sizeof(isc_httpdurl_t));
- if (item == NULL)
- return (ISC_R_NOMEMORY);
-
- item->url = isc_mem_strdup(httpdmgr->mctx, url);
- if (item->url == NULL) {
- isc_mem_put(httpdmgr->mctx, item, sizeof(isc_httpdurl_t));
- return (ISC_R_NOMEMORY);
- }
-
- item->action = func;
- item->action_arg = arg;
- item->isstatic = isstatic;
- isc_time_now(&item->loadtime);
-
- ISC_LINK_INIT(item, link);
- ISC_LIST_APPEND(httpdmgr->urls, item, link);
-
- return (ISC_R_SUCCESS);
-}
diff --git a/usr.sbin/bind/lib/isc/include/isc/Makefile.in b/usr.sbin/bind/lib/isc/include/isc/Makefile.in
index 8c68da3d283..6ef03649dea 100644
--- a/usr.sbin/bind/lib/isc/include/isc/Makefile.in
+++ b/usr.sbin/bind/lib/isc/include/isc/Makefile.in
@@ -27,8 +27,8 @@ HEADERS = aes.h app.h assertions.h base32.h base64.h \
bind9.h boolean.h buffer.h bufferlist.h \
commandline.h counter.h crc64.h errno.h error.h \
event.h eventclass.h file.h formatcheck.h fsaccess.h \
- hash.h heap.h hex.h hmacmd5.h hmacsha.h httpd.h \
- @ISC_IPV6_H@ iterated_hash.h json.h \
+ hash.h heap.h hex.h hmacmd5.h hmacsha.h \
+ @ISC_IPV6_H@ iterated_hash.h \
lang.h lex.h lfsr.h lib.h likely.h list.h log.h \
magic.h md5.h mem.h msgcat.h msgs.h mutexblock.h \
netaddr.h netscope.h ondestroy.h parseint.h \
@@ -37,8 +37,7 @@ HEADERS = aes.h app.h assertions.h base32.h base64.h \
region.h result.h resultclass.h rwlock.h \
safe.h serial.h sha1.h sha2.h sockaddr.h socket.h \
stdio.h stdlib.h string.h symtab.h task.h \
- taskpool.h timer.h tm.h types.h util.h version.h \
- xml.h
+ taskpool.h timer.h tm.h types.h util.h version.h
SUBDIRS =
TARGETS =
diff --git a/usr.sbin/bind/lib/isc/include/isc/httpd.h b/usr.sbin/bind/lib/isc/include/isc/httpd.h
deleted file mode 100644
index 145627d1dff..00000000000
--- a/usr.sbin/bind/lib/isc/include/isc/httpd.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
- * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
- * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-/* $Id: httpd.h,v 1.2 2019/12/17 01:46:35 sthen Exp $ */
-
-#ifndef ISC_HTTPD_H
-#define ISC_HTTPD_H 1
-
-/*! \file */
-
-#include <isc/event.h>
-#include <isc/eventclass.h>
-#include <isc/types.h>
-#include <isc/mutex.h>
-#include <isc/task.h>
-#include <isc/time.h>
-
-/*%
- * HTTP urls. These are the URLs we manage, and the function to call to
- * provide the data for it. We pass in the base url (so the same function
- * can handle multiple requests), and a structure to fill in to return a
- * result to the client. We also pass in a pointer to be filled in for
- * the data cleanup function.
- */
-struct isc_httpdurl {
- char *url;
- isc_httpdaction_t *action;
- void *action_arg;
- isc_boolean_t isstatic;
- isc_time_t loadtime;
- ISC_LINK(isc_httpdurl_t) link;
-};
-
-#define HTTPD_EVENTCLASS ISC_EVENTCLASS(4300)
-#define HTTPD_SHUTDOWN (HTTPD_EVENTCLASS + 0x0001)
-
-#define ISC_HTTPDMGR_FLAGSHUTTINGDOWN 0x00000001
-
-/*
- * Create a new http daemon which will send, once every time period,
- * a http-like header followed by HTTP data.
- */
-isc_result_t
-isc_httpdmgr_create(isc_mem_t *mctx, isc_socket_t *sock, isc_task_t *task,
- isc_httpdclientok_t *client_ok,
- isc_httpdondestroy_t *ondestory, void *cb_arg,
- isc_timermgr_t *tmgr, isc_httpdmgr_t **httpdp);
-
-void
-isc_httpdmgr_shutdown(isc_httpdmgr_t **httpdp);
-
-isc_result_t
-isc_httpdmgr_addurl(isc_httpdmgr_t *httpdmgr, const char *url,
- isc_httpdaction_t *func, void *arg);
-
-isc_result_t
-isc_httpdmgr_addurl2(isc_httpdmgr_t *httpdmgr, const char *url,
- isc_boolean_t isstatic,
- isc_httpdaction_t *func, void *arg);
-
-isc_result_t
-isc_httpd_response(isc_httpd_t *httpd);
-
-isc_result_t
-isc_httpd_addheader(isc_httpd_t *httpd, const char *name,
- const char *val);
-
-isc_result_t
-isc_httpd_addheaderuint(isc_httpd_t *httpd, const char *name, int val);
-
-isc_result_t isc_httpd_endheaders(isc_httpd_t *httpd);
-
-#endif /* ISC_HTTPD_H */
diff --git a/usr.sbin/bind/lib/isc/include/isc/json.h b/usr.sbin/bind/lib/isc/include/isc/json.h
deleted file mode 100644
index 487e174dfe8..00000000000
--- a/usr.sbin/bind/lib/isc/include/isc/json.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
- * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
- * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef ISC_JSON_H
-#define ISC_JSON_H 1
-
-#ifdef HAVE_JSON
-/*
- * This file is here mostly to make it easy to add additional libjson header
- * files as needed across all the users of this file. Rather than place
- * these libjson includes in each file, one include makes it easy to handle
- * the ifdef as well as adding the ability to add additional functions
- * which may be useful.
- */
-#ifdef HAVE_JSON_C
-/*
- * We don't include <json-c/json.h> as the subsequent includes do not
- * prefix the header file names with "json-c/" and using
- * -I <prefix>/include/json-c results in too many filename collisions.
- */
-#include <json-c/linkhash.h>
-#include <json-c/json_util.h>
-#include <json-c/json_object.h>
-#include <json-c/json_tokener.h>
-#include <json-c/json_object_iterator.h>
-#include <json-c/json_c_version.h>
-#else
-#include <json/json.h>
-#endif
-#endif
-
-#define ISC_JSON_RENDERCONFIG 0x00000001 /* render config data */
-#define ISC_JSON_RENDERSTATS 0x00000002 /* render stats */
-#define ISC_JSON_RENDERALL 0x000000ff /* render everything */
-
-#endif /* ISC_JSON_H */
diff --git a/usr.sbin/bind/lib/isc/include/isc/mem.h b/usr.sbin/bind/lib/isc/include/isc/mem.h
index 9a017059ba3..d5d3c6cd473 100644
--- a/usr.sbin/bind/lib/isc/include/isc/mem.h
+++ b/usr.sbin/bind/lib/isc/include/isc/mem.h
@@ -21,12 +21,12 @@
#include <stdio.h>
-#include <isc/json.h>
+
#include <isc/lang.h>
#include <isc/mutex.h>
#include <isc/platform.h>
#include <isc/types.h>
-#include <isc/xml.h>
+
ISC_LANG_BEGINDECLS
@@ -550,22 +550,6 @@ isc_mem_gettag(isc_mem_t *ctx);
*\li 'ctx' is a valid task.
*/
-#ifdef HAVE_LIBXML2
-int
-isc_mem_renderxml(xmlTextWriterPtr writer);
-/*%<
- * Render all contexts' statistics and status in XML for writer.
- */
-#endif /* HAVE_LIBXML2 */
-
-#ifdef HAVE_JSON
-isc_result_t
-isc_mem_renderjson(json_object *memobj);
-/*%<
- * Render all contexts' statistics and status in JSON.
- */
-#endif /* HAVE_JSON */
-
/*
* Memory pools
diff --git a/usr.sbin/bind/lib/isc/include/isc/socket.h b/usr.sbin/bind/lib/isc/include/isc/socket.h
index a01d509679e..47b3b3549f8 100644
--- a/usr.sbin/bind/lib/isc/include/isc/socket.h
+++ b/usr.sbin/bind/lib/isc/include/isc/socket.h
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: socket.h,v 1.9 2020/01/09 18:17:19 florian Exp $ */
+/* $Id: socket.h,v 1.10 2020/01/20 18:43:21 florian Exp $ */
#ifndef ISC_SOCKET_H
#define ISC_SOCKET_H 1
@@ -59,12 +59,12 @@
#include <isc/event.h>
#include <isc/eventclass.h>
#include <isc/lang.h>
-#include <isc/json.h>
+
#include <isc/region.h>
#include <isc/sockaddr.h>
#include <isc/time.h>
#include <isc/types.h>
-#include <isc/xml.h>
+
ISC_LANG_BEGINDECLS
@@ -1179,22 +1179,6 @@ isc__socketmgr_maxudp(isc_socketmgr_t *mgr, int maxudp);
* Test interface. Drop UDP packet > 'maxudp'.
*/
-#ifdef HAVE_LIBXML2
-int
-isc_socketmgr_renderxml(isc_socketmgr_t *mgr, xmlTextWriterPtr writer);
-/*%<
- * Render internal statistics and other state into the XML document.
- */
-#endif /* HAVE_LIBXML2 */
-
-#ifdef HAVE_JSON
-isc_result_t
-isc_socketmgr_renderjson(isc_socketmgr_t *mgr, json_object *stats);
-/*%<
- * Render internal statistics and other state into JSON format.
- */
-#endif /* HAVE_JSON */
-
/*%<
* See isc_socketmgr_create() above.
*/
diff --git a/usr.sbin/bind/lib/isc/include/isc/task.h b/usr.sbin/bind/lib/isc/include/isc/task.h
index b85f2c85d3e..d10dd9cfb4e 100644
--- a/usr.sbin/bind/lib/isc/include/isc/task.h
+++ b/usr.sbin/bind/lib/isc/include/isc/task.h
@@ -14,7 +14,7 @@
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: task.h,v 1.3 2019/12/17 01:46:35 sthen Exp $ */
+/* $Id: task.h,v 1.4 2020/01/20 18:43:21 florian Exp $ */
#ifndef ISC_TASK_H
#define ISC_TASK_H 1
@@ -80,11 +80,11 @@
***/
#include <isc/eventclass.h>
-#include <isc/json.h>
+
#include <isc/lang.h>
#include <isc/stdtime.h>
#include <isc/types.h>
-#include <isc/xml.h>
+
#define ISC_TASKEVENT_FIRSTEVENT (ISC_EVENTCLASS_TASK + 0)
#define ISC_TASKEVENT_SHUTDOWN (ISC_EVENTCLASS_TASK + 1)
@@ -786,16 +786,6 @@ isc_taskmgr_excltask(isc_taskmgr_t *mgr, isc_task_t **taskp);
*/
-#ifdef HAVE_LIBXML2
-int
-isc_taskmgr_renderxml(isc_taskmgr_t *mgr, xmlTextWriterPtr writer);
-#endif
-
-#ifdef HAVE_JSON
-isc_result_t
-isc_taskmgr_renderjson(isc_taskmgr_t *mgr, json_object *tasksobj);
-#endif
-
/*%<
* See isc_taskmgr_create() above.
*/
diff --git a/usr.sbin/bind/lib/isc/include/isc/xml.h b/usr.sbin/bind/lib/isc/include/isc/xml.h
deleted file mode 100644
index 9be4e154708..00000000000
--- a/usr.sbin/bind/lib/isc/include/isc/xml.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
- * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
- * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-/* $Id: xml.h,v 1.2 2019/12/17 01:46:35 sthen Exp $ */
-
-#ifndef ISC_XML_H
-#define ISC_XML_H 1
-
-/*
- * This file is here mostly to make it easy to add additional libxml header
- * files as needed across all the users of this file. Rather than place
- * these libxml includes in each file, one include makes it easy to handle
- * the ifdef as well as adding the ability to add additional functions
- * which may be useful.
- */
-
-#ifdef HAVE_LIBXML2
-#include <libxml/encoding.h>
-#include <libxml/xmlwriter.h>
-#endif
-
-#define ISC_XMLCHAR (const xmlChar *)
-
-#define ISC_XML_RENDERCONFIG 0x00000001 /* render config data */
-#define ISC_XML_RENDERSTATS 0x00000002 /* render stats */
-#define ISC_XML_RENDERALL 0x000000ff /* render everything */
-
-#endif /* ISC_XML_H */
diff --git a/usr.sbin/bind/lib/isc/mem.c b/usr.sbin/bind/lib/isc/mem.c
index a03dfb0a99a..eec2360fefc 100644
--- a/usr.sbin/bind/lib/isc/mem.c
+++ b/usr.sbin/bind/lib/isc/mem.c
@@ -25,7 +25,7 @@
#include <limits.h>
#include <isc/bind9.h>
-#include <isc/json.h>
+
#include <isc/magic.h>
#include <isc/mem.h>
#include <isc/msgs.h>
@@ -35,7 +35,7 @@
#include <isc/mutex.h>
#include <isc/util.h>
-#include <isc/xml.h>
+
#define MCTXLOCK(m, l) if (((m)->flags & ISC_MEMFLAG_NOLOCK) == 0) LOCK(l)
#define MCTXUNLOCK(m, l) if (((m)->flags & ISC_MEMFLAG_NOLOCK) == 0) UNLOCK(l)
@@ -2331,329 +2331,6 @@ typedef struct summarystat {
uint64_t contextsize;
} summarystat_t;
-#ifdef HAVE_LIBXML2
-#define TRY0(a) do { xmlrc = (a); if (xmlrc < 0) goto error; } while(0)
-static int
-xml_renderctx(isc__mem_t *ctx, summarystat_t *summary,
- xmlTextWriterPtr writer)
-{
- int xmlrc;
-
- REQUIRE(VALID_CONTEXT(ctx));
-
- MCTXLOCK(ctx, &ctx->lock);
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "context"));
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "id"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%p", ctx));
- TRY0(xmlTextWriterEndElement(writer)); /* id */
-
- if (ctx->name[0] != 0) {
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%s", ctx->name));
- TRY0(xmlTextWriterEndElement(writer)); /* name */
- }
-
- summary->contextsize += sizeof(*ctx) +
- (ctx->max_size + 1) * sizeof(struct stats) +
- ctx->max_size * sizeof(element *) +
- ctx->basic_table_count * sizeof(char *);
-#if ISC_MEM_TRACKLINES
- if (ctx->debuglist != NULL) {
- summary->contextsize +=
- (ctx->max_size + 1) * sizeof(debuglist_t) +
- ctx->debuglistcnt * sizeof(debuglink_t);
- }
-#endif
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "references"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%d", ctx->references));
- TRY0(xmlTextWriterEndElement(writer)); /* references */
-
- summary->total += ctx->total;
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "total"));
- TRY0(xmlTextWriterWriteFormatString(writer,
- "%llu",
- (uint64_t)ctx->total));
- TRY0(xmlTextWriterEndElement(writer)); /* total */
-
- summary->inuse += ctx->inuse;
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "inuse"));
- TRY0(xmlTextWriterWriteFormatString(writer,
- "%llu",
- (uint64_t)ctx->inuse));
- TRY0(xmlTextWriterEndElement(writer)); /* inuse */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "maxinuse"));
- TRY0(xmlTextWriterWriteFormatString(writer,
- "%llu",
- (uint64_t)ctx->maxinuse));
- TRY0(xmlTextWriterEndElement(writer)); /* maxinuse */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "blocksize"));
- if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0) {
- summary->blocksize += ctx->basic_table_count *
- NUM_BASIC_BLOCKS * ctx->mem_target;
- TRY0(xmlTextWriterWriteFormatString(writer,
- "%llu",
- (uint64_t)
- ctx->basic_table_count *
- NUM_BASIC_BLOCKS *
- ctx->mem_target));
- } else
- TRY0(xmlTextWriterWriteFormatString(writer, "%s", "-"));
- TRY0(xmlTextWriterEndElement(writer)); /* blocksize */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "pools"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%u", ctx->poolcnt));
- TRY0(xmlTextWriterEndElement(writer)); /* pools */
- summary->contextsize += ctx->poolcnt * sizeof(isc_mempool_t);
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "hiwater"));
- TRY0(xmlTextWriterWriteFormatString(writer,
- "%llu",
- (uint64_t)ctx->hi_water));
- TRY0(xmlTextWriterEndElement(writer)); /* hiwater */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "lowater"));
- TRY0(xmlTextWriterWriteFormatString(writer,
- "%llu",
- (uint64_t)ctx->lo_water));
- TRY0(xmlTextWriterEndElement(writer)); /* lowater */
-
- TRY0(xmlTextWriterEndElement(writer)); /* context */
-
- error:
- MCTXUNLOCK(ctx, &ctx->lock);
-
- return (xmlrc);
-}
-
-int
-isc_mem_renderxml(xmlTextWriterPtr writer) {
- isc__mem_t *ctx;
- summarystat_t summary;
- uint64_t lost;
- int xmlrc;
-
- memset(&summary, 0, sizeof(summary));
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "contexts"));
-
- RUNTIME_CHECK(isc_once_do(&once, initialize_action) == ISC_R_SUCCESS);
-
- LOCK(&contextslock);
- lost = totallost;
- for (ctx = ISC_LIST_HEAD(contexts);
- ctx != NULL;
- ctx = ISC_LIST_NEXT(ctx, link)) {
- xmlrc = xml_renderctx(ctx, &summary, writer);
- if (xmlrc < 0) {
- UNLOCK(&contextslock);
- goto error;
- }
- }
- UNLOCK(&contextslock);
-
- TRY0(xmlTextWriterEndElement(writer)); /* contexts */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "summary"));
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "TotalUse"));
- TRY0(xmlTextWriterWriteFormatString(writer,
- "%llu",
- summary.total));
- TRY0(xmlTextWriterEndElement(writer)); /* TotalUse */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "InUse"));
- TRY0(xmlTextWriterWriteFormatString(writer,
- "%llu",
- summary.inuse));
- TRY0(xmlTextWriterEndElement(writer)); /* InUse */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "BlockSize"));
- TRY0(xmlTextWriterWriteFormatString(writer,
- "%llu",
- summary.blocksize));
- TRY0(xmlTextWriterEndElement(writer)); /* BlockSize */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "ContextSize"));
- TRY0(xmlTextWriterWriteFormatString(writer,
- "%llu",
- summary.contextsize));
- TRY0(xmlTextWriterEndElement(writer)); /* ContextSize */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "Lost"));
- TRY0(xmlTextWriterWriteFormatString(writer,
- "%llu",
- lost));
- TRY0(xmlTextWriterEndElement(writer)); /* Lost */
-
- TRY0(xmlTextWriterEndElement(writer)); /* summary */
- error:
- return (xmlrc);
-}
-
-#endif /* HAVE_LIBXML2 */
-
-#ifdef HAVE_JSON
-#define CHECKMEM(m) do { \
- if (m == NULL) { \
- result = ISC_R_NOMEMORY;\
- goto error;\
- } \
-} while(0)
-
-static isc_result_t
-json_renderctx(isc__mem_t *ctx, summarystat_t *summary, json_object *array) {
- isc_result_t result = ISC_R_FAILURE;
- json_object *ctxobj, *obj;
- char buf[1024];
-
- REQUIRE(VALID_CONTEXT(ctx));
- REQUIRE(summary != NULL);
- REQUIRE(array != NULL);
-
- MCTXLOCK(ctx, &ctx->lock);
-
- summary->contextsize += sizeof(*ctx) +
- (ctx->max_size + 1) * sizeof(struct stats) +
- ctx->max_size * sizeof(element *) +
- ctx->basic_table_count * sizeof(char *);
- summary->total += ctx->total;
- summary->inuse += ctx->inuse;
- if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0)
- summary->blocksize += ctx->basic_table_count *
- NUM_BASIC_BLOCKS * ctx->mem_target;
-#if ISC_MEM_TRACKLINES
- if (ctx->debuglist != NULL) {
- summary->contextsize +=
- (ctx->max_size + 1) * sizeof(debuglist_t) +
- ctx->debuglistcnt * sizeof(debuglink_t);
- }
-#endif
-
- ctxobj = json_object_new_object();
- CHECKMEM(ctxobj);
-
- snprintf(buf, sizeof(buf), "%p", ctx);
- obj = json_object_new_string(buf);
- CHECKMEM(obj);
- json_object_object_add(ctxobj, "id", obj);
-
- if (ctx->name[0] != 0) {
- obj = json_object_new_string(ctx->name);
- CHECKMEM(obj);
- json_object_object_add(ctxobj, "name", obj);
- }
-
- obj = json_object_new_int64(ctx->references);
- CHECKMEM(obj);
- json_object_object_add(ctxobj, "references", obj);
-
- obj = json_object_new_int64(ctx->total);
- CHECKMEM(obj);
- json_object_object_add(ctxobj, "total", obj);
-
- obj = json_object_new_int64(ctx->inuse);
- CHECKMEM(obj);
- json_object_object_add(ctxobj, "inuse", obj);
-
- obj = json_object_new_int64(ctx->maxinuse);
- CHECKMEM(obj);
- json_object_object_add(ctxobj, "maxinuse", obj);
-
- if ((ctx->flags & ISC_MEMFLAG_INTERNAL) != 0) {
- uint64_t blocksize;
- blocksize = ctx->basic_table_count * NUM_BASIC_BLOCKS *
- ctx->mem_target;
- obj = json_object_new_int64(blocksize);
- CHECKMEM(obj);
- json_object_object_add(ctxobj, "blocksize", obj);
- }
-
- obj = json_object_new_int64(ctx->poolcnt);
- CHECKMEM(obj);
- json_object_object_add(ctxobj, "pools", obj);
-
- summary->contextsize += ctx->poolcnt * sizeof(isc_mempool_t);
-
- obj = json_object_new_int64(ctx->hi_water);
- CHECKMEM(obj);
- json_object_object_add(ctxobj, "hiwater", obj);
-
- obj = json_object_new_int64(ctx->lo_water);
- CHECKMEM(obj);
- json_object_object_add(ctxobj, "lowater", obj);
-
- MCTXUNLOCK(ctx, &ctx->lock);
- json_object_array_add(array, ctxobj);
- return (ISC_R_SUCCESS);
-
- error:
- MCTXUNLOCK(ctx, &ctx->lock);
- if (ctxobj != NULL)
- json_object_put(ctxobj);
- return (result);
-}
-
-isc_result_t
-isc_mem_renderjson(json_object *memobj) {
- isc_result_t result = ISC_R_SUCCESS;
- isc__mem_t *ctx;
- summarystat_t summary;
- uint64_t lost;
- json_object *ctxarray, *obj;
-
- memset(&summary, 0, sizeof(summary));
- RUNTIME_CHECK(isc_once_do(&once, initialize_action) == ISC_R_SUCCESS);
-
- ctxarray = json_object_new_array();
- CHECKMEM(ctxarray);
-
- LOCK(&contextslock);
- lost = totallost;
- for (ctx = ISC_LIST_HEAD(contexts);
- ctx != NULL;
- ctx = ISC_LIST_NEXT(ctx, link)) {
- result = json_renderctx(ctx, &summary, ctxarray);
- if (result != ISC_R_SUCCESS) {
- UNLOCK(&contextslock);
- goto error;
- }
- }
- UNLOCK(&contextslock);
-
- obj = json_object_new_int64(summary.total);
- CHECKMEM(obj);
- json_object_object_add(memobj, "TotalUse", obj);
-
- obj = json_object_new_int64(summary.inuse);
- CHECKMEM(obj);
- json_object_object_add(memobj, "InUse", obj);
-
- obj = json_object_new_int64(summary.blocksize);
- CHECKMEM(obj);
- json_object_object_add(memobj, "BlockSize", obj);
-
- obj = json_object_new_int64(summary.contextsize);
- CHECKMEM(obj);
- json_object_object_add(memobj, "ContextSize", obj);
-
- obj = json_object_new_int64(lost);
- CHECKMEM(obj);
- json_object_object_add(memobj, "Lost", obj);
-
- json_object_object_add(memobj, "contexts", ctxarray);
- return (ISC_R_SUCCESS);
-
- error:
- if (ctxarray != NULL)
- json_object_put(ctxarray);
- return (result);
-}
-#endif /* HAVE_JSON */
-
static isc_memcreatefunc_t mem_createfunc = NULL;
isc_result_t
diff --git a/usr.sbin/bind/lib/isc/task.c b/usr.sbin/bind/lib/isc/task.c
index ce0d3023ef5..afbdf7b5cc5 100644
--- a/usr.sbin/bind/lib/isc/task.c
+++ b/usr.sbin/bind/lib/isc/task.c
@@ -28,7 +28,7 @@
#include <isc/app.h>
#include <isc/condition.h>
#include <isc/event.h>
-#include <isc/json.h>
+
#include <isc/magic.h>
#include <isc/mem.h>
#include <isc/msgs.h>
@@ -39,7 +39,7 @@
#include <isc/task.h>
#include <isc/thread.h>
#include <isc/util.h>
-#include <isc/xml.h>
+
/*%
* For BIND9 internal applications:
@@ -79,12 +79,6 @@ typedef enum {
task_state_done
} task_state_t;
-#if defined(HAVE_LIBXML2) || defined(HAVE_JSON)
-static const char *statenames[] = {
- "idle", "ready", "running", "done",
-};
-#endif
-
#define TASK_MAGIC ISC_MAGIC('T', 'A', 'S', 'K')
#define VALID_TASK(t) ISC_MAGIC_VALID(t, TASK_MAGIC)
@@ -1770,202 +1764,6 @@ isc_task_exiting(isc_task_t *t) {
}
-#ifdef HAVE_LIBXML2
-#define TRY0(a) do { xmlrc = (a); if (xmlrc < 0) goto error; } while(0)
-int
-isc_taskmgr_renderxml(isc_taskmgr_t *mgr0, xmlTextWriterPtr writer) {
- isc__taskmgr_t *mgr = (isc__taskmgr_t *)mgr0;
- isc__task_t *task = NULL;
- int xmlrc;
-
- LOCK(&mgr->lock);
-
- /*
- * Write out the thread-model, and some details about each depending
- * on which type is enabled.
- */
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "thread-model"));
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "type"));
- TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR "non-threaded"));
- TRY0(xmlTextWriterEndElement(writer)); /* type */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "references"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%d", mgr->refs));
- TRY0(xmlTextWriterEndElement(writer)); /* references */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "default-quantum"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%d",
- mgr->default_quantum));
- TRY0(xmlTextWriterEndElement(writer)); /* default-quantum */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "tasks-running"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%d", mgr->tasks_running));
- TRY0(xmlTextWriterEndElement(writer)); /* tasks-running */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "tasks-ready"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%d", mgr->tasks_ready));
- TRY0(xmlTextWriterEndElement(writer)); /* tasks-ready */
-
- TRY0(xmlTextWriterEndElement(writer)); /* thread-model */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "tasks"));
- task = ISC_LIST_HEAD(mgr->tasks);
- while (task != NULL) {
- LOCK(&task->lock);
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "task"));
-
- if (task->name[0] != 0) {
- TRY0(xmlTextWriterStartElement(writer,
- ISC_XMLCHAR "name"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%s",
- task->name));
- TRY0(xmlTextWriterEndElement(writer)); /* name */
- }
-
- TRY0(xmlTextWriterStartElement(writer,
- ISC_XMLCHAR "references"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%d",
- task->references));
- TRY0(xmlTextWriterEndElement(writer)); /* references */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "id"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%p", task));
- TRY0(xmlTextWriterEndElement(writer)); /* id */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "state"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%s",
- statenames[task->state]));
- TRY0(xmlTextWriterEndElement(writer)); /* state */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "quantum"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%d",
- task->quantum));
- TRY0(xmlTextWriterEndElement(writer)); /* quantum */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "events"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%d",
- task->nevents));
- TRY0(xmlTextWriterEndElement(writer)); /* events */
-
- TRY0(xmlTextWriterEndElement(writer));
-
- UNLOCK(&task->lock);
- task = ISC_LIST_NEXT(task, link);
- }
- TRY0(xmlTextWriterEndElement(writer)); /* tasks */
-
- error:
- if (task != NULL)
- UNLOCK(&task->lock);
- UNLOCK(&mgr->lock);
-
- return (xmlrc);
-}
-#endif /* HAVE_LIBXML2 */
-
-#ifdef HAVE_JSON
-#define CHECKMEM(m) do { \
- if (m == NULL) { \
- result = ISC_R_NOMEMORY;\
- goto error;\
- } \
-} while(0)
-
-isc_result_t
-isc_taskmgr_renderjson(isc_taskmgr_t *mgr0, json_object *tasks) {
- isc_result_t result = ISC_R_SUCCESS;
- isc__taskmgr_t *mgr = (isc__taskmgr_t *)mgr0;
- isc__task_t *task = NULL;
- json_object *obj = NULL, *array = NULL, *taskobj = NULL;
-
- LOCK(&mgr->lock);
-
- /*
- * Write out the thread-model, and some details about each depending
- * on which type is enabled.
- */
- obj = json_object_new_string("non-threaded");
- CHECKMEM(obj);
- json_object_object_add(tasks, "thread-model", obj);
-
- obj = json_object_new_int(mgr->refs);
- CHECKMEM(obj);
- json_object_object_add(tasks, "references", obj);
-
- obj = json_object_new_int(mgr->default_quantum);
- CHECKMEM(obj);
- json_object_object_add(tasks, "default-quantum", obj);
-
- obj = json_object_new_int(mgr->tasks_running);
- CHECKMEM(obj);
- json_object_object_add(tasks, "tasks-running", obj);
-
- obj = json_object_new_int(mgr->tasks_ready);
- CHECKMEM(obj);
- json_object_object_add(tasks, "tasks-ready", obj);
-
- array = json_object_new_array();
- CHECKMEM(array);
-
- for (task = ISC_LIST_HEAD(mgr->tasks);
- task != NULL;
- task = ISC_LIST_NEXT(task, link))
- {
- char buf[255];
-
- LOCK(&task->lock);
-
- taskobj = json_object_new_object();
- CHECKMEM(taskobj);
- json_object_array_add(array, taskobj);
-
- snprintf(buf, sizeof(buf), "%p", task);
- obj = json_object_new_string(buf);
- CHECKMEM(obj);
- json_object_object_add(taskobj, "id", obj);
-
- if (task->name[0] != 0) {
- obj = json_object_new_string(task->name);
- CHECKMEM(obj);
- json_object_object_add(taskobj, "name", obj);
- }
-
- obj = json_object_new_int(task->references);
- CHECKMEM(obj);
- json_object_object_add(taskobj, "references", obj);
-
- obj = json_object_new_string(statenames[task->state]);
- CHECKMEM(obj);
- json_object_object_add(taskobj, "state", obj);
-
- obj = json_object_new_int(task->quantum);
- CHECKMEM(obj);
- json_object_object_add(taskobj, "quantum", obj);
-
- obj = json_object_new_int(task->nevents);
- CHECKMEM(obj);
- json_object_object_add(taskobj, "events", obj);
-
- UNLOCK(&task->lock);
- }
-
- json_object_object_add(tasks, "tasks", array);
- array = NULL;
- result = ISC_R_SUCCESS;
-
- error:
- if (array != NULL)
- json_object_put(array);
-
- if (task != NULL)
- UNLOCK(&task->lock);
- UNLOCK(&mgr->lock);
-
- return (result);
-}
-#endif
-
-
static isc_mutex_t createlock;
static isc_once_t once = ISC_ONCE_INIT;
static isc_taskmgrcreatefunc_t taskmgr_createfunc = NULL;
diff --git a/usr.sbin/bind/lib/isc/unix/socket.c b/usr.sbin/bind/lib/isc/unix/socket.c
index df38446f9c2..b86f62990e8 100644
--- a/usr.sbin/bind/lib/isc/unix/socket.c
+++ b/usr.sbin/bind/lib/isc/unix/socket.c
@@ -44,7 +44,7 @@
#include <isc/bufferlist.h>
#include <isc/condition.h>
#include <isc/formatcheck.h>
-#include <isc/json.h>
+
#include <isc/list.h>
#include <isc/log.h>
#include <isc/mem.h>
@@ -62,7 +62,7 @@
#include <isc/task.h>
#include <isc/thread.h>
#include <isc/util.h>
-#include <isc/xml.h>
+
#include <sys/un.h>
#include <sys/event.h>
@@ -551,15 +551,6 @@ isc__socket_getname(isc_socket_t *socket0);
void *
isc__socket_gettag(isc_socket_t *socket0);
-#ifdef HAVE_LIBXML2
-void
-isc__socketmgr_renderxml(isc_socketmgr_t *mgr0, xmlTextWriterPtr writer);
-#endif
-#ifdef HAVE_JSON
-isc_result_t
-isc__socketmgr_renderjson(isc_socketmgr_t *mgr0, json_object *stats);
-#endif
-
static struct {
isc_socketmethods_t methods;
@@ -5415,272 +5406,4 @@ isc__socket_getfd(isc_socket_t *socket0) {
return ((short) sock->fd);
}
-#if defined(HAVE_LIBXML2) || defined(HAVE_JSON)
-static const char *
-_socktype(isc_sockettype_t type)
-{
- if (type == isc_sockettype_udp)
- return ("udp");
- else if (type == isc_sockettype_tcp)
- return ("tcp");
- else if (type == isc_sockettype_unix)
- return ("unix");
- else if (type == isc_sockettype_fdwatch)
- return ("fdwatch");
- else
- return ("not-initialized");
-}
-#endif
-
-#ifdef HAVE_LIBXML2
-#define TRY0(a) do { xmlrc = (a); if (xmlrc < 0) goto error; } while(0)
-int
-isc_socketmgr_renderxml(isc_socketmgr_t *mgr0, xmlTextWriterPtr writer) {
- isc__socketmgr_t *mgr = (isc__socketmgr_t *)mgr0;
- isc__socket_t *sock = NULL;
- char peerbuf[ISC_SOCKADDR_FORMATSIZE];
- isc_sockaddr_t addr;
- ISC_SOCKADDR_LEN_T len;
- int xmlrc;
-
- LOCK(&mgr->lock);
-
-#ifdef USE_SHARED_MANAGER
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "references"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%d", mgr->refs));
- TRY0(xmlTextWriterEndElement(writer));
-#endif /* USE_SHARED_MANAGER */
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "sockets"));
- sock = ISC_LIST_HEAD(mgr->socklist);
- while (sock != NULL) {
- LOCK(&sock->lock);
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "socket"));
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "id"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%p", sock));
- TRY0(xmlTextWriterEndElement(writer));
-
- if (sock->name[0] != 0) {
- TRY0(xmlTextWriterStartElement(writer,
- ISC_XMLCHAR "name"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%s",
- sock->name));
- TRY0(xmlTextWriterEndElement(writer)); /* name */
- }
-
- TRY0(xmlTextWriterStartElement(writer,
- ISC_XMLCHAR "references"));
- TRY0(xmlTextWriterWriteFormatString(writer, "%d",
- sock->references));
- TRY0(xmlTextWriterEndElement(writer));
-
- TRY0(xmlTextWriterWriteElement(writer, ISC_XMLCHAR "type",
- ISC_XMLCHAR _socktype(sock->type)));
-
- if (sock->connected) {
- isc_sockaddr_format(&sock->peer_address, peerbuf,
- sizeof(peerbuf));
- TRY0(xmlTextWriterWriteElement(writer,
- ISC_XMLCHAR "peer-address",
- ISC_XMLCHAR peerbuf));
- }
-
- len = sizeof(addr);
- if (getsockname(sock->fd, &addr.type.sa, (void *)&len) == 0) {
- isc_sockaddr_format(&addr, peerbuf, sizeof(peerbuf));
- TRY0(xmlTextWriterWriteElement(writer,
- ISC_XMLCHAR "local-address",
- ISC_XMLCHAR peerbuf));
- }
-
- TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "states"));
- if (sock->pending_recv)
- TRY0(xmlTextWriterWriteElement(writer,
- ISC_XMLCHAR "state",
- ISC_XMLCHAR "pending-receive"));
- if (sock->pending_send)
- TRY0(xmlTextWriterWriteElement(writer,
- ISC_XMLCHAR "state",
- ISC_XMLCHAR "pending-send"));
- if (sock->pending_accept)
- TRY0(xmlTextWriterWriteElement(writer,
- ISC_XMLCHAR "state",
- ISC_XMLCHAR "pending_accept"));
- if (sock->listener)
- TRY0(xmlTextWriterWriteElement(writer,
- ISC_XMLCHAR "state",
- ISC_XMLCHAR "listener"));
- if (sock->connected)
- TRY0(xmlTextWriterWriteElement(writer,
- ISC_XMLCHAR "state",
- ISC_XMLCHAR "connected"));
- if (sock->connecting)
- TRY0(xmlTextWriterWriteElement(writer,
- ISC_XMLCHAR "state",
- ISC_XMLCHAR "connecting"));
- if (sock->bound)
- TRY0(xmlTextWriterWriteElement(writer,
- ISC_XMLCHAR "state",
- ISC_XMLCHAR "bound"));
-
- TRY0(xmlTextWriterEndElement(writer)); /* states */
-
- TRY0(xmlTextWriterEndElement(writer)); /* socket */
-
- UNLOCK(&sock->lock);
- sock = ISC_LIST_NEXT(sock, link);
- }
- TRY0(xmlTextWriterEndElement(writer)); /* sockets */
-
- error:
- if (sock != NULL)
- UNLOCK(&sock->lock);
-
- UNLOCK(&mgr->lock);
-
- return (xmlrc);
-}
-#endif /* HAVE_LIBXML2 */
-
-#ifdef HAVE_JSON
-#define CHECKMEM(m) do { \
- if (m == NULL) { \
- result = ISC_R_NOMEMORY;\
- goto error;\
- } \
-} while(0)
-
-isc_result_t
-isc_socketmgr_renderjson(isc_socketmgr_t *mgr0, json_object *stats) {
- isc_result_t result = ISC_R_SUCCESS;
- isc__socketmgr_t *mgr = (isc__socketmgr_t *)mgr0;
- isc__socket_t *sock = NULL;
- char peerbuf[ISC_SOCKADDR_FORMATSIZE];
- isc_sockaddr_t addr;
- ISC_SOCKADDR_LEN_T len;
- json_object *obj, *array = json_object_new_array();
-
- CHECKMEM(array);
-
- LOCK(&mgr->lock);
-
-#ifdef USE_SHARED_MANAGER
- obj = json_object_new_int(mgr->refs);
- CHECKMEM(obj);
- json_object_object_add(stats, "references", obj);
-#endif /* USE_SHARED_MANAGER */
-
- sock = ISC_LIST_HEAD(mgr->socklist);
- while (sock != NULL) {
- json_object *states, *entry = json_object_new_object();
- char buf[255];
-
- CHECKMEM(entry);
- json_object_array_add(array, entry);
-
- LOCK(&sock->lock);
-
- snprintf(buf, sizeof(buf), "%p", sock);
- obj = json_object_new_string(buf);
- CHECKMEM(obj);
- json_object_object_add(entry, "id", obj);
-
- if (sock->name[0] != 0) {
- obj = json_object_new_string(sock->name);
- CHECKMEM(obj);
- json_object_object_add(entry, "name", obj);
- }
-
- obj = json_object_new_int(sock->references);
- CHECKMEM(obj);
- json_object_object_add(entry, "references", obj);
-
- obj = json_object_new_string(_socktype(sock->type));
- CHECKMEM(obj);
- json_object_object_add(entry, "type", obj);
-
- if (sock->connected) {
- isc_sockaddr_format(&sock->peer_address, peerbuf,
- sizeof(peerbuf));
- obj = json_object_new_string(peerbuf);
- CHECKMEM(obj);
- json_object_object_add(entry, "peer-address", obj);
- }
-
- len = sizeof(addr);
- if (getsockname(sock->fd, &addr.type.sa, (void *)&len) == 0) {
- isc_sockaddr_format(&addr, peerbuf, sizeof(peerbuf));
- obj = json_object_new_string(peerbuf);
- CHECKMEM(obj);
- json_object_object_add(entry, "local-address", obj);
- }
-
- states = json_object_new_array();
- CHECKMEM(states);
- json_object_object_add(entry, "states", states);
-
- if (sock->pending_recv) {
- obj = json_object_new_string("pending-receive");
- CHECKMEM(obj);
- json_object_array_add(states, obj);
- }
-
- if (sock->pending_send) {
- obj = json_object_new_string("pending-send");
- CHECKMEM(obj);
- json_object_array_add(states, obj);
- }
-
- if (sock->pending_accept) {
- obj = json_object_new_string("pending-accept");
- CHECKMEM(obj);
- json_object_array_add(states, obj);
- }
-
- if (sock->listener) {
- obj = json_object_new_string("listener");
- CHECKMEM(obj);
- json_object_array_add(states, obj);
- }
-
- if (sock->connected) {
- obj = json_object_new_string("connected");
- CHECKMEM(obj);
- json_object_array_add(states, obj);
- }
-
- if (sock->connecting) {
- obj = json_object_new_string("connecting");
- CHECKMEM(obj);
- json_object_array_add(states, obj);
- }
-
- if (sock->bound) {
- obj = json_object_new_string("bound");
- CHECKMEM(obj);
- json_object_array_add(states, obj);
- }
-
- UNLOCK(&sock->lock);
- sock = ISC_LIST_NEXT(sock, link);
- }
-
- json_object_object_add(stats, "sockets", array);
- array = NULL;
- result = ISC_R_SUCCESS;
-
- error:
- if (array != NULL)
- json_object_put(array);
-
- if (sock != NULL)
- UNLOCK(&sock->lock);
-
- UNLOCK(&mgr->lock);
-
- return (result);
-}
-#endif /* HAVE_JSON */
-
#include "../socket_api.c"