libptr.c

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

C
224
字号
/**************************************************************************************************	$Id: libptr.c,v 1.8 2005/04/20 17:22:25 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 "util.h"#include "libptr.h"/**************************************************************************************************	This code used to be in libmydns.  However, the PTR table is now obsolete.**************************************************************************************************/char mydns_ptr_table_name[PATH_MAX] = MYDNS_PTR_TABLE;/* Optional columns */int mydns_ptr_use_active = 0;/**************************************************************************************************	MYDNS_PTR_COUNT	Returns the number of zones in the ptr table.**************************************************************************************************/longmydns_ptr_count(SQL *sqlConn){	return sql_count(sqlConn, "SELECT COUNT(*) FROM %s", mydns_ptr_table_name);}/*--- mydns_ptr_count() -------------------------------------------------------------------------*//**************************************************************************************************	MYDNS_SET_PTR_TABLE_NAME**************************************************************************************************/voidmydns_set_ptr_table_name(char *name){	if (!name)		strncpy(mydns_ptr_table_name, MYDNS_PTR_TABLE, sizeof(mydns_ptr_table_name)-1);	else		strncpy(mydns_ptr_table_name, name, sizeof(mydns_ptr_table_name)-1);}/*--- mydns_set_ptr_table_name() ----------------------------------------------------------------*//**************************************************************************************************	MYDNS_PARSE_PTR**************************************************************************************************/inline MYDNS_PTR *mydns_parse_ptr(row)	SQL_ROW row;{	MYDNS_PTR *rv;	register int len;	if ((rv = (MYDNS_PTR *)calloc(1, sizeof(MYDNS_PTR))))	{		rv->next = NULL;		rv->id = atou(row[0]);		rv->ip = atou(row[1]);		strncpy(rv->name, row[2], sizeof(rv->name)-1);		rv->ttl = atou(row[3]);		/* Add dot to end of name, if the user forgot */		len = strlen(rv->name);		if (rv->name[len-1] != '.' && len < sizeof(rv->name)-1)		{			rv->name[len] = '.';			rv->name[len+1] = '\0';		}	}	return (rv);}/*-----------------------------------------------------------------------------------------------*//**************************************************************************************************	MYDNS_PTR_DUP**************************************************************************************************/MYDNS_PTR *mydns_ptr_dup(start, recurse)	MYDNS_PTR *start;	int recurse;{	register MYDNS_PTR *first = NULL, *last = NULL, *ptr, *s, *tmp;	for (s = start; s; s = tmp)	{		tmp = s->next;		if ((ptr = (MYDNS_PTR *)malloc(sizeof(MYDNS_PTR))))		{			ptr->id = s->id;			ptr->ip = s->ip;			strncpy(ptr->name, s->name, sizeof(ptr->name)-1);			ptr->ttl = s->ttl;			ptr->next = NULL;			if (recurse)			{				if (!first) first = ptr;				if (last) last->next = ptr;				last = ptr;			}			else				return (ptr);		}	}	return (first);}/*-----------------------------------------------------------------------------------------------*//**************************************************************************************************	MYDNS_PTR_SIZE**************************************************************************************************/inline size_tmydns_ptr_size(first)	MYDNS_PTR *first;{	register MYDNS_PTR *p;	register size_t size = 0;	for (p = first; p; p = p->next)		size += sizeof(MYDNS_PTR) + strlen(p->name);	return (size);}/*-----------------------------------------------------------------------------------------------*//**************************************************************************************************	_MYDNS_PTR_FREE	Frees the pointed-to structure.	Don't call this function directly, call the macro.**************************************************************************************************/inline void_mydns_ptr_free(MYDNS_PTR *first){	register MYDNS_PTR *p, *tmp;	for (p = first; p; p = tmp)	{		tmp = p->next;		Free(p);	}}/*-----------------------------------------------------------------------------------------------*//**************************************************************************************************	MYDNS_PTR_LOAD	Returns 0 on success or nonzero if an error occurred.	SQL	*sql;						Open database connection	MYDNS_PTR **rptr;				Result list will be returned here	struct in_addr *addr;		Look up PTR record for this IP**************************************************************************************************/intmydns_ptr_load(SQL *sqlConn, MYDNS_PTR **rptr, struct in_addr *addr){	MYDNS_PTR *first = NULL, *last = NULL;	size_t	 querylen;	char		 query[DNS_QUERYBUFSIZ];	SQL_RES	 *res;	SQL_ROW	 row;	if (rptr) *rptr = NULL;	/* Verify args */	if (!sqlConn || !rptr)	{		errno = EINVAL;		return (-1);	}	/* Construct query */	querylen = snprintf(query, sizeof(query),		"SELECT "MYDNS_PTR_FIELDS"%s FROM %s WHERE ip=%u",		(mydns_ptr_use_active ? ",active" : ""),		mydns_ptr_table_name, addr->s_addr);	/* Submit query */	if (!(res = sql_query(sqlConn, query, querylen)))		return (-1);	/* Add results to list */	while ((row = sql_getrow(res)))	{		MYDNS_PTR *new;		if (mydns_ptr_use_active && row[4] && !GETBOOL(row[4]))			continue;		if (!(new = mydns_parse_ptr(row)))		{			sql_free(res);			return (-1);		}		if (!first) first = new;		if (last) last->next = new;		last = new;	}	*rptr = first;	sql_free(res);	return (0);}/*-----------------------------------------------------------------------------------------------*//* vi:set ts=3: */

⌨️ 快捷键说明

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