status.c

来自「此dns服务器是在mydns基础上改写」· C语言 代码 · 共 144 行

C
144
字号
/**************************************************************************************************	$Id: status.c,v 1.13 2006/01/18 20:46:47 bboy Exp $	Copyright (C) 2002-2005  Don Moore <bboy@bboy.net>	This program is free software; you can redistribute it and/or modify	it under the terms of the GNU General Public License as published by	the Free Software Foundation; either version 2 of the License, or	(at Your option) any later version.	This program is distributed in the hope that it will be useful,	but WITHOUT ANY WARRANTY; without even the implied warranty of	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the	GNU General Public License for more details.	You should have received a copy of the GNU General Public License	along with this program; if not, write to the Free Software	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA**************************************************************************************************/#include "named.h"#if STATUS_ENABLED/* Make this nonzero to enable debugging for this source file */#define	DEBUG_STATUS 1/**************************************************************************************************	STATUS_FAKE_RR	Generates a fake TXT rr and adds it to the requested data section.**************************************************************************************************/static inline voidstatus_fake_rr(TASK *t, datasection_t ds, const char *name, const char *fmt, ...){	va_list ap;	char buf[128];	MYDNS_RR *rr;													/* Temporary resource record */	va_start(ap, fmt);	vsnprintf(buf, sizeof(buf), fmt, ap);	va_end(ap);	if (!(rr = calloc(1, sizeof(MYDNS_RR))))		Err(_("out of memory"));	strncpy(rr->name, name, sizeof(rr->name)-1);	rr->class = DNS_CLASS_CHAOS;	rr->type = DNS_QTYPE_TXT;	strncpy(rr->data, buf, sizeof(rr->data)-1);	/* Add to list */	rrlist_add(t, ds, DNS_RRTYPE_RR, (void *)rr, rr->name);	Free(rr);}/*--- status_fake_rr() --------------------------------------------------------------------------*//**************************************************************************************************	STATUS_VERSION_BIND	Respond to 'version.bind.' query.**************************************************************************************************/static intstatus_version_bind(TASK *t){	/* Generate fake TXT rr with version number and add to reply list */	status_fake_rr(t, ANSWER, t->qname, "%s", VERSION);	return (0);}/*--- status_version_bind() ---------------------------------------------------------------------*//**************************************************************************************************	STATUS_VERSION_MYDNS	Respond to 'version.mydns.' query.**************************************************************************************************/static intstatus_version_mydns(TASK *t){	time_t uptime = time(NULL) - Status.start_time;	unsigned long requests = Status.udp_requests + Status.tcp_requests;	int n;	/* Generate fake TXT rr with version number and add to reply list */	status_fake_rr(t, ANSWER, t->qname, "%s", VERSION);	/* Now add some extra stuff in ADDITIONAL section */	/* Package release date */	status_fake_rr(t, ADDITIONAL, "release-date.mydns.", "%s", PACKAGE_RELEASE_DATE);	/* Current uptime */	status_fake_rr(t, ADDITIONAL, "uptime.mydns.", "%s", strsecs(uptime));	/* Number of requests */	status_fake_rr(t, ADDITIONAL, "requests.mydns.", "%lu", requests);	/* Request rate */	status_fake_rr(t, ADDITIONAL, "request.rate.mydns.", "%.0f/s", requests ? AVG(requests, uptime) : 0.0);	/* Report TCP requests if server allows TCP */	if (Status.tcp_requests)		status_fake_rr(t, ADDITIONAL, "tcp.requests.mydns.", "%lu", Status.tcp_requests);	/* Result status */	for (n = 0; n < MAX_RESULTS; n++)		if (Status.results[n])		{			char namebuf[80];			snprintf(namebuf, sizeof(namebuf), "results.%s.mydns.", mydns_rcode_str(n));			status_fake_rr(t, ADDITIONAL, namebuf, "%u", Status.results[n]);		}	return (0);}/*--- status_version_mydns() --------------------------------------------------------------------*//**************************************************************************************************	REMOTE_STATUS**************************************************************************************************/intremote_status(TASK *t){	if (t->qtype != DNS_QTYPE_TXT)		return formerr(t, DNS_RCODE_NOTIMP, ERR_NO_CLASS, NULL);	/* Emulate BIND's 'version.bind.' ("dig txt chaos version.bind") */	if (!strcasecmp(t->qname, "version.bind."))		return status_version_bind(t);	/* Extended MyDNS 'version.mydns.' ("dig txt chaos version.mydns") */	else if (!strcasecmp(t->qname, "version.mydns."))		return status_version_mydns(t);	return formerr(t, DNS_RCODE_NOTIMP, ERR_NO_CLASS, NULL);}/*--- remote_status() ---------------------------------------------------------------------------*/#endif	/* STATUS_ENABLED *//* vi:set ts=3: */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?