Как переименовать файл по его иноду в Minix mfs? - PullRequest
0 голосов
/ 01 июня 2018

Как часть выравнивания в университете, я должен изменить функцию unlink_file, расположенную в /usr/src/minix/fs/mfs/link.c, поэтому (при определенных условиях) вместо удаления файлов он просто меняет их имя.

У меня есть индекс родительского каталога, индекс файла и его имя, переданные функции в качестве параметров:

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?

1 Ответ

0 голосов
/ 06 июня 2019

обратите внимание, что 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.директория (как при проверке ошибок, которую я пропустил, такой файл удаляется)

...