総合手引 | セクション 3 | English | オプション |
#include <radlib.h>
RADIUS への要求を出す前に、ライブラリはコンタクト可能なサーバを 確認しなければなりません。ライブラリの設定をする最も簡単な方法は rad_config() を呼び出すことです。 rad_config() によって、ライブラリは radius.conf(5) でフォーマットが定義されているコンフィギュレーションファイルを読み込みます。 コンフィギュレーションファイルのパス名は引数 file として rad_config() へ渡されます。この引数には NULL が 指定されてもかまいません。その場合は標準コンフィギュレーションファイル /etc/radius.conf が使われます。 rad_config() は、正常終了時には 0 を返し、エラー終了時には -1 を返します。
ライブラリは rad_add_server() を呼び出すことによって、決まった手順で 設定することもできます。パラメータ host パラメータは、サーバホストを指定し、 完全なドメイン名 (FQDN) でも、またはドット区切りの四つの数字でテキスト形式 で書かれた IP アドレスのどちらで指定してもかまいません。 パラメータ port は、サーバに接続するときの UDP ポート番号を指定します。 port の指定が 0 のとき、ライブラリはネットワークサービスデータベースの ‘radius/udp’ または ‘radacct/udp’ サービスを検索し、見つかったポートを使用します。 エントリが見つからないときには、ライブラリは標準 RADIUS ポート、 すなわち認証には 1812 をアカウンティングには 1813 を使用します。 サーバホストに関する共有シークレット情報は、 パラメータ secret として渡されます。パラメータは NUL で終了するどんな文字列もかまいません。 RADIUS プロトコルでは、共有 シークレット情報の 128 バイトより後は無視されます。サーバからの受信 タイムアウトは、パラメータ timeout により、秒の単位で渡されます。要求をあきらめるまでの 最大繰り返し回数は、パラメータ max_tries で渡されます。 rad_add_server() は 正常終了のときは 0 を返し、エラーが発生したときは -1 を返します。
rad_add_server() は、複数回呼び出しが可能で、 rad_config() と共に使用することができます。 サーバは、10 個まで指定できます。複数サーバが 指定された場合、正しい応答が得られるか、またはサーバの max_tries 制限に達するまで、ラウンドロビン方式で呼び出しを試みます。
rad_create_request() により要求が生成された後、属性を付加することができます。これは、 rad_put_addr(), rad_put_int(), rad_put_string() 呼び出しにより行われます。これらは、属性を決めるパラメータ type や、インターネットアドレス値、整数値、 NUL で終了する文字列を、それぞれに受け取ります。
ライブラリには、関数 rad_put_attr() も備わっているので、未加工で解釈できない属性も 与えることができます。引数 data は、バイト配列の先頭のポインタで、 引数 len は、その長さを指定します。
関数 rad_put_X() は、正常終了時には 0 返し、エラー発生時には -1 を返します。
関数 rad_send_request() は、要求を送信し、必要ならば定義されたサーバに対して ラウンドロビン方式で接続を試み、正しい応答がを待ちます。 正しい応答があった場合、 rad_send_request() は応答のタイプを指定する RADIUS コードを返します。 戻り値は、一般に RAD_ACCESS_ACCEPT, RAD_ACCESS_REJECT, RAD_ACCESS_CHALLENGE です。正しくない応答を受信したとき、 rad_send_request() は -1 を返します。
応答待ちをブロックしたくない場合は、代わりに rad_init_send_request() および rad_continue_send_request() を使えます。 RADIUS サーバからの返答を受信するか、 またはタイムアウトになった場合、これらの関数は rad_send_request() の項で挙げた値を返します。それ以外では、ゼロが返され、 fd および tv での指す値が select(2) に渡されるディスクリプタとタイムアウトに設定されます。
rad_init_send_request() は最初に呼び出す必要があり、続いて、戻り値が 0 でなくなるまで rad_continue_send_request() 呼び出しを繰り返します。 それぞれの呼び出しの間に、アプリケーションは、 select(2) を呼び出す必要があり、その際 *fd を読み出しディスクリプタとして渡し、 tv で定義される時間経過の後、タイムアウトします。 select から制御が戻ったとき、 select(2) でディスクリプタが読み出し可能である場合は、引数 selected に 0 でない値を設定して rad_continue_send_request() を呼び出す必要があります。
RADIUS への要求と同じように、各応答は 0 または、 それ以上の属性を持っています。応答が rad_send_request() または rad_continue_send_request() により正常に受信された後、属性は rad_get_attr() によって、1 つずつ取り出すことができます。 rad_get_attr() 呼び出しが呼ばれるたびに、現在の応答から次の属性を 取得し、参照パラメータ data および len を介して、データへのポインタとデータ長をそれぞれ保管します。 データは応答それ自身の中に存在し、 変更してはいけないということに注意して下さい。 rad_get_attr() 呼び出しは、正常終了すると RADIUS 属性タイプを返します。 現在の応答内に属性が無くなると
rad_get_attr() は 0 を返します。不正な属性のようなエラーが検出されると、 -1 を返します。
属性の共通タイプは、 rad_cvt_addr(), rad_cvt_int(), rad_cvt_string() によりデコードすることができます。これらの関数は、 rad_get_attr() により取得される属性データへのポインタを受け取ります。 rad_cvt_string() の 場合は、 len で長さも指定する必要があります。これらの関数は、属性を インターネットアドレスや整数値、文字列などとして解釈し、得られた値を 戻り値として返します。 rad_cvt_string() はメモリを動的に割り当て、 NULL で終了した文字列を返します。アプリケーションは、不要な文字列を free(3) を使って解放しなければなりません。
十分な仮想メモリがない場合、 rad_cvt_string() は NULL を返します。 rad_cvt_addr() および rad_cvt_int() がエラー終了することはありません。
rad_add_server() | |
rad_config() | |
rad_create_request() | |
rad_get_attr() | |
rad_put_addr() | |
rad_put_attr() | |
rad_put_int() | |
rad_put_string() | |
rad_init_send_request() | |
rad_continue_send_request() | |
rad_send_request() | |
以下の関数は、処理が正常に終了した時、 NULL でないポインタを返します。 十分な仮想メモリの割り当てができないとき、 NULL を返しますが、 エラーメッセージは記録されません。
rad_acct_open() | |
rad_auth_open() | |
rad_cvt_string() | |
RFC 2138, Remote Authentication Dial In User Service (RADIUS),
,RFC 2139, RADIUS Accounting,
,LIBRADIUS (3) | October 30, 1999 |
総合手引 | セクション 3 | English | オプション |
このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.