⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timedb.c

📁 package of develop dns
💻 C
字号:
/* * Copyright (C) 2004  Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 2000, 2001  Internet Software Consortium. * * Permission to use, copy, modify, and 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: timedb.c,v 1.7.4.2.8.2 2004/03/08 09:04:23 marka Exp $ *//* * A simple database driver that enables the server to return the * current time in a DNS record. */#include <config.h>#include <string.h>#include <stdio.h>#include <time.h>#include <isc/print.h>#include <isc/result.h>#include <isc/util.h>#include <dns/sdb.h>#include <named/globals.h>#include "timedb.h"static dns_sdbimplementation_t *timedb = NULL;/* * This database operates on relative names. * * "time" and "@" return the time in a TXT record.   * "clock" is a CNAME to "time" * "current" is a DNAME to "@" (try time.current.time) */ static isc_result_ttimedb_lookup(const char *zone, const char *name, void *dbdata,	      dns_sdblookup_t *lookup){	isc_result_t result;	UNUSED(zone);	UNUSED(dbdata);	if (strcmp(name, "@") == 0 || strcmp(name, "time") == 0) {		time_t now = time(NULL);		char buf[100];		int n;		/*		 * Call ctime to create the string, put it in quotes, and		 * remove the trailing newline.		 */		n = snprintf(buf, sizeof(buf), "\"%s", ctime(&now));		if (n < 0)			return (ISC_R_FAILURE);		buf[n - 1] = '\"';		result = dns_sdb_putrr(lookup, "txt", 1, buf);		if (result != ISC_R_SUCCESS)			return (ISC_R_FAILURE);	} else if (strcmp(name, "clock") == 0) {		result = dns_sdb_putrr(lookup, "cname", 1, "time");		if (result != ISC_R_SUCCESS)			return (ISC_R_FAILURE);	} else if (strcmp(name, "current") == 0) {		result = dns_sdb_putrr(lookup, "dname", 1, "@");		if (result != ISC_R_SUCCESS)			return (ISC_R_FAILURE);	} else		return (ISC_R_NOTFOUND);	return (ISC_R_SUCCESS);}/* * lookup() does not return SOA or NS records, so authority() must be defined. */static isc_result_ttimedb_authority(const char *zone, void *dbdata, dns_sdblookup_t *lookup) {	isc_result_t result;	UNUSED(zone);	UNUSED(dbdata);	result = dns_sdb_putsoa(lookup, "localhost.", "root.localhost.", 0);	if (result != ISC_R_SUCCESS)		return (ISC_R_FAILURE);	result = dns_sdb_putrr(lookup, "ns", 86400, "ns1.localdomain.");	if (result != ISC_R_SUCCESS)		return (ISC_R_FAILURE);	result = dns_sdb_putrr(lookup, "ns", 86400, "ns2.localdomain.");	if (result != ISC_R_SUCCESS)		return (ISC_R_FAILURE);	return (ISC_R_SUCCESS);}/* * This zone does not support zone transfer, so allnodes() is NULL.  There * is no database specific data, so create() and destroy() are NULL. */static dns_sdbmethods_t timedb_methods = {	timedb_lookup,	timedb_authority,	NULL,	/* allnodes */	NULL,	/* create */	NULL	/* destroy */};/* * Wrapper around dns_sdb_register(). */isc_result_ttimedb_init(void) {	unsigned int flags;	flags = DNS_SDBFLAG_RELATIVEOWNER | DNS_SDBFLAG_RELATIVERDATA;	return (dns_sdb_register("time", &timedb_methods, NULL, flags,				 ns_g_mctx, &timedb));}/* * Wrapper around dns_sdb_unregister(). */voidtimedb_clear(void) {	if (timedb != NULL)		dns_sdb_unregister(&timedb);}

⌨️ 快捷键说明

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