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

📄 rr.c~

📁 此dns服务器是在mydns基础上改写
💻 C~
📖 第 1 页 / 共 2 页
字号:
				case DNS_QTYPE_RP:				case DNS_QTYPE_SRV:#ifdef DN_COLUMN_NAMES					/* Just append dot for DN */					strncat(rr->data, ".", sizeof(rr->data) - strlen(rr->data) - 1);#else					{						int namelen = strlen(rr->data);						if (namelen && rr->data[namelen-1] != '.')						{							strncat(rr->data, ".", sizeof(rr->data) - namelen - 1);							strncat(rr->data, origin, sizeof(rr->data) - namelen - 2);						}					}#endif					break;				default: break;			}		if (rr->type == DNS_QTYPE_SRV)			mydns_rr_parse_srv(row, origin, rr);	}	return (rr);}/*--- mydns_rr_parse() --------------------------------------------------------------------------*//**************************************************************************************************	MYDNS_RR_DUP	Make and return a copy of a MYDNS_RR record.  If 'recurse' is specified, copies all records	in the RRset.**************************************************************************************************/MYDNS_RR *mydns_rr_dup(MYDNS_RR *start, int recurse){	register MYDNS_RR *first = NULL, *last = NULL, *rr, *s, *tmp;	for (s = start; s; s = tmp)	{		tmp = s->next;		if (!(rr = (MYDNS_RR *)calloc(1, sizeof(MYDNS_RR))))			Err(_("out of memory"));		rr->id = s->id;		rr->zone = s->zone;		strncpy(rr->name, s->name, sizeof(rr->name)-1);		rr->type = s->type;		rr->class = s->class;		strncpy(rr->data, s->data, sizeof(rr->data)-1);		rr->aux = s->aux;		rr->ttl = s->ttl;#if ALIAS_ENABLED		rr->alias = s->alias;#endif		rr->srv_weight = s->srv_weight;		rr->srv_port = s->srv_port;		/* Copy rp_txt only for RP records */		if (rr->type == DNS_QTYPE_RP)			strncpy(rr->rp_txt, s->rp_txt, sizeof(rr->rp_txt) - 1);		/* Copy naptr fields only for NAPTR records */		if (rr->type == DNS_QTYPE_NAPTR)		{			rr->naptr_order = s->naptr_order;			rr->naptr_pref = s->naptr_pref;			strncpy(rr->naptr_flags, s->naptr_flags, sizeof(rr->naptr_flags) - 1);			strncpy(rr->naptr_service, s->naptr_service, sizeof(rr->naptr_service) - 1);			strncpy(rr->naptr_regex, s->naptr_regex, sizeof(rr->naptr_regex) - 1);			strncpy(rr->naptr_replacement, s->naptr_replacement, sizeof(rr->naptr_replacement) - 1);		}		rr->next = NULL;		if (recurse)		{			if (!first) first = rr;			if (last) last->next = rr;			last = rr;		}		else			return (rr);	}	return (first);}/*--- mydns_rr_dup() ----------------------------------------------------------------------------*//**************************************************************************************************	MYDNS_RR_SIZE**************************************************************************************************/inline size_tmydns_rr_size(MYDNS_RR *first){	register MYDNS_RR *p;	register size_t size = 0;	for (p = first; p; p = p->next)		size += sizeof(MYDNS_RR);	return (size);}/*--- mydns_rr_size() ---------------------------------------------------------------------------*//**************************************************************************************************	_MYDNS_RR_FREE	Frees the pointed-to structure.	Don't call this function directly, call the macro.**************************************************************************************************/inline void_mydns_rr_free(MYDNS_RR *first){	register MYDNS_RR *p, *tmp;	for (p = first; p; p = tmp)	{		tmp = p->next;		Free(p);	}}/*--- _mydns_rr_free() --------------------------------------------------------------------------*//**************************************************************************************************	MYDNS_RR_LOAD	Returns 0 on success or nonzero if an error occurred.	If "name" is NULL, all resource records for the zone will be loaded.**************************************************************************************************/intmydns_rr_load(SQL *sqlConn, MYDNS_RR **rptr, uint32_t zone,				  dns_qtype_t type, char *name, char *origin, const char *requestor_ip_section){	MYDNS_RR *first = NULL, *last = NULL;	size_t	querylen;	uchar		query[DNS_QUERYBUFSIZ],				namequery[DNS_MAXNAMELEN + DNS_MAXNAMELEN + DNS_MAXNAMELEN + 25] = "";	uchar		*wheretype;	register char *c, *cp;	SQL_RES	*res;	SQL_ROW	row;#ifdef DN_COLUMN_NAMES	int		originlen = origin ? strlen(origin) : 0;	int		namelen = name ? strlen(name) : 0;#endif#if DEBUG_ENABLED && DEBUG_LIB_RR	Debug("mydns_rr_load(zone=%u, type='%s', name='%s', origin='%s')",			zone, mydns_qtype_str(type), name ?: "NULL", origin ?: "NULL");#endif	if (rptr) *rptr = NULL;	/* Verify args */	if (!sqlConn || !rptr)	{		errno = EINVAL;		return (-1);	}	/* Get the type='XX' part of the WHERE clause */	switch (type)	{#if ALIAS_ENABLED		case DNS_QTYPE_A:			wheretype = " AND (type='A' OR type='ALIAS')"; break;#else		case DNS_QTYPE_A:			wheretype = " AND type='A'"; break;#endif		case DNS_QTYPE_AAAA:		wheretype = " AND type='AAAA'"; break;		case DNS_QTYPE_CNAME:	wheretype = " AND type='CNAME'"; break;		case DNS_QTYPE_HINFO:	wheretype = " AND type='HINFO'"; break;		case DNS_QTYPE_MX:		wheretype = " AND type='MX'"; break;		case DNS_QTYPE_NAPTR:	wheretype = " AND type='NAPTR'"; break;		case DNS_QTYPE_NS:		wheretype = " AND type='NS'"; break;		case DNS_QTYPE_PTR:		wheretype = " AND type='PTR'"; break;		case DNS_QTYPE_SOA:		wheretype = " AND type='SOA'"; break;		case DNS_QTYPE_SRV:		wheretype = " AND type='SRV'"; break;		case DNS_QTYPE_TXT:		wheretype = " AND type='TXT'"; break;		case DNS_QTYPE_ANY:		wheretype = ""; break;		default:			errno = EINVAL;			return (-1);	}	/* Make sure 'name' and 'origin' (if present) are valid */	if (name)	{		for (c = name; *c; c++)			if (SQL_BADCHAR(*c))				return (0);	}	if (origin)	{		for (c = origin; *c; c++)			if (SQL_BADCHAR(*c))				return (0);	}#ifdef DN_COLUMN_NAMES	/* Remove dot from origin and name for DN */	if (originlen && origin[originlen - 1] == '.')		origin[originlen-1] = '\0';	else		originlen = 0;	if (name)	{		if (namelen && name[namelen - 1] == '.')			name[namelen-1] = '\0';		else			namelen = 0;	}#endif	/* Construct query */	if (name)	{		if (origin)		{			if (!name[0])				snprintf(namequery, sizeof(namequery), "(name='' OR name='%s')", origin);			else			{#ifdef DN_COLUMN_NAMES				snprintf(namequery, sizeof(namequery), "name='%s'", name);#else				snprintf(namequery, sizeof(namequery), "(name='%s' OR name='%s.%s')", name, name, origin);#endif			}		}		else			snprintf(namequery, sizeof(namequery), "name='%s'", name);	}#ifdef DN_COLUMN_NAMES	if (originlen)		origin[originlen - 1] = '.';							/* Readd dot to origin for DN */	if (name)	{		if (namelen)			name[namelen - 1] = '.';	}#endif	querylen = snprintf(query, sizeof(query),		"SELECT "MYDNS_RR_FIELDS"%s FROM %s WHERE "#ifdef DN_COLUMN_NAMES			"zone_id=%u%s"#else			"zone=%u%s"#endif			"%s%s%s%s",			(mydns_rr_use_active ? ",active" : ""),			mydns_rr_table_name,			zone, wheretype,			(namequery[0]) ? " AND " : "",			namequery,			(mydns_rr_where_clause) ? " AND " : "",			(mydns_rr_where_clause) ? mydns_rr_where_clause : "");	/* Submit query */	if (!(res = sql_query(sqlConn, query, querylen)))		return (-1);#if DEBUG_ENABLED && DEBUG_LIB_RR	{		int numresults = sql_num_rows(res);		Debug("[*%s*][*%s*]%s RR query: %d row%s: %s",__FILE__,__LINE__, numresults, S(numresults), query);	}#endif	/* Add results to list */	while ((row = sql_getrow(res)))	{		MYDNS_RR *new;		/* Obey "active" column */		if (mydns_rr_use_active && row[MYDNS_RR_NUMFIELDS] && !GETBOOL(row[MYDNS_RR_NUMFIELDS]))			continue;		if (!(new = mydns_rr_parse(row, origin)))			continue;		/* Always trim origin from name (XXX: Why? When did I add this?) */		/* Apparently removing this code breaks RRs where the name IS the origin */		/* But trim only where the name is exactly the origin */		if (origin && (cp = strstr(new->name, origin)) && !(cp - new->name))			*cp = '\0';		if (!first) first = new;		if (last) last->next = new;		last = new;	}	*rptr = first;	sql_free(res);	return (0);}/*--- mydns_rr_load() ---------------------------------------------------------------------------*//* vi:set ts=3: */

⌨️ 快捷键说明

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