| 総合手引 | セクション 9 | English | オプション |
#include <sys/param.h>
#include <sys/vnode.h>
引数は以下の通りです。
| vp | |
| 調査対象ファイルの vnode。 | |
| mode | |
| 要求されたアクセスのタイプ。 | |
| cred | |
| 調査対象のユーザ証明。 | |
| td | |
| 調査しているスレッド。 | |
mode は VREAD, VWRITE または VEXEC を含むマスクです。
int
vop_access(struct vnode *vp, int mode, struct ucred *cred, struct thread *td)
{
int error;
/*
* ファイルがソケット、FIFO、またはファイルシステムに存在する
* ブロック型または文字型デバイスでない場合には、読み込み専用
* ファイルシステムへの書き込みは認められません。
*/
if (mode & VWRITE) {
switch (vp->v_type) {
case VDIR:
case VLNK:
case VREG:
if (vp->v_mount->mnt_flag & MNT_RDONLY)
return EROFS;
break;
}
}
/* 不変ビットが設定されていれば、誰も書き込めません。 */
if ((mode & VWRITE) && vp has immutable bit set)
return EPERM;
/* そうでなければ、uid が 0 ならば常に許可。 */
if (cred->cr_uid == 0)
return 0;
mask = 0;
/* そうでなければ、所有者を調べます。 */
if (cred->cr_uid == owner of vp) {
if (mode & VEXEC)
mask |= S_IXUSR;
if (mode & VREAD)
mask |= S_IRUSR;
if (mode & VWRITE)
mask |= S_IWUSR;
return (((mode of vp) & mask) == mask ? 0 : EACCES);
}
/* そうでなければ、グループを調べます。 */
for (i = 0, gp = cred->cr_groups; i < cred->cr_ngroups; i++, gp++)
if (group of vp == *gp) {
if (mode & VEXEC)
mask |= S_IXGRP;
if (mode & VREAD)
mask |= S_IRGRP;
if (mode & VWRITE)
mask |= S_IWGRP;
return (((mode of vp) & mask) == mask ? 0 : EACCES);
}
/* そうでなければ、その他を調べます。 */
if (mode & VEXEC)
mask |= S_IXOTH;
if (mode & VREAD)
mask |= S_IROTH;
if (mode & VWRITE)
mask |= S_IWOTH;
return (((mode of vp) & mask) == mask ? 0 : EACCES);
}
| [EPERM] | |
| 不変ファイルを変更しようとしました。 | |
| [EACCES] | |
| パーミッションビットのファイルモードまたは ACL が要求されたアクセスを 許可しませんでした。 | |
| VOP_ACCESS (9) | July 24, 1996 |
| 総合手引 | セクション 9 | English | オプション |
このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.
| “ | I define UNIX as “30 definitions of regular expressions living under one roof.” | ” |
| — Donald Knuth | ||