对现有的do_mkdir()系统调用进行调用,以打印尚未存在的已创建文件夹

时间:2016-04-27 13:12:41

标签: c kernel system-calls mkdir minix

我正在努力熟悉修改Minix系统调用和重建内核。

我在每次调用时修改mkdir以打印New dir -> <directory-name> <permissions>除非该目录已存在

我修改了/usr/src/servers/vfs/open.c,其中包含mkdir的代码。 我将这行代码添加到第610行:

    printf("New dir -> %s %o",fullpath,dirmode);

通过此次修改,mkdir打印正确,但如果该文件夹已存在,我收到以下消息:

New Dir -> test 755 mkdir: test: file exists

我希望看到:

mkdir: test: file exists

我认为通过将printf添加到第610行附近的最后一个if-else主体,在这种情况下它不会执行,因为这个if-else结构检查新目录是否有效(inode,权限等),如果目录已经存在,则应该返回调用。我错了。

我应该检查哪个系统函数或变量以查看文件是否已存在?

My edited version of open.c.

我正在使用Minix版本3.2.1。

为了测试这个,我重建了内核,就像这样:

cd /usr/src/releasetools
make hdboot

1 个答案:

答案 0 :(得分:2)

根据评论者的建议,你需要再检查一下。

您修改的部分附近的代码显示:

/* Make sure that the object is a directory */
if (!S_ISDIR(vp->v_mode)) {
    r = ENOTDIR;
} else if ((r = forbidden(fp, vp, W_BIT|X_BIT)) == OK) {
    r = req_mkdir(vp->v_fs_e, vp->v_inode_nr, fullpath, fp->fp_effuid,
                  fp->fp_effgid, bits);
    printf("New dir -> %s %o",fullpath,dirmode);
}

这里的关键是分支检查父目录是否存在,然后检查程序是否有权创建新目录 - 但不管目录是否已经存在。

该检查是req_mkdir的一部分,它返回一个错误代码,表明它是否成功。您可以查看此错误代码:

/* Make sure that the object is a directory */
if (!S_ISDIR(vp->v_mode)) {
    r = ENOTDIR;
} else if ((r = forbidden(fp, vp, W_BIT|X_BIT)) == OK) {
    r = req_mkdir(vp->v_fs_e, vp->v_inode_nr, fullpath, fp->fp_effuid,
                  fp->fp_effgid, bits);
    if (r == OK) {
        printf("New dir -> %s %o\n", fullpath, dirmode);
    }
}

当我在这里时,我还在printf格式字符串的末尾添加了缺少的换行符,以便它不会与下一行串在一起。

免责声明:我实际上没有对此进行测试,可能会犯错误。