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

📄 gen.c

📁 bind 9.3结合mysql数据库
💻 C
📖 第 1 页 / 共 2 页
字号:
voidsd(int rdclass, const char *classname, const char *dirname, char filetype) {	char buf[sizeof("0123456789_65535.h")];	char fmt[sizeof("%10[-0-9a-z]_%d.h")];	int type;	char typename[11];	isc_dir_t dir;	if (!start_directory(dirname, &dir))		return;	sprintf(fmt,"%s%c", "%10[-0-9a-z]_%d.", filetype);	while (next_file(&dir)) {		if (sscanf(dir.filename, fmt, typename, &type) != 2)			continue;		if ((type > 65535) || (type < 0))			continue;		sprintf(buf, "%s_%d.%c", typename, type, filetype);		if (strcmp(buf, dir.filename) != 0)			continue;		add(rdclass, classname, type, typename, dirname);	}	end_directory(&dir);}static unsigned intHASH(char *string) {	unsigned int n;	unsigned char a, b;	n = strlen(string);	if (n == 0) {		fprintf(stderr, "n == 0?\n");		exit(1);	}	a = tolower((unsigned char)string[0]);	b = tolower((unsigned char)string[n - 1]);	return ((a + n) * b) % 256;}intmain(int argc, char **argv) {	char buf[256];			/* XXX Should be max path length */	char srcdir[256];		/* XXX Should be max path length */	int rdclass;	char classname[11];	struct tt *tt;	struct cc *cc;	struct ttnam *ttn, *ttn2;	unsigned int hash;	struct tm *tm;	time_t now;	char year[11];	int lasttype;	int code = 1;	int class_enum = 0;	int type_enum = 0;	int structs = 0;	int depend = 0;	int c, i, j;	char buf1[11];	char filetype = 'c';	FILE *fd;	char *prefix = NULL;	char *suffix = NULL;	char *file = NULL;	isc_dir_t dir;	for (i = 0; i < TYPENAMES; i++)		memset(&typenames[i], 0, sizeof(typenames[i]));	strcpy(srcdir, "");	while ((c = isc_commandline_parse(argc, argv, "cdits:F:P:S:")) != -1)		switch (c) {		case 'c':			code = 0;			depend = 0;			type_enum = 0;			class_enum = 1;			filetype = 'c';			structs = 0;			break;		case 'd':			code = 0;			depend = 1;			class_enum = 0;			type_enum = 0;			structs = 0;			filetype = 'h';			break;		case 't':			code = 0;			depend = 0;			class_enum = 0;			type_enum = 1;			filetype = 'c';			structs = 0;			break;		case 'i':			code = 0;			depend = 0;			class_enum = 0;			type_enum = 0;			structs = 1;			filetype = 'h';			break;		case 's':			sprintf(srcdir, "%s/", isc_commandline_argument);			break;		case 'F':			file = isc_commandline_argument;			break;		case 'P':			prefix = isc_commandline_argument;			break;		case 'S':			suffix = isc_commandline_argument;			break;		case '?':			exit(1);		}	sprintf(buf, "%srdata", srcdir);	if (!start_directory(buf, &dir))		exit(1);	while (next_file(&dir)) {		if (sscanf(dir.filename, "%10[0-9a-z]_%d",			   classname, &rdclass) != 2)			continue;		if ((rdclass > 65535) || (rdclass < 0))			continue;		sprintf(buf, "%srdata/%s_%d", srcdir, classname, rdclass);		if (strcmp(buf + 6 + strlen(srcdir), dir.filename) != 0)			continue;		sd(rdclass, classname, buf, filetype);	}	end_directory(&dir);	sprintf(buf, "%srdata/generic", srcdir);	sd(0, "", buf, filetype);	if (time(&now) != -1) {		if ((tm = localtime(&now)) != NULL && tm->tm_year > 104) 			sprintf(year, "-%d", tm->tm_year + 1900);		else			year[0] = 0;	} else		year[0] = 0;	if (!depend) fprintf(stdout, copyright, year);	if (code) {		fputs("#ifndef DNS_CODE_H\n", stdout);		fputs("#define DNS_CODE_H 1\n\n", stdout);		fputs("#include <isc/boolean.h>\n", stdout);		fputs("#include <isc/result.h>\n\n", stdout);		fputs("#include <dns/name.h>\n\n", stdout);		for (tt = types; tt != NULL; tt = tt->next)			fprintf(stdout, "#include \"%s/%s_%d.c\"\n",				tt->dirname, tt->typename, tt->type);		fputs("\n\n", stdout);		doswitch("FROMTEXTSWITCH", "fromtext", FROMTEXTARGS,			 FROMTEXTTYPE, FROMTEXTCLASS, FROMTEXTDEF);		doswitch("TOTEXTSWITCH", "totext", TOTEXTARGS,			 TOTEXTTYPE, TOTEXTCLASS, TOTEXTDEF);		doswitch("FROMWIRESWITCH", "fromwire", FROMWIREARGS,			 FROMWIRETYPE, FROMWIRECLASS, FROMWIREDEF);		doswitch("TOWIRESWITCH", "towire", TOWIREARGS,			 TOWIRETYPE, TOWIRECLASS, TOWIREDEF);		doswitch("COMPARESWITCH", "compare", COMPAREARGS,			  COMPARETYPE, COMPARECLASS, COMPAREDEF);		doswitch("FROMSTRUCTSWITCH", "fromstruct", FROMSTRUCTARGS,			  FROMSTRUCTTYPE, FROMSTRUCTCLASS, FROMSTRUCTDEF);		doswitch("TOSTRUCTSWITCH", "tostruct", TOSTRUCTARGS,			  TOSTRUCTTYPE, TOSTRUCTCLASS, TOSTRUCTDEF);		doswitch("FREESTRUCTSWITCH", "freestruct", FREESTRUCTARGS,			  FREESTRUCTTYPE, FREESTRUCTCLASS, FREESTRUCTDEF);		doswitch("ADDITIONALDATASWITCH", "additionaldata",			 ADDITIONALDATAARGS, ADDITIONALDATATYPE,			 ADDITIONALDATACLASS, ADDITIONALDATADEF);		doswitch("DIGESTSWITCH", "digest",			 DIGESTARGS, DIGESTTYPE,			 DIGESTCLASS, DIGESTDEF);		doswitch("CHECKOWNERSWITCH", "checkowner",			CHECKOWNERARGS, CHECKOWNERTYPE,			CHECKOWNERCLASS, CHECKOWNERDEF);		doswitch("CHECKNAMESSWITCH", "checknames",			CHECKNAMESARGS, CHECKNAMESTYPE,			CHECKNAMESCLASS, CHECKNAMESDEF);		/*		 * From here down, we are processing the rdata names and		 * attributes.		 */#define PRINT_COMMA(x) (x == maxtype ? "" : ",")#define METANOTQUESTION  "DNS_RDATATYPEATTR_META | " \			 "DNS_RDATATYPEATTR_NOTQUESTION"#define METAQUESTIONONLY "DNS_RDATATYPEATTR_META | " \			 "DNS_RDATATYPEATTR_QUESTIONONLY"#define RESERVED "DNS_RDATATYPEATTR_RESERVED"		/*		 * Add in reserved/special types.  This will let us		 * sort them without special cases.		 */		insert_into_typenames(0, "reserved0", RESERVED);		insert_into_typenames(31, "eid", RESERVED);		insert_into_typenames(32, "nimloc", RESERVED);		insert_into_typenames(34, "atma", RESERVED);		insert_into_typenames(100, "uinfo", RESERVED);		insert_into_typenames(101, "uid", RESERVED);		insert_into_typenames(102, "gid", RESERVED);		insert_into_typenames(251, "ixfr", METAQUESTIONONLY);		insert_into_typenames(252, "axfr", METAQUESTIONONLY);		insert_into_typenames(253, "mailb", METAQUESTIONONLY);		insert_into_typenames(254, "maila", METAQUESTIONONLY);		insert_into_typenames(255, "any", METAQUESTIONONLY);		/*		 * Spit out a quick and dirty hash function.  Here,		 * we walk through the list of type names, and calculate		 * a hash.  This isn't perfect, but it will generate "pretty		 * good" estimates.  Lowercase the characters before		 * computing in all cases.		 *		 * Here, walk the list from top to bottom, calculating		 * the hash (mod 256) for each name.		 */		fprintf(stdout, "#define RDATATYPE_COMPARE(_s, _d, _tn, _n, _tp) \\\n");		fprintf(stdout, "\tdo { \\\n");		fprintf(stdout, "\t\tif (sizeof(_s) - 1 == _n && \\\n"				"\t\t    strncasecmp(_s,(_tn),"				"(sizeof(_s) - 1)) == 0) { \\\n");		fprintf(stdout, "\t\t\tif ((dns_rdatatype_attributes(_d) & "		       		  "DNS_RDATATYPEATTR_RESERVED) != 0) \\\n");		fprintf(stdout, "\t\t\t\treturn (ISC_R_NOTIMPLEMENTED); \\\n");		fprintf(stdout, "\t\t\t*(_tp) = _d; \\\n");		fprintf(stdout, "\t\t\treturn (ISC_R_SUCCESS); \\\n");		fprintf(stdout, "\t\t} \\\n");		fprintf(stdout, "\t} while (0)\n\n");		fprintf(stdout, "#define RDATATYPE_FROMTEXT_SW(_hash,"				"_typename,_length,_typep) \\\n");		fprintf(stdout, "\tswitch (_hash) { \\\n");		for (i = 0; i <= maxtype; i++) {			ttn = find_typename(i);			if (ttn == NULL)				continue;			/*			 * Skip entries we already processed.			 */			if (ttn->sorted != 0)				continue;			hash = HASH(ttn->typename);			fprintf(stdout, "\t\tcase %u: \\\n", hash);			/*			 * Find all other entries that happen to match			 * this hash.			 */			for (j = 0; j <= maxtype; j++) {				ttn2 = find_typename(j);				if (ttn2 == NULL)					continue;				if (hash == HASH(ttn2->typename)) {					fprintf(stdout, "\t\t\tRDATATYPE_COMPARE"					       "(\"%s\", %u, "					       "_typename, _length, _typep); \\\n",					       ttn2->typename, ttn2->type);					ttn2->sorted = 1;				}			}			fprintf(stdout, "\t\t\tbreak; \\\n");		}		fprintf(stdout, "\t}\n");		fprintf(stdout, "#define RDATATYPE_ATTRIBUTE_SW \\\n");		fprintf(stdout, "\tswitch (type) { \\\n");		for (i = 0; i <= maxtype; i++) {			ttn = find_typename(i);			if (ttn == NULL)				continue;			fprintf(stdout, "\tcase %u: return (%s); \\\n",			        i, upper(ttn->attr));		}		fprintf(stdout, "\t}\n");		fprintf(stdout, "#define RDATATYPE_TOTEXT_SW \\\n");		fprintf(stdout, "\tswitch (type) { \\\n");		for (i = 0; i <= maxtype; i++) {			ttn = find_typename(i);			if (ttn == NULL)				continue;			fprintf(stdout, "\tcase %u: return "				"(str_totext(\"%s\", target)); \\\n",			        i, upper(ttn->typename));		}		fprintf(stdout, "\t}\n");		fputs("#endif /* DNS_CODE_H */\n", stdout);	} else if (type_enum) {		char *s;		fprintf(stdout, "#ifndef DNS_ENUMTYPE_H\n");		fprintf(stdout, "#define DNS_ENUMTYPE_H 1\n\n");		fprintf(stdout, "enum {\n");		fprintf(stdout, "\tdns_rdatatype_none = 0,\n");		lasttype = 0;		for (tt = types; tt != NULL; tt = tt->next)			if (tt->type != lasttype)				fprintf(stdout,					"\tdns_rdatatype_%s = %d,\n",					funname(tt->typename, buf1),					lasttype = tt->type);		fprintf(stdout, "\tdns_rdatatype_ixfr = 251,\n");		fprintf(stdout, "\tdns_rdatatype_axfr = 252,\n");		fprintf(stdout, "\tdns_rdatatype_mailb = 253,\n");		fprintf(stdout, "\tdns_rdatatype_maila = 254,\n");		fprintf(stdout, "\tdns_rdatatype_any = 255\n");		fprintf(stdout, "};\n\n");		fprintf(stdout, "#define dns_rdatatype_none\t"			"((dns_rdatatype_t)dns_rdatatype_none)\n");		for (tt = types; tt != NULL; tt = tt->next)			if (tt->type != lasttype) {				s = funname(tt->typename, buf1);				fprintf(stdout,					"#define dns_rdatatype_%s\t%s"					"((dns_rdatatype_t)dns_rdatatype_%s)"					"\n",					s, strlen(s) < 2U ? "\t" : "", s);				lasttype = tt->type;			}		fprintf(stdout, "#define dns_rdatatype_ixfr\t"			"((dns_rdatatype_t)dns_rdatatype_ixfr)\n");		fprintf(stdout, "#define dns_rdatatype_axfr\t"			"((dns_rdatatype_t)dns_rdatatype_axfr)\n");		fprintf(stdout, "#define dns_rdatatype_mailb\t"			"((dns_rdatatype_t)dns_rdatatype_mailb)\n");		fprintf(stdout, "#define dns_rdatatype_maila\t"			"((dns_rdatatype_t)dns_rdatatype_maila)\n");		fprintf(stdout, "#define dns_rdatatype_any\t"			"((dns_rdatatype_t)dns_rdatatype_any)\n");		fprintf(stdout, "\n#endif /* DNS_ENUMTYPE_H */\n");	} else if (class_enum) {		char *s;		int classnum;		fprintf(stdout, "#ifndef DNS_ENUMCLASS_H\n");		fprintf(stdout, "#define DNS_ENUMCLASS_H 1\n\n");		fprintf(stdout, "enum {\n");		fprintf(stdout, "\tdns_rdataclass_reserved0 = 0,\n");		fprintf(stdout, "#define dns_rdataclass_reserved0 \\\n\t\t\t\t"			"((dns_rdataclass_t)dns_rdataclass_reserved0)\n");#define PRINTCLASS(name, num) \	do { \		s = funname(name, buf1); \		classnum = num; \		fprintf(stdout, "\tdns_rdataclass_%s = %d%s\n", s, classnum, \		       classnum != 255 ? "," : ""); \		fprintf(stdout, "#define dns_rdataclass_%s\t" \		       "((dns_rdataclass_t)dns_rdataclass_%s)\n", s, s); \	} while (0)		for (cc = classes; cc != NULL; cc = cc->next) {			if (cc->rdclass == 4) {				PRINTCLASS("ch", 3);				PRINTCLASS("chaos", 3);			} else if (cc->rdclass == 255) {				PRINTCLASS("none", 254);			}			PRINTCLASS(cc->classname, cc->rdclass);		}#undef PRINTCLASS		fprintf(stdout, "};\n\n");		fprintf(stdout, "#endif /* DNS_ENUMCLASS_H */\n");	} else if (structs) {		if (prefix != NULL) {			if ((fd = fopen(prefix,"r")) != NULL) {				while (fgets(buf, sizeof(buf), fd) != NULL)					fputs(buf, stdout);				fclose(fd);			}		}		for (tt = types; tt != NULL; tt = tt->next) {			sprintf(buf, "%s/%s_%d.h",				tt->dirname, tt->typename, tt->type);			if ((fd = fopen(buf,"r")) != NULL) {				while (fgets(buf, sizeof(buf), fd) != NULL)					fputs(buf, stdout);				fclose(fd);			}		}		if (suffix != NULL) {			if ((fd = fopen(suffix,"r")) != NULL) {				while (fgets(buf, sizeof(buf), fd) != NULL)					fputs(buf, stdout);				fclose(fd);			}		}	} else if (depend) {		for (tt = types; tt != NULL; tt = tt->next)			fprintf(stdout, "%s:\t%s/%s_%d.h\n", file,				tt->dirname, tt->typename, tt->type);	}	if (ferror(stdout) != 0)		exit(1);	return (0);}

⌨️ 快捷键说明

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