名称
setacl, fsetacl ― アクセス制御リスト (ACL) 情報の設定
構文
#include <sys/acl.h>
int setacl(
const char *path,
int nentries,
const struct acl_entry *acl
);
int fsetacl(
int fildes,
int nentries,
const struct acl_entry *acl
);
説明
setacl() は存在するファイルのアクセス制御リスト
(ACL) の設定、および (ACL) のオプションのエントリーの削除を行います。 path はファイルのパス名を指定します。
同様に、 fsetacl() はファイル記述子 fildes で指定された開いているファイルに対して、既存のファイルのアクセス制御リストの設定を行います。
ACL の設定を行う場合、プロセスの実効ユーザー ID はファイルの所有者またはスーパーユーザーでなければなりません。
setacl() の呼び出しに成功した場合、ファイルに対する直前のオプションの
ACL エントリー (以下の説明参照) は削除されます。 nentries はパラメータ acl で定義された有効なエントリーの数を示します。 nentries がゼロ以上の場合、新しい ACL がファイルに適用されます。
ファイルの基本的なエントリー (以下参照) が新たな ACL で述べられていない場合、エントリーは保持されますが、ファイルのアクセスモードはゼロ (no
access) に設定されます。 したがって、 setacl() のルーティンコールはファイルの ACL
を完全に定義しています。
特別な場合として、 nentries が負の数の場合 (すなわち ACL_DELOPT (<sys/acl.h> で定義)
の値の場合)、パラメータ acl は無視され、ファイルのオプションのエントリーがあればすべて削除され、基本的なエントリーは変更されないままになります。
ファイルモードのモードビットには、 setacl() の呼び出しの結果、クリアされるものもあります。 chmod(2) を参照してください。
Access
Control Lists
ACL はエントリーの並びです。 エントリーは具体的に次の 4 つのレベルに分類されます。
| (u.g, mode) | | グループ g のユーザー u に適用する場合 |
| (u.%, mode) | | 任意のグループのユーザー u に適用する場合 |
| (%.g, mode) | | グループ g の任意のユーザーに適用する場合 |
| (%.%, mode) | | 任意のグループの任意のユーザーに適用する場合 |
ACL 内のエントリーは一意でなければなりません。 2 つのエントリーは同じユーザー ID uid) およびグループ ID gid) を共有できません (以下参照)。 エントリーはどんな順序でも表せます。
システムはアクセスチェックのため必要ならばエントリーを並べ換えます。
ACL_NSUSER は上で % と表した指定なしの uid の値として、また ACL_NSGROUP は指定なしの gid の値としてヘッダーファイル <sys/acl.h> で定義されています。
エントリー内の uid が ACL_NSUSER の時、ファイルエントリーは %.g となります。 gid が ACL_NSGROUP の時、ファイルエントリーは u.% となります。 uid および gid が両方とも指定なしの場合、ファイルエントリーは %.% になります。
ヘッダーファイルの <unistd.h> は、ACL
エントリー内のモードビットの意味 (R_OK, W_OK および X_OK)
を定義します。 モード値の不適当なビットはゼロでなければなりません。
各ファイルの ACL には、追加または削除ができず、変更だけが可能な 3 つの基本的なエントリーがあります。
基本的な ACL エントリーはファイルのパーミッションビットから直接マップされています。
(<file's owner> . ACL_NSGROUP, <file's owner mode bits>)
(ACL_NSUSER . <file's group>, <file's group mode bits>)
(ACL_NSUSER . ACL_NSGROUP, <file's other mode bits>)
さらに、ファイルに対するアクセスの制限や許可のために、オプションの
ACL エントリーを 13 まで設定することができます。
setacl() を用いて基本的な ACL エントリーのモードを変えると、ファイルの相当するパーミッションビットが変わります。
パーミッションビットは同様に chmod() chmod(2) 参照) を使って変えられ、 stat() stat(2) 参照) を使って読めます。
1 つのファイルに許されるエントリーの数は (<sys/acl.h>)
内の NACLENTRIES 参照) スペースとパフォーマンスが理由で小さくなっています。
アクセスコントロールのために必要な時にはユーザーグループを作るようにしてください。
普通のユーザーはグループを作ることはできないので、ACL を用いてファイルアクセスを制御する能力は限られたものになります。
戻り値
setacl() および fsetacl() は、正常終了すると 0 を返します。失敗すると
-1 を返し、 ファイルの ACL が修正されず、エラーを示す値が errno にセットされます。
エラー
setacl() は、次の条件のどれかを満たす場合に失敗します。
| [ENOTDIR] | | path の構成要素がディレクトリでない場合 |
| [ENOENT] | | 指定されたファイルが存在しなかった場合 (例、 path が null または path の構成要素が存在しない場合) |
| [EACCES] | | path の構成要素の検索パーミッションが許されなかった場合 |
| [EPERM] | | 実効ユーザー ID がファイルの所有者と一致せず、実効ユーザー
ID がスーパーユーザーとも一致しなかった場合 |
| [EROFS] | | 指定されたファイルが読み取り専用のファイルシステムにある場合 |
| [EFAULT] | | path または acl がプロセスの割り当てられたアドレス空間の外を指しているか、あるいは acl が nentries で示されるものほど大きくない場合 |
| [EINVAL] | | ACL 内に冗長なエントリーがある場合、 または acl が無効な uid、 gid あるいは mode の値を含んでいる場合 |
| [E2BIG] | | NACLENTRIES エントリーより多くのエントリーがある
ACL を設定しようとした場合 |
| [EOPNOTSUPP] | | ネットワーク サービスが、実行した機能をリモートファイル上でサポートしていない場合 |
| [ENOSYS] | | 実行した機能がこのファイルシステム タイプでサポートされない場合 |
| [ENOSPC] | | ファイルシステムに十分な領域がない場合 |
| [ENFILE] | | システム ファイルテーブルがいっぱいになってしまった場合 |
| [ENAMETOOLONG] | | _POSIX_NO_TRUNC が有効である時に path の長さが PATH_MAX バイトを超えた場合、または path の構成要素の長さが NAME_MAX バイトを超えた場合 |
| [ELOOP] | | path 名にシンボリックリンクが多すぎる場合 |
| [EDQUOT] | | 現在のファイルシステムでユーザーに割り当てたディスクブロックまたは
i ノードがいっぱいになってしまった場合 |
fsetacl() は、次の条件のどれかを満たす場合に失敗します。
| [EBADF] | | fildes が有効なファイル記述子でない場合 |
| [EPERM] | | 実効ユーザー ID がファイルの所有者のものと一致せず、しかも実効ユーザー
ID がスーパーユーザーのものではない場合 |
| [EROFS] | | 指定されたファイルが読み取り専用のファイルシステムにある場合 |
| [EFAULT] | | path または acl が、割り当てられていないアドレス空間を指しているか、あるいは acl が nentries で示されるものほど大きくない場合 |
| [EINVAL] | | ACL 内に冗長なエントリーがある場合、または acl が無効な uid、 gid あるいは mode の値を含んでいる場合 |
| [E2BIG] | | NACLENTRIES エントリーより多くのエントリーを
ACL に設定しようとした場合 |
| [EOPNOTSUPP] | | ネットワーク サービスの中に、リモートファイルに対して、実行した機能をサポートしていないサービスがある場合 |
| [ENOSYS] | | 実行した機能がこのファイルシステム タイプでサポートされない場合 |
| [ENOSPC] | | ファイルシステムに十分な領域がない場合 |
| [ENFILE] | | システムファイル テーブルがいっぱいになってしまった場合 |
| [EDQUOT] | | 現在のファイルシステムでユーザーに割り当てたディスクブロックまたは
i ノードがいっぱいになってしまった場合 |
例
ファイル ../shared に対し、次のコードのフラグメントは、ファイルの所有者に read、write
および execute またはファイルの search を許し、ユーザー 103、グループ
204 にファイルの read を許す ACL を定義し、設定しています。
#include <unistd.h>
#include <sys/stat.h>
#include <sys/acl.h>
char *filename = "../shared";
struct acl_entry acl [2];
struct stat statbuf;
if (stat (filename, & statbuf) < 0)
error (...);
acl [0] . uid = statbuf . st_uid; /* file owner */
acl [0] . gid = ACL_NSGROUP;
acl [0] . mode = R_OK | W_OK | X_OK;
acl [1] . uid = 103;
acl [1] . gid = 204;
acl [1] . mode = R_OK;
if (setacl (filename, 2, acl))
error (...);
次の呼び出しによりすべてのオプションの ACL エントリーは file1 から削除されます。
setacl ("file1", ACL_DELOPT, (struct acl_entry *) 0);
制約
NFS
setacl() および fsetacl() はリモートファイル上でサポートされていません。
HFS
ACL は、HFS ファイルシステム上でのみサポートされています。
著者
setacl() および fsetacl() は
HP で開発されました。
参照
access(2), chmod(2), getaccess(2), getacl(2), stat(2), acl(5),
unistd(5)