#ifndef lint
#endif
/*
* Copyright (c) 2000,2001,2002 Japan Network Information Center.
* All rights reserved.
*
* By using this file, you agree to the terms and conditions set forth bellow.
*
* LICENSE TERMS AND CONDITIONS
*
* The following License Terms and Conditions apply, unless a different
* license is obtained from Japan Network Information Center ("JPNIC"),
* a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda,
* Chiyoda-ku, Tokyo 101-0047, Japan.
*
* 1. Use, Modification and Redistribution (including distribution of any
* under this License Terms and Conditions.
*
* 2. Redistribution of source code must retain the copyright notices as they
* appear in each source code file, this License Terms and Conditions.
*
* 3. Redistribution in binary form must reproduce the Copyright Notice,
* materials provided with the distribution. For the purposes of binary
* distribution the "Copyright Notice" refers to the following language:
* "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved."
*
* 4. The name of JPNIC may not be used to endorse or promote products
* derived from this Software without specific prior written approval of
* JPNIC.
*
* 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*/
/*
* idnconv -- Codeset converter for named.conf and zone files
*/
#include <config.h>
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#ifdef HAVE_LOCALE_H
#include <locale.h>
#endif
#include <idn/converter.h>
#include <idn/normalizer.h>
#include "util.h"
#define FLAG_NAMEPREP \
#define DEFAULT_FLAGS \
static void print_usage(char *cmd);
static void print_version(void);
static unsigned long get_ucs(const char *p);
int
char *cname;
int ndelimiters = 0;
int nlocalmappers = 0;
int no_resconf = 0;
idn_result_t r;
int exit_value;
#ifdef HAVE_SETLOCALE
#endif
/*
* If the command name begins with 'r', reverse mode is assumed.
*/
cname++;
else
if (cname[0] == 'r')
flags |= FLAG_REVERSE;
ac--;
av++;
exit(1); \
} \
ac--;
av++;
ac--;
av++;
ac--;
av++;
ac--;
av++;
no_resconf = 1;
flags |= FLAG_REVERSE;
flags &= ~FLAG_LOCALMAP;
flags &= ~FLAG_NAMEPREP;
flags &= ~FLAG_UNASSIGNCHECK;
flags &= ~FLAG_BIDICHECK;
flags &= ~FLAG_ASCIICHECK;
} else if (OPT_MATCH("-nolengthcheck")) {
flags &= ~FLAG_LENGTHCHECK;
} else if (OPT_MATCH("-noroundtripcheck")) {
flags &= ~FLAG_ROUNDTRIPCHECK;
flags &= ~FLAG_SELECTIVE;
} else if (OPT_MATCH("-localmap")) {
"local maps");
} else if (OPT_MATCH("-delimiter")) {
unsigned long v;
"delimiter maps");
ac--;
av++;
} else if (OPT_MATCH("-flush")) {
flush_every_line = 1;
} else {
}
ac--;
av++;
}
if (ac > 1)
/* Initialize. */
if ((r = idn_resconf_initialize()) != idn_success) {
errormsg("error initializing library\n");
return (1);
}
/*
* Create resource contexts.
* `resconf1' and `resconf2' are almost the same but local and
* IDN encodings are reversed.
*/
errormsg("error initializing configuration contexts\n");
return (1);
}
/* Load configuration file. */
if (no_resconf) {
} else {
}
/* Set encoding alias file. */
if (encoding_alias != NULL)
/* Set input codeset. */
if (flags & FLAG_REVERSE) {
errormsg("cannot get the IDN encoding.\n"
"please specify an appropriate one "
"with `-in' option.\n");
exit(1);
}
} else {
}
} else {
errormsg("cannot get the local encoding.\n"
"please specify an appropriate one "
"with `-in' option.\n");
exit(1);
}
} else {
}
}
/* Set output codeset. */
if (flags & FLAG_REVERSE) {
errormsg("cannot get the local encoding.\n"
"please specify an appropriate one "
"with `-out' option.\n");
exit(1);
}
} else {
}
} else {
errormsg("cannot get the IDN encoding.\n"
"please specify an appropriate one "
"with `-out' option.\n");
exit(1);
}
} else {
}
}
/* Set delimiter map(s). */
if (ndelimiters > 0) {
}
/* Set local map(s). */
if (nlocalmappers > 0) {
}
/* Set NAMEPREP version. */
if (nameprep_version != NULL) {
}
idn_res_enable(1);
/* Open input file. */
if (ac > 0) {
errormsg("cannot open file %s: %s\n",
return (1);
}
} else {
}
/* Do the conversion. */
if (flags & FLAG_REVERSE)
else
return exit_value;
}
static int
idn_result_t r;
int nl_trimmed;
int local_ace_hack;
/*
* See if the input codeset is an ACE.
*/
(flags & FLAG_SELECTIVE))
local_ace_hack = 1;
else
local_ace_hack = 0;
if (local_ace_hack) {
if (flags & FLAG_ROUNDTRIPCHECK)
actions1 |= IDN_RTCHECK;
} else {
}
if (flags & FLAG_DELIMMAP)
actions2 |= IDN_DELIMMAP;
if (flags & FLAG_LOCALMAP)
actions2 |= IDN_LOCALMAP;
if (flags & FLAG_NORMALIZE)
if (flags & FLAG_PROHIBITCHECK)
if (flags & FLAG_UNASSIGNCHECK)
if (flags & FLAG_BIDICHECK)
if (flags & FLAG_ASCIICHECK)
actions2 |= IDN_ASCCHECK;
if (flags & FLAG_LENGTHCHECK)
actions2 |= IDN_LENCHECK;
strbuf_init(&buf1);
strbuf_init(&buf2);
line_number = 1;
/*
* Trim newline at the end. This is needed for
* those ascii-comatible encodings such as UTF-5 or RACE
* not to try converting newlines, which will result
* in `invalid encoding' error.
*/
/*
* Convert input line to UTF-8.
*/
if (local_ace_hack)
else
0);
if (r != idn_success) {
errormsg("conversion failed at line %d: %s\n",
idn_result_tostring(r));
goto error;
}
errormsg("conversion to utf-8 failed at line %d\n",
goto error;
}
/*
* Perform local mapping and NAMEPREP, and convert to
* the output codeset.
*/
flags & FLAG_SELECTIVE);
if (r != idn_success) {
errormsg("error in nameprep or output conversion "
"at line %d: %s\n",
goto error;
}
if (nl_trimmed)
if (flush_every_line)
line_number++;
}
strbuf_reset(&buf1);
strbuf_reset(&buf2);
return (0);
strbuf_reset(&buf1);
strbuf_reset(&buf2);
return (1);
}
static int
idn_result_t r;
int nl_trimmed;
/*
* See if the input codeset is an ACE.
*/
(flags & FLAG_SELECTIVE))
idn_ace_hack = 1;
else
idn_ace_hack = 0;
(flags & FLAG_SELECTIVE))
local_ace_hack = 1;
else
local_ace_hack = 0;
if (local_ace_hack) {
if (flags & FLAG_NORMALIZE)
if (flags & FLAG_PROHIBITCHECK)
if (flags & FLAG_UNASSIGNCHECK)
if (flags & FLAG_BIDICHECK)
if (flags & FLAG_ASCIICHECK)
actions2 |= IDN_ASCCHECK;
if (flags & FLAG_LENGTHCHECK)
actions2 |= IDN_LENCHECK;
} else {
}
if (flags & FLAG_DELIMMAP)
actions1 |= IDN_DELIMMAP;
if (flags & FLAG_NORMALIZE)
if (flags & FLAG_NORMALIZE)
if (flags & FLAG_PROHIBITCHECK)
if (flags & FLAG_UNASSIGNCHECK)
if (flags & FLAG_BIDICHECK)
if (flags & FLAG_ASCIICHECK)
actions1 |= IDN_ASCCHECK;
if (flags & FLAG_ROUNDTRIPCHECK)
actions1 |= IDN_RTCHECK;
strbuf_init(&buf1);
strbuf_init(&buf2);
line_number = 1;
/*
* Trim newline at the end. This is needed for
* those ascii-comatible encodings such as UTF-5 or RACE
* not to try converting newlines, which will result
* in `invalid encoding' error.
*/
/*
* Treat input line as the string encoded in local
* encoding and convert it to UTF-8 encoded string.
*/
if (local_ace_hack) {
r = idn_nomemory;
else
r = idn_success;
} else {
0);
}
if (r != idn_success) {
errormsg("conversion failed at line %d: %s\n",
goto error;
}
/*
* Convert internationalized domain names in the line.
*/
if (idn_ace_hack) {
} else {
}
if (r != idn_success) {
errormsg("conversion failed at line %d: %s\n",
idn_result_tostring(r));
goto error;
}
errormsg("conversion to utf-8 failed at line %d\n",
goto error;
}
/*
* Perform round trip check and convert to the output
* codeset.
*/
if (local_ace_hack) {
} else {
}
if (r != idn_success) {
errormsg("error in nameprep or output conversion "
"at line %d: %s\n",
goto error;
}
if (nl_trimmed)
if (flush_every_line)
line_number++;
}
strbuf_reset(&buf1);
strbuf_reset(&buf2);
return (0);
strbuf_reset(&buf1);
strbuf_reset(&buf2);
return (1);
}
static int
/*
* If the string in BUF ends with a newline, trim it and
* return 1. Otherwise, just return 0 without modifying BUF.
*/
char *s = strbuf_get(buf);
return (1);
}
return (0);
}
static idn_result_t
{
idn_result_t r = idn_success;
for (;;) {
case 0:
break;
case FLAG_REVERSE:
break;
case FLAG_SELECTIVE:
break;
case FLAG_REVERSE|FLAG_SELECTIVE:
break;
}
if (r == idn_buffer_overflow) {
/*
* Conversion is not successful because
* the size of the target buffer is not enough.
* Double the size and retry.
*/
/* oops. allocation failed. */
return (idn_nomemory);
}
} else {
break;
}
}
return (r);
}
static char *options[] = {
"-in INPUT-CODESET : specifies input codeset name.",
"-i INPUT-CODESET : synonym for -in",
"-out OUTPUT-CODESET : specifies output codeset name.",
"-o OUTPUT-CODESET : synonym for -out",
"-conf CONF-FILE : specifies idnkit configuration file.",
"-c CONF-FILE : synonym for -conf",
"-noconf : do not load idnkit configuration file.",
"-C : synonym for -noconf",
"-reverse : specifies reverse conversion.",
" (i.e. IDN encoding to local encoding)",
"-r : synonym for -reverse",
"-nameprep VERSION : specifies version name of NAMEPREP.",
"-n VERSION : synonym for -nameprep",
"-nonameprep : do not perform NAMEPREP.",
"-N : synonym for -nonameprep",
"-localmap MAPPING : specifies local mapping.",
"-nolocalmap : do not perform local mapping.",
"-L : synonym for -nolocalmap",
"-nounassigncheck : do not perform unassigned codepoint check.",
"-U : synonym for -nounassigncheck",
"-nobidicheck : do not perform bidirectional text check.",
"-B : synonym for -nobidicheck",
"-nolengthcheck : do not check label length.",
"-noasciicheck : do not check ASCII range characters.",
"-A : synonym for -noasciicheck",
"-noroundtripcheck : do not perform round trip check.",
"-delimiter U+XXXX : specifies local delimiter code point.",
"-alias alias-file : specifies codeset alias file.",
"-a : synonym for -alias",
"-flush : line-buffering mode.",
"-whole : convert the whole region instead of",
" regions containing non-ascii characters.",
"-w : synonym for -whole",
"-version : print version number, then exit.",
"-v : synonym for -version",
"",
" The following options can be specified multiple times",
" -localmap, -delimiter",
NULL,
};
static void
print_version() {
"library version: %s\n",
exit(0);
}
static void
int i;
exit(1);
}
static unsigned long
get_ucs(const char *p) {
unsigned long v;
char *end;
/* Skip optional 'U+' */
p += 2;
if (*end != '\0') {
exit(1);
}
return v;
}