5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews/*
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * convert.c - convert domain name
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews */
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews/*
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * Copyright (c) 2000,2002 Japan Network Information Center.
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * All rights reserved.
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews *
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * By using this file, you agree to the terms and conditions set forth bellow.
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews *
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * LICENSE TERMS AND CONDITIONS
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews *
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * The following License Terms and Conditions apply, unless a different
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * license is obtained from Japan Network Information Center ("JPNIC"),
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda,
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * Chiyoda-ku, Tokyo 101-0047, Japan.
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews *
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * 1. Use, Modification and Redistribution (including distribution of any
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * modified or derived work) in source and/or binary forms is permitted
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * under this License Terms and Conditions.
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews *
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * 2. Redistribution of source code must retain the copyright notices as they
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * appear in each source code file, this License Terms and Conditions.
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews *
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * 3. Redistribution in binary form must reproduce the Copyright Notice,
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * this License Terms and Conditions, in the documentation and/or other
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * materials provided with the distribution. For the purposes of binary
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * distribution the "Copyright Notice" refers to the following language:
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved."
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews *
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * 4. The name of JPNIC may not be used to endorse or promote products
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * derived from this Software without specific prior written approval of
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * JPNIC.
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews *
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews */
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#include <windows.h>
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#include <stdio.h>
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#include <stdlib.h>
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#include <string.h>
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews#include "wrapcommon.h"
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews/*
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * prepare/dispose conversion context
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews */
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsvoid
5c526acb82c882e41b655c31f5fa4425c87b671cMark AndrewsidnConvDone(idn_resconf_t ctx)
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews{
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if (ctx != NULL) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idnLogReset();
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idn_resconf_destroy(ctx);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews }
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews}
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrewsidn_resconf_t
5c526acb82c882e41b655c31f5fa4425c87b671cMark AndrewsidnConvInit(void)
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews{
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews char encoding[256];
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idn_resconf_t ctx;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idn_result_t r;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idnLogReset();
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idnLogPrintf(idn_log_level_info, "idnkit version: %-.20s\n",
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idn_version_getstring());
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews /*
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * Initialize.
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews */
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if ((r = idn_resconf_initialize()) != idn_success) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idnPrintf("idnConvInit: cannot initialize idn library: %s\n",
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idn_result_tostring(r));
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews return NULL;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews }
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if ((r = idn_resconf_create(&ctx)) != idn_success) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idnPrintf("idnConvInit: cannot create context: %s\n",
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idn_result_tostring(r));
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews return NULL;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews }
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews /*
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * load configuration file.
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews */
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if ((r = idn_resconf_loadfile(ctx, NULL)) != idn_success) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idnPrintf("idnConvInit: cannot read configuration file: %s\n",
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idn_result_tostring(r));
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if ((r = idn_resconf_setdefaults(ctx)) != idn_success) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idnPrintf("idnConvInit: setting default configuration"
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews " failed: %s\n",
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idn_result_tostring(r));
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idnConvDone(ctx);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews return (NULL);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews }
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idnPrintf("idnConvInit: using default configuration\n");
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews }
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews /*
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * Set local codeset.
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews */
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if (idnGetPrgEncoding(encoding, sizeof(encoding)) == TRUE) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idnPrintf("Encoding PRG <%-.100s>\n", encoding);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews r = idn_resconf_setlocalconvertername(ctx, encoding,
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews IDN_CONVERTER_RTCHECK);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if (r != idn_success) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idnPrintf("idnConvInit: invalid local codeset "
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews "\"%-.100s\": %s\n",
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews encoding, idn_result_tostring(r));
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idnConvDone(ctx);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews return NULL;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews }
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews }
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews return ctx;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews}
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews/*
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * idnConvReq - convert domain name in a DNS request
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews *
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * convert local encoding to DNS encoding
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews */
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark AndrewsBOOL
5c526acb82c882e41b655c31f5fa4425c87b671cMark AndrewsidnConvReq(idn_resconf_t ctx, const char FAR *from, char FAR *to, size_t tolen)
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews{
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idn_result_t r;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idnLogReset();
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idnLogPrintf(idn_log_level_trace, "idnConvReq(from=%-.100s)\n", from);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if (ctx == NULL) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idnLogPrintf(idn_log_level_trace, "idnConvReq: ctx is NULL\n");
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if (strlen(from) >= tolen)
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews return FALSE;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews strcpy(to, from);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews return TRUE;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews }
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews r = idn_res_encodename(ctx, IDN_ENCODE_APP, from, to, tolen);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if (r == idn_success) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews return TRUE;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews } else {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews return FALSE;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews }
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews}
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews/*
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * idnConvRsp - convert domain name in a DNS response
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews *
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews * convert DNS encoding to local encoding
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews */
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark AndrewsBOOL
5c526acb82c882e41b655c31f5fa4425c87b671cMark AndrewsidnConvRsp(idn_resconf_t ctx, const char FAR *from, char FAR *to, size_t tolen)
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews{
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idnLogReset();
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews idnLogPrintf(idn_log_level_trace, "idnConvRsp(from=%-.100s)\n", from);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if (ctx == NULL) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews if (strlen(from) >= tolen)
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews return FALSE;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews strcpy(to, from);
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews return TRUE;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews } else if (idn_res_decodename(ctx, IDN_DECODE_APP,
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews from, to, tolen) == idn_success) {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews return TRUE;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews } else {
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews return FALSE;
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews }
5c526acb82c882e41b655c31f5fa4425c87b671cMark Andrews}