Dados gerais

Interface: FSManager
Arquivos: fsmanager.h
Última atualização: 01/03/2003
Autor: Luiz Henrique Shigunov
Informações

Descrição
Estruturas
Configuração
Funções para o sistema

0x00 - Close - Fecha um descritor de arquivo
0x02 - Mount - Monta um sistema de arquivos
0x03 - Open - Abre um arquivo/diretório
0x05 - Read - Lê de um descritor de arquivo
0x07 - Remove - Remove um arquivo/diretório
0x09 - RewindDir - Volta a ler do início do diretório

0x0a - Seek - Posiciona o ponto de leitura/escrita de um arquivo
0x0b - Status - Obtém informações sobre um arquivo/diretório
0x01 - StatusFD - Obtém informações sobre um descritor de arquivo
0x0c - Unmount - Desmonta um sistema de arquivos
0x0d - Write - Escreve num arquivo
Funções para o usuário

0x0e - UClose - Fecha um descritor de arquivo
0x0f - UChangeDir - Define o diretório corrente
0x10 - UChangeRoot - Define o diretório raiz
0x11 - UMount - Monta um sistema de arquivos
0x12 - UOpen - Abre um arquivo/diretório
0x14 - URead - Lê de um descritor de arquivo
0x16 - URemove - Remove um arquivo/diretório

0x18 - URewindDir - Volta a ler do início do diretório
0x19 - USeek - Posiciona o ponto de leitura/escrita de um arquivo
0x1a - UStatus - Obtém informações sobre um arquivo/diretório
0x04 - UStatusFD - Obtém informações sobre um descritor de arquivo
0x1b - UUnmount - Desmonta um sistema de arquivos
0x1c - UWrite - Escreve num arquivo

Descrição

Esta página descreve a interface FSManager que é responsável por fazer a ponte entre os módulos do sistema e do usuário e os vários sistemas de arquivos, permitindo que vários sistemas de arquivos sejam instalados transparentemente, ou seja, um módulo não precisa saber se está lendo um arquivo de um disquete no formato FAT ou Ext2. Mas, se um módulo quiser tirar proveito de alguma função particular de um sistema de arquivos poderá faze-lo, basta chamar o módulo específico.

Para conseguir essa flexibilidade, cada sistema de arquivos terá que ser montado, ou seja, ligado ao administrador de sistemas de arquivos e também à um módulo de dispositivo.

Um módulo para ser ligado ao administrador de sistemas de arquivos terá que implementar a interface FileSystem, além disso, sistemas de arquivos só podem ser montados em dispositivos que implementem a interface BlockDev.

Um mesmo sistema de arquivos de uma mesma unidade e dispositivo pode ser montado em vários diretórios diferentes, mas apenas um sistema de arquivos pode ser montado num determinado diretório.

Montar um sistema de arquivos significa disponibilizar esse sistema de arquivos para o sistema. Assim, não faz sentido montar o sistema de arquivos num diretório inexistente, pois ele vai ficar indisponível. Do mesmo modo, não faz sentido remover o diretório onde o sistema de arquivos está montado, pois o sistema de arquivos se tornaria indisponível.

Tendo essa definição, fica claro que o diretório onde o sistema de arquivos será montado deve existir e ficar bloqueado (não pode ser removido, movido, etc).

Um identificador de arquivo ou diretório obtido via função do sistema é único em todo o sistema. Já um identificador de arquivo ou diretório obtido via função do usuário é único somente na tarefa.

A interface atual suporta apenas arquivos com tamanho máximo de 2 GB.

Estruturas

typedef struct {
    unsigned short size;
    char name[1];
} FSManager_DirEntry;

Onde size é o tamanho desta entrada de diretório. name é um nome de arquivo terminado em NULL.

typedef struct {
    unsigned int mode;
    unsigned int nlink;
    unsigned int uid;
    unsigned int gid;
    int size;
    unsigned int blksize;
    unsigned int blocks;
    unsigned int atime;
    unsigned int mtime;
    unsigned int ctime;
} FSManager_EntryStatus;

nlink é o número de hard links.

uid é o ID do dono.

gid é o ID do grupo do dono.

size é o tamanho do arquivo (ser for um arquivo ou um link simbólico) em bytes. O tamanho do link simbólico é o tamanho do caminho que ele contém sem o NULL final.

blksize é o tamanho do bloco para uma E/S eficiente (escrever no arquivo com bloco de tamanho menor pode causar um ineficiente ler-modificar-reescrever).

blocks é o tamanho do arquivo em blocos de 512 bytes.

Nem todos os sistema de arquivos utilizam todos os campos de tempo.

