Как переименовать файл по его индексу в Minix mfs?

В рамках адаптации в университете я должен изменить функцию 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.

Мой вопрос: как я могу получить абсолютный путь к файлу по его индексу? Или есть другой способ переименовать файл изнутри функции unlink_file?


person Mysquff    schedule 01.06.2018    source источник


Ответы (1)


обратите внимание, что fs_rename делает с сообщением и получает указатель на индексные дескрипторы.

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 (поскольку в проверках ошибок, которые я пропустил, такой файл удаляется)

person Blomex    schedule 06.06.2019