#include <super.h>
#include <bitops.h>
#include <block_map.h>
#include <new_inode.h>
#include <release_fssys.h>
#include <progress.h>
#include <version.h>
struct any_sb_info { char *si_itfilename; /* имя файла таблицы инф.узлов */ unsigned long si_blocksize; /* размер блока */ unsigned long si_inodes; /* число инф.узлов */ unsigned long *si_inode_bitmap; /* карта инф.узлов */ struct any_inode *si_inode_table; /* массив инф.узлов */ };Эта структура -- аналог суперблока в других файловых системах.
Поле si_itfilename сохраняется при открытии таблицы инф.узлов и используется при сохранении, если не указано другого имени файла для записи таблицы инф.узлов.
Поле si_inode_bitmap это карта битов обозначающих занят ли тот или иной инф.узел (т.е. 1 значит занят).
Поле si_inode_table -- собственно таблица инф.узлов. Массив из si_inodes структур any_inode (будут описаны ниже).
struct any_inode { uint16_t i_mode; /* Режим доступа */ uint16_t i_uid; /* Идентификатор пользователя */ uint16_t i_gid; /* Идентификатор группы */ uint64_t i_size; /* Размер в байтах */ uint32_t i_atime; /* Время доступа */ uint32_t i_ctime; /* Время создания */ uint32_t i_mtime; /* Время модификации */ uint16_t i_links_count; /* Число ссылок */ union { struct any_file_frags *file_frags; /* Фрагменты файла */ struct any_dir *dir; /* Элементы директории */ char *symlink; /* Символическая ссылка */ dev_t device; /* Устройство */ } i_info; size_t i_it_file_offset; /* Смещение в файле таблицы инф.узлов */ }
Это структура является несколько модифицированной аналогичной структурой файловой системы ext2fs ext2_inode.
Описание большинства элементов вы можете найти в stat(2).
Объединение i_info содержит ссылку на часть информации об инф.узле зависимую от типа инф.узла.
Для простого файла -- это описание расположения его фрагментов на диске.
Для директорий -- список её элементов.
Для символических ссылок -- строка ссылки.
Для устройства -- тип устройства (см. описание элемента st_rdev в структуре stat(2))
Поле i_it_file_offset используется функцией сохранения таблицы инф.узлов.
struct any_dir { uint32_t d_ndirents; /* число элементов */ struct any_dirent* d_dirent; /* первый элемент директории */ void* d_data; /* ссылка на дополнительные данные (используется в графическом интерфейсе) */ };
Поле d_dirent является указателем на односвязный список элементов директории.
struct any_dirent { char* d_name; /* имя элемента */ uint32_t d_inode; /* номер инф.узла */ struct any_dirent *d_next; /* следующий элемент директории */ };
struct any_file_frags { uint32_t fr_nfrags; /* число фрагментов */ struct any_file_fragment *fr_frags; /* фрагменты */ };Поле fr_frags является массивом из fr_nfrags элементов, описывающих каждый фрагмент файла.
struct any_file_fragment { uint32_t fr_start; /* номер начального блока фрагмента */ uint32_t fr_length; /* длина фрагмента в блоках */ };
Размер блока, используемый в этой структуре в качестве единицы измерения, определён в структуре any_sb_info.
Значение 0 элемента fr_start означает sparse-фрагмент (такой который не хранится на диске, но считается, что он заполнен нулями)
Новая таблица инф.узлов заполняется нулями.
Возвращает 0 в случае успеха или -ENOMEM в случае не хватки памяти.
Имейте ввиду, что после этого вызова элементы si_inode_bitmap и si_inode_table структуры any_sb_info таблицы инф.узлов могут изменить своё значение (т.е. таблица и карта инф.узлов могут изменить своё расположение в памяти) и любые указатели на инф.узлы вычисленные перед этим вызовом выражением вроде (it->si_inode_table + ino) или &(it->si_inode_table[ino]). потребуют обновления.
Возвращает 0 в случае успеха или выходит из программы со статусом ENOMEM.
Возвращает 0 в случае успеха или -ENOMEM, -ENAMETOOLONG, -EINVAL в случае ошибки. В случае ошибки ввода/вывода переменная errno будет хранить более точный код ошибки.
Если itfilename == NULL, то берёт имя файла из поля it->si_itfilename.
Имейте ввиду, что этот вызов не освобождает память занимаемую таблицей инф.узлов (хотя вызов read_it выделяет память под загружаемую таблицу инф.узлов)
Возвращает 0 в случае успеха или 1 в случае ошибки. В случае ошибки ввода/вывода переменная errno будет хранить более точный код ошибки.
Возвращает значение бита перед установкой.
Возвращает значение бита перед очищением.
Возвращает номер найденного бита, или значение не меньшее size в случае неудачи.
Возвращает номер найденного бита, или значение не меньшее size в случае неудачи.
Карта перед вызовом этой функции должна быть выделена в памяти и заполнена нулями.
Кроме прочих блоков функция помечает нулевой блок как системный.
Функция возвращает 0 в случае успеха или -1, если в таблице инф.узлов найдены файлы, разделяющие между собой информацию одних и тех же блоков (установка последнего параметра check_intersects позволяет отменить проверку на пересечение блоков, что используется в утилите anysurrect).
Это значит, что в процессе своей работы функция не должна ни разу найти уже установленного бита в карте блоков (вероятно, помеченного ей же как используемый блок другим инф.узлом).
Номер нового инф.узла помещается в переменную *newino.
В случае создания устройства (специального файла), указатель data должен указывать на переменную типа dev_t содержащей тип устройства.
Возвращает ноль в случае успеха. Завершает работу программы при не хватке памяти.
Помещает номер найденного инф.узла в переменную *ino.
Возвращает 0 в случае успеха, 1 -- в случае отсутствия жлемента с таким именем, или -1, если инф.узел root не является директорией или является свободным инф.узлом.
При этом в программе должна быть объявлена переменная mode_t dir_umask; содержащая маску сбрасываемых бит доступа для создаваемых директорий.
Функция этого типа должна считывать/записывать блоки начиная с from в количестве n штук в/из (заранее выделенного) буфера buffer.
Функция должна возвращать 0 в случае успеха, или отрицательное значение в случае ошибки ввода/вывода.
Присвойте этому указателю правильное значение перед вызовом any_release().
Присвойте этому указателю правильное значение перед вызовом any_release().
Функция этого типа должна возвращать 0, если проверяемый блок свободен.
Эта функция должна возвращать 1, только, если блок устройства будет занят системной информацией.
Присвойте этому указателю правильное значение перед вызовом any_release().
Присвойте этому указателю правильное значение перед вызовом any_release().
Функция будет использовать функции any_readblk и any_writeblk для чтения/записи с устройства, функцию any_getblkcount для получения размера устройства, а также функцию any_testblk для получения информации о расположении системных блоков на устройстве.
Функция будет использовать функции readblk и writeblk для чтения/записи с устройства, функцию getblkcount для получения размера устройства, а также функцию testblk для получения информации о расположении системных блоков на устройстве.
Эта функция используется в утилитах построения файловых систем build_e2fs и build_xfs, после освобождения блоков от системной информации. Именно поэтому её объявление не было перенесено в другой файл.
Эти функции были взяты из e2fsprogs и немного модифицированы.
Максимальное значение установленное в ноль будет означать что число обрабатываемых единиц (блоков, файлов и т.п.) не известно (возможно эта строка прогресса будет отображать подсчёт этих элементов), в этом случае строка прогресса будет выглядеть не как
<пояснение>: <номер обрабатываемого элемента>/<всего элементов>
а без указания максимального числа элементов:
<пояснение>: <номер обрабатываемого элемента>
Эта возможность используется в build_it для файловых систем которые не выдают правильное значение числа используемых инф.узлов (например, VFAT).
Эта функция возвращает курсор и записывает новое значение прогресса.
Функция используется в утилите anysurrect для принятия решения о возвращении курсора прогресса к его необходимому для обновления прогресса положению, которое изменяется при выводе индикатора типа распознаваемого файла.
Функция используется в утилите anysurrect для принятия решения о печати нового значения индикатора типа распознаваемого файла после обновления строки прогресса.