log.c = Joseph J. Pfeiffer - Пример файловой системы во FUSE

Дополнительная информация:

  1. [об авторе]
  2. [основная тема]
  3. Функции Си используемые в log.c

содержимое файла (не забудьте исправить #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, );
}