client configuration specification

# クライアント設定ファイル

- 概要
- サーバエンコーディングエントリ
- サーバ ZLD エントリ
- 正規化エントリ
- 代替エンコーディングエントリ
- エンコーディングエイリアスエントリ
- ローカルコードセット
- コンフィギュレーションファイル記述例

## 概要

クライアント設定ファイルは、多言語ドメイン名のための各種の設定が 記述されているファイルで、mDNkit を使用して多言語化 (国際化) したクライアント側のリゾルバが読み込むファイルです。 このファイルは MDN ライブラリの resconf モジュール によって読み込まれ、 多言語ドメインに関する以下のような設定ができます。

- DNS プロトコル上のドメイン名のエンコーディング
- 正規化形式
- DNS の返答メッセージ中のドメイン名がローカルエンコーディングに 変換できなかった時に使用される、代替エンコーディング
- エンコーディング名のエイリアス

このファイルは通常のテキストファイルで、ファイルの各行 (# で始まるコメント行と、空行を除いて) は、 次のような単純なフォーマットで構成されます。

>     キーワード 値...

クライアント設定ファイルは、mDNkit をデフォルトの設定でコンパイルした 場合には以下に配置されます。

>     /usr/local/etc/mdnres.conf

以降、各キーワードごとに設定内容を記述します。

## サーバエンコーディングエントリ

DNS プロトコル上の多言語ドメイン名のエンコーディングとして使用する エンコーディング (コードセット名) を指定します。

[構文]
  `server-encoding` encoding

encoding には、使用するエンコーディング名を記述し、 次のものが指定できます。

- UTF-8
- RACE
- UTF-5
- iconv_open() ライブラリ関数で許可されているコードセット名 (使用できるコードセット名については、iconv() のドキュメントを 御覧ください)
- 後述のエイリアスファイルで定義されたエイリアス名 (「エンコーディングエイリアス」 の項を御覧ください)

このエントリは必須エントリであり、必ず記述しなければなりません。

## サーバ ZLD エントリ

DNS プロトコル上で使用される多言語ドメイン名のエンコーディング (server-encoding エントリで指定されたもの) の中には、多言語ドメイン名と従来の ASCII ドメイン名とを区別するために ZLD (zero-level domain) というドメインを必要とするものがあります。 ZLD は通常のトップレベルドメインのさらに上位ドメインに相当します。 ただしこれは DNS のシステム内部でのみ使われるドメインであり、 一般ユーザやアプリケーションからは見えないようになっています。

[構文]
  `server-zld` ZLD

mDNkit のデフォルトの設定では、ZLD は使用できないようになっており、 設定ファイル中にこのエントリがあると警告メッセージが表示されます。 このエントリの指定を有効にするには、mDNkit の configure 実行時に `--enable-zld` オプションによって ZLD サポートを有効にしておく 必要があります。

## 正規化エントリ

正規化エントリでは、DNS サーバに送る前にドメイン名に適用すべき 正規化の方式を指定します。

[構文]
  `normalize` scheme [scheme..]

scheme には、正規化形式を記述します。 以下のものが記述できます。

`ascii-lowercase`
  ASCII 大文字を小文字に変換
`ascii-uppercase`
  ASCII 小文字を大文字に変換
`unicode-lowercase`
  Unicode Technical Report #21: Case Mappings に基づいて、Unicode 大文字を小文字に変換
`unicode-uppercase`
  Unicode Technical Report #21: Case Mappings に基づいて、Unicode 小文字を大文字に変換
`unicode-form-c`
  Unicode Technical Report #15: Unicode Normalization Forms の「Form C」による正規化
`unicode-form-kc`
  Unicode Technical Report #15: Unicode Normalization Forms の「Form KC」による正規化
`ja-fullwidth`
  日本語半角カナを全角カナに変換
`ja-minus-hack`
  日本語の全角マイナス記号(−)をハイフン(`-`)に変換
`ja-delimiter-hack`
  日本語の句点(。)および全角ピリオド(．)をピリオド(`.`)に変換

正規化形式には複数の形式が指定可能です。複数の形式が指定された場合、 順序通りに (左から右に) 適用されます。

## 代替エンコーディングエントリ

mDNkit で多言語化されたリゾルバライブラリは、 アプリケーションが使用しているローカルコードセットを自動的に決定し、 DNS の応答メッセージ中のドメイン名を、そのコードセットに変換しようとします。 しかし、ドメイン名に使用されているある文字がローカルコードセットに マップされていないために、変換に失敗することもあり得ます。 例えば日本語コードセットを使用している日本語のアプリケーションが、 日本語の文字セットに含まれていない中国語の文字を含んだ DNS 応答を受信したような時にこのようなことが起こります。

代替エンコーディングエントリは、上記のような問題が生じた時に ローカルコードセットの代わりに使用するコードセットを指定します。

[構文]
  `alternate-encoding` encoding

encoding はコードセット名で、RACE のような ASCII 互換エンコーディング を使用しなければなりません。

## エンコーディングエイリアスエントリ

エンコーディングエイリアスエントリでは、コードセット名のエイリアスを 記述したファイルのパス名を記述します。

[構文]
  `alias-file` pathname

pathname には、エイリアスファイルへのパス名を指定します。 このエイリアスファイルは通常のテキストファイルで、 以下のような形式の行から構成されます。

>     alias-name name

alias-name は定義されるエイリアス名で、name は 実際のコードセット名か、定義済のエイリアス名です。

## ローカルコードセット

クライアント設定ファイルにはローカルコードセットを指定するエントリは 存在しません。 ローカルコードセットはアプリケーションがそのときに使用している ロケールの情報から決定されるからです。 ですから、それぞれのアプリケーションがそれぞれ異なるローカルコードセットを 使用することができますし、同一アプリケーションが複数のローカルコードセットを 切り替えながら使用することも可能です。

mDNkit はロケール情報からアプリケーションの使用しているローカルコードセットを 推測しようとしますが、時には失敗することもあります。 例えば、C ロケールで動作しているにも関わらず 非 ASCII コードセットを使用しているアプリケーションではロケール情報から ローカルコードセットを判定することは不可能ですし、mDNkit が知らない ロケールで動作するアプリケーションの場合にも推測に失敗するでしょう。

このような場合のために、環境変数 `MDN_LOCAL_CODESET` によって アプリケーションのローカルコードセットを強制指定することができるように なっています。 この変数にコードセット名 (もしくはそのエイリアス名) を指定すると、mDNkit はロケールの設定に関わらず、指定したコードセットを ローカルコードセットとして動作します。

## コンフィギュレーションファイル記述例

以下に、コンフィギュレーションファイルの記述例を示します。

>     #
>     # a sample configuration.
>     #

>     # DNS プロトコル上のエンコーディングとして RACE を使用する
>     server-encoding RACE

>     # 正規化の手順として、小文字に変換した後、KC 正規化法を使用する
>     normalize unicode-lowercase unicode-form-kc

>     # 代替エンコーディングとして RACE を使用する
>     alternate-encoding RACE