【问题标题】:How to rename a file by its inode in Minix mfs?如何通过 Minix mfs 中的 inode 重命名文件?
【发布时间】:2018-11-11 23:10:06
【问题描述】:

作为大学调整的一部分,我必须修改位于/usr/src/minix/fs/mfs/link.c 中的函数unlink_file,因此(在某些情况下)不是删除文件,而是更改它们的名称。

我将父目录的 inode、文件的 inode 及其名称作为参数传递给函数:

static int unlink_file(dirp, rip, file_name)
struct inode *dirp;     /* parent directory of file */
struct inode *rip;      /* inode of file, may be NULL too. */
char file_name[MFS_NAME_MAX];   /* name of file to be removed */

我想过使用rename(2) 系统调用(该实现位于函数fs_rename 的同一文件中),但我需要文件的绝对路径才能这样做。不幸的是,我不知道如何从 inode 结构中检索它。

我的问题是:如何通过 inode 检索文件的绝对路径?或者还有其他方法可以从 unlink_file 函数中重命名文件吗?

【问题讨论】:

    标签: filesystems rename inode minix


    【解决方案1】:

    注意 fs_rename 对消息的作用以及它获取指向 inode 的指针。

    unlink_file 已经有指向文件 inode 的指针和指向文件所在目录的指针。如果你只需要重命名它,你可以检查 fs_rename() 的作用,当 old_dirp 和 new_dirp 都相同时

    same_pdir == (old_dip == new_dirp); //somewhere in fs_rename()
    (bunch of error checks..)
    if(same_pdir){
    r = search_dir(old_dirp, old_name, NULL, DELETE, IGN_PERM); // this deletes the file from directory
    if(r == OK)
    (void)search_dir(old_dirp, new_name, &numb, ENTER, IGN_PERM); //this creates file with new_name in the directory
    }
    

    请记住,这部分代码假定目录中当前不存在名为 new_name 的文件(如在错误检查中我已跳过此类文件被删除)

    【讨论】: