code:chmod - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Source

  • chmod 系统调用 的 实现函数
  • 改变指定文件或目录的访问权限
  • 从用户态传入2个参数
    • 参数1: name ,文件或目录的路径名 -> u.u_arg[0]
    • 参数2: mode ,希望变成的访问模式 -> u.u_arg[1]

3559

3560 chmod()

3561 {

3562     register *ip;

3563

3564     if ((ip = owner()) == NULL)

3565               return;

  • 检查当前用户是否是文件的拥有者或者是超级用户
    • 若不是或者无法根据name指示的路径找到相应INODE,直接返回
    • 否则,ip=通过name得到的INODE
3566     ip->i_mode =& ~07777;
  • 将ip->i_mode的最后12位(与访问权限有关的位)清空
3567     if (u.u_uid)

3568          u.u_arg[1] =& ~ISVTX;

  • 若当前用户不是超级用户
    • 清除传入参数mode中的ISVTX标志,参看inode.h
3569     ip->i_mode =| u.u_arg[1]&07777;
  • 将传入的参数mode的后12位赋给ip->i_mode
3570     ip->i_flag =| IUPD;

3571     iput(ip);

  • ip->i_flag置上IUPD标志,表明该INODE被修改过
  • 调用iput使ip->i_count -1,(抵消3564调用owner时间接调用namei而 导致的ip->i_count +1)
3572 }

3573 /* ------------------------- */

Ref

Param

(chmod = 15.)
sys chmod; name; mode
⚠️ **GitHub.com Fallback** ⚠️