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

📄 resconf.c

📁 bind-3.2.
💻 C
📖 第 1 页 / 共 3 页
字号:
		r = idn_checker_add(ctx->prohibit_checker, long_name);		if (r != idn_success)			return (r);	}	return (idn_success);}idn_result_tidn_resconf_addallunassignedcheckernames(idn_resconf_t ctx, const char **names,					 int nnames) {	char long_name[MAX_CONF_LINE_LENGTH + 1];	idn_result_t r;	int i;	assert(ctx != NULL && names != NULL);	TRACE(("idn_resconf_addallunassignedcheckername(nnames=%d)\n",	      nnames));	if (ctx->unassigned_checker == NULL) {		r = idn_checker_create(&(ctx->unassigned_checker));		if (r != idn_success)			return (r);	}	for (i = 0; i < nnames; i++, names++) {		if (strlen(*names) + strlen(IDN_CHECKER_UNASSIGNED_PREFIX)			> MAX_CONF_LINE_LENGTH) {			return (idn_invalid_name);		}		strcpy(long_name, IDN_CHECKER_UNASSIGNED_PREFIX);		strcat(long_name, *names);		r = idn_checker_add(ctx->unassigned_checker, long_name);		if (r != idn_success)			return (r);	}	return (idn_success);}idn_result_tidn_resconf_addallbidicheckernames(idn_resconf_t ctx, const char **names,				   int nnames) {	char long_name[MAX_CONF_LINE_LENGTH + 1];	idn_result_t r;	int i;	assert(ctx != NULL && names != NULL);	TRACE(("idn_resconf_addallbidicheckername(nnames=%d)\n", nnames));	if (ctx->bidi_checker == NULL) {		r = idn_checker_create(&(ctx->bidi_checker));		if (r != idn_success)			return (r);	}	for (i = 0; i < nnames; i++, names++) {		if (strlen(*names) + strlen(IDN_CHECKER_BIDI_PREFIX)			> MAX_CONF_LINE_LENGTH) {			return (idn_invalid_name);		}		strcpy(long_name, IDN_CHECKER_BIDI_PREFIX);		strcat(long_name, *names);		r = idn_checker_add(ctx->bidi_checker, long_name);		if (r != idn_success)			return (r);	}	return (idn_success);}static idn_result_tparse_conf(idn_resconf_t ctx, FILE *fp) {	char line[MAX_CONF_LINE_LENGTH + 1];	int lineno = 0;	char *argv[3];	int argc;	idn_result_t r;	int conf_mask = 0;	TRACE(("parse_conf()\n"));	/*	 * Parse config file.  parsing of 'idn-encoding' line is	 * postponed because 'alias-file' line must be processed	 * before them.	 */	while (fgets(line, sizeof(line), fp) != NULL) {		char *newline;		lineno++;		newline = strpbrk(line, "\r\n");		if (newline != NULL)			*newline = '\0';		else if (fgetc(fp) != EOF) {			ERROR(("libidnkit: too long line \"%-.30s\", "			       "line %d\n", line, lineno));			return (idn_invalid_syntax);		}		argc = split_args(line, argv, 2);		if (argc == -1) {			ERROR(("libidnkit: syntax error, line %d\n", lineno));			return (idn_invalid_syntax);		} else if (argc == 0 || argv[0][0] == '#') {			continue;		} else if (argc == 1) {			ERROR(("libidnkit: syntax error, line %d\n", lineno));			return (idn_invalid_syntax);		}		if (strcmp(argv[0], "idn-encoding") == 0) {			if (conf_mask & DEFAULT_CONF_IDN_ENCODING) {				ERROR(("libidnkit: \"%s\" redefined, "				       "line %d\n", argv[0], lineno));				r = idn_invalid_syntax;			} else {				conf_mask |= DEFAULT_CONF_IDN_ENCODING;				r = parse_idn_encoding(ctx, argv[1], lineno);			}		} else if (strcmp(argv[0], "local-map") == 0) {			r = parse_local_map(ctx, argv[1], lineno);		} else if (strcmp(argv[0], "nameprep") == 0) {			if (conf_mask & DEFAULT_CONF_NAMEPREP) {				ERROR(("libidnkit: \"%s\" redefined, "				       "line %d\n", argv[0], lineno));				r = idn_invalid_syntax;			} else {				conf_mask |= DEFAULT_CONF_NAMEPREP;				r = parse_nameprep(ctx, argv[1], lineno);			}		} else if (strcmp(argv[0], "nameprep-map") == 0 ||			   strcmp(argv[0], "nameprep-normalize") == 0 ||			   strcmp(argv[0], "nameprep-prohibit") == 0 ||			   strcmp(argv[0], "nameprep-unassigned") == 0 ||			   strcmp(argv[0], "alias-file") == 0 ||			   strcmp(argv[0], "encoding-alias-file") == 0 ||			   strcmp(argv[0], "normalize") == 0 ||			   strcmp(argv[0], "server-encoding") == 0 ||		           strcmp(argv[0], "alternate-encoding") == 0 ||			   strcmp(argv[0], "delimiter-map") == 0) {			WARNING(("libidnkit: obsolete command \"%s\", line %d "			         "(ignored)\n", argv[0], lineno));			r = idn_success;		} else {			ERROR(("libidnkit: unknown command \"%-.30s\", "			       "line %d\n", argv[0], lineno));			r = idn_invalid_syntax;		}		if (r != idn_success)			return (r);	}	lineno++;	if (conf_mask != DEFAULT_CONF_ALL) {		return setdefaults_body(ctx, conf_mask);	}	return (idn_success);}static idn_result_tparse_idn_encoding(idn_resconf_t ctx, char *args, int lineno) {	idn_result_t r;	char *argv[MAX_CONF_LINE_ARGS + 1];	int argc;	argc = split_args(args, argv, MAX_CONF_LINE_ARGS + 1);	if (argc != 1) {		ERROR(("libidnkit: wrong # of args for idn-encoding, "		       "line %d\n", lineno));		return (idn_invalid_syntax);	}	r = idn_converter_create(argv[0], &ctx->idn_converter,				 IDN_CONVERTER_DELAYEDOPEN |				 IDN_CONVERTER_RTCHECK);	if (r != idn_success) {		ERROR(("libidnkit: cannot create idn converter, %s, "		       "line %d\n", idn_result_tostring(r), lineno));	}	return (r);}static idn_result_tparse_local_map(idn_resconf_t ctx, char *args, int lineno) {	idn_result_t r;	char *argv[MAX_CONF_LINE_ARGS + 1];	int argc;	int i;	argc = split_args(args, argv, MAX_CONF_LINE_ARGS + 1);	if (argc < 2 || argc > MAX_CONF_LINE_ARGS) {		ERROR(("libidnkit: wrong # of args for local-map, line %d\n",		       lineno));		return (idn_invalid_syntax);	}	if (ctx->local_mapper == NULL) {		r = idn_mapselector_create(&ctx->local_mapper);		if (r != idn_success) {			ERROR(("libidnkit: cannot create local mapper, %s, "			       "line %d\n", idn_result_tostring(r), lineno));			return (r);		}	}	for (i = 1; i < argc; i++) {		r = idn_mapselector_add(ctx->local_mapper, argv[0], argv[i]);		if (r == idn_invalid_name) {			ERROR(("libidnkit: map scheme unavailable \"%-.30s\""			       " or invalid TLD \"%-.30s\", line %d\n",			       argv[i], argv[0], lineno));			return (r);		} else if (r != idn_success) {			return (r);		}	}	return (idn_success);}static idn_result_tparse_nameprep(idn_resconf_t ctx, char *args, int lineno) {	idn_result_t r;	char *argv[MAX_CONF_LINE_ARGS + 1];	char scheme_name[MAX_CONF_LINE_LENGTH + 1];	int argc;	argc = split_args(args, argv, MAX_CONF_LINE_ARGS + 1);	if (argc != 1) {		ERROR(("libidnkit: wrong # of args for nameprep, line %d\n",		       lineno));		return (idn_invalid_syntax);	}	/*	 * Set mapper.	 */	r = idn_mapper_create(&ctx->mapper);	if (r != idn_success) {		ERROR(("libidnkit: cannot create mapper, %s, line %d\n",		       idn_result_tostring(r), lineno));		return (r);	}	r = idn_mapper_add(ctx->mapper, argv[0]);	if (r == idn_invalid_name) {		ERROR(("libidnkit: map scheme unavailable \"%-.30s\", "		       "line %d\n", argv[0], lineno));		return (r);	} else if (r != idn_success) {		return (r);	}	/*	 * Set normalizer.	 */	r = idn_normalizer_create(&ctx->normalizer);	if (r != idn_success) {		ERROR(("libidnkit: cannot create normalizer, %s, line %d\n",		       idn_result_tostring(r), lineno));		return (r);	}	r = idn_normalizer_add(ctx->normalizer, argv[0]);	if (r == idn_invalid_name) {		ERROR(("libidnkit: unknown normalization scheme \"%-.30s\", "		       "line %d\n", argv[0], lineno));		return (r);	} else if (r != idn_success) {		return (r);	}	/*	 * Set prohibit checker.	 */	r = idn_checker_create(&ctx->prohibit_checker);	if (r != idn_success) {		ERROR(("libidnkit: cannot create prohibit checker, %s, "		       "line %d\n", idn_result_tostring(r), lineno));		return (r);	}	sprintf(scheme_name, "%s%s", IDN_CHECKER_PROHIBIT_PREFIX, argv[0]);	r = idn_checker_add(ctx->prohibit_checker, scheme_name);	if (r == idn_invalid_name) {		ERROR(("libidnkit: unknown prohibit scheme \"%-.30s\", "		       "line %d\n", argv[0], lineno));		return (r);	} else if (r != idn_success) {		return (r);	}	/*	 * Set unassigned checker.	 */	r = idn_checker_create(&ctx->unassigned_checker);	if (r != idn_success) {		ERROR(("libidnkit: cannot create unassigned checker, %s, "		       "line %d\n", idn_result_tostring(r), lineno));		return (r);	}	sprintf(scheme_name, "%s%s", IDN_CHECKER_UNASSIGNED_PREFIX, argv[0]);	r = idn_checker_add(ctx->unassigned_checker, scheme_name);	if (r == idn_invalid_name) {		ERROR(("libidnkit: unknown unassigned scheme \"%-.30s\", "		       "line %d\n", argv[0], lineno));		return (r);	} else if (r != idn_success) {		return (r);	}	/*	 * Set bidi checker.	 */	r = idn_checker_create(&ctx->bidi_checker);	if (r != idn_success) {		ERROR(("libidnkit: cannot create bidi checker, %s, line %d\n",		       idn_result_tostring(r), lineno));		return (r);	}	sprintf(scheme_name, "%s%s", IDN_CHECKER_BIDI_PREFIX, argv[0]);	r = idn_checker_add(ctx->bidi_checker, scheme_name);	if (r == idn_invalid_name) {		ERROR(("libidnkit: unknown bidi scheme \"%-.30s\", "		       "line %d\n", argv[0], lineno));		return (r);	} else if (r != idn_success) {		return (r);	}	return (idn_success);}static intsplit_args(char *s, char **av, int max_ac) {	int ac;	int i;	for (ac = 0; *s != '\0' && ac < max_ac; ac++) {		if (ac > 0)			*s++ = '\0';		while (isspace((unsigned char)*s))			s++;		if (*s == '\0')			break;		if (*s == '"' || *s == '\'') {			int qc = *s++;			av[ac] = s;			while (*s != qc) {				if (*s == '\0')					return (-1);				s++;			}		} else {			av[ac] = s;			while (*s != '\0' && !isspace((unsigned char)*s))				s++;		}	}	for (i = ac; i < max_ac; i++)		av[i] = NULL;	return (ac);}static voidresetconf(idn_resconf_t ctx) {#ifndef WITHOUT_ICONV	idn_resconf_setlocalconverter(ctx, NULL);#endif	idn_resconf_setidnconverter(ctx, NULL);	idn_resconf_setauxidnconverter(ctx, NULL);	idn_resconf_setdelimitermap(ctx, NULL);	idn_resconf_setlocalmapselector(ctx, NULL);	idn_resconf_setmapper(ctx, NULL);	idn_resconf_setnormalizer(ctx, NULL);	idn_resconf_setprohibitchecker(ctx, NULL);	idn_resconf_setunassignedchecker(ctx, NULL);	idn_resconf_setbidichecker(ctx, NULL);}#ifndef WITHOUT_ICONVstatic idn_result_tupdate_local_converter(idn_resconf_t ctx) {	idn_result_t r;	const char *old_encoding;	const char *new_encoding;	/*	 * We don't update local converter, if the converter is set	 * by idn_resconf_setlocalconverter() or	 * idn_resconf_setlocalconvertername().	 */	if (ctx->local_converter_is_static)		return (idn_success);	/*	 * Update the local converter if the local encoding is changed.	 */	old_encoding = (ctx->local_converter != NULL) ?		       idn_converter_localencoding(ctx->local_converter) :		       NULL;	new_encoding = idn_localencoding_name();	if (new_encoding == NULL) {		ERROR(("cannot determine local codeset name\n"));		return (idn_notfound);	}	if (old_encoding != NULL &&	    new_encoding != NULL &&	    strcmp(old_encoding, new_encoding) == 0) {		return (idn_success);	}	if (ctx->local_converter != NULL) {		idn_converter_destroy(ctx->local_converter);		ctx->local_converter = NULL;	}	r = idn_converter_create(new_encoding,				 &ctx->local_converter,				 IDN_CONVERTER_RTCHECK);	return (r);}#endifidn_result_tidn_resconf_setdefaults(idn_resconf_t ctx){	idn_result_t r;	assert(ctx != NULL);	TRACE(("idn_resconf_setdefaults()\n"));	resetconf(ctx);	r = idn_delimitermap_create(&ctx->delimiter_mapper);	if (r != idn_success) {		ERROR(("libidnkit: cannot create delimiter mapper, %s\n",		       idn_result_tostring(r)));		return (r);	}	return setdefaults_body(ctx, 0);}static idn_result_tsetdefaults_body(idn_resconf_t ctx, int conf_mask) {	idn_result_t r;	TRACE(("setdefaults_body()\n"));	assert(ctx != NULL);	if (!(conf_mask & DEFAULT_CONF_NAMEPREP)) {		TRACE(("set default nameprep\n"));		r = idn_resconf_setnameprepversion(ctx, IDN_NAMEPREP_CURRENT);		if (r != idn_success) {			return (r);		}	}	if (!(conf_mask & DEFAULT_CONF_IDN_ENCODING)) {		TRACE(("set default idn encoding\n"));		r = idn_converter_create(IDN_ENCODING_CURRENT,					 &ctx->idn_converter,					 IDN_CONVERTER_DELAYEDOPEN |					 IDN_CONVERTER_RTCHECK);		if (r != idn_success) {			ERROR(("libidnkit: cannot create idn converter, %s\n",			       idn_result_tostring(r)));			return (r);		}	}	return (idn_success);}

⌨️ 快捷键说明

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