c语言 - 修改现有的 do_mkdir() 系统调用以打印尚不存在的已创建文件夹



我正在尝试熟悉修改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、权限等),如果该目录已经存在,则调用应返回。我错了。

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

我编辑的 open.c 版本。

我使用的是 Minix 版本 3.2.1。

为了测试这一点,我只重建了内核,如下所示:

cd /usr/src/releasetools
make hdboot

正如评论者所建议的那样,您需要再检查一件事。

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

/* 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 %on", fullpath, dirmode);
    }
}

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

免责声明:我还没有实际测试过这个,可能犯了一个错误。

相关内容

  • 没有找到相关文章

最新更新