本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP-UX リファレンス: セクション 2 : システムコール > g

getaccess(2)

HP-UX 11i Version 2: September 2004
≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 索引

名称

getaccess ― あるユーザーの、ファイルへの実効アクセス権の取得。

構文

#include <sys/getaccess.h> 
 
int getaccess( 
    const char *path, 
    uid_t uid, 
    int ngroups, 
    const gid_t *gidset, 
    void *label, 
    void *privs 
); 

説明

getaccess() は、存在するファイルへの、あるユーザー ID のアクセス権 (読取り、書込み、実行/探索) を返します。 path はあるファイルへのパス名を指します。呼出しが成功すると、そのファイル に対するあるユーザーの実効アクセス権 (モード) を表わす、0 以上の値を返します。 アクセス権は、ビット (R_OKW_OK、 および X_OK) の 論理 OR として表わされます。これらの値はヘッダー <unistd.h> に定義されています。 0 が返された場合、アクセスが拒否されることを意味します。

uid パラメータはユーザー ID です。 <sys/getaccess.h> に定義されている特別な値は、呼び出したプロセスの実行、リアル、あるいは セーブされたユーザー ID を表わします。

UID_EUID  

実効ユーザー ID

UID_RUID  

リアルユーザー ID

UID_SUID  

セーブされたユーザー ID

ngroupsgidset 中のグループ ID の数で、 NGROUPS_MAX + 1 を超えません (NGROUPS_MAX は <limits.h> で定義されています )。 ngroups パラメータが正のときは、 gidset パラメータはチェックのときに使うグループ ID の値の配列です。 ngroups が認められた負の値であるときは、 gidset は無視されます。 ngroups が <sys/getaccess.h> で定義される特別な負の値であるとき、 プロセスの実効、リアル、およびセーブされたユーザー ID とその補助グループリストのさまざまな組合わせを表わします。

NGROUPS_EGID  

プロセスの有効グループ ID のみを使う

NGROUPS_RGID  

プロセスのリアルグループ ID のみを使う

NGROUPS_SGID  

プロセスのセーブされたグループ ID のみを使う

NGROUPS_SUPP  

プロセスの補助グループのみを使う

NGROUPS_EGID_SUPP
  

プロセスの有効グループ ID と補助グループを使う

NGROUPS_RGID_SUPP
  

プロセスのリアルグループ ID と補助グループを使う

NGROUPS_SGID_SUPP
  

プロセスのセーブされたグループ ID と補助グループを使う

labelprivs パラメータは将来の拡張用のものです。 現在は、これらのパラメータの値は (void *) 0 でなければなりません。

アクセス制御リストのアクセスチェックのルールは acl(5) で述べられています。 これに加えて、 読取り専用ファイルシステム上のファイルや、実行中の テキストを共有したプログラムの W_OK ビットはクリアされます。 access(2) と同様に、 書込みのできるテキストを共有したプログラムの X_OK ビットは消されません。これは書込みのできるファイルがテキストを共有したプログラム であることを知る簡単な方法がないからです。

呼び出したユーザー ID が 0 であるか、あるいは UID_EUIDUID_RUID、 または UID_SUID で ( <sys/getaccess.h> を参照) プロセスの、各々のユーザー ID が 0 のとき、 R_OKW_OK は常にセットされます。ただし、 読取り専用ファイルシステム上のファイルまたは実行中の テキストを共有したプログラムの W_OK がクリアされるときはセットされません。 X_OK がセットされるのは、ファイルが通常のファイルでないか、任意のファイルの ACL エントリーの中の実行ビットがセットされているときであり、かつそのときのみです。

getaccess() は、指定されたユーザー ID に関係なく、まず呼出し側の実効ユーザー ID、 有効グループ ID、 および補助グループリストによって、 path の各ディレクトリ構成要素をチェックします。 呼出し側がそのファイルへのパスを捜せないとき、 「no access allowed」ではないエラーが起きます。 (この場合は、呼出し側で、そのファイルのことを調べても意味がありません)。

