code:access - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
6730
6731 /*
6732 * Check mode permission on inode pointer.
6733 * Mode is READ, WRITE, or EXEC.
6734 * In the case of WRITE, the
6735 * read-only status of the file
6736 * system is checked.
6737 * Also in WRITE, prototype text
6738 * segments cannot be written.
6739 * The mode is shifted to select
6740 * the owner/group/other fields.
6741 * The super user is granted all
6742 * permissions except for EXEC where
6743 * at least one of the EXEC bits must
6744 * be on.
6745 */
6746 access(aip, mode)
6747 int *aip;
6748 {
6749 register *ip, m;
- IWRITE,IEXEC,IREAD 权限常量定义在inode.h
6750
6751 ip = aip;
6752 m = mode;
6753 if(m == IWRITE) {
6754 if(getfs(ip->i_dev)->s_ronly != 0) {
6755 u.u_error = EROFS;
6756 return(1);
6757 }
6758 if(ip->i_flag & ITEXT) {
- 若尝试写 只读的文件系统,则抛出EROFS
6759 u.u_error = ETXTBSY;
6760 return(1);
6761 }
6762 }
- 若尝试写 作为程序正文的文件,则抛出ETXTBSY
6763 if(u.u_uid == 0) {
6764 if(m == IEXEC && (ip->i_mode &
6765 (IEXEC | (IEXEC>>3) | (IEXEC>>6))) == 0)
6766 goto bad;
6767 return(0);
6768 }
6769 if(u.u_uid != ip->i_uid) {
- 当前用户为超级用户
- 若尝试执行无执行权限的文件,则抛出EACCES
- 其他情况,超级用户拥有完全权限
6770 m =>> 3;
6771 if(u.u_gid != ip->i_gid)
6772 m =>> 3;
6773 }
6774 if((ip->i_mode&m) != 0)
6775 return(0);
6776
- 若 当前用户 为 文件拥有者,则 文件权限 对比 拥有者权限
- 否则,若 当前用户 属于 文件拥有组,则 文件权限 对比 拥有组权限
- 否则,文件权限 对比 其他用户权限
- 若验证通过,则返回0,否则抛出EACCES
6777 bad:
6778 u.u_error = EACCES;
6779 return(1);
6780 }
6781 /* ------------------------- */