総合手引 | セクション 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 |