修改现有 do_mkdir() 系统调用以打印创建的尚不存在的文件夹
Modyifing existing do_mkdir() system call to print created folder that doesn't already exist
我正在尝试熟悉修改 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、权限等) ),如果目录已经存在,调用应该 return。我错了。
我应该检查什么系统函数或变量来查看文件是否已经存在?
我正在使用 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
的一部分完成的,returns 一个错误代码表明它是否成功。您需要检查此错误代码:
/* 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
格式字符串的末尾添加了缺少的换行符,这样它就不会与下一行串在一起。
免责声明:我还没有实际测试过,可能有误。
我正在尝试熟悉修改 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、权限等) ),如果目录已经存在,调用应该 return。我错了。
我应该检查什么系统函数或变量来查看文件是否已经存在?
我正在使用 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
的一部分完成的,returns 一个错误代码表明它是否成功。您需要检查此错误代码:
/* 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
格式字符串的末尾添加了缺少的换行符,这样它就不会与下一行串在一起。
免责声明:我还没有实际测试过,可能有误。