📄 bind-9.2.2-patch
字号:
+ static isc_result_t output_filter(isc_buffer_t *buffer,+ unsigned int used_org,+ isc_boolean_t absolute);+ static idn_result_t append_textname(char *name, const char *origin,+ size_t namesize);+ static void idn_check_result(idn_result_t r, const char *msg);+ + #define MAXDLEN 256+ #endif+ /* * Apply and clear locks at the event level in global task. * Can I get rid of these using shutdown events? XXX****************** 648,653 ****--- 671,680 ---- ISC_LIST_APPEND(server_list, srv, link); } + #ifdef WITH_IDN+ initialize_idn();+ #endif+ if (keyfile[0] != 0) setup_file_key(); else if (keysecret[0] != 0)****************** 1168,1173 ****--- 1195,1208 ---- isc_buffer_t b; dns_compress_t cctx; char store[MXNAME];+ #ifdef WITH_IDN+ idn_result_t mr;+ char utf8_textname[MXNAME], utf8_origin[MXNAME], idn_textname[MXNAME];+ #endif+ + #ifdef WITH_IDN+ dns_name_settotextfilter(output_filter);+ #endif REQUIRE(lookup != NULL); INSIST(!free_now);****************** 1196,1201 ****--- 1231,1247 ---- isc_buffer_init(&lookup->onamebuf, lookup->onamespace, sizeof(lookup->onamespace)); + #ifdef WITH_IDN+ /*+ * We cannot convert `textname' and `origin' separately.+ * `textname' doesn't contain TLD, but local mapping needs+ * TLD.+ */+ mr = idn_encodename(IDN_LOCALCONV | IDN_DELIMMAP, lookup->textname,+ utf8_textname, sizeof(utf8_textname));+ idn_check_result(mr, "convert textname to UTF-8");+ #endif+ /* * If the name has too many dots, force the origin to be NULL * (which produces an absolute lookup). Otherwise, take the origin****************** 1204,1215 ****--- 1250,1290 ---- * is TRUE or we got a domain line in the resolv.conf file. */ /* XXX New search here? */+ #ifdef WITH_IDN+ if ((count_dots(utf8_textname) >= ndots) || !usesearch)+ lookup->origin = NULL; /* Force abs lookup */+ else if (lookup->origin == NULL && lookup->new_search && usesearch) {+ lookup->origin = ISC_LIST_HEAD(search_list);+ }+ #else if ((count_dots(lookup->textname) >= ndots) || !usesearch) lookup->origin = NULL; /* Force abs lookup */ else if (lookup->origin == NULL && lookup->new_search && usesearch) { lookup->origin = ISC_LIST_HEAD(search_list); }+ #endif+ + #ifdef WITH_IDN if (lookup->origin != NULL) {+ mr = idn_encodename(IDN_LOCALCONV | IDN_DELIMMAP,+ lookup->origin->origin, utf8_origin,+ sizeof(utf8_origin));+ idn_check_result(mr, "convert origin to UTF-8");+ mr = append_textname(utf8_textname, utf8_origin,+ sizeof(utf8_textname));+ idn_check_result(mr, "append origin to textname");+ }+ mr = idn_encodename(IDN_LOCALMAP | IDN_NAMEPREP | IDN_ASCCHECK |+ IDN_IDNCONV | IDN_LENCHECK, utf8_textname,+ idn_textname, sizeof(idn_textname));+ idn_check_result(mr, "convert UTF-8 textname to IDN encoding");+ #endif+ + #ifdef WITH_IDN+ if (0) {+ #else+ if (lookup->origin != NULL) {+ #endif debug("trying origin %s", lookup->origin->origin); result = dns_message_gettempname(lookup->sendmsg, &lookup->oname);****************** 1254,1259 ****--- 1329,1343 ---- if (lookup->trace && lookup->trace_root) dns_name_clone(dns_rootname, lookup->name); else {+ #ifdef WITH_IDN+ len = strlen(idn_textname);+ isc_buffer_init(&b, idn_textname, len);+ isc_buffer_add(&b, len);+ result = dns_name_fromtext(lookup->name, &b,+ dns_rootname,+ ISC_FALSE,+ &lookup->namebuf);+ #else len = strlen(lookup->textname); isc_buffer_init(&b, lookup->textname, len); isc_buffer_add(&b, len);****************** 1261,1266 ****--- 1345,1351 ---- dns_rootname, ISC_FALSE, &lookup->namebuf);+ #endif } if (result != ISC_R_SUCCESS) { dns_message_puttempname(lookup->sendmsg,****************** 2663,2665 ****--- 2748,2848 ---- if (mctx != NULL) isc_mem_destroy(&mctx); }+ + #ifdef WITH_IDN+ static void+ initialize_idn(void) {+ idn_result_t r;+ + #ifdef HAVE_SETLOCALE+ /* Set locale */+ (void)setlocale(LC_ALL, "");+ #endif+ /* Create configuration context. */+ r = idn_nameinit(1);+ if (r != idn_success)+ fatal("idn api initialization failed: %s",+ idn_result_tostring(r));+ + /* Set domain name -> text post-conversion filter. */+ dns_name_settotextfilter(output_filter);+ }+ + static isc_result_t+ output_filter(isc_buffer_t *buffer, unsigned int used_org,+ isc_boolean_t absolute)+ {+ char tmp1[MAXDLEN], tmp2[MAXDLEN];+ size_t fromlen, tolen;+ isc_boolean_t end_with_dot;+ + /*+ * Copy contents of 'buffer' to 'tmp1', supply trailing dot+ * if 'absolute' is true, and terminate with NUL.+ */+ fromlen = isc_buffer_usedlength(buffer) - used_org;+ if (fromlen >= MAXDLEN)+ return (ISC_R_SUCCESS);+ memcpy(tmp1, (char *)isc_buffer_base(buffer) + used_org, fromlen);+ end_with_dot = (tmp1[fromlen - 1] == '.') ? ISC_TRUE : ISC_FALSE;+ if (absolute && !end_with_dot) {+ fromlen++;+ if (fromlen >= MAXDLEN)+ return (ISC_R_SUCCESS);+ tmp1[fromlen - 1] = '.';+ }+ tmp1[fromlen] = '\0';+ + /*+ * Convert contents of 'tmp1' to local encoding.+ */+ if (idn_decodename(IDN_DECODE_APP, tmp1, tmp2, MAXDLEN) != idn_success)+ return (ISC_R_SUCCESS);+ strcpy(tmp1, tmp2);+ + /*+ * Copy the converted contents in 'tmp1' back to 'buffer'.+ * If we have appended trailing dot, remove it.+ */+ tolen = strlen(tmp1);+ if (absolute && !end_with_dot && tmp1[tolen - 1] == '.')+ tolen--;+ + if (isc_buffer_length(buffer) < used_org + tolen)+ return (ISC_R_NOSPACE);+ + isc_buffer_subtract(buffer, isc_buffer_usedlength(buffer) - used_org);+ memcpy(isc_buffer_used(buffer), tmp1, tolen);+ isc_buffer_add(buffer, tolen);+ + return (ISC_R_SUCCESS);+ }+ + static idn_result_t+ append_textname(char *name, const char *origin, size_t namesize) {+ size_t namelen = strlen(name);+ size_t originlen = strlen(origin);+ + /* Already absolute? */+ if (namelen > 0 && name[namelen - 1] == '.')+ return idn_success;+ + /* Append dot and origin */+ + if (namelen + 1 + originlen >= namesize)+ return idn_buffer_overflow;+ + name[namelen++] = '.';+ (void)strcpy(name + namelen, origin);+ return idn_success;+ }+ + static void+ idn_check_result(idn_result_t r, const char *msg) {+ if (r != idn_success) {+ exitcode = 1;+ fatal("%s: %s", msg, idn_result_tostring(r));+ }+ }+ + #endif /* WITH_IDN */Index: bin/dig/host.1diff -c mdn/othersrc/bind9/bin/dig/host.1:1.1.1.2 mdn/othersrc/bind9/bin/dig/host.1:1.4*** bin/dig/host.1 Wed Mar 5 17:14:57 2003--- bin/dig/host.1 Wed Mar 5 17:42:53 2003****************** 120,125 ****--- 120,136 ---- effectively wait forever for a reply. The time to wait for a response will be set to the number of seconds given by the hardware's maximum value for an integer quantity.+ .SH "IDN SUPPORT"+ .PP+ If \fBhost\fR has been built with IDN (internationalized+ domain name) support, it can accept and display non-ASCII domain names.+ \fBhost\fR appropriately converts character encoding of+ domain name before sending a request to DNS server or displaying a+ reply from the server.+ If you'd like to turn off the IDN support for some reason, defines+ the \fBIDN_DISABLE\fR environment variable.+ The IDN support is disabled if the the variable is set when+ \fBhost\fR runs. .SH "FILES" .PP \fI/etc/resolv.conf\fRIndex: bin/dig/host.docbookdiff -c mdn/othersrc/bind9/bin/dig/host.docbook:1.1.1.2 mdn/othersrc/bind9/bin/dig/host.docbook:1.4*** bin/dig/host.docbook Wed Mar 5 17:14:57 2003--- bin/dig/host.docbook Wed Mar 5 17:42:53 2003****************** 181,186 ****--- 181,201 ---- </refsect1> <refsect1>+ <title>IDN SUPPORT</title>+ <para>+ If <command>host</command> has been built with IDN (internationalized+ domain name) support, it can accept and display non-ASCII domain names.+ <command>host</command> appropriately converts character encoding of+ domain name before sending a request to DNS server or displaying a+ reply from the server.+ If you'd like to turn off the IDN support for some reason, defines+ the <envar>IDN_DISABLE</envar> environment variable.+ The IDN support is disabled if the the variable is set when+ <command>host</command> runs.+ </para>+ </refsect1>+ + <refsect1> <title>FILES</title> <para> <filename>/etc/resolv.conf</filename>Index: lib/dns/name.cdiff -c mdn/othersrc/bind9/lib/dns/name.c:1.1.1.11 mdn/othersrc/bind9/lib/dns/name.c:1.15*** lib/dns/name.c Wed Mar 5 17:16:22 2003--- lib/dns/name.c Wed Mar 5 17:49:58 2003****************** 194,199 ****--- 194,206 ---- /* XXXDCL make const? */ dns_name_t *dns_wildcardname = &wild; + #ifdef WITH_IDN+ /*+ * dns_name_t to text post-conversion procedure.+ */+ static dns_name_totextfilter_t totext_filter_proc = NULL;+ #endif+ static void set_offsets(const dns_name_t *name, unsigned char *offsets, dns_name_t *set_name);****************** 1684,1689 ****--- 1691,1699 ---- unsigned int labels; isc_boolean_t saw_root = ISC_FALSE; char num[4];+ #ifdef WITH_IDN+ unsigned int oused = target->used;+ #endif /* * This function assumes the name is in proper uncompressed****************** 1861,1866 ****--- 1871,1880 ---- isc_buffer_add(target, tlen - trem); + #ifdef WITH_IDN+ if (totext_filter_proc != NULL)+ return ((*totext_filter_proc)(target, oused, saw_root));+ #endif return (ISC_R_SUCCESS); } ****************** 3325,3327 ****--- 3339,3347 ---- return (ISC_R_SUCCESS); } + #ifdef WITH_IDN+ void+ dns_name_settotextfilter(dns_name_totextfilter_t proc) {+ totext_filter_proc = proc;+ }+ #endifIndex: lib/dns/include/dns/name.hdiff -c mdn/othersrc/bind9/lib/dns/include/dns/name.h:1.1.1.7 mdn/othersrc/bind9/lib/dns/include/dns/name.h:1.10*** lib/dns/include/dns/name.h Wed May 22 17:15:29 2002--- lib/dns/include/dns/name.h Mon May 27 12:10:15 2002****************** 219,224 ****--- 219,235 ---- */ #define DNS_NAME_MAXWIRE 255 + #ifdef WITH_IDN+ /*+ * Text output filter procedure.+ * 'target' is the buffer to be converted. The region to be converted+ * is from 'buffer'->base + 'used_org' to the end of the used region.+ */+ typedef isc_result_t (*dns_name_totextfilter_t)(isc_buffer_t *target,+ unsigned int used_org,+ isc_boolean_t absolute);+ #endif+ /*** *** Initialization ***/****************** 1244,1249 ****--- 1255,1268 ---- * 'size' > 0. * */+ + #ifdef WITH_IDN+ void+ dns_name_settotextfilter(dns_name_totextfilter_t proc);+ /*+ * Call 'proc' at the end of dns_name_totext.+ */+ #endif /* WITH_IDN */ #define DNS_NAME_FORMATSIZE (DNS_NAME_MAXTEXT + 1) /*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -