ユーティリティはステータス情報の生成と利用の両方を行います。 ただし、 -l (listen モード) オプションを指定した場合は例外で、利用のみ行います。 情報の生成では、定期的に システムに状態を問い合わせ、ステータスメッセージを構築してネットワークに ブロードキャストします。情報の利用では、他の サーバからの状態メッセージを受け取り、検査してから、 /var/rwho ディレクトリの下のファイルに記録します。
次のオプションが使用可能です:
オプションの ttl 引数が -m フラグとともに与えられた時には、 は IP マルチキャストデータグラムを TTL が ttl として、 全てのインタフェースではなく 1 つのインタフェースに対して送ります。 ttl は 0 から 32 (または、MAX_MULTICAST_SCOPE) までの値です。 -m 1 は、 -m とは異なることに注意してください。 -m 1 は、1 つのインタフェースにだけ転送を行います。
-m フラグが、 ttl 引数無しで使われた場合、プログラムはマルチキャスト 報告を全ての マルチキャストが利用可能なインタフェースから受け取ります。 ttl 引数が与えられた場合は、マルチキャストレポートは 1 つのインタフェース からだけ受け取ります。その 1 つは、報告を行っているものです (これは、ホストルーティング表によって制御されます)。 -m オプションに関係なく、プログラムはブロードキャストもしくは ユニキャストによる報告を全てのインタフェースから受け取ります。 したがって、このプログラムは、マルチキャストを使っていない古い から報告を受け取りますが、マルチキャストが使われている場合には古い は このプログラムによって生成される報告を受け取れないことになります。
サーバは、``who'' サービスで指定されているポート番号でメッセージを 送受信します。 services(5) を参照して下さい。送受信するメッセージは以下のような形式です。
struct outmp { char out_line[8]; /* 端末 (tty) 名 */ char out_name[8]; /* ユーザID */ long out_time; /* 時刻 */ }; struct whod { char wd_vers; char wd_type; char wd_fill[2]; int wd_sendtime; int wd_recvtime; char wd_hostname[32]; int wd_loadav[3]; int wd_boottime; struct whoent { struct outmp we_utmp; int we_idle; } wd_we[1024 / sizeof (struct whoent)]; };
すべてのフィールドは、送信に先立ってネットワークバイトオーダに変換されます。 ホスト負荷 (load average) は w(1) によって計算され、送信の 5, 10, 15 分前の負荷を 100 倍した 整数として表現されます。 ホスト名は、 gethostname(3) システムコールで得られたものがドメイン名を省略して格納されます。 メッセージの最後の配列には、メッセージを送信したマシンにログインしている ユーザの情報が格納されています。 この情報は、 utmp(5) の非アイドルの端末ラインのエントリと、その端末ラインから最後に文字を 受け取った時間を秒数で表した値が入っています。
サーバによって受信されるメッセージは、 サーバのポートから送信されたものでないか、 -i オプションが指定されていなければ捨てられます。 さらにメッセージのホストの名前が表示できない ASCII 文字を含んでいる場合も、メッセージは捨てられます。 が受け取った正しいメッセージは /var/rwho ディレクトリに whod.hostname というファイル名で格納されます。 これらのファイルには、最新のメッセージだけが、 上で説明した形式で残っています。
ステータスメッセージはほぼ 3 分ごとに作成されます。 ユーティリティは、30 分ごとに /boot/kernel/kernel に対して nlist(3) を実行します。これは、このファイルがその時点での実際のシステムイメージ であることを確認するためです。