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

📄 import-axfr.c

📁 此dns服务器是在mydns基础上改写
💻 C
📖 第 1 页 / 共 2 页
字号:
		Errx("%s: %s: %s", hostname, _("error reading name from answer section"), name);	DNS_GET16(type, src);	DNS_GET16(class, src);	DNS_GET32(ttl, src);	DNS_GET16(rdlen, src);	rv = src + rdlen;	if (!got_soa && type != DNS_QTYPE_SOA)		Errx(_("got non-SOA RR before SOA"));	switch (type)	{		case DNS_QTYPE_SOA:			if (got_soa)				return (NULL);			process_axfr_soa(name, reply, replylen, src, ttl);			break;		case DNS_QTYPE_A:			{				struct in_addr addr;				memcpy(&addr.s_addr, src, SIZE32);				import_rr(shortname(name, 1), "A", inet_ntoa(addr), 0, ttl);			}			break;		case DNS_QTYPE_AAAA:			{				uint8_t addr[16];				memcpy(&addr, src, sizeof(uint8_t) * 16);				if (inet_ntop(AF_INET6, &addr, data, sizeof(data)-1))					import_rr(shortname(name, 1), "AAAA", data, 0, ttl);				else					Notice("%s IN AAAA: %s", name, strerror(errno));			}			break;		case DNS_QTYPE_CNAME:			if (!(src = name_unencode(reply, replylen, src, data, sizeof(data))))				Errx("%s CNAME: %s: %s", name, _("error reading data"), data);			import_rr(shortname(name, 1), "CNAME", shortname(data, 0), 0, ttl);			break;		case DNS_QTYPE_HINFO:			{				size_t len;				int	quote1, quote2;				char	*c, data2[DNS_MAXNAMELEN+1];				char	insdata[DNS_MAXNAMELEN * 2 + 2];				len = *src++;				memcpy(data, src, len);				data[len] = '\0';				src += len;				for (c = data, quote1 = 0; *c; c++)					if (!isalnum(*c))						quote1++;				len = *src++;				memcpy(data2, src, len);				data2[len] = '\0';				src += len;				for (c = data2, quote2 = 0; *c; c++)					if (!isalnum(*c))						quote2++;				snprintf(insdata, sizeof(insdata), "%s%s%s %s%s%s",					quote1 ? "\"" : "", data, quote1 ? "\"" : "",					quote2 ? "\"" : "", data2, quote2 ? "\"" : "");				import_rr(shortname(name, 1), "HINFO", insdata, 0, ttl);			}			break;		case DNS_QTYPE_MX:			{				uint16_t pref;				DNS_GET16(pref, src);				if (!(src = name_unencode(reply, replylen, src, data, sizeof(data))))					Errx("%s MX: %s: %s", name, _("error reading data"), data);				import_rr(shortname(name, 1), "MX", shortname(data, 0), pref, ttl);			}			break;		case DNS_QTYPE_NS:			if (!(src = name_unencode(reply, replylen, src, data, sizeof(data))))				Errx("%s NS: %s: %s", name, _("error reading data"), data);			import_rr(shortname(name, 1), "NS", shortname(data, 0), 0, ttl);			break;		case DNS_QTYPE_PTR:			{				struct in_addr addr;				addr.s_addr = mydns_revstr_ip4(name);				if (!(src = name_unencode(reply, replylen, src, data, sizeof(data))))					Errx("%s PTR: %s: %s", name, _("error reading data"), data);				import_rr(shortname(name, 1), "PTR", shortname(data, 0), 0, ttl);			}			break;		case DNS_QTYPE_RP:			{				char txtref[DNS_MAXNAMELEN+1];				char insdata[DNS_MAXNAMELEN * 2 + 2];				/* Get mbox in 'data' */				if (!(src = name_unencode(reply, replylen, src, data, sizeof(data))))					Errx("%s RP: %s: %s", name, _("error reading mbox"), data);				/* Get txt in 'txtref' */				if (!(src = name_unencode(reply, replylen, src, txtref, sizeof(txtref))))					Errx("%s RP: %s: %s", name, _("error reading txt"), txtref);				/* Construct data to insert */				snprintf(insdata, sizeof(insdata), "%s %s", shortname(data, 0), shortname(txtref, 0));				import_rr(shortname(name, 1), "RP", insdata, 0, ttl);			}			break;		case DNS_QTYPE_SRV:		{			uint16_t priority, weight, port;			char		 databuf[DNS_MAXNAMELEN + 40];			DNS_GET16(priority, src);			DNS_GET16(weight, src);			DNS_GET16(port, src);			if (!(src = name_unencode(reply, replylen, src, data, sizeof(data))))				Errx("%s SRV: %s: %s", name, _("error reading data"), data);			snprintf(databuf, sizeof(databuf), "%u %u %s", weight, port, shortname(data, 0));			import_rr(shortname(name, 1), "SRV", databuf, priority, ttl);		}		break;		case DNS_QTYPE_TXT:			{				size_t len = *src++;				memcpy(data, src, len);				data[len] = '\0';				src += len;				import_rr(shortname(name, 1), "TXT", data, 0, ttl);			}			break;		default:			Warnx("%s %s: %s", name, mydns_qtype_str(type), _("discarding unsupported RR type"));			break;	}	return (rv);}/*--- process_axfr_answer() ---------------------------------------------------------------------*//**************************************************************************************************	PROCESS_AXFR_REPLY**************************************************************************************************/static intprocess_axfr_reply(char *reply, size_t replylen){	char *src = reply, name[DNS_MAXNAMELEN+1];	uint16_t n, qdcount, ancount;	DNS_HEADER	hdr;	/* Read packet header */	src += SIZE16;					/* ID */	memcpy(&hdr, src, SIZE16); src += SIZE16;	DNS_GET16(qdcount, src);	DNS_GET16(ancount, src);	src += SIZE16 * 2;	if (hdr.rcode != DNS_RCODE_NOERROR)		Errx("%s: %s: %s", hostname, _("server responded to our request with error"),			  mydns_rcode_str(hdr.rcode));#if DEBUG_ENABLED	Debug("%d byte REPLY: qr=%u opcode=%s aa=%u tc=%u rd=%u ra=%u z=%u rcode=%u qd=%u an=%u",			replylen, hdr.qr, mydns_opcode_str(hdr.opcode),			hdr.aa, hdr.tc, hdr.rd, hdr.ra, hdr.z, hdr.rcode, qdcount, ancount);#endif	/* Read question section(s) */	for (n = 0; n < qdcount; n++)	{		if (!(src = name_unencode(reply, replylen, src, name, sizeof(name))))			Errx("%s: %s: %s", hostname, _("error reading name from question section"), name);		src += (SIZE16 * 2);	}	/* Process all RRs in the answer section */	for (n = 0; n < ancount; n++)		if (!(src = process_axfr_answer(reply, replylen, src)))			return (-1);	return (0);}/*--- process_axfr_reply() ----------------------------------------------------------------------*//**************************************************************************************************	IMPORT_AXFR**************************************************************************************************/voidimport_axfr(char *hostport, char *import_zone){	unsigned char *reply, len[2];	int fd;	size_t replylen;#if DEBUG_ENABLED	Debug("STARTING AXFR of \"%s\" from %s", import_zone, hostport);#endif	hostname = zone = NULL;	got_soa = 0;	zone = import_zone;	/* Connect to remote host */	if ((fd = axfr_connect(hostport, &hostname)) < 0)		Errx("%s: %s", hostport, _("failed to connect"));#if DEBUG_ENABLED	Debug("connected to %s", hostport);#endif	/* Send AXFR request */	request_axfr(fd, hostname, zone);	/* Read packets from server and process them */	while (recv(fd, len, 2, MSG_WAITALL) == 2)	{		if ((replylen = ((len[0] << 8) | (len[1]))) < 12)			Errx(_("message too short"));		if (!(reply = malloc(replylen)))			Err("malloc");		if (recv(fd, reply, replylen, MSG_WAITALL) != replylen)			Errx(_("short message from server"));		if (process_axfr_reply(reply, replylen))			break;		Free(reply);	}	close(fd);#if DEBUG_ENABLED	Debug("COMPLETED AXFR of \"%s\" from %s", import_zone, hostport);#endif}/*--- import_axfr() -----------------------------------------------------------------------------*//* vi:set ts=3: *//* NEED_PO */

⌨️ 快捷键说明

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