ONC+ 開発ガイド

ポートモニターの使用

RPC サーバーは、inetdlisten のようなポートモニターから起動できます。ポートモニターは、要求が来ているかどうか監視し、要求が来ればそれに応じてサーバーを生成します。生成されたサーバープロセスには、要求を受信したファイル記述子 0 が渡されます。inetd の場合、サーバーは処理を終えるとすぐに終了するか、次の要求がくる場合に備えて指定された時間だけ待ってから終了します。 付録 F 「SAF を使用したポートモニタープログラムの作成」も参照してください。

listen の場合は常に新たなプロセスが生成されるため、サーバーは応答を返したらすぐに終了しなければなりません。次に示す関数呼び出しでは、ポートモニターから起動されるサービスで使用する SVCXPRT ハンドルが作成されます。

transp = svc_tli_create(0, nconf, (struct t_bind *)NULL, 0, 0)

ここで、nconf は要求を受信したトランスポートの netconfig 構造体です。

サービスはポートモニターによりすでに rpcbind で登録されているので、登録する必要はありません。ただし、次のように svc_reg() を呼び出してサービス手続きを登録する必要があります。

svc_reg(transp, PROGNUM, VERSNUM, dispatch,(struct netconfig *)NULL)

ここでは netconfig 構造体として NULL を渡し、svc_reg()rpcbind を呼び出してサービスを登録しないようにしています。

接続型トランスポートの場合は、次のルーチンにより下位レベルインタフェースが提供されます。

transp = svc_fd_create(0, recvsize, sendsize);

最初の引数ではファイル記述子 0 を指定します。recvsizesendsize には、適当なバッファサイズを指定できます。どちらの引数も 0 とすると、システムのデフォルト値が使用されます。自分で監視を行わないアプリケーションサーバーの場合は、svc_fd_create() を使用します。

inetd の使用

/etc/inet/inetd.conf のエントリ形式は、ソケットサービス、TLI サービス、RPC サービスによってそれぞれ異なります。RPC サービスの場合の inetd.conf のエントリ形式は次のようになります。

表 5–3 RPC inetdサービス

サービス 

説明 

rpc_prog/vers

RPC プログラム名に / とバージョン番号 (またはバージョン番号の範囲) を付けたもの 

endpoint_type

dgram (非接続型ソケット)、stream (接続型ソケット)、tli (TLI 端点) のどれか

proto

* (サポートされているトランスポートすべてを意味する)、nettype、netid のどれか。または、nettype と netid をコンマで区切ったリスト  

flags

wait または nowait のどちらか

user

有効な passwd データベースに存在しているユーザー

pathname

サーバーデーモンへのフルパス名 

args

デーモンの呼び出し時に渡される引数 

次に、エントリの例を示します。

rquotad/1 tli rpc/udp wait root /usr/lib/nfs/rquotad rquotad

詳細については、inetd.conf(4) のマニュアルページを参照してください。

リスナーの使用

次に示すように pmadm を使用して RPC サービスを追加します。


pmadm -a -p pm_tag -s  svctag -i id -v vers  \
 
	-m `nlsadmin -c command -D -R prog:vers`

次に、コマンド行引数を示します。

-a

サービスの追加

-p pm_tag

サービスへのアクセスを提供するポートモニターに結合したタグの指定

-s svctag

サーバーの ID コード

-i id

サービス svctag に割り当てられた /etc/passwd 内のユーザー名

-v ver

ポートモニターのデータベースファイルのバージョン番号

-m

サービスを呼び出す nlsadmin コマンドを指定。nlsadmin コマンドには引数を渡すことができます。たとえば、rusersd という名前のリモートプログラムサーバーのバージョン 1 を追加する場合は、pmadm コマンドは次のようになります。


# pmadm -a -p tcp -s rusers -i root -v 4 \
 
-m `nlsadmin -c /usr/sbin/rpc.ruserd -D -R 100002:1`

このコマンドでは、root パーミッションが指定され、listener データベースファイルのバージョン 4 でインストールされ、TCP トランスポート上で使用可能になります。pmadm の引数やオプションは複雑であるため、RPC サービスはコマンドスクリプトでもメニューシステムでも追加できます。メニューシステムを使用するには、sysadm ports と入力して、port_services オプションを選択します。

サービスを追加した場合は、その後リスナーを再初期化してサービスを利用可能にしなければなりません。そのためには、次のようにリスナーを一度止めてから再起動します。このとき rpcbind が実行されている必要があります。

# sacadm -k -p pmtag
# sacadm -s -p pmtag

リスナープロセスの設定などについての詳細は、 listen(1M)pmadm(1M)、および sacadm(1M) のマニュアルページを参照してください。 また、『Solaris のシステム管理 (IP サービス)』の「TCP/IP プロトコルがデータ通信を行う方法」も参照してください。