名称
cpacl(), fcpacl() ― アクセス制御リスト (ACL) およびモードビットの、 ファイル間でのコピー
(HFS ファイルシステムのみ)
構文
#include <acllib.h>
int cpacl(
const char *fromfile,
const char *tofile,
mode_t frommode,
uid_t fromuid,
gid_t fromgid,
uid_t touid,
gid_t togid
);
int fcpacl(
int fromfd,
int tofd,
mode_t frommode,
uid_t fromuid,
gid_t fromgid,
uid_t touid,
gid_t togid
);
特記事項:
変化し続けている業界標準に確実に準拠していくために、このマニュアルエントリーに記載されている特徴も随時改訂していく予定です。
説明
cpacl() と fcpacl() は共に、アクセス制御リストとモードビット
(ファイルアクセス パーミッションビットと混合モードビット、 chmod(2) 参照) をファイル間でコピーして、 chown(2) と同様に所有権を転送します。 cpacl() と fcpacl() は次のパラメータを取ります。
パス名 fromfile および tofile) または開いているファイル記述子 fromfd および tofd)
モード値 frommode, 通常は stat() によって返される st_mode 値。 stat(2) 参照 )。常にコピーされるファイル混合モードビット、およびどちらかのファイルがリモートの場合にアクセス制御リストの代わりにコピーされるファイルアクセス
パーミッションビットを含みます。
所有権転送用のファイル のユーザー ID およびグループ
ID fromuid, touid および fromgid, togid) 通常は、 fromuid と fromgid が stat() によって返される st_uid および st_gid の値になり、 touid と togid が geteuid() および getegid() によって返される値になります getuid(2) の geteuid(2) および getegid(2) を参照)。
両方のファイルがローカルの場合、 cpacl() ルーチンはアクセス制御リストをコピーし、必要に応じて chownacl() を呼び出して chownacl(3C) 参照) 所有権を fromfile から tofile に転送します。
cpacl() (fcpacl()) は、 getacl() (fgetacl())
または setacl() (fsetacl()) setacl(2) 参照) のエラーを認識した後にリモートコピー
(NFS 経由) を行います。 fromfile fromfd) から tofile tofd) にモードをコピーするとき、 cpacl() は chmod() (fchmod())
を使って frommode 全体 ( ファイル混合モードビットとファイルアクセス パーミッションビット)
を tofile tofd) にコピーします。混合モードビットの一部が消去される場合もあります chmod(2) 参照)。
cpacl() (fcpacl()) はアクセス制御リストを fromfile fromfd) から tofile tofd) へコピーします。この際所有権は転送されませんが、エラーチェックおよびリモートファイルの取り扱いが確実に行われます。これは、 touid に等しい fromuid と、 togid に等しい fromgid をパスすることによって行われます (つまりゼロが 4 個です)。リモートファイル、 fromuid、 touid、 fromgid および togid は無視されます。
戻り値
cpacl() と fcpacl() は正常終了するとゼロを返します。エラーが生じた場合、失敗の原因を示す errno を設定して、以下のように負の値を返します。
| -1 | | ローカル fromfile fromfd) 上で getacl() (fgetacl())
を実行することができない場合 |
| -2 | | tofile tofd) 上で chmod() (fchmod())
を実行してファイル混合モードビットをセットすることができない場合。 cpacl() (fcpacl())
は fromfile fromfd) がローカルである限り、ファイルがローカルかリモートかに関係なくこの動作を試行します。 |
| -3 | | ローカル tofile tofd) 上で setacl() (fsetacl())
を実行できない場合。 結果的にそのファイルのオプションの ACL エントリーが削除されて、そのファイルアクセス
パーミッションビットがゼロにセットされ、混合モードビットが変更されることになります。 |
| -4 | | tofile tofd) 上で chmod() (fchmod())
を実行してモートをセットすることができないようになります。結果的に、 fromfile fromfd) がローカルの場合、 tofile tofd) のオプションの ACL エントリーが削除され、アクセスパーミッション
ビットがゼロになり、ファイルがローカルかリモートかに関係なくファイル混合モードビットが変更されることになります。 |
例
次のコーディング例は oldfile に関する stat 情報を取得して、そのファイルの混合ビットとアクセス制御リストを、呼び出し側が所有する newfile にコピーします。一方のファイルがリモートの場合、 oldfile 上の st_mode だけがコピーされます。
#include <sys/types.h>
#include <sys/stat.h>
struct stat statbuf;
if (stat ("oldfile", & statbuf) < 0)
error (...);
if (cpacl ("oldfile", "newfile", statbuf.st_mode,
statbuf.st_uid, statbuf.st_gid, geteuid(), getegid()) < 0)
{
error (...);
}
制約
cpacl() と fcpacl() は
標準 HP-UX オペレーティングシステムの HFS ファイルシステム でのみサポートされています。
著者
cpacl() と fcpacl() は
HP で開発されました。
参照
acl(2), chown(2), getacl(2), getegid(2), geteuid(2), getuid(2),
setacl(2), stat(2), acltostr(3C), chownacl(3C), strtoacl(3C), acl(5),
aclv(5), thread_safety(5)