View of xos/fs/vfat.c


XOS | Parent Directory | View | Download

/* Pilote de systeme de fichiers FAT */
/* 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/>. */
 
/* Code teste uniquement avec une disquette de 1,44 Mo. En particulier,
 * la FAT32 est non testee. */
 
/* Le pilote est actuellement limite aux volumes de 128 Go. */
 
#include "file_system_struct.h"
#include "vfat_instance.h"
#include "vfat_instance_struct.h"
#include "device_struct.h"
 
#include <stat_struct.h>
#include <kmalloc.h>
#include <errno.h>
#include <consts.h>
#include <stddef.h>
 
/* vfat */
 
static int vfat_mount(const struct device_struct *device, void **data)
{
  int retval;
 
  if (!(*data = kmalloc(sizeof (struct vfat_instance_struct)))) {
    retval = -ENOMEM;
    goto error;
  }
  if ((retval = vfat_instance_init(*data, device)) < 0)
    goto error_free;
  return 0;
 
 error_free:
  kfree(*data, sizeof (struct vfat_instance_struct));
 error:
  return retval;
}
 
static void vfat_umount(void *data)
{
  vfat_instance_destroy(data);
  kfree(data, sizeof (struct vfat_instance_struct));
}
 
static int vfat_find(void *data, unsigned long dir_id, const char *fs_basename, unsigned long *id, int *type)
{
  return vfat_instance_find(data, dir_id, fs_basename, id, type);
}
 
static int vfat_get_name(void *data, unsigned long id, char name[])
{
  return vfat_instance_get_name(data, id, name);
}
 
static int vfat_get_size(void *data, unsigned long reg_id, unsigned long *size)
{
  return vfat_instance_get_size(data, reg_id, size);
}
 
static int vfat_stat(void *data, unsigned long id, struct stat_struct *fs_buf)
{
  return vfat_instance_stat(data, id, fs_buf);
}
 
static int vfat_read_dir(void *data, unsigned long dir_id, unsigned long pos, char *fs_buf, unsigned int count)
{
  return vfat_instance_read_dir(data, dir_id, pos, fs_buf, count);
}
 
static int vfat_read(void *data, unsigned long leaf_id, unsigned long pos, char *fs_buf, unsigned int count)
{
  return vfat_instance_read(data, leaf_id, pos, fs_buf, count);
}
 
static int vfat_write(void *data, unsigned long leaf_id, unsigned long pos, const char *fs_buf, unsigned int count)
{
  return vfat_instance_write(data, leaf_id, pos, fs_buf, count);
}
 
static int vfat_create(void *data, unsigned long dir_id, const char *fs_basename)
{
  return vfat_instance_create(data, dir_id, fs_basename);
}
 
static int vfat_mkdir(void *data, unsigned long dir_id, const char *fs_basename)
{
  return vfat_instance_mkdir(data, dir_id, fs_basename);
}
 
static int vfat_can_remove(void *data, unsigned long leaf_id)
{
  return vfat_instance_can_remove(data, leaf_id);
}
 
static int vfat_remove(void *data, unsigned long leaf_id, unsigned long parent_dir_id)
{
  return vfat_instance_remove(data, leaf_id, parent_dir_id);
}
 
static int vfat_rmdir(void *data, unsigned long dir_id, unsigned long parent_dir_id)
{
  return vfat_instance_rmdir(data, dir_id, parent_dir_id);
}
 
static int vfat_rename(void *data, unsigned long old_id, unsigned long old_parent_dir_id, unsigned long new_dir_id, const char *fs_basename)
{
  return vfat_instance_rename(data, old_id, old_parent_dir_id, new_dir_id, fs_basename);
}
 
const struct file_system_struct vfat = {
  .name = "vfat",
  .type = FT_BLK,
  .mount = vfat_mount,
  .umount = vfat_umount,
  .find = vfat_find,
  .get_name = vfat_get_name,
  .get_device = NULL,
  .get_size = vfat_get_size,
  .stat = vfat_stat,
  .read_dir = vfat_read_dir,
  .read = vfat_read,
  .write = vfat_write,
  .ioctl = NULL,
  .create = vfat_create,
  .mkdir = vfat_mkdir,
  .can_remove = vfat_can_remove,
  .remove = vfat_remove,
  .rmdir = vfat_rmdir,
  .rename = vfat_rename
};