| 日本−日本語 |
|
|
|
![]() |
HP-UX リファレンス: セクション 3 : ライブラリ (N~Z) > sstrtoacl(3C)HP-UX 11i Version 2: September 2004 |
|
名称strtoacl(), strtoaclpatt(), aclentrystart[] ― 文字列形式の変換 構文#include <acllib.h> 説明strtoacl() は、厳密なシンボリック (文字列) 表現のアクセス制御リストを構造体形式に変換します。 この関数は、入力文字列を解析し、その妥当性を確認します。 さらに文字列中のエントリーを変更内容として、 すでに存在している ACL に付け加えることもできます。 strtoaclpatt() は、シンボリック (文字列) 表現のアクセス制御リストパターンを構造体形式に変換します。 この関数は、入力文字列を解析し、その妥当性を確認します。 外部配列 aclentrystart[] は、上の 2 つのいずれかのルーチンが次に呼ばれるまで有効で、エラーの報告に用いられます。 以下の「エラー」の項を参照してください。 入力文字列として、「演算子形式」および「ショート形式」の ACL および ACL パターン acl(5) の中で説明されています) が使用できます。 string 中の最初の空白以外の文字が ( ならば、 ACL あるいは ACL パターンの場合はショート形式でなければなりません。 それ以外の場合は演算子形式として解釈されます。 strtoacl() は、変換される文字列を指すポインターと、 ACL エントリーの配列 (acl[]) の先頭の要素を指すポインターが必要です。 この配列は、はじめは nentries で表示される個数 (0 以上) の有効なエントリーを含んでいて、また maxentries で表示される個数までのエントリーを収容することが可能です。 さらに strtoacl() は、 string 中の@ 文字との置換をするために、また acl[] 中の最終的なエントリー数を返すために、 ファイルのユーザー ID fuid) とグループ ID fgid) が必要です。 冗長なエントリー (@ 文字を処理した結果、 同一のユーザー ID とグループ ID となったもの) は 1 つにまとめられ、 acl[] 中には一意なエントリーが、登録された順序で入れられます。 新しいエントリーがあるときは、 acl 配列の最後に付け加えられます。 strtoaclpatt()strtoaclpatt() は、 ACL の代わりに ACL パターンを処理する点が strtoacl() と異なります。 すでに存在している最初の ACL の修正は無意味なので、サポートされていません。 ユーザー ID およびグループ ID がマッチするエントリーを 1 つにまとめることはしません。 各エントリーの入力は、返される配列中の 1 つのエントリーを与えます。 ユーザー ID およびグループ ID に置換される@ 文字 (acl(5) 参照) は、呼び出し時に与えた特定のユーザー名あるいはグループ名ではなく、特別な値 (ACL_FILEOWNER あるいは ACL_FILEGROUP。 これらは <acllib.h> 中で定義されています) に変換されます。 したがって、各ファイルに対して ACL パターンを再解析するために strtoaclpatt() を呼び出す必要はありません。 しかし ACL パターンを ACL と比較する場合は、呼び出し側でこの特別な値を処理しなければなりません。 ユーザー名、グループ名、モード値にワイルドカードが使用できます。 モード値に使用した場合、モード値に使用した部分がないものとして扱われます。 詳しくは acl(5) を参照してください。 strtoaclpatt() は strtoacl() とは異なった構造体を返します。 acl_entry_patt 構造体は、1 つの mode 値ではなく、 onmode および offmode のマスクを持っています。 演算子形式の入力において、演算子は strtoaclpatt() には異なった効果を示します。
2 つのルーチンとも、任意のユーザー ID およびグループ ID を表す % は、それぞれ ACL_NSUSER と ACL_NSGROUP に変換されます。 また strtoaclpatt() では、ユーザー ID およびグループ ID のワイルドカード * は、それぞれ ACL_ANYUSER と ACL_ANYGROUP に変換されます。 これらの値は <acllib.h> の中で定義されています。 エントリーは、 string 中どのような順序でもかまいません。 string は冗長なエントリーを含んでいてもよく、また演算子形式では、 ACL エントリーのモードの修正 (厳密な形式の場合) あるいはモードビットの追加、削除 (パターンの場合) を行う + および - 演算子が冗長になっていてもかまいません。 エントリーおよび修正は、左から右へという順序で適用されます。 推奨される使用法strtoacl() (strtoaclpatt()) を用いて新しい ACL (ACL パターン) 配列を構築するときは、 必要な数の acl[] を定義してください。 これを strtoacl() (strtoaclpatt()) に渡すときには、 nentries に 0 を設定し (strtoacl() の場合だけです)、 maxentries に acl[] の要素数を設定してください。 strtoacl() で、ファイルのすでに存在している ACL を修正する場合は、エントリーの可能な数の最大数 (NACLENTRIES です。 <sys/acl.h> 参照) だけ、 acl[] を定義してください。 ファイルの ACL を読み取るために getacl() (getacl(2) 参照) を呼び出し、またファイルの所有者とグループ ID を得るために stat() (stat(2) 参照) を呼び出します。 そして、 maxentries に NACLENTRIES の値を設定して、現在のエントリー数、現在の ACL、および ID 値を strtoacl() に渡します。 strtoacl() が成功した場合、出力された ACL はすべての冗長部が解消されているため、問題なく setacl() (setacl(2) 参照) に渡すことができます。 ただし、 strtoacl() と strtoaclpatt() はともにユーザー ID とグループ ID の妥当性を確認しないので、これらの値が無効なものである場合、 setacl() は失敗します。 効率化のための技法通常 strtoacl() は、ユーザー名およびグループ名の@ を特定のユーザー ID およびグループ ID の値に置き換え、冗長なエントリーをまとめます。 したがって、 ACL を適用しようとする一連のファイルの各々に stat() および strtoacl() を用いるのが、時間はかかりますが最も簡単な方法です。 string の中に@ 文字がない場合、あるいは単に ACL をもう 1 つの別な ACL と比較する場合 (そして特別な値自体を扱おうとする場合) は、 strtoacl() を 1 回呼び出すだけで十分で、各ファイルに対して stat() を呼び出すのは無意味です。 この動作を行わせる場合、最初に fuid に ACL_FILEOWNER、 fgid に ACL_FILEGROUP を設定して strtoacl() を呼び出してください。 ファイルを特定した fuid と fgid の値を渡して再びこの関数を呼び出す必要があるのは、 acl[] 中の fuid と fgid に特別な値が設定されていて、かつ各ファイルに厳密な ACL を設定する必要があるときだけです。 下の例の項を参照してください。 string の中に@ があり、かつ acl[] を setacl() の呼び出しに使用しようとするときは、 ACL 文字列を解析するために各ファイルに対して strtoacl() を再び呼び出す必要があります。 これは@ で表された名前が特定の ID に置き換えられないため、1 回の実行ではすべての冗長なエントリーが結合されない可能性があるためです。 このことは 2 つの ACL の比較においても同様になります。 その上、演算子形式の入力の演算子の情報は失われてしまうので、呼び出し側で後にエントリーを結合することはできません。 戻り値strtoacl() (strtoaclpatt()) が成功すると、最終的な ACL (ACL パターン) の エントリーの数が返され、その値は常に nentries (0) 以上です。 さらに strtoaclpatt() は、前後に空白を含んでいる可能性のある string の中から解析された、各パターンエントリーの先頭を指すために、グローバル配列 aclentrystart[] に値を設定します。 この時設定されるのは、戻り値より 1 個多いポインターです (決して NACLENTRIES + 1 個を超えません)。 最後の有効な要素は、 string の末尾の null 文字を指します。 strtoaclpatt() を呼び出した後、エントリーパターンの該当する入力文字列は、一時的に string 中の次のエントリーパターンの先頭に null を挿入して、呼び出し側でエラーの報告のために使われます。 エラーエラーが起こった場合、 strtoacl() と strtoaclpatt() は負の値を返し、 acl の内容は不定です (おそらく内容は変化しています)。 この場合エラーの報告をわかりやすくするために、 aclentrystart[0] および aclentrystart[1] はそれぞれ、解析中にエラーが起こったエントリーと次のエントリーの先頭を指すように設定されます。 そのエントリーが ( で始まっていない場合、 aclentrystart[1] は aclentrystart[0] 以後の、次の null 文字あるいはカンマを指します。 それ以外の場合は、次の null、あるいは次の ) に引き続く文字を指します。 エラーの場合に返される値は次のとおりです。
例次のコードの一部は、ACL の文字列を、 ファイルの所有者として 103 という番号を fuid に使い、ファイルのグループとして 45 という番号を fgid に使った、エントリーの配列へ変換します。 #include <acllib.h> 次のコードは、 ../myfile ファイルに対する ACL, fuid, fgid を取得し、 記述文字列を用いて ACL を修正し、さらに ../myfile2 ファイルに対する ACL を新しいバージョンに変更します。 #include <sys/types.h> 次のコードの一部は、 fuid と fgid の特別な値を用いて strtoacl() を呼び出して、それが acl[] 中に現れるかどうかをチェックします。
次のコードの一部は、 文字列中の ACL パターンを、パターンエントリーの配列へ変換します。
for ループ中のコードの一部は、ファイルの ACL (変数名は a* です) のエントリーを、そのファイルのユーザー ID およびグループ ID (変数名は f* です) を使用して、エントリーパターン (変数名は p*, onmask, offmask です) と比較します。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||