入り口に戻る

原文はこちら。

翻訳にあたって、オープンソースグループ・ジャパンの MIT ライセンスと ISC ライセンスの訳を参考にした。

# X Transport Interface(日本語訳)

## X Consortium Standard

### Stuart Anderson

NCR Corporation

### Ralph Mor

X Consortium

### Alan Coopersmith

Oracle Corp.

X Version 11, Release 7.7

Version 0.7

Copyright © 1993, 1994 NCR Corporation - Dayton, Ohio, USA

All Rights Reserved

Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name NCR not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. NCR makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty.

NCR DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL NCR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

(訳)

(本ソフトウェアとその文書を使用、複製、および頒布することは、目的を問わず無償で許可する。但し、上記の著作権表示を全ての複製に記載しなければならず、且つ同著作権表示と本許諾表示を附属文書に記載しなければならず、且つ NCR の名称は、事前の書面による特別な承認を得ずに、本ソフトウェアの頒布に関する宣伝や広告に使用してはならない。NCR は、本ソフトウェアのいかなる目的への適切性についても、何ら表明を行わない。本ソフトウェアは「現状有姿」で、明示または暗黙の保証もなく提供される。)

(NCR は、本ソフトウェアに関するあらゆる保証を拒否するものとする。ここでいう保証には、販売可能性および適合性に関するあらゆる黙示的な保証も含まれる。いかなる場合も、本ソフトウェアの使用または動作に起因または関連して生ずる使用不能損失、データの損失または利益の損失(これらの損失が契約に沿った行為によって生じたか、過失または他の不法行為によって生じたかは問わない)を原因とするあらゆる特別、間接、または派生的な損害について、NCR は一切の責任を負わない。)