atime tempo do último acesso. Por exemplo: Read.

mtime tempo da última modificação. Por exemplo: Write. O mtime de um diretório muda quando um arquivo é criado ou apagado no diretório. mtime não é modificado por mudanças no dono, modo, etc.

ctime tempo da última mudança. Por exemplo: Write. ctime é modificado por mudanças no dono, modo, etc.

mode pode ser (em octal):
0170000 - FSManager_TYPE_MASK - máscara para o tipo de arquivo
0140000 - FSManager_TYPE_SOCKET - socket
0120000 - FSManager_TYPE_LINK - link simbólico
0100000 - FSManager_TYPE_FILE - arquivo
0060000 - FSManager_TYPE_BLOCK_DEV - dispositivo de bloco
0040000 - FSManager_TYPE_DIR - diretório
0020000 - FSManager_TYPE_CHAR_DEV - dispositivo de caracter
0010000 - FSManager_TYPE_FIFO - fifo
0004000 - FSManager_UID_BIT - UID bit
0002000 - FSManager_GID_BIT - GID bit
0001000 - FSManager_STICKY_BIT - sticky bit
0000700 - FSManager_USER_RWX - máscara para permissões dono
0000400 - FSManager_USER_READ - dono tem permissão de leitura
0000200 - FSManager_USER_WRITE - dono tem permissão de escrita
0000100 - FSManager_USER_EXEC - dono tem permissão de execução
0000070 - FSManager_GROUP_RWX - máscara para permissões grupo
0000040 - FSManager_GROUP_READ - grupo tem permissão de leitura
0000020 - FSManager_GROUP_WRITE - grupo tem permissão de escrita
0000010 - FSManager_GROUP_EXEC - grupo tem permissão de execução
0000007 - FSManager_OTHER_RWX - máscara para permissões outros
0000004 - FSManager_OTHER_READ - outros tem permissão de leitura
0000002 - FSManager_OTHER_WRITE - outros tem permissão de escrita
0000001 - FSManager_OTHER_EXEC - outros tem permissão de execução

typedef struct {
    FSManager_Handle *fd;
    int flags;
    void *buf;
    int size;
} FSManager_FDIO;

Onde fd é o descritor do arquivo/diretório, buf é onde os dados serão colocados no caso de leitura ou donde os dados serão lidos para escrita, size é a quantidade de bytes a serem lidos ou escritos e flags deve ser 0 ou o somatório de:

Em caso de sucesso size terá a quantidade de bytes lidos ou escritos.

typedef struct {
    FileSystem_Handle *fd;
} FSManager_Handle;

É usada apenas por módulos que implementam a interface FileSystem.

typedef struct {
    const char *str;
    unsigned int len;
    unsigned int hash;
} FSManager_ExStr;

É usada apenas por módulos que implementam a interface FileSystem.

typedef struct FSManager__Dentry {
    unsigned int count;
    unsigned int mode;
    unsigned int flags;
    struct FSManager__Dentry *parent;
    FSManager_FS *fs;
    struct FSManager__Dentry *hashNext;
    struct FSManager__Dentry *hashPrior;
    struct FSManager__Dentry *lruNext;
    struct FSManager__Dentry *lruPrior;
    struct FSManager__Dentry *mounted;
    unsigned int version;
    TaskManager_Semaphore lock;
    FSManager_ExStr name;
    void *fsData;
    char iname[FSManager_INAME_LEN];
} FSManager_Dentry;

É usada apenas por módulos que implementam a interface FileSystem.

Configuração

Esta interface define os seguintes grupos e chaves disponíveis através da interface CfgManager:

/system/FSManager/root

As seguintes chaves estão definidas neste grupo:

  • fsImp - nome da implementação da interface FileSystem a ser utilizada para montar o diretório raiz (o sistema de arquivos a ser montado)
  • devImp - nome da implementação da interface BlockDev a ser utilizada para montar o diretório raiz (o dispositivo a ser montado)
  • unit - número da unidade do dispositivo a ser utilizada
  • data - dados a serem passados para o sistema de arquivos

Alguns exemplos:

  • fsImp = Ext2FS
  • devImp = FDC
  • unit = 0x0
  • data =

Funções para o sistema

Estas funções são de uso exclusivo dos módulos do sistema.

0x00 - Close

Sintaxe

int FSManager_Close(FSManager_Handle *fd);

Propriedades

Descrição

Esta função fecha o descritor de arquivo fd.

Valor de retorno

0x02 - Mount

Sintaxe

int FSManager_Mount(const char *fsImp, const char *devImp, unsigned int unit, const char *path, int prop, const char *data);

