/**************************************************************************************************
	$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.
**************************************************************************************************/
long
mydns_ptr_count(SQL *sqlConn)
{
	return sql_count(sqlConn, "SELECT COUNT(*) FROM %s", mydns_ptr_table_name);
}
/*--- mydns_ptr_count() -------------------------------------------------------------------------*/


/**************************************************************************************************
	MYDNS_SET_PTR_TABLE_NAME
**************************************************************************************************/
void
mydns_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_t
mydns_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
**************************************************************************************************/
int
mydns_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: */


syntax highlighted by Code2HTML, v. 0.9.1