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
- 3271 reads