idn-lookup.c revision 1.1
1/* $NetBSD: idn-lookup.c,v 1.1 2011/04/13 18:15:58 elric Exp $ */ 2 3/* 4 * Copyright (c) 2004 Kungliga Tekniska H��gskolan 5 * (Royal Institute of Technology, Stockholm, Sweden). 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * 3. Neither the name of the Institute nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36#ifdef HAVE_CONFIG_H 37#include <config.h> 38#endif 39#include <assert.h> 40#include <err.h> 41#include <netdb.h> 42#include <stdio.h> 43#include <stdlib.h> 44#include <string.h> 45#include <sys/socket.h> 46#include <sys/types.h> 47 48#include <krb5/getarg.h> 49#include <krb5/roken.h> 50 51#include "windlocl.h" 52 53static int version_flag = 0; 54static int help_flag = 0; 55 56 57static int 58is_separator(uint32_t u) 59{ 60 return u == 0x002E || u == 0x3002; 61} 62 63static void 64lookup(const char *name) 65{ 66 unsigned i; 67 char encoded[1024]; 68 char *ep; 69 int ret; 70 struct addrinfo hints; 71 struct addrinfo *ai; 72 73 size_t u_len = strlen(name); 74 uint32_t *u = malloc(u_len * sizeof(uint32_t)); 75 size_t norm_len = u_len * 2; 76 uint32_t *norm = malloc(norm_len * sizeof(uint32_t)); 77 78 if (u == NULL && u_len != 0) 79 errx(1, "malloc failed"); 80 if (norm == NULL && norm_len != 0) 81 errx(1, "malloc failed"); 82 83 ret = wind_utf8ucs4(name, u, &u_len); 84 if (ret) 85 errx(1, "utf8 conversion failed"); 86 ret = wind_stringprep(u, u_len, norm, &norm_len, WIND_PROFILE_NAME); 87 if (ret) 88 errx(1, "stringprep failed"); 89 free(u); 90 91 ep = encoded; 92 for (i = 0; i < norm_len; ++i) { 93 unsigned j; 94 size_t len; 95 96 for (j = i; j < norm_len && !is_separator(norm[j]); ++j) 97 ; 98 len = sizeof(encoded) - (ep - encoded); 99 ret = wind_punycode_label_toascii(norm + i, j - i, ep, &len); 100 if (ret) 101 errx(1, "punycode failed"); 102 103 ep += len; 104 *ep++ = '.'; 105 i = j; 106 } 107 *ep = '\0'; 108 free(norm); 109 110 printf("Converted \"%s\" into \"%s\"\n", name, encoded); 111 112 memset(&hints, 0, sizeof(hints)); 113 hints.ai_flags = AI_CANONNAME; 114 ret = getaddrinfo(encoded, NULL, &hints, &ai); 115 if(ret) 116 errx(1, "getaddrinfo failed: %s", gai_strerror(ret)); 117 printf("canonical-name: %s\n", ai->ai_canonname); 118 freeaddrinfo(ai); 119} 120 121static struct getargs args[] = { 122 {"version", 0, arg_flag, &version_flag, 123 "print version", NULL }, 124 {"help", 0, arg_flag, &help_flag, 125 NULL, NULL } 126}; 127 128static void 129usage (int ret) 130{ 131 arg_printusage(args, sizeof(args)/sizeof(args[0]), NULL, 132 "dns-names ..."); 133 exit (ret); 134} 135 136int 137main(int argc, char **argv) 138{ 139 int optidx = 0; 140 unsigned i; 141 142 setprogname (argv[0]); 143 144 if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) 145 usage(1); 146 147 if (help_flag) 148 usage (0); 149 150 if(version_flag){ 151 print_version(NULL); 152 exit(0); 153 } 154 155 argc -= optidx; 156 argv += optidx; 157 158 if (argc == 0) 159 usage(1); 160 161 for (i = 0; i < argc; ++i) 162 lookup(argv[i]); 163 return 0; 164} 165