mdnconv


概要

mdnconvはネームサーバの設定ファイル named.conf や ゾーンマスタファイルのためのコードセット (エンコーディング) 変換ツールです。

mdnconvは引数で指定されたファイル、あるいは標準入力からテキストを入力し、 mDNkit の設定ファイル (mdn.conf) やオプションで指定された エンコーディング変換および正規化を実行し、結果を標準出力に書き出します。

具体的な使い方に関しては利用者ガイドの named.conf、 ゾーンマスタファイルの作成の項をご覧ください。

なお、mdnconv は 環境変数 MDN_DISABLE の設定を明示的に無視するため、 MDN_DISABLE が設定されているかどうかにかかわらず、ドメイン名の変換処理を 行います。


起動

mdnconv を起動する際の、コマンド行の形式は次の通りです。

% mdnconv [オプション...] [ファイル名...]


オプション

mdnconvのオプションには、mDNkitの設定ファイル (mdn.conf) のエントリと同じ設定機能を持っているものが多数あります。

設定ファイル内のエントリとオプションの両方を指定している場合、 その設定項目が複数回定義できるもの (例えば nameprep-map エントリとそれに相当する -map オプション) であれば、指 定は両方とも有効になります。正確には、設定ファイルの定義内容がまず設定 され、オプションで指定した内容が追加されます。

また、設定項目が一つしか定義できないもの (例えば idn-encoding とそれに相当する-out オプション) については、両方指定する とオプションの方が優先されます。

mdnconv が認識するオプションは、次の通りです。 よく使われると思われるオプションに関しては、短縮形として1文字のオプション を用意してあります。

