static void lookup(const char *name) { unsigned i; char encoded[1024]; char *ep; int ret; struct addrinfo hints; struct addrinfo *ai; size_t u_len = strlen(name); uint32_t *u = malloc(u_len * sizeof(uint32_t)); size_t norm_len = u_len * 2; uint32_t *norm = malloc(norm_len * sizeof(uint32_t)); if (u == NULL && u_len != 0) errx(1, "malloc failed"); if (norm == NULL && norm_len != 0) errx(1, "malloc failed"); ret = wind_utf8ucs4(name, u, &u_len); if (ret) errx(1, "utf8 conversion failed"); ret = wind_stringprep(u, u_len, norm, &norm_len, WIND_PROFILE_NAME); if (ret) errx(1, "stringprep failed"); free(u); ep = encoded; for (i = 0; i < norm_len; ++i) { unsigned j; size_t len; for (j = i; j < norm_len && !is_separator(norm[j]); ++j) ; len = sizeof(encoded) - (ep - encoded); ret = wind_punycode_label_toascii(norm + i, j - i, ep, &len); if (ret) errx(1, "punycode failed"); ep += len; *ep++ = '.'; i = j; } *ep = '\0'; free(norm); printf("Converted \"%s\" into \"%s\"\n", name, encoded); memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_CANONNAME; ret = getaddrinfo(encoded, NULL, &hints, &ai); if(ret) errx(1, "getaddrinfo failed: %s", gai_strerror(ret)); printf("canonical-name: %s\n", ai->ai_canonname); freeaddrinfo(ai); }
int main(void) { unsigned i; unsigned failures = 0; for (i = 0; i < punycode_examples_size; ++i) { char buf[256]; int ret; const struct punycode_example *e = &punycode_examples[i]; size_t len; len = sizeof(buf); ret = wind_punycode_label_toascii(e->val, e->len, buf, &len); if (ret) { printf("punycode %u (%s) failed: %d\n", i, e->description, ret); ++failures; continue; } if (strncmp(buf, "xn--", 4) == 0) { memmove(buf, buf + 4, len - 4); len -= 4; } if (len != strlen(e->pc)) { printf("punycode %u (%s) wrong len, actual: %u, expected: %u\n", i, e->description, (unsigned int)len, (unsigned int)strlen(e->pc)); printf("buf %s != pc: %s\n", buf, e->pc); ++failures; continue; } if (strncasecmp(buf, e->pc, len) != 0) { printf("punycode %u (%s) wrong contents, " "actual: \"%.*s\", expected: \"%s\"\n", i, e->description, (unsigned int)len, buf, e->pc); ++failures; continue; } } return failures != 0; }