View of xos/fs/file_struct.h


XOS | Parent Directory | View | Download

/* Copyright (C) 2008  Emmanuel Varoquaux
 
   This file is part of XOS.
 
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.
 
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
 
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
 
#ifndef FILE_STRUCT_H
#define FILE_STRUCT_H
 
#include <mapping_struct.h>
#include <condition_struct.h>
 
/* Un fichier ayant une entree dans l'arborescence est uniquement determine par
 * son instance de systeme de fichiers et son id. La racine est le seul fichier
 * egal a son parent.
 * Les tubes n'ont pas d'entree dans l'arborescence.
 * Lorsqu'un systeme de fichiers est monte sur un repertoire, il masque le
 * systeme de fichier definissant le repertoire. Ce dernier est memorise dans
 * le champ master_file_system_instance. */
 
/* La classification logique des fichiers est la suivante :
 *
 * file
 *     node
 *         dir (FT_DIR)
 *         leaf
 *             reg (FT_REG)
 *             spec
 *                 block (FT_BLK)
 *                 char (FT_CHR)
 *     pipe (FT_PIPE)
 */
 
struct file_struct;
struct stat_struct;
struct device_struct;
 
struct file_operations_struct {
  int (*read)(struct file_struct *, unsigned long, char *, unsigned int);
  int (*write)(struct file_struct *, unsigned long, const char *, unsigned int);
  long (*seek)(const struct file_struct *, unsigned long, long, int);
  int (*stat)(const struct file_struct *, struct stat_struct *);
  int (*ioctl)(const struct file_struct *, int, void *);
 
  union {
    /* fichiers ayant une entree dans l'arborescence */
    struct {
      int (*get_device)(const struct file_struct *, struct device_struct **);
    };
  };
};
 
struct file_struct {
  const struct file_operations_struct *file_operations;
 
  union {
    /* fichiers ayant une entree dans l'arborescence */
    struct {
      unsigned int count;       /* nombre de references */
      int write_access_count;   /* nombre d'acces en ecriture */
      struct mapping_struct mapping; /* projection en memoire */
      struct file_struct *parent; /* repertoire parent */
      struct file_struct *next_entry; /* prochaine entree de meme parent */
      struct file_system_instance_struct *file_system_instance; /* systeme de fichiers operant */
      unsigned long id;         /* identifiant dans le systeme de fichier */
 
      int is_dir;               /* indicateur de repertoire */
      union {
        /* repertoires */
        struct {
          struct file_struct *first_entry; /* premiere entree */
          struct file_system_instance_struct *master_file_system_instance; /* systeme de fichier proprietaire */
        };
 
        /* fichiers reguliers, fichiers speciaux */
        struct {
          unsigned to_remove : 1; /* indicateur de suppression */
        };
      };
    };
 
    /* tubes */
    struct {
      unsigned int read_count;
      unsigned int write_count;
      char *buffer;             /* tampon */
      unsigned long size;       /* taille des donnees dans le tampon */
      long mtime;               /* heure de dernier acces en ecriture */
      struct condition_struct condition; /* condition pour la communication inter-processus */
    };
  };
};
 
#endif