code:link - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
5905
5906
5907 /* link system call
5908 */
5909 link()
5910 {
5911 register *ip, *xp;
5912 extern uchar;
5913
5915 if(ip == NULL)
- ip ← name1 对应的 INODE
5916 return;
5917 if(ip->i_nlink >= 127) {
5918 u.u_error = EMLINK;
5919 goto out;
5920 }
5921 if((ip->i_mode&IFMT)==IFDIR && !suser())
- 若ip 别名数 >=127,抛出错误
- 错误代码 : EMLINK
5922 goto out;
5923 /*
- 只有 超级用户 才可以给目录起别名
5924 * ulock to avoid possible hanging in namei
5925 */
5926 ip->i_flag =& ~ILOCK;
5927 u.u_dirp = u.u_arg[1];
- 解锁ip (在5914 namei置锁)
5929 if(xp != NULL) {
- xp ← 查找 name2 对应的 INODE
5930 u.u_error = EEXIST;
5931 iput(xp);
5932 }
5933 if(u.u_error)
- xp 若已存在,则抛出错误,释放xp
- 错误代码 : EEXIST
5934 goto out;
5935 if(u.u_pdir->i_dev != ip->i_dev) {
5937 u.u_error = EXDEV;
5938 goto out;
5939 }
5940 wdir(ip);
- 若name1 和 name2 INODE不在同一设备,抛出错误
- 错误代码 : EXDEV
5941 ip->i_nlink++;
- 将 ip (再次) 链入目录结构 (新文件名name2为参数)
5942 ip->i_flag =| IUPD;
5943
- 修正ip参数
5944 out:
5946 }
5947 /* ------------------------- */
- (link = 9.)
- sys link; name1; name2