Propriedades

Descrição

Esta função monta o sistema de arquivos fsImp com as propriedades prop na árvore de diretórios. fsImp vai usar a unidade unit do dispositivo devImp.

fsImp tem que ser a implementação da interface FileSystem. E devImp da interface BlockDev.

data são dados repassados para o sistema de arquivos e, por isso, são dependentes do sistema de arquivos.

Se path não for um caminho completo, ou seja, começar com "/" e se a tarefa que chama a função tiver um diretório corrente, este será usado. Caso contrário o diretório raiz será usado.

prop pode ser:

Não é permitido montar um sistema de arquivos num diretório que já tem um sistema de arquivos montado.

Valor de retorno

0x03 - Open

Sintaxe

int FSManager_Open(const char *pathname, int prop, FSManager_Handle **fd);

Propriedades

Descrição

Esta função abre o arquivo/diretório pathname com as propriedades prop.

prop pode ser:

FSManager_READ e/ou FSManager_WRITE são obrigatórios, os demais podem ser adicionados. (FSManager_WRITE + FSManager_CREATE, por exemplo).

No caso de prop ter FSManager_CREATE, prop pode ter também os seguintes valores em octal:

Se pathname não for um caminho completo, ou seja, começar com "/" e se a tarefa que chama a função tiver um diretório corrente, este será usado. Caso contrário o diretório raiz será usado.

O ponteiro de leitura/escrita será posicionado no início.

Valor de retorno

0x05 - Read

Sintaxe

int FSManager_Read(FSManager_FDIO *request);

Propriedades

Descrição

Esta função processa o pedido de leitura request.

No caso de leitura de diretórios, buf vai conter as entradas lidas (FSManager_DirEntry).

Em caso de sucesso, o ponteiro de leitura/escrita será avançado da quantidade de bytes lidos.

Valor de retorno

0x07 - Remove

Sintaxe

int FSManager_Remove(const char *pathname);

Propriedades

Descrição

Esta função remove pathname.

Se pathname não for um caminho completo, ou seja, começar com "/" e se a tarefa que chama a função tiver um diretório corrente, este será usado. Caso contrário o diretório raiz será usado.

O arquivo/diretório pathname pode estar sendo usado. Quem está usando continua podendo usar, mas não é possível abrir, listar, etc.

Um diretório com arquivos não pode ser removido.

Valor de retorno

0x09 - RewindDir

Sintaxe

int FSManager_RewindDir(FSManager_Handle *fd);

Propriedades

Descrição

Esta função posiciona a leitura de entradas do diretório fd no início.

Valor de retorno

0x0a - Seek

Sintaxe

int FSManager_Seek(FSManager_Handle *fd, int count, int prop, int *newPos);

Propriedades

Descrição

Esta função posiciona o ponto de leitura/escrita do arquivo fd na posição count bytes de acordo com prop.

prop pode ser:

Em caso de sucesso, newPos, se for diferente de nulo, conterá a nova posição.

Valor de retorno

0x0b - Status

Sintaxe

int FSManager_Status(const char *pathname, FSManager_EntryStatus *buf, int prop);

Propriedades

Descrição

Esta função obtém informações sobre pathname e as coloca em buf.

Se pathname não for um caminho completo, ou seja, começar com "/" e se a tarefa que chama a função tiver um diretório corrente, este será usado. Caso contrário o diretório raiz será usado.

prop pode ser:

Valor de retorno

0x01 - StatusFD

Sintaxe

int FSManager_StatusFD(FSManager_Handle *fd, FSManager_EntryStatus *buf, int prop);

Propriedades

Descrição

Esta função obtém informações sobre fd, que deve ter sido aberto por Open, e as coloca em buf.

prop pode ser:

Valor de retorno

0x0c - Unmount

Sintaxe

int FSManager_Unmount(const char *path, int prop);

Propriedades

Descrição

Esta função desmonta o sistema de arquivos montado em path.

Se path não for um caminho completo, ou seja, começar com "/" e se a tarefa que chama a função tiver um diretório corrente, este será usado. Caso contrário o diretório raiz será usado.

prop pode ser 0 ou o somatório de:

Valor de retorno

0x0d - Write

Sintaxe

int FSManager_Write(FSManager_FDIO *request);

Propriedades

Descrição

Esta função processa o pedido de escrita request.

Em caso de sucesso, o ponteiro de leitura/escrita será avançado desse valor.

Valor de retorno

Funções para o usuário

Estas funções são de uso exclusivo dos módulos do usuário.

0x0e - UClose

Sintaxe

int FSManager_UClose(int fd);