-in <in-code>
-i <in-code>
入力テキストのエンコーディングを指定します。 このオプションを指定しなかった場合のデフォルトのエンコーディングは アプリケーションの ローカルエンコーディング になります。 ただし後述する-reverseオプションが指定されている場合には mDNkit 設定ファイルの idn-encoding エントリの設定がデフォルトとなります。
-out <out-code>
-o <out-code>
出力テキストのコードセット名 <out-code> を指定します。 このオプションを指定しなかった場合のデフォルトのエンコーディングは mDNkit 設定ファイルの idn-encoding エントリに指定されたエンコーディングです。 ただし後述する-reverseオプションが指定されている場合には アプリケーションの ローカルエンコーディング がデフォルトとなります。
-conf <path>
-c <path>
mDNkitの設定ファイル (mdn.conf) のパス名を指定します。 オプション -conf-noconf のいずれも指定しな かった場合は、デフォルトの設定ファイルを読み込みます。
-noconf
-C
mDNkitの設定ファイル (mdn.conf) を読み込まないようにします。
-reverse
-r
逆変換を行います。通常、mdnconvはローカルエンコーディングの テキストを読み込み、正規化の後IDNエンコーディングに変換して出力しますが、 このオプションを指定した場合にはIDNエンコーディングのテキストを読み込み、 ローカルエンコーディングに変換して出力するという動作になります。
-nameprep <version>
-n <version>
NAMEPREP のバージョンを指定します。 mDNkit の設定ファイルの nameprepエントリ に相当します。
-nonameprep
-N
NAMEPREP 処理を行いません。 このオプションは -nounassigncheck の効果も合わせ持っています。
-map <scheme>
NAMEPREP のマッピング方式を指定します。 mDNkit の設定ファイルの nameprep-map エントリに相当します。 このオプションは複数回指定することが可能です。
-normalize <scheme>
NAMEPREP のマッピング方式を指定します。 mDNkit の設定ファイルの nameprep-normalize エントリに相当します。 このオプションは複数回指定することが可能です。
-prohibit <set>
NAMEPREP の禁止文字検査における禁止文字を指定します。 mDNkit の設定ファイルの nameprep-prohibit エントリに相当します。 このオプションは複数回指定することが可能です。
-unassigned <set>
NAMEPREP の未割り当て文字検査における未割り当て文字を指定します。 mDNkit の設定ファイルの nameprep-unassigned エントリに相当します。 このオプションは複数回指定することが可能ですが、-nonameprep もしくは -nounassigncheck が指定されたときは無視されます。
-nounassigncheck
-U
NAMEPREP の未割り当て文字検査を行わないようにします。
-delimiter <codepoint>
ピリオド (`.') 以外にドメイン名の区切りと見なしたい 文字を指定します。 mDNkit の設定ファイルの delimiter-map エントリに相当します。 このオプションは複数回指定することが可能ですが、-reverse オプションが指定されたとき、あるいは-delimitermap が指定 されなかったときは無視されます。
-localmap <map>
NAMEPREP とは別に行う、ローカルなマッピングの方式を指定します。 mDNkit の設定ファイルの local-map エントリで、トップレベルドメイン `.' に対するマッピング を指定することに相当します。 このオプションは複数回指定することが可能ですが、-reverse オプションが指定されたとき、あるいは-nolocalmap が指定 されたときは無視されます。
-nolocalmap
-L
ローカルなマッピングを行いません。 -reverseオプションが指定されたときは無視されます。
-delimitermap
-d
ピリオド (`.') 以外の文字を、ピリオドにマッピングし ます。このオプションを指定しなければ、通常このマッピングは行いません。 -reverseオプションが指定されたときは、無視されます。
-whole
-w
正規化とターゲットコードセットへの変換を 入力されたテキスト全体に対して行います。このオプションを指定しなければ 非ASCII文字を含むドメイン名だと判断された部分のみが変換対象となります。
-alias path
-a path
エンコーディング名の別名を定義します。 mDNkit の設定ファイルの encoding-alias-file エントリに相当します。
-flush
行ごとに出力をフラッシュします。mdnconv はファイルやパイプへの 出力の場合、通常は複数行のデータをまとめて書き出しますが、この オプションを指定すると1行ごとに変換結果を書き出します。 通常はこのオプションを指定する必要はありませんが、 mdnconv をフィルタプログラムとして他のプログラムから利用する場合などに 便利なことがあります。
-version
-v
バージョン情報を表示して実行を終了します。 mdnconv のバージョンと、ライブラリ (libmdn) のバージョンを表示します。 両者は通常同一のはずですが、共有ライブラリを使っている場合には 違っていることがあるかもしれません。

変換処理 (順方向) の詳細

mdnconv の順方向変換 (-reverse オプション無指定時の動作) では、入力データに対して一行ずつ次のような処理が行われます。

  1. ファイルあるいは標準入力からテキストを1行読み込みます。
  2. 行末の改行コードを取り除きます。 これは -whole オプションをつけて mdnconv を実行し、かつ 出力エンコーディングが Punycode や RACE など ASCII 互換 エンコーディングの場合に、改行コードも Punycode や RACE で エンコードされてしまい、改行がなくなってしまうのを避けるためです。
  3. 行を UTF-8 エンコーディングに変換します。 通常は行全体を入力エンコーディングから UTF-8 に変換しますが、 入力コードセットが "RACE" などの ASCII 互換エンコーディング (ACE) で、 かつ -whole オプションが指定されていない場合は、次のような 特別な処理を行います。 これは、入力行中にスペース等の ACE には含まれない文字が入っていると、 変換できずにエラーになってしまうためです。
    1. 行の中から正しい ASCII ドメイン名と解釈できる部分文字列 (つまり 英数字とハイフン、ピリオドだけから構成される部分、ただし先頭は英数字 のみ、末尾はハイフン以外の文字) を取り出します。
    2. それぞれを入力 ACE エンコーディングから UTF-8 に変換してみます。
    3. 変換に成功すればその部分文字列を変換結果で置き換え、 変換に失敗すれば (例えば変換対象文字列がその ACE 特有のプリフィックス やサフィックスを持たない場合) その部分は置き換えず、元の文字列のままと します。
  4. 変換結果が UTF-8 として正しいエンコーディングであるかをチェックします。 本来この処理は不要なはずですが、コード変換の実装にバグがあった場合に早い 段階で検出できるよう、ここでチェックをするようにしてあります。
  5. UTF-8 に変換された行の中から、多言語ドメイン名と推測される部分を 取り出します。-whole オプションが指定されていれば、行全体を 一つのドメイン名とみなして取り出します。指定されていなければ、次の条件に 該当する部分文字列を多言語ドメイン名とみなして、一つずつ取り出します。
  6. 取り出した個々の多言語ドメイン名に対して、設定されている区切り文字を ピリオド (`.') に変換します。 ただし、-delimitermapが指定されている場合、この処理は 飛ばします。
  7. 取り出した個々の多言語ドメイン名に対して、ローカルなマッピングを行います。 ただし、-nolocalmapが指定されている場合、この処理は 飛ばします。
  8. 取り出した個々の多言語ドメイン名に対して、NAMEPREP による正規化 (マッピング、正規化、禁止文字の検査、未割り当てコードポイントの検査) を行います。禁止文字や未割り当てコードポイントが含まれていた場合には、 エラーを出力して処理を中止します。 ただし、-nonameprepが指定されている場合、これらの正規化処理 は一切行わないようにします。また、-nounassigncheck が指定 されている場合は、未割り当てコードポイントの検査だけを行わないようにします。
  9. 取り出した個々の多言語ドメイン名に対して、再度変換結果が UTF-8 として 正しいエンコーディングであるかをチェックします。 本来この処理は不要なはずですが、正規化の実装にバグがあった場合を考えて チェックを入れてあります。
  10. 取り出した多言語ドメイン名を、行の中に埋め戻します。 取り出して UTF-8 に変換した多言語ドメイン名を、行の中に埋め戻します。
  11. 行全体を UTF-8 エンコーディングから -out で指定された出力 エンコーディングに変換します。
  12. 行末の改行コードを付加します。
  13. 行の内容を、変換結果として標準出力に出力します。

逆変換処理の詳細

mdnconv の逆方向変換 (-reverse オプション指定時の動作) では、入力データに対して一行ずつ次のような処理が行われます。

  1. ファイルあるいは標準入力からテキストを1行読み込みます。
  2. 行末の改行コードを取り除きます。
  3. 多言語ドメイン名と推測される部分を取り出します。 入力コードセットが "RACE" などの ASCII 互換エンコーディング (ACE) で、 ないか、-whole オプションが指定されている場合は、行全体 を一つの多言語ドメイン名とみなして取り出します。 それ以外の場合は、行の中から正しい ASCII ドメイン名と解釈できる 部分文字列 (英数字とハイフン、ピリオドだけから構成される部分、ただし 先頭は英数字のみ、末尾はハイフン以外の文字) をすべて探し出します。 そして、見つかった個々の文字列に対して、入力 ACE エンコーディングから UTF-8 への変換を試み、成功すればその文字列を多言語ドメイン名とみなして 取り出します。 このような処理を行うことにより、行の途中に ACE でエンコードされた 文字列が混ざっている場合にもかなり高い確率で正しく多言語ドメイン名を 取り出すことができます。
  4. 取り出した個々の多言語ドメイン名を UTF-8 に変換します。
  5. 取り出した個々の多言語ドメイン名に対して、名前が正しく NAMEPREP で 正規化されているかどうか (マッピング、正規化を行い、禁止文字、 未割り当てコードポイントを含んでいないかどうか) の検査を行います。 正規化されていなかった場合、入力エンコーディングが ACE であれば入力 された文字列に戻し、ACE でなければそのまま次の処理に進みます。 ただし、-nonameprepが指定されている場合、これらの検査は 一切行わないようにします。-nounassigncheckが指定されている 場合は、未割り当てコードポイントの検査だけを行わないようにします。
  6. 取り出した多言語ドメイン名を、行の中に埋め戻します。 取り出して UTF-8 に変換した多言語ドメイン名を、行の中に埋め戻します。
  7. 変換結果が UTF-8 として正しいエンコーディングであるかをチェックします。
  8. 行全体を UTF-8 エンコーディングから -out で指定された 出力エンコーディングに変換します。
  9. 行末の改行コードを付加します。
  10. 行の内容を、変換結果として標準出力に出力します。