blob: 97d5995c1f4a87709d9cc04c4f2b58c280d8fb15 [file] [log] [blame]
#ifndef __FS_H
#define __FS_H
#include <driver.h>
#define PATH_MAX 1024 /* include/linux/limits.h */
struct partition;
struct node_d;
struct stat;
struct dirent {
char d_name[256];
};
typedef struct dir {
struct device_d *dev;
struct fs_driver_d *fsdrv;
struct node_d *node;
struct dirent d;
void *priv; /* private data for the fs driver */
} DIR;
typedef struct filep {
struct device_d *dev; /* The device this FILE belongs to */
ulong pos; /* current position in stream */
ulong size; /* The size of this inode */
ulong flags; /* the O_* flags from open */
void *inode; /* private to the filesystem driver */
/* private fields. Mapping between FILE and filedescriptor number */
int no;
char in_use;
} FILE;
#define FS_DRIVER_NO_DEV 1
struct fs_driver_d {
char *name;
int (*probe) (struct device_d *dev);
int (*mkdir)(struct device_d *dev, const char *pathname);
int (*rmdir)(struct device_d *dev, const char *pathname);
/* create a file. The file is guaranteed to not exist */
int (*create)(struct device_d *dev, const char *pathname, mode_t mode);
int (*unlink)(struct device_d *dev, const char *pathname);
/* Truncate a file to given size */
int (*truncate)(struct device_d *dev, FILE *f, ulong size);
int (*open)(struct device_d *dev, FILE *f, const char *pathname);
int (*close)(struct device_d *dev, FILE *f);
int (*read)(struct device_d *dev, FILE *f, void *buf, size_t size);
int (*write)(struct device_d *dev, FILE *f, const void *buf, size_t size);
int (*flush)(struct device_d *dev, FILE *f);
off_t (*lseek)(struct device_d *dev, FILE *f, off_t pos);
struct dir* (*opendir)(struct device_d *dev, const char *pathname);
struct dirent* (*readdir)(struct device_d *dev, struct dir *dir);
int (*closedir)(struct device_d *dev, DIR *dir);
int (*stat)(struct device_d *dev, const char *file, struct stat *stat);
int (*ioctl)(struct device_d *dev, FILE *f, int request, void *buf);
int (*erase)(struct device_d *dev, FILE *f, size_t count,
unsigned long offset);
int (*protect)(struct device_d *dev, FILE *f, size_t count,
unsigned long offset, int prot);
int (*memmap)(struct device_d *dev, FILE *f, void **map, int flags);
struct driver_d drv;
unsigned long flags;
struct list_head list;
};
struct mtab_entry {
char path[PATH_MAX];
struct mtab_entry *next;
struct device_d *dev;
struct device_d *parent_device;
};
struct fs_device_d {
char *backingstore; /* the device we are associated with */
struct device_d dev; /* our own device */
struct fs_driver_d *driver;
struct mtab_entry mtab;
};
/*
* standard posix file functions
*/
int open(const char *pathname, int flags, ...);
int creat(const char *pathname, mode_t mode);
int unlink(const char *pathname);
int close(int fd);
int flush(int fd);
int stat(const char *filename, struct stat *s);
int read(int fd, void *buf, size_t count);
int ioctl(int fd, int request, void *buf);
ssize_t write(int fd, const void *buf, size_t count);
#define SEEK_SET 1
#define SEEK_CUR 2
#define SEEK_END 3
off_t lseek(int fildes, off_t offset, int whence);
int mkdir (const char *pathname, mode_t mode);
/* Create a directory and its parents */
int make_directory(const char *pathname);
int rmdir (const char *pathname);
const char *getcwd(void);
int chdir(const char *pathname);
DIR *opendir(const char *pathname);
struct dirent *readdir(DIR *dir);
int closedir(DIR *dir);
int mount (const char *device, const char *fsname, const char *path);
int umount(const char *pathname);
/* not-so-standard functions */
int erase(int fd, size_t count, unsigned long offset);
int protect(int fd, size_t count, unsigned long offset, int prot);
int protect_file(const char *file, int prot);
void *memmap(int fd, int flags);
#define PROT_READ 1
#define PROT_WRITE 2
#define LS_RECURSIVE 1
#define LS_SHOWARG 2
#define LS_COLUMN 4
int ls(const char *path, ulong flags);
char *mkmodestr(unsigned long mode, char *str);
/*
* Information about mounted devices.
* Note that we only support mounting on directories lying
* directly in / and of course the root directory itself
*/
struct mtab_entry *get_mtab_entry_by_path(const char *path);
struct mtab_entry *mtab_next_entry(struct mtab_entry *entry);
const char *fsdev_get_mountpoint(struct fs_device_d *fsdev);
/*
* Read a file into memory. Memory is allocated with malloc and must
* be freed with free() afterwards. This function allocates one
* byte more than actually needed and sets this to zero, so that
* it can be used for text files.
* If size is nonzero it s set to the file size.
*/
void *read_file(const char *filename, size_t *size);
/*
* This function turns 'path' into an absolute path and removes all occurrences
* of "..", "." and double slashes. The returned string must be freed wit free().
*/
char *normalise_path(const char *path);
/* Register a new filesystem driver */
int register_fs_driver(struct fs_driver_d *fsdrv);
#endif /* __FS_H */