87 #include <unicode/uidna.h>
103 #define DEF_MIDNA_CACHE_SIZE 256
107 static VSTRING *midna_domain_buf;
109 #define STR(x) vstring_str(x)
113 static const char *midna_domain_strerror(UErrorCode error,
int info_errors)
121 "UIDNA_ERROR_EMPTY_LABEL", UIDNA_ERROR_EMPTY_LABEL,
122 "UIDNA_ERROR_LABEL_TOO_LONG", UIDNA_ERROR_LABEL_TOO_LONG,
123 "UIDNA_ERROR_DOMAIN_NAME_TOO_LONG", UIDNA_ERROR_DOMAIN_NAME_TOO_LONG,
124 "UIDNA_ERROR_LEADING_HYPHEN", UIDNA_ERROR_LEADING_HYPHEN,
125 "UIDNA_ERROR_TRAILING_HYPHEN", UIDNA_ERROR_TRAILING_HYPHEN,
126 "UIDNA_ERROR_HYPHEN_3_4", UIDNA_ERROR_HYPHEN_3_4,
127 "UIDNA_ERROR_LEADING_COMBINING_MARK", UIDNA_ERROR_LEADING_COMBINING_MARK,
128 "UIDNA_ERROR_DISALLOWED", UIDNA_ERROR_DISALLOWED,
129 "UIDNA_ERROR_PUNYCODE", UIDNA_ERROR_PUNYCODE,
130 "UIDNA_ERROR_LABEL_HAS_DOT", UIDNA_ERROR_LABEL_HAS_DOT,
131 "UIDNA_ERROR_INVALID_ACE_LABEL", UIDNA_ERROR_INVALID_ACE_LABEL,
132 "UIDNA_ERROR_BIDI", UIDNA_ERROR_BIDI,
133 "UIDNA_ERROR_CONTEXTJ", UIDNA_ERROR_CONTEXTJ,
140 uidna_errors, info_errors,
143 return u_errorName(error);
149 static void *midna_domain_to_ascii_create(
const char *name,
void *unused_context)
151 static const char myname[] =
"midna_domain_to_ascii_create";
153 UErrorCode error = U_ZERO_ERROR;
154 UIDNAInfo info = UIDNA_INFO_INITIALIZER;
162 msg_warn(
"%s: Problem translating domain \"%.100s\" to ASCII form: %s",
163 myname, name,
"malformed UTF-8");
171 : UIDNA_NONTRANSITIONAL_TO_ASCII, &error);
172 anl = uidna_nameToASCII_UTF8(idna,
174 buf,
sizeof(buf) - 1,
186 if (U_SUCCESS(error) && info.errors == 0 && anl > 0) {
189 msg_warn(
"%s: Problem translating domain \"%.100s\" to ASCII form: %s",
190 myname, name,
"malformed ASCII label(s)");
195 msg_warn(
"%s: Problem translating domain \"%.100s\" to ASCII form: %s",
196 myname, name, midna_domain_strerror(error, info.errors));
203 static void *midna_domain_to_utf8_create(
const char *name,
void *unused_context)
205 static const char myname[] =
"midna_domain_to_utf8_create";
207 UErrorCode error = U_ZERO_ERROR;
208 UIDNAInfo info = UIDNA_INFO_INITIALIZER;
216 msg_warn(
"%s: Problem translating domain \"%.100s\" to UTF-8 form: %s",
217 myname, name,
"malformed UTF-8");
225 : UIDNA_NONTRANSITIONAL_TO_UNICODE, &error);
226 anl = uidna_nameToUnicodeUTF8(idna,
228 buf,
sizeof(buf) - 1,
239 if (U_SUCCESS(error) && info.errors == 0 && anl > 0) {
245 msg_warn(
"%s: Problem translating domain \"%.100s\" to UTF8 form: %s",
246 myname, name, midna_domain_strerror(error, info.errors));
253 static void midna_domain_cache_free(
void *value,
void *unused_context)
263 static CTABLE *midna_domain_to_ascii_cache = 0;
265 if (midna_domain_to_ascii_cache == 0)
267 midna_domain_to_ascii_create,
268 midna_domain_cache_free,
277 static CTABLE *midna_domain_to_utf8_cache = 0;
279 if (midna_domain_to_utf8_cache == 0)
281 midna_domain_to_utf8_create,
282 midna_domain_cache_free,
291 const char *cache_res;
297 if (midna_domain_buf == 0)
303 return (cache_res + 1);
310 const char *cache_res;
316 if (midna_domain_buf == 0)
322 return (cache_res + 1);
339 int main(
int argc,
char **argv)
346 if (setlocale(LC_ALL,
"C") == 0)
347 msg_fatal(
"setlocale(LC_ALL, C) failed: %m");
358 if (*bp ==
'#' || *bp == 0)
360 msg_info(
"unconditional conversions:");
362 msg_info(
"\"%s\" ->utf8 \"%s\"", bp, utf8 ? utf8 :
"(error)");
364 msg_info(
"\"%s\" ->ascii \"%s\"", bp, ascii ? ascii :
"(error)");
365 msg_info(
"conditional conversions:");
369 msg_info(
"\"%s\" ->ascii \"%s\" ->utf8 \"%s\"",
370 bp, ascii, utf8 ? utf8 :
"(error)");
372 if (strcmp(utf8, bp) != 0)
373 msg_warn(
"\"%s\" != \"%s\"", bp, utf8);
379 msg_info(
"\"%s\" ->utf8 \"%s\" ->ascii \"%s\"",
380 bp, utf8, ascii ? ascii :
"(error)");
382 if (strcmp(ascii, bp) != 0)
383 msg_warn(
"\"%s\" != \"%s\"", bp, ascii);
#define vstring_fgets_nonl(s, p)
int midna_domain_transitional
const char * str_long_name_mask_opt(VSTRING *buf, const char *context, const LONG_NAME_MASK *table, long mask, int flags)
int main(int argc, char **argv)
int valid_utf8_string(const char *, ssize_t)
const void * ctable_locate(CTABLE *cache, const char *key)
int valid_hostname(const char *name, int gripe)
const char * midna_domain_to_utf8(const char *name)
int midna_domain_cache_size
void msg_warn(const char *fmt,...)
const char * midna_domain_suffix_to_utf8(const char *name)
CTABLE * ctable_create(ssize_t limit, CTABLE_CREATE_FN create, CTABLE_DELETE_FN delete, void *context)
VSTRING * vstring_alloc(ssize_t len)
VSTRING * vstring_sprintf(VSTRING *vp, const char *format,...)
NORETURN msg_fatal(const char *fmt,...)
char * mystrndup(const char *str, ssize_t len)
const char * midna_domain_suffix_to_ascii(const char *suffix)
const char * midna_domain_to_ascii(const char *name)
#define DEF_MIDNA_CACHE_SIZE
void msg_vstream_init(const char *name, VSTREAM *vp)
void msg_info(const char *fmt,...)