log.c = Joseph J. Pfeiffer - Пример файловой системы во FUSE
Primary tabs
Forums:
Дополнительная информация:
содержимое файла (не забудьте исправить #include инструкции) =
// Since the point of this filesystem is to learn FUSE and its // datastructures, I want to see *everything* that happens related to // its data structures. This file contains macros and functions to // accomplish this. /* ТАК КАК цель данного примера - файловой системы - это изучение FUSE и относящихся к этому модулю структур данных, то было бы неплохо видеть "все" действия нашей системы - всё что имеет отношения к её струтурам данных. Поэтому в данном файле размещены макросы и функции , служащие для ведения журнала - то есть записи происходящих операций*/ #include "params.h" #include fuse.h> #include stdarg.h> /* здесь ,в частности, описаны макроопределения va_start, va_arg, va_end - позволяющие получать переданные аргументы в функциях с переменнным числом параметров.*/ #include stdio.h> #include stdlib.h> #include unistd.h> #include sys/types.h> #include sys/stat.h> #include "log.h" FILE *log_open() // открывает файл журнала. { FILE *logfile; // very first thing, open up the logfile and mark that we got in // here. If we can't open the logfile, we're dead. /* Прежде всего - надо открыть файл журнала - если открывть его не удастся - "нам крышка"))))*/ logfile = fopen("bbfs.log", "w"); if (logfile == NULL) { perror("logfile"); exit(EXIT_FAILURE); // выхожим с вернув параметр, информирующий о нейдаче операции. } // set logfile to line buffering setvbuf(logfile, NULL, _IOLBF, 0); /* буферизируем запись построчно (). */ return logfile; } /*следующая функция как раз-таки и осуществляет запись очередного в файл журнала*/ void log_msg(const char *format, ...) // функция с переменным числом параметров { va_list ap; // объявляем указатель для работы со списокм необязательных параметров va_start(ap, format); // переставляем указатель на первый из необязательных параметров vfprintf(BB_DATA->logfile, format, ap); /* записываем в файл журнала - передаём ap - указатель установленный на начало списка "необязательных" параметров с помощью вызванной ранее va_start(ap, format); см. об этой функции - fkn.ktu10.com/?q=node/996 */ } // struct fuse_file_info keeps information about files (surprise!). // This dumps all the information in a struct fuse_file_info. The struct // definition, and comments, come from /usr/include/fuse/fuse_common.h // Duplicated here for convenience. /* Структура fuse_file_info хранит всю информацию о файлах ( не ожидали?!!))) Следующая функция выгружает всю инофрмацию из структуры fuse_file_info. Различные определния взяты из файла /usr/include/fuse/fuse_common.h Они продублированны здесь для большей потяности кода. Строка типа "0x%08x" - это довольно замудрённый формат для вывода шестадцатеричных значений флагов с помощью функции vfprintf , которая поддерживает форматы аналогично printf() */ void log_fi (struct fuse_file_info *fi) // типа - "log file information" - логгируем информацию о файле. { /** Open flags. Available in open() and release() - флаги открытия файла*/ // int flags; log_struct(fi, flags, 0x%08x, ); /** Old file handle, don't use - дескриптор старого файла - не исопльзуется */ // unsigned long fh_old; log_struct(fi, fh_old, 0x%08lx, ); /** In case of a write operation indicates if this was caused by a writepage - в случае если операция записи указывает, что была вызвана с помощью writepage */ // int writepage; log_struct(fi, writepage, %d, ); /** Can be filled in by open, to use direct I/O on this file. Introduced in version 2.4 - данное поле может быть заполнено при открытии - при использовнии прямого ввода-вывода для данного файла Введено в верссии 2.4 */ // unsigned int keep_cache : 1; log_struct(fi, direct_io, %d, ); /** Can be filled in by open, to indicate, that cached file data need not be invalidated. Introduced in version 2.4 Поле может ыть заполнено при открытии файла - чтобы отметить, что кешированные данные файла не должны признаваться недействительными */ // unsigned int flush : 1; log_struct(fi, keep_cache, %d, ); /** Padding. Do not use = "набивка" -не используется*/ // unsigned int padding : 29; /** File handle. May be filled in by filesystem in open(). Available in all other file operations Дескриптор файла - может быть определён при выполнении open() - доступен во всех остьльных фаловых операциях */ // uint64_t fh; log_struct(fi, fh, 0x%016llx, ); /** Lock owner id. Available in locking operations and flush = Идентификатор владельца блокировки - доступен при быполнии операции блокировки и "слива - опустошения" - "flush" */ // uint64_t lock_owner; log_struct(fi, lock_owner, 0x%016llx, ); }; // This dumps the info from a struct stat. The struct is defined in // <bits/stat.h>; this is indirectly included from <fcntl.h> /* Эта функция выгружает инофрмацию из структуры stat это структура определена в <bits/stat.h> - н косвенно включается из заголовочного файла <fcntl.h> */ void log_stat(struct stat *si) { // dev_t st_dev; /* ID of device containing file */ log_struct(si, st_dev, %lld, ); // ino_t st_ino; /* inode number */ log_struct(si, st_ino, %lld, ); // mode_t st_mode; /* protection */ log_struct(si, st_mode, 0%o, ); // nlink_t st_nlink; /* number of hard links */ log_struct(si, st_nlink, %d, ); // uid_t st_uid; /* user ID of owner */ log_struct(si, st_uid, %d, ); // gid_t st_gid; /* group ID of owner */ log_struct(si, st_gid, %d, ); // dev_t st_rdev; /* device ID (if special file) */ log_struct(si, st_rdev, %lld, ); // off_t st_size; /* total size, in bytes */ log_struct(si, st_size, %lld, ); // blksize_t st_blksize; /* blocksize for filesystem I/O */ log_struct(si, st_blksize, %ld, ); // blkcnt_t st_blocks; /* number of blocks allocated */ log_struct(si, st_blocks, %lld, ); // time_t st_atime; /* time of last access */ log_struct(si, st_atime, 0x%08lx, ); // time_t st_mtime; /* time of last modification */ log_struct(si, st_mtime, 0x%08lx, ); // time_t st_ctime; /* time of last status change */ log_struct(si, st_ctime, 0x%08lx, ); } // о структурах читайте здесь = fkn.ktu10.com/?q=node/1000 void log_statvfs(struct statvfs *sv) /* записываем данные из структуры , которая содержит информацию о файловой системе*/ { // unsigned long f_bsize; /* file system block size */ log_struct(sv, f_bsize, %ld, ); // unsigned long f_frsize; /* fragment size */ log_struct(sv, f_frsize, %ld, ); // fsblkcnt_t f_blocks; /* size of fs in f_frsize units */ log_struct(sv, f_blocks, %lld, ); // fsblkcnt_t f_bfree; /* # free blocks */ log_struct(sv, f_bfree, %lld, ); // fsblkcnt_t f_bavail; /* # free blocks for non-root */ log_struct(sv, f_bavail, %lld, ); // fsfilcnt_t f_files; /* # inodes */ log_struct(sv, f_files, %lld, ); // fsfilcnt_t f_ffree; /* # free inodes */ log_struct(sv, f_ffree, %lld, ); // fsfilcnt_t f_favail; /* # free inodes for non-root */ log_struct(sv, f_favail, %lld, ); // unsigned long f_fsid; /* file system ID */ log_struct(sv, f_fsid, %ld, ); // unsigned long f_flag; /* mount flags */ log_struct(sv, f_flag, 0x%08lx, ); // unsigned long f_namemax; /* maximum filename length */ log_struct(sv, f_namemax, %ld, ); } void log_utime(struct utimbuf *buf) /* записываем иформацию о времени доступа к файлу и его изменения*/ { // time_t actime; log_struct(buf, actime, 0x%08lx, ); // time_t modtime; log_struct(buf, modtime, 0x%08lx, ); }
- Log in to post comments
- 2590 reads