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

标签 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

最佳答案

根据评论者的建议,您还需要检查一件事。

您修改的部分附近的代码说:

/* 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 格式字符串的末尾添加了缺少的换行符,这样它就不会与下一行串在一起。

免责声明:我没有实际测试过,可能有误。

关于c - 修改现有的 do_mkdir() 系统调用以打印创建的尚不存在的文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36890880/

相关文章:

c - fscanf() 替换我的 ADT 节点?

c++ - gcov-工具合并 : "not a gcov data file"

c++ - ArrayFire:具有从主函数调用的 OpenCL 内核的函数

c - 每次执行 a.out 时,getpid() 递增 5 或 6

c++ - 如何使用 C++ 进行系统调用

c++ - 在排序和旋转的数组中搜索

objective-c - 返回 C 数组和内存管理

logging - 如何将 dmesg 时间戳转换为自定义日期格式?

linux - 关闭源代码 Linux 内核模块?

linux-kernel - 无法访问打开的/arch/x86/syscalls/syscall_32.tbl