(訳註：「〜AND FITNESS, IN NO EVENT〜」のカンマは、ピリオドの間違いだと思われる。ネット上のテンプレートによる。参考URL:https://spdx.org/licenses/HPND.html)

Copyright © 1993, 1994, 2002 The Open Group

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group.

X Window System is a trademark of The Open Group, Inc.

(訳)

(本ソフトウェアおよび関連する文書のファイル（以下「ソフトウェア」）の複製を取得した全ての人物に対し、以下の条件に従うことを前提に、ソフトウェアを無制限に扱うことを無償で許可する。これには、ソフトウェアの複製を使用、複製、改変、結合、公開、頒布、再許諾、および/または販売する権利、およびソフトウェアを提供する人物に同様の行為を許可する権利が含まれるが、これらに限定されない。)

(上記の著作権表示および本許諾表示を、ソフトウェアの全ての複製または実質的な部分に記載するものとする。)

(ソフトウェアは「現状有姿」で提供され、明示的であるか黙示的であるかを問わず、いかなる種類の保証も行われない。ここでいう保証には、商品性、特定目的への適合性、および権利の非侵害性に関する保証も含まれるが、これらに限定されるものではない。THE OPEN GROUP は、ソフトウェアまたはソフトウェアの使用もしくはその他に取り扱いに起因または関連して生じるいかなる請求、損害賠償、その他の責任(これらの請求、損害賠償、責任が契約に沿った行為によって生じたか、不法行為またはその他の行為によって生じたかは問わない)について、一切の責任を負わない。)

(The Open Group の名称は、この表示に記載されている場合を除き、The Open Group の事前の書面による承認を得ずに、宣伝であろうとその他の形であろうと、ソフトウェアの販売を促進するもの、またはソフトウェアの使用その他の扱いを奨励するものに使用してはならない。)

(X Window System は The Open Group, Inc の商標である。)

## The X Transport Interface

X Transport Interface は、Stuart Anderson (NCR) が Ralph Mor (X Consortium) の助力を得て設計したものである。

### 註記

本文書の記述は、X11R6 の実装と完全に一致するものではない(これは最近行われたコードの変更が原因である)。具体的に言えば、フォント・サーバを複製(cloning：訳註：訳語要確認：具体的にはどのような動作のことか？)するための機能が追加され、クライアント対サーバのコードの条件分岐が複雑になった(原文：compliation：訳註：「compilation」か「complication」か、クライアント対サーバのコードに生じたものを要確認。クライアント対サーバのコードにおいて条件分岐の整理が行われた？)

## 第１章　意図と目標

(訳註：「トランスポート」(transport)とは、？？？要確認)

X Transport Interface は、各システム特有のコードと各トランスポート特有のコード全てをソース・ツリー(source tree)の１箇所に集めるために作成されたものである。X ウィンドウ・システムの全てのライブラリ、全てのクライアント及び全てのサーバがこの API を使用する。この API を使用することで、新しい種類のトランスポートを追加することが可能となり、また、ソース・コードの中の X Transport Interface のコードの部分以外の箇所に如何なる変更をも加えることなく新たなプラットフォームに対応することができるようになる。

このインターフェイスによって、`#ifdef TRANSPORT` と `#ifdef PLATFORM` の宣言文が繰り返し登場する問題を解決する。この宣言文は、ソース・ツリーの至るところにバラ撒かれていた。

このインターフェイスは、全ての種類のプロトコルに対応するのに不足の無い機能を提供する。ここでいうプロトコルには、X11 や FS (訳註：X Font Service Protocol？Font Server？要確認)のような接続指向のプロトコル、及び XDMCP (訳註：X Display Manager Control Protocol)のような無接続指向のプロトコル(connection-less oriented protocol)が含まれる。

## 第２章　このインターフェイスの概要

このインターフェイスは、アプリケーションが使用する API を提供するものである。この API の関数は、全てのトランスポートと全てのシステムに共通の仕事を行う。例えば、アドレスを解析してホストとポート番号に分解する作業などである。また、この API の関数は、特別な表(table)に記載されている各トランスポート特有の関数を呼び出す。この表の中身はコンパイル時に定まる。この表には、トランスポートのそれぞれの型に対応するエントリ(entry)が記載されている。各エントリは、そのトランスポートのインターフェイスとして機能する関数へのポインタを持つ(大抵の場合ポインタである)レコード(record：１件のデータ構造)である。

この API は、`select()` 及び `poll()` を抽象化した関数(abstraction)は提供しない。この２つの関数はもともと伝送制御方式(transport)に依存するところが無く、２つの関数に代わる新たなインターフェイスは必要無いからである。また、そのようなインターフェイス(抽象化された関数)が実行効率に与える影響も不明である。

## 第３章　アドレス記述書式の定義

アドレスは次の構文を用いて記述する。

    protocol/host:port

構文中の `protocol` は、プロトコル・ファミリ(プロトコルの種類)あるいはプロトコル・ファミリの別名(alias)を表す。周知のプロトコル・ファミリの定義を後の章に記す。

構文中の `host` の部分は、Network Service Access Point (NSAP) として解釈できるホストの名前、あるいは同様に解釈できる伝送制御方式(transport)依存の実体(entity)の名前を表す。

構文中の `port` の部分は、Transport Service Access Point (TSAP) の名前を表す。TSAP の書式は、その基礎となる伝送制御方式(transport)の実装によって定まるが、アドレスの一部を成す場合には文字列形式を使って表現される。

## 第４章　内部のデータ構造体

主要なデータ構造体が２つ存在する。この２つのデータ構造体は、このインターフェイスの、伝送制御方式(transport)から独立している部分に関連するものである。これ以外の追加のデータ構造体が各トランスポート(transport：訳註：伝送制御サービス？)の内部で使用されることもある。

## Xtransport

トランスポートの表(table)の中には、利用可能なトランスポートそれぞれのエントリが１つづつ存在する。トランスポートの表とは Xtransport レコード(record)の配列のことである。各レコードには、単一のトランスポートの全エントリ・ポイントが含まれている。このレコードの定義は次の通り。

    typedef struct _Xtransport {

        char *TransName;
        int  flags;

        XtransConnInfo (*OpenCOTSClient)(
         struct _Xtransport *,     /* transport */
         char     *,     /* protocol */
         char     *,     /* host */
         char     *      /* port */
        );

        XtransConnInfo (*OpenCOTSServer)(
         struct _Xtransport *,     /* transport */
         char *,     /* protocol */
         char *,     /* host */
         char *      /* port */
        );

        XtransConnInfo (*OpenCLTSClient)(
         struct _Xtransport *,     /* transport */
         char *,               /* protocol */
         char *,               /* host */
         char *               /* port */
        );

        XtransConnInfo (*OpenCLTSServer)(
         struct _Xtransport *,   /* transport */
         char *,     /* protocol */
         char *,     /* host */
         char *     /* port */
        );

        int     (*SetOption)(
         XtransConnInfo,          /* connection */
         int,               /* option */
         int               /* arg */
        );

        int     (*CreateListener)(
         XtransConnInfo,          /* connection */
         char *,               /* port */
         int               /* flags */
        );

        int     (*ResetListener)(
         XtransConnInfo          /* connection */
        );

        XtransConnInfo (*Accept)(
         XtransConnInfo          /* connection */
        );

        int     (*Connect)(
         XtransConnInfo,          /* connection */
         char *,               /* host */
         char *               /* port */
        );

        int     (*BytesReadable)(
         XtransConnInfo,          /* connection */
         BytesReadable_t *     /* pend */
        );

        int     (*Read)(
         XtransConnInfo,          /* connection */
         char *,               /* buf */
         int               /* size */
        );

        int     (*Write)(
         XtransConnInfo,          /* connection */
         char *,               /* buf */
         int               /* size */
        );

        int     (*Readv)(
         XtransConnInfo,          /* connection */
         struct iovec *,          /* buf */
         int               /* size */
        );

        int     (*Writev)(
         XtransConnInfo,          /* connection */
         struct iovec *,          /* buf */
         int               /* size */
        );

        int     (*Disconnect)(
         XtransConnInfo          /* connection */
        );

        int     (*Close)(
         XtransConnInfo          /* connection */
        );

    } Xtransport;

`flags` フィールドには、以下のマスクを組み合わせて OR 演算したものが入る。

TRANS_ALIAS | このフラグは、このレコードが別名を提供するものであり、同レコードを使って待受口(listener)を作成すべきでないことを示す。
TRANS_LOCAL | このフラグは、これが LOCALCONN トランスポートであることを示す。
TRANS_ABSTRACT | このフラグは、ローカル接続トランスポートが抽象ソケット名前空間を使用することを示す。

`flags` フィールドには、実行中のライブラリによって上記のもの以外のフラグが設定されることがあり得る。

TRANS_DISABLED | このフラグは、このトランスポートが無効化されてしまっていることを示す。
TRANS_NOLISTEN | このフラグは、サーバがこのトランスポートを使って新たな待受口(listener)を開かないようにするべきであることを示す。
TRANS_NOUNLINK | このフラグは、トランスポート・バックエンドによって設定されるものであり(訳註：transport backendとは？要確認)、同トランスポートの接続の端点(endpoint)を切断しないようにするべきであることを表す。

## XtransConnInfo

それぞれの接続には、当該接続に対して割り当てられた不透明な XtransConnInfo トランスポート接続オブジェクトが存在する。このレコード(record)には、同接続固有の情報が含まれている。このレコードの定義は次の通り。

    typedef struct _XtransConnInfo *XtransConnInfo;

    struct _XtransConnInfo {
        struct _Xtransport     *transptr;
        char     *priv;
        int          flags;
        int          fd;
        int          family;
        char     *addr;
        int          addrlen;
        char     *peeraddr;
        int          peeraddrlen;
    };

## 第５章　伝送制御方式(transport)に依存しない公開 API

この API を使用するライブラリとサーバはいづれも、この API を内部に取り込まなければならない。ライブラリはこの API を使用することができるけれども、この API はそのようなライブラリの公開 API には加わらない。このインターフェイスは、単に実装の手助けをする存在にすぎない。この API は次の２つのものから成る。即ち、低水準の核となる関数(primitive)一式と、それらの関数を基にして作られた少数のユーティリティ関数とから成る。このユーティリティ関数は、既存のコードを移植するのに使用することができる、より親しみやすいインターフェイスを提供するために存在する。

TRANS(func) の部分を書き換えるためのマクロが Xtrans.h に定義されている。TRANS(func) は、コードがコンパイルされた状況に応じて、適切な関数名を作成するものである。例えば、Xlib のために構築された場合、TRANS(OpenCOTSClient) は `_X11TransOpenCOTSClient` となる。

この API の関数の蹉跌・失敗は全て「致命的なもの」として扱われ、当該接続は、一度閉じた上で再度確立されるべきである(再確立の要望があれば)。しかしながら、大抵の場合、デバッグのために errno の値を利用することができるであろう。

## 核となるインターフェイス API

(訳註：COTS：Connection Oriented Transport Service、CLTS：Connection-Less Transport Service)

- XtransConnInfo TRANS(OpenCOTSClient)(char *address)

  この関数は、クライアントによる使用に適した接続指向のトランスポート(Connection-Oriented Transport)を作成するものである。引数 `address` には、この端点(endpoint)が接続されることになるサーバの完全アドレス(full address)を入れる。この関数は、成功すれば不透明なトランスポート接続オブジェクトを返し、失敗すれば NULL を返す。

- XtransConnInfo TRANS(OpenCOTSServer)(char *address)

  この関数は、サーバによる使用に適した接続指向のトランスポート(Connection-Oriented Transport)を作成するものである。引数 `address` には、このサーバと結び付くことになる完全アドレスを入れる。この関数は、成功すれば不透明なトランスポート接続オブジェクトを返し、失敗すれば NULL を返す。

- XtransConnInfo TRANS(OpenCLTSClient)(char *address)

  この関数は、クライアントによる使用に適した、接続を持たないトランスポート(Connection-Less Transport) を作成するものである。引数 `address` には、この端点(endpoint)が接続されることになるサーバの完全アドレスを入れる。この関数は、成功すれば不透明なトランスポート接続オブジェクトを返し、失敗すれば NULL を返す。

- XtransConnInfo TRANS(OpenCLTSServer)(char *address)

  この関数は、サーバによる使用に適した、接続を持たないトランスポート(Connection-Less Transport) を作成するものである。引数 `address` には、このサーバと結び付くことになる完全アドレスを入れる。この関数は、成功すれば不透明なトランスポート接続オブジェクトを返し、失敗すれば NULL を返す。

- int TRANS(SetOption)(XtransConnInfo connection, int option, int arg)

  この関数は、トランスポートのオプションを設定するものであり、`setsockopt()` 及び `ioctl()` と同様の働きをする。引数 `connection` には、関数 _XTransOpen*() で取得した端点(endpoint)を指定する。引数 `option` には、設定するべきオプションを入れる。オプションの実際の値の定義は後の章に記す。引数 `arg` は、オプションによっては必要になることがある追加の値を渡すために使用する。この関数は、成功すれば 0 を返し、失敗すれば -1 を返す。

  ### 註記

  現在の用法を基に考えると、反対の関数 `TRANS(GetOption)` は不要である。

- int TRANS(CreateListener)(XtransConnInfo connection, char *port, int flags)

  この関数は、サーバ端点(server endpoint)に設定を施して同サーバ端点が待ち受け(listening)を行うようにするものである。引数 `connection` には、`TRANS(OpenCOTSServer)()` もしくは `TRANS(OpenCLTSServer)()` で取得した端点(endpoint)を指定する。引数 `port` には、待ち受けのためにこの端点に結び付けられるポート(port)を指定する。port が NULL である場合、トランスポートは、利用可能な TSAP の中の任意のものをこの接続に割り当てることができる。トランスポートがこの機能に対応していない場合、この関数は「失敗」(failure)を返すことになる。引数 `flags` に ADDR_IN_USE_ALLOWED を指定すると、内包されている(underlying)結び付けの関数(binding function)の呼び出しがエラー EADDRINUSE で蹉跌することを許容できるようになり、これによって関数 `TRANS(CreateListener)` 自体が蹉跌するのを避けることができる(訳註：TRANS(CreateListener)()は、内部でbind()を呼び出す：X11R7.7/lib/xtrans-1.2.7/Xtranssock.c)。この関数は、成功すれば 0 を返し、失敗すれば -1 を返す。

- int TRANS(ResetListener)(XtransConnInfo connection)

  サーバが再起動した場合、ある種の待ち受けポートをリセットする必要が生じうる。例えば unix domain では、通信に使っているファイルが削除されてしまっていないか確認する必要があり、削除されている場合、再び作成しなければならない。引数 `connection` には、`TRANS(OpenCOTSServer)()` によって取得・開設されている端点(endpoint)であって、且つ `TRANS(CreateListener)()` に渡されて結び付け(bind)もされているものを指定する。この関数は次の値のいづれかを返す：TRANS_RESET_NOOP、TRANS_RESET_NEW_FD、または TRANS_RESET_FAILURE。

- XtransConnInfo TRANS(Accept)(XtransConnInfo connection)

  一度ある接続の徴を受け取った後は、同接続を受け入れるためにこの関数を呼び出すことができるようになる。引数 `connection` には、 `TRANS(OpenCOTSServer)()` によって取得・開設されている端点(endpoint)であって、且つ `TRANS(CreateListener)()` に渡されて結び付け(bind)もされているものを指定する。この関数は、成功すれば新たに不透明なトランスポート接続オブジェクトを返し、さもなければ NULL を返す。

- int TRANS(Connect)(XtransConnInfo connection, char *address)

  この関数は、サーバに対する「接続」を作成するものである。引数 `connection` には、`TRANS(OpenCOTSClient)()` で取得した端点(endpoint)を指定する。引数 `address` には、この端点を接続するべき TSAP を指定する。address の中にプロトコル(を表す文字列)が含まれている場合、それらは無視される。この関数は、成功すれば 0 を返し、失敗すれば -1 を返す。

- int TRANS(BytesReadable)(XtransConnInfo connection, BytesReadable_t *pend);

  この関数は、マクロ BytesReadable と同じ機能を提供する。

- int TRANS(Read)(XtransConnInfo connection, char *buf, int size)

  この関数は、要求されたバイト数の分だけ COTS 接続から読み込みを行うか、または、「要求されたバイト数」と「到着するパケットのサイズ」の２つの中の小さい方のバイト数の分だけ CLTS 接続から読み込みを行うものである。(訳註：原文の「return」は「read」の間違いだと判断した。)

- int TRANS(Write)(XtransConnInfo connection, char *buf, int size)

  この関数は、要求されたバイト数だけ COTS 接続に対して書き込みを行うか、または size で要求されたサイズのパケットを CLTS 接続へ送信する。

- int TRANS(Readv)(XtransConnInfo connection, struct iovec *buf, int size)

  `TRANS(Read)()` と同様である。

- int TRANS(Writev)(XtransConnInfo connection, struct iovec *buf, int size)

  `TRANS(Write)()` と同様である。

- int TRANS(Disconnect)(XtransConnInfo connection)

  この関数は、秩序立った形で接続を切断する(orderly disconnect)のが望ましいときに使用するものである。この関数は、トランスポート上の指定した接続を破壊する。ソケットの関数の `shutdown()` と同様のものである。

- int TRANS(Close)(XtransConnInfo connection)

  この関数は、トランスポートを閉じ、同トランスポートとアドレスとの結び付きを解除し(unbind)、同トランスポートに結び付けられていた全ての資源を解放するものである。引数 connection で指定された接続に対して `TRANS(Disconnect)` の呼び出しが行われていなかった場合、秩序立っていない形で切断が行われる可能性がある。

- int TRANS(IsLocal)(XtransConnInfo connection)

  (指定された connection が) ローカルのトランスポートであれば TRUE を返す。

- int TRANS(GetMyAddr)(XtransConnInfo connection, int *familyp, int *addrlenp, Xtransaddr **addrp)

  この関数は、`getsockname()` と同様のものである。この関数ではアドレスを格納する領域の割り当てが行われるので、この関数を呼び出した者は同領域を解放しなければならない。接続が確立されるまでは、全てのトランスポートが有効なアドレスを持つわけではない。`Connect()` もしくは `Accept()` によって接続が確立されるまでは、この関数を使わないようにするべきである。

- int TRANS(GetPeerAddr)(XtransConnInfo connection, int *familyp, int *addrlenp, Xtransaddr **addrp)

  この関数は、`getpeername()` と同様のものである。この関数ではアドレスを格納する領域の割り当てが行われるので、この関数を呼び出した者は同領域を解放しなければならない。接続が確立されるまでは、全てのトランスポートが有効なアドレスを持つわけではない。`Connect()` もしくは `Accept()` によって接続が確立されるまでは、この関数を使わないようにするべきである。

- int TRANS(GetConnectionNumber)(XtransConnInfo connection)

  このトランスポートと結び付いているファイル記述子(file descriptor)を返す。

- int TRANS(MakeAllCOTSServerListeners)(char *port, int *partial_ret, int *count_ret, XtransConnInfo **connections_ret)

  大抵のサーバはこの関数を用いることになる。この関数は、トランスポートの表に並んでいるトランスポートそれぞれに対して、COTS のサーバ端点(server endpoint)の作成を試みる。表にあるトランスポートの中の一部のネットワーク(partial network)しか作成できなかった場合、`partial_ret` には True が設定される。`count_ret` には、返ってきたトランスポートの数が入る。`connections_ret` には、トランスポートのリスト(配列)が入る。

- int TRANS(MakeAllCLTSServerListeners)( char *port, int *partial_ret, int *count_ret, XtransConnInfo **connections_ret)

  大抵のサーバはこの関数を用いることになる。この関数は、トランスポートの表に並んでいるトランスポートそれぞれに対して、CLTS のサーバ端点(server endpoint)の作成を試みる。表にあるトランスポートの中の一部のネットワーク(partial network)しか作成できなかった場合、`partial_ret` には True が設定される。`count_ret` には、返ってきたトランスポートの数が入る。`connections_ret` には、トランスポートのリスト(配列)が入る。

## ユーティリティ API

この節では、核となるインターフェイス API を基にして作られた有用な関数について述べる。こうした関数は、利便性を考えて用意してあるものである。

- int TRANS(ConvertAddress)(int *familyp, int *addrlenp, Xtransaddr *addrp)

  この関数は、sockaddr 形式(ソケット式)のアドレスを X 認証形式のアドレスへと変換するものである(即ち、AF_INET、AF_UNIX を X プロトコルの定義(即ち FamilyInternet、FamilyLocal)へ変換するものである)。

## 第６章　トランスポートのオプションの定義

関数 `TRANS(SetOption)()` で指定できるオプションとして、以下のものが定義されている。OS あるいはトランスポートがこれらのオプションに対応していない場合、OS は指定されたオプションを黙って無視することになる。

- TRANS_NONBLOCKING

  このオプションによって接続の「停止モード」(blocking mode)を操作する。引数に 1 が指定された場合、接続は「停止」(blocking)に設定される。引数に 0 が指定された場合、接続は「非停止」(non-blocking)に設定される。

- TRANS_CLOSEONEXEC

  このオプションは、exec が発生した時に接続に何が起きるのかを定めるものである。この引数に 1 が指定された場合、exec が起きたときは、接続は閉じることになる。この引数に 0 が指定された場合、exec が起きたときは、接続は閉じないことになる。

## 第７章　伝送制御方式(transport)に依存する非公開 API

伝送制御方式に依存する非公開関数は、Xtransport レコードの中に置かれる。この関数群は、伝送制御方式に依存しない公開 API とよく似ているが、引数と戻り値の中のあるものが若干異なっている。`#ifdef SUNSYSV` のようなものは、この関数群の内部で処理するべきである。

- XtransConnInfo *OpenCOTSClient ( struct _Xtransport *thistrans, char *protocol, char *host, char *port)

  この関数は、接続指向のトランスポート(Connection-Oriented Transport)を作成するものである。引数 `thistrans` は、トランスポートの表(transport table)の中の Xtransport エントリ１つを指す。引数 `protocol`、`host`、及び `port` は、`TRANS(OpenCOTSClient)()` で指定されたアドレスの中の各引数に対応する部分を入れた文字列を指す。この関数は、この関数の戻り値となる XtransConnInfo 構造体の中身の領域を確保して(allocate)、中身を初期化しなければならない。この関数はトランスポートを開設し、必要であれば同トランスポートをトランスポート名前空間へ結び付ける(bind)。XtransConnInfo 構造体のローカル・アドレス(local address)の部分(訳註：どこか？要確認)も、この関数によって書き込まれる。

- XtransConnInfo *OpenCOTSServer ( struct _Xtransport *thistrans, char *protocol, char *host, char *port)

  この関数は、接続指向のトランスポート(Connection-Oriented Transport)を作成するものである。引数 `thistrans` は、トランスポートの表(transport table)の中の Xtransport エントリ１つを指す。引数 `protocol`、`host`、及び `port` は、`TRANS(OpenCOTSServer)()` で指定されたアドレスの中の各引数に対応する部分を入れた文字列を指す(訳註：原文は「`TRANS(OpenCOTSClient)()`」)。この関数は、この関数の戻り値となる XtransConnInfo 構造体の中身の領域を割り当てて(allocate)、中身を初期化しなければならない。この関数はトランスポートを開設する。

- XtransConnInfo *OpenCLTSClient ( struct _Xtransport *thistrans, char *protocol, char *host, char *port)

  この関数は、接続を持たないトランスポート(Connection-Less Transport)を作成するものである。引数 `thistrans` は、トランスポートの表(transport table)の中の Xtransport エントリ１つを指す。引数 `protocol`、`host`、及び `port` は、`TRANS(OpenCLTSClient)()` で指定されたアドレスの中の各引数に対応する部分を入れた文字列を指す(訳註：原文は「`TRANS(OpenCOTSClient)()`」)。この関数は、この関数の戻り値となる XtransConnInfo 構造体の中身の領域を割り当てて(allocate)、中身を初期化しなければならない。この関数はトランスポートを開設し、必要であれば同トランスポートをトランスポート名前空間へ結び付ける。XtransConnInfo 構造体のローカル・アドレス(local address)の部分も、この関数によって書き込まれる。

- XtransConnInfo *OpenCLTSServer ( struct _Xtransport *thistrans, char *protocol, char *host, char *port)

  この関数は、接続を持たないトランスポート(Connection-Less Transport)を作成するものである。引数 `thistrans` は、トランスポートの表(transport table)の中の Xtransport エントリ１つを指す。引数 `protocol`、`host`、及び `port` は、`TRANS(OpenCLTSServer)()` で指定されたアドレスの中の各引数に対応する部分を入れた文字列を指す(訳註：原文は「`TRANS(OpenCOTSClient)()`」)。この関数は、この関数の戻り値となる XtransConnInfo 構造体の中身の領域を割り当てて(allocate)、中身を初期化しなければならない。この関数はトランスポートを開設する。

- int SetOption (struct _Xtransport *thistrans, int option, int arg)

  この関数は、X Transport Interface で定義されたオプションを伝送制御方式(transport)に依存する形で実装するためのものである。現在の試作実装においては、この関数は使われていない。なぜかというと、今のところ、定義されたオプションは全て伝送制御方式に依存しないものだからである。この関数を使う必要性が生じるのは、根本的に異なる種類の伝送制御方式が加わった場合や、伝送制御方式依存のオプションが定義された場合である。

- int CreateListener (struct _Xtransport *thistrans, char *port, int flags)

  この関数は、サーバのために開設されたトランスポート端点(transport endpoint)を引数に取り、送られて来る接続リクエストを待ち受けるよう同トランスポート端点に設定を施すものである。引数 `port` には、Open の関数(トランスポート開設の関数)で指定したアドレスのポートを表す部分を入れる。内部で使用されるトランスポート端点がすでにアドレスと結び付けられている可能性があり、且つそうであったとしてもそれをエラーと見做さないようにするべきである場合、引数 `flags` には ADDR_IN_USE_ALLOWED を指定するものとする。そうでない場合、flags には 0 を指定する。上記の指定は IPv6 のコードで使用される。IPv6 のコードでは、同一のソケットが IPv6 のアドレスと IPv4 のアドレスの両方に結び付けられている可能性がある。この関数は、XtransConnInfo 構造体のローカル・アドレス(local address)の部分を記入し、必要であれば指定されたトランスポートをトランスポート名前空間へ結び付ける。こうして、トランスポート端点は、送られて来る接続リクエストを待ち受ける状態へと移行することになる。

- int ResetListener (struct _Xtransport *thistrans)

  この関数は、トランスポートをリセットして適切に待受けを行うように設定するものである。

- XtransConnInfo Accept(struct _Xtransport *thistrans)

  この関数は、送られて来た接続リクエストを受けて、新たなトランスポート端点(transport endpoint)を作成するものである。引数 `thistrans` には、サーバが待ち受けのために開設した端点を入れる。新たな端点は、開設され、トランスポートの名前空間へ結び付けられる。新たな端点を表す XtransConnInfo 構造体がこの関数から返ってくる。

- int Connect(struct _Xtransport *thistrans, char *host, char *port)

  この関数は、サーバへの接続を確立するものである。引数 `host` 及び `port` には、接続確立の相手となるべきサーバを表す。接続が確立されると、`Read()` と `Write()` の呼び出しが可能になる。

- int BytesReadable(struct _Xtransport *thistrans, BytesReadable_t *pend)

  この関数は、マクロ `BytesReadable()` に代わるものである。この関数のおかげで各トランスポートは、どれだけのデータが読み込める状態になっているのかを判断するための独自の仕組みを持てるようになった。

- int Read(struct _Xtransport *thistrans, char *buf, int size)

  この関数は、接続から buf へ size で指定されたバイト数だけ読み込みを行うものである。

- int Write(struct _Xtransport *thistrans, char *buf, int size)

  この関数は、buf から接続へ size で指定されたバイト数だけ書き込みを行うものである。

- int Readv(struct _Xtransport *thistrans, struct iovec *buf, int size)

  この関数は、接続に対して `readv()` と同様の操作を行うものである。

- int Writev(struct _Xtransport *thistrans, struct iovec *buf, int size)

  この関数は、接続に対して `writev()` と同様の操作を行うものである。

- int Disconnect(struct _Xtransport *thistrans)

  この関数は、接続の秩序立った閉鎖(orderly shutdown)の作業を開始するものである。トランスポートが秩序立った切断と秩序立っていない切断とを区別しない場合、この関数の呼び出しは何ら影響を及ぼさない。

- int Close(struct _Xtransport *thistrans)

  この関数は、接続を破壊し、端点を閉鎖(close)する。

## 第８章　環境設定

伝送制御方式それぞれの実装は環境(platform)ごとに異なるものとなる。TCPCONN、UNIXCONN、LOCALCONN、及び STREAMSCONN のような既存の接続の型(訳註：#define によって宣言された型)の代わりに、利用可能なトランスポートの型(のそれぞれ)を表すフラグ(訳註：フラグによる指定)を使用するのが望ましい。

X11R6 においては、トランスポートの型(のそれぞれ)を利用可能にする下記のフラグは、設定ファイル `vendor.cf` もしくは `site.def` の中の ConnectionFlags で設定されていた。

X11R7 モジュールの公開版においては、これらのフラグは `configure` スクリプトの実行時に設定されることになった。この `configure` スクリプトには、`xtrans.m4` からマクロ `XTRANS_CONNECTION_FLAGS` が取り込まれている。

`#define` | configure のフラグ | 説明
--- | --- | ---
TCPCONN | `--enable-tcp-transport` | INET (IPv4) ドメイン・ソケット(INET (IPv4) Domain Socket)に基くトランスポートを利用可能にする。
IPv6 | `--enable-ipv6` | TCPCONN を拡張して IPv6 ソケットに基くトランスポートを利用可能にする。
UNIXCONN | `--enable-unix-transport` | UNIX ドメイン・ソケット(UNIX Domain Socket)に基くトランスポートを利用可能にする。
STREAMSCONN | X11R7 では利用できない。 | TLI (訳註：Transport Layer Interface)に基くトランスポートを利用可能にする。
LOCALCONN | `--enable-local-transport` | SYSV ローカル接続トランスポートを利用可能にする。
DNETCONN | X11R7 では利用できない。 | DECnet のトランスポートを利用可能にする。

## 第９章　各トランスポートのアドレス構成要素の定義

プロトコル・ファミリ(プロトコルの種類) | アドレスの構成要素
--- | ---
protocol | host | port
Internet | inet inet6 tcp udp | インターネットのホスト(アドレス指定可能なもの)の名前 | サービスの名前もしくは有効なポート番号が入った文字列。例えば「xserver0」「7100」
DECnet | decnet | DECnet のホスト(アドレス指定可能なもの)の名前 | オブジェクトの完全名(complete name)が入った文字列。例えば「X$X0」
NETware | ipx | NETware のホスト(アドレス指定可能なもの)の名前 | 詳細はまだ明らかでない。
OSI | osi | OSI のホスト(アドレス指定可能なもの)の名前。 | 詳細はまだ明らかでない。
Local | local pts named sco isc | (無視される) | ポート名の入った文字列、例えば「xserver0」「fontserver0」。

## 第１０章　実装について

この章では、本文書と並行して開発されている試作実装について述べる。本仕様書の開発を進める中で、この試作実装によって細かな点や問題の多くが洗い出されてきた。

X11R6 においては、このインターフェイスのソース・コードは全て `xc/lib/xtrans` に置かれていた。

X11R7 においては、このインターフェイスのソース・コードは全て X.Org が提供するモジュール・パッケージ `lib/libxtrans` 経由で届けられることになった。そして、このソース・コードは、他のモジュール群を構築(build)する時にそれらのモジュール群がこのインターフェイスのソース・コードを発見できるように、``${prefix}`/X11/Xtrans` にインストールされることになった。

ソース・コード内の関数名は全て `TRANS(func)()` という書式で書かれている。マクロ `TRANS()` は次のように定義されている。

    #if (__STDC__ && !defined(UNIXCPP)) || defined(ANSICPP)
    #define TRANS(func) _PROTOCOLTrans##func
    #else
    #define TRANS(func) _PROTOCOLTrans/**/func
    #endif

PROTOCOL の部分は、このコードがコンパイルされるディレクトリごとに独自に定義されることになる。定義の結果として PROTOCOL には、ライブラリやサーバが実装するプロトコルの名前が入る。例えば、X11、FS、ICE などである。

X Transport Interface を使用するライブラリとサーバは全て、``TRANSPORT`trans.c` という名前の新しいファイルを持つ。このファイルには、`configure` スクリプトが提供する構成フラグに基いて、各種のトランスポートを取り込むことになる(訳註：#include するという意味。参考：X11R7.7/lib/libICE-1.0.8/src/icetrans.c)。以下に挙げるのは、フォント・サーバのための `xfstrans.c` の例である。

    #include "config.h"

    #define FONT_t 1
    #define TRANS_REOPEN 1
    #define TRANS_SERVER 1

    #include <X11/Xtrans/transport.c>

以下にこのインターフェイスのためのソース・ファイルの一覧表を載せる。

`Xtrans.h` | 「伝送制御方式に依存しない API」の関数の型宣言(prototype)と定義がある。
`Xtransint.h` | インターフェイスの実装においてのみ使用される。内部のデータ構造が入っている。
`Xtranssock.c` | 「伝送制御方式に依存する API」のソケットによる実装である。
`Xtranstli.c` | 「伝送制御方式に依存する API」の TLI (Transport Layer Interface)による実装である。
`Xtransdnet.c` | 「伝送制御方式に依存する API」の DECnet による実装である。
`Xtranslocal.c` | SYSV ローカル接続のための「伝送制御方式に依存する API」の実装である。(訳註：ファイル名：X11R7.7/lib/xtrans-1.2.7/Xtranslcl.c)
`Xtrans.c` | 伝送制御方式に依存しない公開 API の関数がある。
`Xtransutil.c` | X Transport Interface を使用するユーティリティ関数を集めてある。

ファイル `Xtransint.h` には、かつて `Xlibint.h` や `Xlibnet.h` の中にあった、トランスポート関連のコードの大部分が含まれている。これによって、トランスポートのユーザの全てが同コードの定義を利用できるようになる。また、これによって、他のライブラリの中の同等なコードも不要なものになる。

入り口に戻る