export.c

来自「此dns服务器是在mydns基础上改写」· C语言 代码 · 共 554 行 · 第 1/2 页

C
554
字号
				putc('\\', stdout);			putc(*c, stdout);		}		putc('"', stdout);		putc('\n', stdout);	}	else		printf("%s\n", rr->data);}/*--- bind_dump_rr() ----------------------------------------------------------------------------*/#define TINYDNS_NAMEFIX(str) \			if (!(str)[0] || LASTCHAR((str)) != '.') \			{ \				if ((str)[0]) strncat((str), ".", sizeof((str))-strlen((str))-1); \				strncat((str), soa->origin, sizeof((str))-strlen((str))-1); \			} \			if (LASTCHAR((str)) == '.') LASTCHAR((str)) = '\0';/**************************************************************************************************	TINYDNS_DUMP_SOA**************************************************************************************************/static voidtinydns_dump_soa(MYDNS_SOA *soa){	char origin[DNSBUFLEN], ns[DNSBUFLEN], mbox[DNSBUFLEN];	strncpy(origin, soa->origin, sizeof(origin)-1);	strncpy(ns, soa->ns, sizeof(ns)-1);	strncpy(mbox, soa->mbox, sizeof(mbox)-1);	if (LASTCHAR(origin) == '.') LASTCHAR(origin) = '\0';	if (LASTCHAR(ns) == '.') LASTCHAR(ns) = '\0';	if (LASTCHAR(mbox) == '.') LASTCHAR(mbox) = '\0';	printf("Z%s:%s:%s:%u:%u:%u:%u:%u:%u\n",			 origin, ns, mbox,			 soa->serial, soa->refresh, soa->retry, soa->expire, soa->minimum, soa->ttl); }/*--- tinydns_dump_soa() ------------------------------------------------------------------------*//**************************************************************************************************	TINYDNS_DUMP_RR	Output resource record, BIND format.**************************************************************************************************/static voidtinydns_dump_rr(MYDNS_SOA *soa, MYDNS_RR *rr, int maxlen){	char name[DNSBUFLEN], data[DNSBUFLEN];	strncpy(name, rr->name, sizeof(name));	TINYDNS_NAMEFIX(name);	switch (rr->type)	{		case DNS_QTYPE_A:			printf("=%s:%s:%u\n", name, rr->data, rr->ttl);			break;		case DNS_QTYPE_AAAA:			/* Not supported by tinydns (?) */			break;		case DNS_QTYPE_CNAME:			strncpy(data, rr->data, sizeof(data));			TINYDNS_NAMEFIX(data);			printf("C%s:%s:%u\n", name, data, rr->ttl);			break;		case DNS_QTYPE_MX:			strncpy(data, rr->data, sizeof(data));			TINYDNS_NAMEFIX(data);			printf("@%s::%s:%u:%u\n", name, data, rr->aux, rr->ttl);			break;		case DNS_QTYPE_NS:			strncpy(data, rr->data, sizeof(data));			TINYDNS_NAMEFIX(data);			printf(".%s::%s:%u\n", name, data, rr->ttl);			break;		/* tinydns does not natively support SRV; However, there's a patch			(http://tinydns.org/srv-patch) to support it.  This code complies with			its format, which is "Sfqdn:ip:x:port:weight:priority:ttl:timestamp" */		case DNS_QTYPE_SRV:			strncpy(data, rr->data, sizeof(data));			TINYDNS_NAMEFIX(data);			printf("S%s::%s:%u:%u:%u:%u\n", name, data, rr->srv_port, rr->srv_weight, rr->aux, rr->ttl);			break;		case DNS_QTYPE_TXT:			{				char databuf[DNSBUFLEN * 4], *c, *d;				/* Need to output colons as octal - also any other wierd chars */				for (c = rr->data, d = databuf; *c; c++)				{					if (*c == ':' || !isprint((int)(*c)))						d += sprintf(d, "\\%03o", *c);					else						*(d++) = *c;				}				*d = '\0';				printf("'%s:%s:%u\n", name, databuf, rr->ttl);			}			break;		default:			break;	}}/*--- tinydns_dump_rr() -------------------------------------------------------------------------*//**************************************************************************************************	DUMP_SOA**************************************************************************************************/static MYDNS_SOA *dump_soa(void){	MYDNS_SOA *soa;	if (mydns_soa_load(sql, &soa, zone,0) != 0)		//modi by zyl 080408		ErrSQL(sql, "%s: %s", zone, _("error loading SOA record for zone"));	if (!soa)		Errx("%s: %s", zone, _("zone not found"));	switch (output_format)	{		case OUTPUT_BIND:			bind_dump_soa(soa);			break;		case OUTPUT_TINYDNS:			tinydns_dump_soa(soa);			break;	}	return (soa);}/*--- dump_soa() --------------------------------------------------------------------------------*//**************************************************************************************************	DUMP_RR**************************************************************************************************/static voiddump_rr(MYDNS_SOA *soa, MYDNS_RR *rr, int maxlen){	switch (output_format)	{		case OUTPUT_BIND:			bind_dump_rr(soa, rr, maxlen);			break;		case OUTPUT_TINYDNS:			tinydns_dump_rr(soa, rr, maxlen);			break;	}}/*--- dump_rr() ---------------------------------------------------------------------------------*//**************************************************************************************************	DUMP_RR_LONG**************************************************************************************************/static voiddump_rr_long(MYDNS_SOA *soa){	int maxlen = 0;	char query[BUFSIZ];	size_t querylen;	SQL_RES *res;	SQL_ROW row;	/* No records in zone - return immediately */	if (!sql_count(sql, "SELECT COUNT(*) FROM %s WHERE zone=%u", mydns_rr_table_name, soa->id))	{		if (output_format == OUTPUT_BIND)			puts("");		return;	}	if (output_format == OUTPUT_BIND)		maxlen = sql_count(sql, "SELECT MAX(LENGTH(name)) FROM %s WHERE zone=%u", mydns_rr_table_name, soa->id) + 1;	if (!maxlen)		maxlen = DNS_MAXNAMELEN;	querylen = snprintf(query, sizeof(query),		"SELECT "MYDNS_RR_FIELDS" FROM %s WHERE zone=%u ORDER BY name,type,aux",		mydns_rr_table_name, soa->id);	/* Submit query */	if (!(res = sql_query(sql, query, querylen)))		return;	/* Add results to list */	while ((row = sql_getrow(res)))	{		MYDNS_RR *rr;		if (!(rr = mydns_rr_parse(row, soa->origin)))			continue;		dump_rr(soa, rr, maxlen);		mydns_rr_free(rr);			}   sql_free(res);	if (output_format == OUTPUT_BIND)		puts("");}/*--- dump_rr_long() ----------------------------------------------------------------------------*//**************************************************************************************************	DUMP_ZONE**************************************************************************************************/static voiddump_zone(char *zone_name){	MYDNS_SOA *soa;	strncpy(zone, zone_name, sizeof(zone)-2);	if (LASTCHAR(zone) != '.')		strcat(zone, ".");	if ((soa = dump_soa()))	{		dump_rr_long(soa);		mydns_soa_free(soa);	}	zones_out++;}/*--- dump_zone() -------------------------------------------------------------------------------*//**************************************************************************************************	MAIN**************************************************************************************************/intmain(int argc, char **argv){	setlocale(LC_ALL, "");										/* Internationalization */	bindtextdomain(PACKAGE, LOCALEDIR);	textdomain(PACKAGE);	cmdline(argc, argv);	load_config();	db_connect();	dump_header();	if (optind >= argc)	{		SQL_RES *res;		SQL_ROW row;		char query[256];		size_t querylen;		querylen = snprintf(query, sizeof(query), "SELECT origin FROM %s", mydns_soa_table_name);		if (!(res = sql_query(sql, query, querylen)))			return (0);		while ((row = sql_getrow(res)))			dump_zone(row[0]);		sql_free(res);	}	while (optind < argc)		dump_zone((char *)argv[optind++]); 	return (0);}/*--- main() ------------------------------------------------------------------------------------*//* vi:set ts=3: *//* NEED_PO */

⌨️ 快捷键说明

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