door_call関数は、doorディスクリプタdが示すサーバ関数を呼び出す。また、その関数はparamsに指定された引数が与えられる。なお、paransにNULLが指定された場合には、引数も戻り値も存在しないものと見なす。
引数はdoor_arg_t構造体の、data_ptrとdesc_ptrに指定されたバッファのデータが使用される。data_sizeにはdata_ptrのバッファ長(バイト数)を指定すること。desc_numにはdesc_ptrのバッファにあるディスクリプタの個数を指定すること。
door_arg_t構造体の全てのメンバは、door_callから制御が返ってきた時には、更新されている可能性がある。また、rbufにはdoor呼び出しの戻り値が書き込まれる。
door_arg_t構造体のdata_ptrとdesc_ptrには、rbufに書き込まれた戻り値の位置が記録される(door_callから制御が返ってきた時には、data_ptrには「rbuf内のどこに"バイト列"の戻り値が記録されているか」が書き込まれ、desc_ptrには「rbuf内のどこに"ディスクリプタ"の戻り値が記録されているか」が書き込まれる)。data_sizeとdesc_numには、戻り値のデータ長とディスクリプタの個数が書き込まれる。
door_call関数は、引数の入力と出力とで同じバッファを使用することができる。そのため、data_ptrとdesc_ptrに、rbufのバッファをポイントさせていても問題ない。
もし、doorの戻り値のサイズがrsizeに指定された値より大きくなった場合は、システムは呼び出し元のメモリ領域内に、自動的に新しいバッファを割り当て、rbufとrsizeの値を更新する。なおその場合、バッファが不要になったら、呼び出し元でmunmap(rbuf, rsize)を呼び出して、メモリ領域を開放する必要がある。
クライアントは、ディスクリプタをdoor_desc構造体に設定することで、サーバ側にディスクリプタを渡すことができる。そのときクライアントは、d_attributesにディスクリプタの属性を設定する必要がある。属性は複数個を組み合わせて指定することできる。なお現在は、DOOR_DESCRIPTOR属性を持つディスクリプタだけをサポートしている。また、DOOR_RELEASEを指定することで、ディスクリプタがサーバに渡された時に、クライアント側のディスクリプタが自動的に閉じられるようにすることも出来る。なお、door_call関数に渡したディスクリプタは、door_call関数がEFAULTとEBADF以外の理由で失敗した場合には、自動的に閉じられる。
door_desc_t構造体は次のように定義される。
typedef struct {
door_attr_t d_attributes; /* 属性 */
union {
struct {
int d_descriptor; /* ディスクリプタ */
door_id_t d_id; /* 一意なdoorID */
} d_desc;
} d_data;
} door_desc_t;
ディスクリプタが渡された、或いは返された時には、新規のディスクリプタがターゲットのアドレス空間で構築され、ターゲットのd_descriptorメンバは新しいディスクリプタの値に更新される。更に、システムは各doorごとシステム全体での一意な値を生成して、d_idメンバにその値を書き込み、d_attributesメンバに次に様な属性を設定する。
| DOOR_LOCAL |
受け取ったdoorはdoor_createによってこのプロセスで生成された物である。 |
| DOOR_PRIVATE |
受け取ったdoorは、サーバスレッドのプライベートプールを持っている。 |
| DOOR_UNREF |
受け取ったdoorは参照されなくなった時に通知されることを期待している。 |
| DOOR_UNREF_MULTI |
DOOR_UNREFに似ている。この場合は、同じdoorに対して、参照されなくなった時の通知が複数回あることを期待している。 |
| DOOR_REFUSE_DESC |
このdoorはディスクリプタの引数を受け付けない。 |
| DOOR_REVOKED |
受け取ったdoorはサーバによって無効化されている。 |
door_call関数はrestartableなシステムコールではない。door_call関数を処理しているスレッドでシグナルを受信した時には、関数は失敗し、errnoにEINTRを設定する。door処理はidempotentでないため、door_call処理中に生成される可能性のある全てのシグナルをマスクするべきである。door_callの処理中にクライアントがアボートした場合、サーバスレッドはPOSIXスレッドのcancellationメカニズムによって通知される。
door_createから返されたディスクリプタには、close-on-exec(FD_CLOEXEC) フラグが付けられている。
doorに関する情報は、door_info関数によって全てのクライアントから参照することが出来る。そのため、セキュリティ性が求められるアプリケーションでは、door_info関数によってアクセス可能なdoor情報に、セキュアな情報を記録してはいけない。特に、cookieにはセキュアな情報を記録してはいけない。