Propriedades

Do usuário.

Descrição

Esta função fecha o descritor fd, que pode ser um arquivo ou um diretório.

Valor de retorno

0x0f - UChangeDir

Sintaxe

int FSManager_UChangeDir(const char *path);

Propriedades

Do usuário.

Descrição

Esta função define o diretório corrente da tarefa para path.

O diretório corrente é utilizando quando um caminho não começa com "/".

Valor de retorno

0x10 - UChangeRoot

Sintaxe

int FSManager_UChangeRoot(const char *path);

Propriedades

Do usuário.

Descrição

Esta função define o diretório raiz da tarefa para path.

O diretório raiz é utilizando quando um caminho começa com "/".

Valor de retorno

0x11 - UMount

Sintaxe

int FSManager_UMount(const char *fsImp, const char *devImp, unsigned int unit, const char *path, int prop, const char *data);

Propriedades

Do usuário.

Descrição

Esta função monta o sistema de arquivos fsImp com as propriedades prop na árvore de diretórios. fsImp vai usar a unidade unit do dispositivo devImp.

fsImp tem que ser a implementação da interface FileSystem. E devImp da interface BlockDev.

data são dados repassados para o sistema de arquivos e, por isso, são dependentes do sistema de arquivos.

prop pode ser:

Valor de retorno

0x12 - UOpen

Sintaxe

int FSManager_UOpen(const char *pathname, int prop);

Propriedades

Do usuário.

Descrição

Esta função abre o arquivo/diretório pathname com as propriedades prop.

prop pode ser:

FSManager_READ e/ou FSManager_WRITE são obrigatórios, os demais podem ser adicionados. (FSManager_WRITE + FSManager_CREATE, por exemplo).

No caso de prop ter FSManager_CREATE, prop pode ter também os seguintes valores em octal:

Se pathname não for um caminho completo, ou seja, começar com "/" o diretório corrente será usado.

O ponteiro de leitura/escrita será posicionado no início.

Valor de retorno

0x14 - URead

Sintaxe

int FSManager_URead(int fd, void *buf, int size);

Propriedades

Do usuário.

Descrição

Esta função lê size bytes do arquivo/diretório fd e os coloca em buf.

No caso de leitura de diretórios, buf vai conter as entradas lidas (FSManager_DirEntry).

Em caso de sucesso, o ponteiro de leitura/escrita será avançado da quantidade de bytes lidos.

Valor de retorno

0x16 - URemove

Sintaxe

int FSManager_URemove(const char *pathname);

Propriedades

Do usuário.

Descrição

Esta função remove pathname.

Se pathname não for um caminho completo, ou seja, começar com "/" o diretório corrente será usado.

O arquivo/diretório pathname pode estar sendo usado. Quem está usando continua podendo usar, mas não é possível abrir, listar, etc.

Um diretório com arquivos não pode ser removido.

Valor de retorno

0x18 - URewindDir

Sintaxe

int FSManager_URewindDir(int fd);

Propriedades

Do usuário.

Descrição

Esta função posiciona a leitura de entradas do diretório fd no início.

Valor de retorno

0x19 - USeek

Sintaxe

int FSManager_USeek(int fd, int count, int prop);

Propriedades

Do usuário.

Descrição

Esta função posiciona o ponto de leitura/escrita do arquivo fd na posição count bytes de acordo com prop.

prop pode ser:

Valor de retorno

0x1a - UStatus

Sintaxe

int FSManager_UStatus(const char *pathname, FSManager_EntryStatus *buf, int prop);

Propriedades

Do usuário.

Descrição

Esta função obtém informações sobre pathname e as coloca em buf.

prop pode ser:

Valor de retorno

0x04 - UStatusFD

Sintaxe

int FSManager_UStatusFD(int fd, FSManager_EntryStatus *buf, int prop);

Propriedades

Do usuário.

Descrição

Esta função obtém informações sobre fd, que deve ter sido aberto por UOpen, e as coloca em buf.

prop não é usado ainda.

Valor de retorno

0x1b - UUnmount

Sintaxe

int FSManager_UUnmount(const char *path, int prop);

Propriedades

Do usuário.

Descrição

Esta função desmonta o sistema de arquivos montado em path.

prop pode ser 0 ou o somatório de:

Valor de retorno

0x1c - UWrite

Sintaxe

int FSManager_UWrite(int fd, void *buf, int count);

Propriedades

Do usuário.

Descrição

Esta função escreve count bytes de buf no arquivo fd.

Em caso de sucesso, o ponteiro de leitura/escrita será avançado da quantidade de bytes escritos.

Valor de retorno