Serge,
Да, st_ino должен быть уникальным для каждого уникального файла (при одном и том же st_dev).
Да ладно. Тот нюанс можно вручную профиксить.
Гораздо больше проблем создает другой нюанс stat:
Не работает stat:
stat .
stat /fd2/1
stat /rd/1
stat /hd0/1
stat /tmp0/1
stat /cd2/1
stat /sys
stat /fd2
Из-за этого может не работать:
busybox ls
busybox mkdir с ключом -p
Распаковщик tar не может создать иерархию каталогов, потому что stat с первым компонентом пути (типа "/tmp0") возвращает -1.
Это может быть от странного поведения функции 70.5 (stat вроде как на нее опирается) : Функция не поддерживает виртуальные папки типа /, /rd и корневые папки типа /rd/1
Я думал что это профиксили в ядре (у меня старая документация), но видимо ошибся.
Удивительно, но работает stat /kolibrios
Пример для тестирования stat:
Code: Select all
#include <unistd.h>
#include <sys/stat.h>
#include <stdio.h>
int main(int argc,char** argv)
{
struct stat buf;
int ret;
const char* arg=".";
if (argc<=1){
printf("\nUsage:\nstat <filename>\n");
//return 0;
}else
arg=argv[1];
if ((ret=stat(arg,&buf))==0){
printf("\nOK stat !file=%s,\nmode:0x%x\n" ,arg,(int)buf.st_mode);
printf("\nst_dev:0x%x" ,(int)buf.st_dev);
printf("\nst_ino:0x%x" ,(int)buf.st_ino);
printf("\nst_nlink:0x%x" ,(int)buf.st_nlink);
printf("\nst_uid:0x%x" ,(int)buf.st_uid);
printf("\nst_gid:0x%x" ,(int)buf.st_gid);
printf("\nst_rdev:0x%x" ,(int)buf.st_rdev);
printf("\nst_size:0x%x" ,(int)buf.st_size);
}else{
printf("\nFailed,ret=%i\n ",ret);
}
return ret;
}
У меня есть небольшая наработка кода, не совсем полностью устраняющая этот нюанс, могу показать (реализация lstat, которая просто парсит переданный в функцию путь, если соответствует определенному шаблону, то возвращает, что это директория, иначе возвращает значение stat из под newlib).