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

📄 soa.c

📁 此dns服务器是在mydns基础上改写
💻 C
字号:
/**************************************************************************************************	$Id: soa.c,v 1.65 2005/12/18 19:16:41 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 "mydns.h"char mydns_soa_table_name[PATH_MAX] = MYDNS_SOA_TABLE;char *mydns_soa_where_clause = NULL;/* Optional columns */int mydns_soa_use_active = 0;int mydns_soa_use_xfer = 0;int mydns_soa_use_update_acl = 0;/* Make this nonzero to enable debugging within this source file */#define	DEBUG_LIB_SOA	1/**************************************************************************************************	MYDNS_SOA_COUNT	Returns the number of zones in the soa table.**************************************************************************************************/longmydns_soa_count(SQL *sqlConn){	return sql_count(sqlConn, "SELECT COUNT(*) FROM %s", mydns_soa_table_name);}/*--- mydns_soa_count() -------------------------------------------------------------------------*//**************************************************************************************************	MYDNS_SET_SOA_TABLE_NAME**************************************************************************************************/voidmydns_set_soa_table_name(char *name){	if (!name)		strncpy(mydns_soa_table_name, MYDNS_SOA_TABLE, sizeof(mydns_soa_table_name)-1);	else		strncpy(mydns_soa_table_name, name, sizeof(mydns_soa_table_name)-1);}/*--- mydns_set_soa_table_name() ----------------------------------------------------------------*//**************************************************************************************************	MYDNS_SET_SOA_WHERE_CLAUSE**************************************************************************************************/voidmydns_set_soa_where_clause(char *where){	if (where && strlen(where))	{		if (!(mydns_soa_where_clause = strdup(where)))			Errx("out of memory");	}}/*--- mydns_set_soa_where_clause() --------------------------------------------------------------*//**************************************************************************************************	MYDNS_SOA_PARSE**************************************************************************************************/#if !PROFILINGinline#endifMYDNS_SOA *mydns_soa_parse(SQL_ROW row){	MYDNS_SOA *rv;	int len;	if ((rv = (MYDNS_SOA *)malloc(sizeof(MYDNS_SOA))))	{		rv->next = NULL;		rv->id = atou(row[0]);		strncpy(rv->origin, row[1], sizeof(rv->origin)-1);		strncpy(rv->ns, row[2], sizeof(rv->ns)-1);		if (!rv->ns[0])			snprintf(rv->ns, sizeof(rv->ns), "ns.%s", rv->origin);		strncpy(rv->mbox, row[3], sizeof(rv->mbox)-1);		if (!rv->mbox[0])			snprintf(rv->mbox, sizeof(rv->mbox), "hostmaster.%s", rv->origin);		rv->serial = atou(row[4]);		rv->refresh = atou(row[5]);		rv->retry = atou(row[6]);		rv->expire = atou(row[7]);		rv->minimum = atou(row[8]);		rv->ttl = atou(row[9]);		/* If 'ns' or 'mbox' don't end in a dot, append the origin */		len = strlen(rv->ns);		if (rv->ns[len-1] != '.')		{			strncat(rv->ns, ".", sizeof(rv->ns) - len - 1);			strncat(rv->ns, rv->origin, sizeof(rv->ns) - len - 2);		}		len = strlen(rv->mbox);		if (rv->mbox[len-1] != '.')		{			strncat(rv->mbox, ".", sizeof(rv->mbox) - len - 1);			strncat(rv->mbox, rv->origin, sizeof(rv->mbox) - len - 2);		}		/* Make sure TTL for SOA is at least the minimum */		if (rv->ttl < rv->minimum)			rv->ttl = rv->minimum;	}	return (rv);}/*--- mydns_soa_parse() -------------------------------------------------------------------------*//**************************************************************************************************	MYDNS_SOA_DUP	Create a duplicate copy of the record.	Make and return a copy of a MYDNS_SOA record.  If 'recurse' is specified, copies all records	in the list.**************************************************************************************************/MYDNS_SOA *mydns_soa_dup(MYDNS_SOA *start, int recurse){	register MYDNS_SOA *first = NULL, *last = NULL, *soa, *s, *tmp;	for (s = start; s; s = tmp)	{		tmp = s->next;		if (!(soa = (MYDNS_SOA *)calloc(1, sizeof(MYDNS_SOA))))			Err(_("out of memory"));		soa->id = s->id;		strncpy(soa->origin, s->origin, sizeof(soa->origin)-1);		strncpy(soa->ns, s->ns, sizeof(soa->ns)-1);		strncpy(soa->mbox, s->mbox, sizeof(soa->mbox)-1);		soa->serial = s->serial;		soa->refresh = s->refresh;		soa->retry = s->retry;		soa->expire = s->expire;		soa->minimum = s->minimum;		soa->ttl = s->ttl;		soa->next = NULL;		if (recurse)		{			if (!first) first = soa;			if (last) last->next = soa;			last = soa;		}		else			return (soa);	}	return (first);}/*--- mydns_soa_dup() ---------------------------------------------------------------------------*//**************************************************************************************************	MYDNS_SOA_SIZE**************************************************************************************************/#if !PROFILINGinline#endifsize_tmydns_soa_size(MYDNS_SOA *first){	register MYDNS_SOA *p;	register size_t size = 0;	for (p = first; p; p = p->next)		size += sizeof(MYDNS_SOA);	return (size);}/*--- mydns_soa_size() --------------------------------------------------------------------------*//**************************************************************************************************	_MYDNS_SOA_FREE	Frees the pointed-to structure.	Don't call this function directly, call the macro.**************************************************************************************************/#if !PROFILINGinline#endifvoid_mydns_soa_free(MYDNS_SOA *first){	register MYDNS_SOA *p, *tmp;	for (p = first; p; p = tmp)	{		tmp = p->next;		Free(p);	}}/*--- mydns_soa_free() --------------------------------------------------------------------------*//**************************************************************************************************	MYDNS_SOA_LOAD	Returns 0 on success or nonzero if an error occurred.**************************************************************************************************/intmydns_soa_load(SQL *sqlConn, MYDNS_SOA **rptr, char *origin, int telecom_operator){	MYDNS_SOA		*first = NULL, *last = NULL;	size_t			querylen;	char				query[DNS_QUERYBUFSIZ];	SQL_RES			*res;	SQL_ROW			row;	register char	*c;#ifdef DN_COLUMN_NAMES	int				originlen = strlen(origin);#endif	if (rptr) *rptr = NULL;	/* Verify args */	if (!sqlConn || !origin || !rptr)	{		errno = EINVAL;		return (-1);	}	/* We're not escaping 'origin', so check it for illegal type chars */	for (c = origin; *c; c++)		if (SQL_BADCHAR(*c))			return (0);#ifdef DN_COLUMN_NAMES	if (origin[originlen - 1] == '.')		origin[originlen - 1] = '\0';							/* Remove dot from origin for DN */	else		originlen = 0;#endif	/* Construct query */	if (mydns_soa_where_clause)		querylen = snprintf(query, sizeof(query),			"SELECT "MYDNS_SOA_FIELDS"%s FROM %s WHERE origin='%s' AND %s AND telecom_operator=%d",			(mydns_soa_use_active ? ",active" : ""),			mydns_soa_table_name, origin, mydns_soa_where_clause,telecom_operator);	else	{		querylen = snprintf(query, sizeof(query),			"SELECT "MYDNS_SOA_FIELDS"%s FROM %s WHERE origin='%s' AND telecom_operator=%d",			(mydns_soa_use_active ? ",active" : ""),			mydns_soa_table_name, origin,telecom_operator);		//querylen = snprintf(query, sizeof(query),		//	"SELECT "MYDNS_SOA_FIELDS" FROM soa WHERE id=3");	}#ifdef DN_COLUMN_NAMES	if (originlen)		origin[originlen - 1] = '.';							/* Readd dot to origin for DN */#endif	/* Submit query */	if (!(res = sql_query(sqlConn, query, querylen)))		return (-1);#if DEBUG_ENABLED && DEBUG_LIB_SOA	{		int numresults = sql_num_rows(res);		Debug("SOA query: %d row%s: %s", numresults, S(numresults), query);	}#endif	/* Add results to list */	while ((row = sql_getrow(res)))	{		MYDNS_SOA *new;		if (mydns_soa_use_active && row[MYDNS_SOA_NUMFIELDS] && !GETBOOL(row[MYDNS_SOA_NUMFIELDS]))			continue;		if (!(new = mydns_soa_parse(row)))		{			sql_free(res);			return (-1);		}		if (!first) first = new;		if (last) last->next = new;		else last = new;	}	*rptr = first;	sql_free(res);	return (0);}/*--- mydns_soa_load() --------------------------------------------------------------------------*//* vi:set ts=3: */

⌨️ 快捷键说明

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