92 lines
2.9 KiB
C
92 lines
2.9 KiB
C
/* vim: tabstop=4 shiftwidth=4 noexpandtab
|
|
*/
|
|
#ifndef FS_H
|
|
#define FS_H
|
|
|
|
#define PATH_SEPARATOR '/'
|
|
#define PATH_SEPARATOR_STRING "/"
|
|
#define PATH_UP ".."
|
|
#define PATH_DOT "."
|
|
|
|
#define FS_FILE 0x01
|
|
#define FS_DIRECTORY 0x02
|
|
#define FS_CHARDEVICE 0x04
|
|
#define FS_BLOCKDEVICE 0x08
|
|
#define FS_PIPE 0x10
|
|
#define FS_SYMLINK 0x20
|
|
#define FS_MOUNTPOINT 0x40
|
|
|
|
#define _IFMT 0170000 /* type of file */
|
|
#define _IFDIR 0040000 /* directory */
|
|
#define _IFCHR 0020000 /* character special */
|
|
#define _IFBLK 0060000 /* block special */
|
|
#define _IFREG 0100000 /* regular */
|
|
#define _IFLNK 0120000 /* symbolic link */
|
|
#define _IFSOCK 0140000 /* socket */
|
|
#define _IFIFO 0010000 /* fifo */
|
|
|
|
struct fs_node;
|
|
|
|
typedef uint32_t (*read_type_t) (struct fs_node *, uint32_t, uint32_t, uint8_t *);
|
|
typedef uint32_t (*write_type_t) (struct fs_node *, uint32_t, uint32_t, uint8_t *);
|
|
typedef void (*open_type_t) (struct fs_node *, uint8_t read, uint8_t write);
|
|
typedef void (*close_type_t) (struct fs_node *);
|
|
typedef struct dirent *(*readdir_type_t) (struct fs_node *, uint32_t);
|
|
typedef struct fs_node *(*finddir_type_t) (struct fs_node *, char *name);
|
|
typedef void (*create_type_t) (struct fs_node *, char *name, uint16_t permission);
|
|
typedef void (*mkdir_type_t) (struct fs_node *, char *name, uint16_t permission);
|
|
|
|
typedef struct fs_node {
|
|
char name[256]; // The filename.
|
|
uint32_t mask; // The permissions mask.
|
|
uint32_t uid; // The owning user.
|
|
uint32_t gid; // The owning group.
|
|
uint32_t flags; // Flags (node type, etc).
|
|
uint32_t inode; // Inode number.
|
|
uint32_t length; // Size of the file, in byte.
|
|
uint32_t impl; // Used to keep track which fs it belongs to.
|
|
read_type_t read;
|
|
write_type_t write;
|
|
open_type_t open;
|
|
close_type_t close;
|
|
readdir_type_t readdir;
|
|
finddir_type_t finddir;
|
|
create_type_t create;
|
|
mkdir_type_t mkdir;
|
|
struct fs_node *ptr; // Used by mountpoints and symlinks.
|
|
uint32_t offset;
|
|
} fs_node_t;
|
|
|
|
struct dirent {
|
|
uint32_t ino; // Inode number.
|
|
char name[256]; // The filename.
|
|
};
|
|
|
|
struct stat {
|
|
uint16_t st_dev;
|
|
uint16_t st_ino;
|
|
uint32_t st_mode;
|
|
uint16_t st_nlink;
|
|
uint16_t st_uid;
|
|
uint16_t st_gid;
|
|
uint16_t st_rdev;
|
|
uint32_t st_size;
|
|
};
|
|
|
|
extern fs_node_t *fs_root;
|
|
extern fs_node_t * null_device_create();
|
|
|
|
uint32_t read_fs(fs_node_t *node, uint32_t offset, uint32_t size, uint8_t *buffer);
|
|
uint32_t write_fs(fs_node_t *node, uint32_t offset, uint32_t size, uint8_t *buffer);
|
|
void open_fs(fs_node_t *node, uint8_t read, uint8_t write);
|
|
void close_fs(fs_node_t *node);
|
|
struct dirent *readdir_fs(fs_node_t *node, uint32_t index);
|
|
fs_node_t *finddir_fs(fs_node_t *node, char *name);
|
|
int mkdir_fs(char *name, uint16_t permission);
|
|
int create_file_fs(char *name, uint16_t permission);
|
|
fs_node_t *kopen(char *filename, uint32_t flags);
|
|
char *canonicalize_path(char *cwd, char *input);
|
|
fs_node_t *clone_fs(fs_node_t * source);
|
|
|
|
#endif
|