access(2) と getaccess(2) の比較

次の表は access()getaccess() のさまざまな性質について比較したものです

access()getaccess()
すべての ACL エントリーをチェックする
(HFS ファイルシステムのみ)
同じ
リアル uid、リアル gid、および
補助グループリストを使う
指定された uid とグループリストを使う;
典型的な値にはマクロが使用可能
あるモードの値をチェックし、
成功か失敗を返す
すべてのモードビットについ
てオンかオフかを返す
呼び出し側の実効 ID を使ってファイル
へのパスをチェックする
同じ
共有テキストファイルが現在
実行中であれば W_OK は偽
同じ
読取り専用ファイルシステム
上のファイルなら W_OK は偽
同じ
現在書き込みでオープンされている
ファイルなら X_OK は変更されない
同じ
スーパーユーザーなら R_OKW_OK
常に真 (上の場合を除く)
同じ
スーパーユーザーなら X_OK は常に真ファイルが普通のファイルでないか、
任意の ACL エントリー中の実行
がセットされていれば、スーパーユーザー
なら X_OK は真

戻り値

getaccess() は正常終了すると、指定されたファイルへの指定されたユーザーのアクセス権を表す負でない 値を返します。 異常終了すると -1 を返し、エラーを示す値が errno にセットされます。

エラー

getaccess() は次の条件のいずれかを満たす場合に異常終了します。

[EACCES] 

path プリフィックスの構成要素が 呼び出した者に対して 探索パーミッションを許していない

[EFAULT] 

path あるいは gidset が、プロセスへ割り当てられたアドレス空間の外を指している。 このエラーの検出の信頼性は実現方法に依存しています。

[EINVAL] 

ngroups が正しくない、つまり、 ngroups が 0 か、認められていない負の値か、あるいは NGROUPS + 1 よりも大きい

[EINVAL] 

gidset が正しくないグループ ID 値を含んでいる

[EINVAL] 

label または privs の値が null ポインタでない

[ELOOP] 

path 名の変換において、シンボリックリンクの数が多過ぎる

[ENAMETOOLONG] 

_POSIX_NO_TRUNC が有効なときに、 指定されたパス名の長さが PATH_MAX バイトを超えたか、パス名の構成要素の長さが NAME_MAX バイトを超えた

[ENOENT] 

その名前のファイルが存在しない (例えば、 path が null か、あるいは path の構成要素が存在しない)

[ENOTDIR] 

path プリフィックスの構成要素がディレクトリでない

[EOPNOTSUPP] 

getaccess() が、リモートファイルのあるタイプではサポートされていない

以下の呼出しでは、ファイル ``test'' への呼出し側の実効アクセス権が 調べられて、ユーザーが読取りアクセスを持っていれば成功します。

#include <unistd.h>
#include <sys/getaccess.h>
int mode;
mode = getaccess ("test", UID_EUID, NGROUPS_EGID_SUPP,
       (int *) 0, (void *) 0, (void *) 0);
if ((mode >= 0) && (mode & R_OK)) ...

以下は、ファイル /tmp/hold へのユーザー ID 23、 グループ ID 109 のアクセス権をテストする方法です。

int gid = 109;
int mode;
mode = getaccess ("/tmp/hold", 23, 1, & gid,
       (void *) 0, (void *) 0);

必要に応じ、以下のコードは、プロセスの有効グループ ID を含む gidset を生成します。

#include <limits.h>
int gidset [NGROUPS_MAX + 1];
int ngroups;
gidset [0] = getegid();
ngroups = 1 + getgroups (NGROUPS_MAX, & gidset [1]);

著者

getaccess() は HP によって開発されました。

参照

access(2), acl(2), chmod(2), getacl(2), setacl(2), stat(2), acl(5), aclv(5), unistd(5)

印刷用画面へ
プライバシー 本サイト利用時の合意事項
© 1983-2004 Hewlett-Packard Development Company, L.P.