|
̾??
????
???????Υ????ȥ??ݥ????Ȥϡ?Ϳ?????줿???????Ф??롢?ե??????? ???????????Ĥ?Ĵ?????ޤ??? ?????ϰʲ????̤??Ǥ???
mode ?? ???å?vnode ?ϡ????????˥??å????졢???????ˤ????å?????³???ޤ??? ???????ե????뤬???ꤵ?줿??ˡ?ǥ?????????ǽ?ʾ????ˤϡ?0 ???֤????ޤ??? ?????Ǥʤ??????ˤϡ?Ŭ?ڤʥ??顼?????ɤ??֤????ޤ??? ??????????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);
}
???顼
??Ϣ???????????Υޥ˥奢???ڡ????? Doug Rabson ???ޤ?????
|