多数の CAM ライブラリ関数が cam_device 構造体を使用します。
struct cam_device { char device_path[MAXPATHLEN+1];/* * ユーザが指定した * デバイスのパス名。 * ユーザがデバイス名 * とユニット番号を * 別々に記述すると * これは NULL に * なることがあります。 */ char given_dev_name[DEV_IDLEN+1];/* * ユーザが指定した * デバイス名。 */ u_int32_t given_unit_number; /* * ユーザが指定した * ユニット番号。 */ char device_name[DEV_IDLEN+1];/* * デバイス名。 * たとえば 'pass' */ u_int32_t dev_unit_num; /* この特定のデバイスに * 対応する通過デバイスの * ユニット番号。 */ char sim_name[SIM_IDLEN+1];/* * コントローラ名。 * たとえば 'ahc' */ u_int32_t sim_unit_number; /* コントローラユニット番号 */ u_int32_t bus_id; /* コントローラバス番号 */ lun_id_t target_lun; /* 論理ユニット番号 */ target_id_t target_id; /* ターゲット ID */ path_id_t path_id; /* システム SCSI バス番号 */ u_int16_t pd_type; /* 周辺装置のタイプ */ struct scsi_inquiry_data inq_data; /* SCSI 照会データ */ u_int8_t serial_num[252]; /* デバイスシリアル番号 */ u_int8_t serial_num_len; /* シリアル番号の長さ */ u_int8_t sync_period; /* 調整された同期周期 */ u_int8_t sync_offset; /* 調整された同期オフセット */ u_int8_t bus_width; /* 調整されたバス幅 */ int fd; /* デバイスのファイル記述子 */ };
Fn cam_open_device は、引数として、開こうとしているデバイスを記述する文字列、 および open(2) に渡すのに適切な flags を取ります。 渡される「パス」は、 実際には、開くデバイス名とユニット番号が入った任意のタイプの 文字列です。 文字列は Fn cam_get_device によって解釈されて、 デバイス名とユニット番号になります。デバイス名とユニット番号が 決定されると、ルックアップが実行されて、指定のデバイスに対応する通過 デバイスを決定します。 Fn cam_open_device は使用法はかなり簡単ですが、 現実には一般的な使用に適していません。動作が必ずしも 決定的ではないからです。新しいアプリケーションを作成しているプログラマは、 以下に説明する他のオープンルーチンの 1 つを使用するようにしてください。
Fn cam_open_spec_device は、渡されたデバイス名とユニット番号に対応する pass(4) デバイスを開きます。 flags は、 open(2) に渡すのに適切なフラグである 必要があります。 device 引数はオプションです。 ユーザは、 cam_device 構造体に 割り振り済みの空間を指定できます。 device 引数が NULL の場合、 Fn cam_open_spec_device は、 malloc(3) を使用して cam_device 構造体用の空間を 割り振ります。
Fn cam_open_btl は、 Fn cam_open_spec_device に類似していますが、引数として、 デバイス名とユニット番号の代わりに SCSI バス、ターゲット、および論理 ユニットを取る点が異なります。 path_id 引数は、 SCSI バス番号の CAM の 同等のものです。これはシステム内の論理バス番号を表します。 flags は、 open(2) に渡すのに適切なフラグである必要があります。 Fn cam_open_spec_device と同じように、 Fa device 引数はオプションです。
Fn cam_open_pass は、引数として、開く pass(4) デバイスの Fa path を取ります。 変換もルックアップも行われないので、 渡されるパスは CAM pass(4) デバイスの パスでなければなりません。 Fa flags は、 open(2) に渡すのに適したフラグである 必要があります。 Fa device 引数は、ユーザが CAM ライブラリに cam_device 構造体用の空間を割り振りさせたい場合は、 Fn cam_open_spec_device および Fn cam_open_btl と同じように、 NULL である必要があります。 Fn cam_close_device は、上記の open() 呼び出しの 1 つが割り振った cam_device 構造体を解放し、通過デバイスへのファイル記述子を閉じます。 ユーザが cam_device 構造体用の空間を割り振っている場合は、このルーチンを呼び 出してはなりません。 代わりに、ユーザは Fn cam_close_spec_device を呼び出すべきです。
Fn cam_close_spec_device は、上記の open() ルーチンの 1 つで開かれた ファイル記述子を閉じるだけです。この関数は、 cam_device が CAM ライブラリ ではなく、呼び出し元によって割り振られたときに呼び出す必要があります。
Fn cam_getccb は、 malloc(3) を使用して CCB を割り振り、 cam_device 構造の値を使用して CCB ヘッダ内にフィールドを設定します。
Fn cam_send_ccb は、指定の ccb を、 cam_device 構造体内で記述された Fa device に 送信します。
Fn cam_freeccb は、 Fn cam_getccb が割り振った CCB を解放します。
Fn cam_path_string は、引数として、 cam_device 構造体、および長さが Fa len のストリングを取ります。 この関数は、カーネルが使用するのと類似した、コロンで 終了する印刷接頭語ストリングを作成します。 たとえば、"(cd0:ahc1:0:4:0): " です。 Fn cam_path_string は、多くとも Fa len Ns -1 キャラクタを str に設定します。 Fa len 番めのキャラクタは、終了を示す `\0' です。
Fn cam_device_dup は、 strdup(3) と同じように方法で動作します。 cam_device 構造体用に空間を割り当て、渡された Fa device 構造体の内容を、新たに割り振られた 構造体にコピーします。
Fn cam_device_copy は Fa src 構造体を Fa dst にコピーします。
Fn cam_get_device は、デバイス名にユニット番号が続いたストリングの入った Fa path 引数を取ります。次に、ストリングをデバイス名とユニット名に分解し、 それぞれ Fa dev_name と Fa unit に戻します。 Fn cam_get_device は、少なくとも次の 形式のストリングを処理できます。
Fn cam_get_device は、 Fn cam_open_device に類似した機能を準備する必要がある アプリケーション用の便利な関数として備えられています。プログラマは、 可能であれば、デバイス名とユニット番号を得るもっと決定的な方式を 使用することをお勧めします。
Fn cam_getccb は、割り振り済みで部分的に初期化済みの CCB を返します。また、 CCB の割り振りが処理失敗した場合は NULL を返します。
Fn cam_send_ccb は、エラーが発生した場合、値 -1 を返し、 errno がエラーを 示すように設定されます。
Fn cam_path_string は、便宜として記入された印刷接頭語を返します。これは、 Fn cam_path_string に渡されるのと同じ Fa str です。
Fn cam_device_dup は、渡された device のコピーを返します。または、エラーが 発生した場合は NULL を返します。
Fn cam_get_device は、処理成功の場合は 0 を返し、 処理失敗を示す場合は -1 を返します。
ここで説明した基本 CAM ライブラリ関数の 1 つから エラーが返された場合は、 エラーの理由が一般にグローバルストリング cam_errbuf に印刷されます。 これの長さは CAM_ERRBUF_SIZE キャラクタです。
おそらく関数には名前が不適切なものや、名前が不十分なものがあります。