#ifndef __FS_H #define __FS_H #include #include #include #include #include #include #include #include #include #define PATH_MAX 1024 /* include/linux/limits.h */ struct partition; struct node_d; struct stat; typedef struct filep { struct fs_device_d *fsdev; /* The device this FILE belongs to */ char *path; loff_t pos; /* current position in stream */ #define FILE_SIZE_STREAM ((loff_t) -1) loff_t size; /* The size of this inode */ ulong flags; /* the O_* flags from open */ void *priv; /* 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 { 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 (*symlink)(struct device_d *dev, const char *pathname, const char *newpath); int (*readlink)(struct device_d *dev, const char *pathname, char *name, size_t 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); loff_t (*lseek)(struct device_d *dev, FILE *f, loff_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, loff_t count, loff_t offset); int (*protect)(struct device_d *dev, FILE *f, size_t count, loff_t offset, int prot); int (*memmap)(struct device_d *dev, FILE *f, void **map, int flags); struct driver_d drv; enum filetype type; unsigned long flags; }; #define dev_to_fs_device(d) container_of(d, struct fs_device_d, dev) extern struct list_head fs_device_list; #define for_each_fs_device(f) list_for_each_entry(f, &fs_device_list, list) #define for_each_fs_device_safe(tmp, f) list_for_each_entry_safe(f, tmp, &fs_device_list, list) extern struct bus_type fs_bus; 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 cdev *cdev; char *path; struct device_d *parent_device; struct list_head list; char *options; char *linux_rootarg; }; #define drv_to_fs_driver(d) container_of(d, struct fs_driver_d, drv) int flush(int fd); int umount_by_cdev(struct cdev *cdev); /* not-so-standard functions */ #define ERASE_SIZE_ALL ((loff_t) - 1) int erase(int fd, loff_t count, loff_t offset); int protect(int fd, size_t count, loff_t offset, int prot); int protect_file(const char *file, int prot); void *memmap(int fd, int flags); #define FILESIZE_MAX ((loff_t)-1) #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); /* * 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); char *normalise_link(const char *pathname, const char* symlink); char *get_mounted_path(const char *path); struct cdev *get_cdev_by_mountpath(const char *path); /* Register a new filesystem driver */ int register_fs_driver(struct fs_driver_d *fsdrv); void automount_remove(const char *_path); int automount_add(const char *path, const char *cmd); void automount_print(void); int fsdev_open_cdev(struct fs_device_d *fsdev); const char *cdev_get_mount_path(struct cdev *cdev); const char *cdev_mount_default(struct cdev *cdev, const char *fsoptions); void mount_all(void); void fsdev_set_linux_rootarg(struct fs_device_d *fsdev, const char *str); char *path_get_linux_rootarg(const char *path); #endif /* __FS_H */