1 /* 2 * Copyright (c) 2006-2023, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2005-01-26 Bernard The first version. 9 * 2023-05-05 Bernard Change to dfs v2.0 10 */ 11 12 #ifndef __DFS_FILE_H__ 13 #define __DFS_FILE_H__ 14 15 #include <dfs.h> 16 #include <dfs_fs.h> 17 18 #ifdef __cplusplus 19 extern "C" 20 { 21 #endif 22 23 #define STDIN_FILENO 0 /* standard input file descriptor */ 24 #define STDOUT_FILENO 1 /* standard output file descriptor */ 25 #define STDERR_FILENO 2 /* standard error file descriptor */ 26 27 struct dfs_file; 28 struct dfs_vnode; 29 struct dfs_dentry; 30 struct dfs_attr; 31 32 struct rt_pollreq; 33 struct dirent; 34 struct lwp_avl_struct; 35 struct file_lock; 36 struct dfs_aspace; 37 38 struct dfs_file_ops 39 { 40 int (*open)(struct dfs_file *file); 41 int (*close)(struct dfs_file *file); 42 int (*ioctl)(struct dfs_file *file, int cmd, void *arg); 43 ssize_t (*read)(struct dfs_file *file, void *buf, size_t count, off_t *pos); 44 ssize_t (*write)(struct dfs_file *file, const void *buf, size_t count, off_t *pos); 45 int (*flush)(struct dfs_file *file); 46 off_t (*lseek)(struct dfs_file *file, off_t offset, int wherece); 47 int (*truncate)(struct dfs_file *file, off_t offset); 48 int (*getdents)(struct dfs_file *file, struct dirent *dirp, uint32_t count); 49 int (*poll)(struct dfs_file *file, struct rt_pollreq *req); 50 51 int (*mmap)(struct dfs_file *file, struct lwp_avl_struct *mmap); 52 int (*lock)(struct dfs_file *file, struct file_lock *flock); 53 int (*flock)(struct dfs_file *file, int, struct file_lock *flock); 54 }; 55 56 struct dfs_vnode 57 { 58 uint32_t flags; 59 uint32_t mode; 60 int type; /* node type */ 61 62 rt_atomic_t ref_count; /* reference count */ 63 64 struct dfs_mnt *mnt; /* which mounted file system does this vnode belong to */ 65 66 size_t size; 67 uint32_t nlink; 68 69 const struct dfs_file_ops *fops; 70 71 unsigned int uid; 72 unsigned int gid; 73 struct timespec atime; 74 struct timespec mtime; 75 struct timespec ctime; 76 77 struct dfs_aspace *aspace; 78 struct rt_mutex lock; 79 80 void *data; /* private data of this file system */ 81 }; 82 83 /* file descriptor */ 84 #define DFS_FD_MAGIC 0xfdfd 85 struct dfs_file 86 { 87 uint16_t magic; 88 uint16_t mode; 89 90 uint32_t flags; 91 rt_atomic_t ref_count; 92 93 off_t fpos; 94 struct rt_mutex pos_lock; 95 96 const struct dfs_file_ops *fops; 97 struct dfs_dentry *dentry; /* dentry of this file */ 98 struct dfs_vnode *vnode; /* vnode of this file */ 99 100 void *mmap_context; /* used by mmap routine */ 101 102 void *data; 103 }; 104 #define DFS_FILE_POS(dfs_file) ((dfs_file)->fpos) 105 106 /* file is open for reading */ 107 #define FMODE_READ 0x1 108 /* file is open for writing */ 109 #define FMODE_WRITE 0x2 110 /* file is seekable */ 111 #define FMODE_LSEEK 0x4 112 /* file can be accessed using pread */ 113 #define FMODE_PREAD 0x8 114 /* file can be accessed using pwrite */ 115 #define FMODE_PWRITE 0x10 116 /* File is opened for execution with sys_execve / sys_uselib */ 117 #define FMODE_EXEC 0x20 118 /* File is opened with O_NDELAY (only set for block devices) */ 119 #define FMODE_NDELAY 0x40 120 /* File is opened with O_EXCL (only set for block devices) */ 121 #define FMODE_EXCL 0x80 122 123 /* dfs_vnode.c */ 124 int dfs_vnode_init(struct dfs_vnode *vnode, int type, const struct dfs_file_ops *fops); 125 struct dfs_vnode *dfs_vnode_create(void); 126 int dfs_vnode_destroy(struct dfs_vnode* vnode); 127 128 struct dfs_vnode *dfs_vnode_ref(struct dfs_vnode *vnode); 129 void dfs_vnode_unref(struct dfs_vnode *vnode); 130 131 /*dfs_file.c*/ 132 #ifdef RT_USING_SMART 133 struct dfs_mmap2_args 134 { 135 void *addr; 136 size_t length; 137 int prot; 138 int flags; 139 off_t pgoffset; 140 size_t min_align_size; 141 142 struct rt_lwp *lwp; 143 void *ret; 144 }; 145 #endif 146 147 void dfs_file_init(struct dfs_file *file); 148 void dfs_file_deinit(struct dfs_file *file); 149 150 int dfs_file_open(struct dfs_file *file, const char *path, int flags, mode_t mode); 151 int dfs_file_close(struct dfs_file *file); 152 153 off_t dfs_file_get_fpos(struct dfs_file *file); 154 void dfs_file_set_fpos(struct dfs_file *file, off_t fpos); 155 ssize_t dfs_file_pread(struct dfs_file *file, void *buf, size_t len, off_t offset); 156 ssize_t dfs_file_read(struct dfs_file *file, void *buf, size_t len); 157 ssize_t dfs_file_pwrite(struct dfs_file *file, const void *buf, size_t len, off_t offset); 158 ssize_t dfs_file_write(struct dfs_file *file, const void *buf, size_t len); 159 off_t generic_dfs_lseek(struct dfs_file *file, off_t offset, int whence); 160 off_t dfs_file_lseek(struct dfs_file *file, off_t offset, int wherece); 161 int dfs_file_stat(const char *path, struct stat *buf); 162 int dfs_file_lstat(const char *path, struct stat *buf); 163 int dfs_file_setattr(const char *path, struct dfs_attr *attr); 164 int dfs_file_fstat(struct dfs_file *file, struct stat *buf); 165 int dfs_file_ioctl(struct dfs_file *file, int cmd, void *args); 166 int dfs_file_fcntl(int fd, int cmd, unsigned long arg); 167 int dfs_file_fsync(struct dfs_file *file); 168 int dfs_file_unlink(const char *path); 169 int dfs_file_link(const char *oldname, const char *newname); 170 int dfs_file_symlink(const char *oldname, const char *name); 171 int dfs_file_readlink(const char *path, char *buf, int bufsize); 172 int dfs_file_rename(const char *old_file, const char *new_file); 173 int dfs_file_ftruncate(struct dfs_file *file, off_t length); 174 int dfs_file_getdents(struct dfs_file *file, struct dirent *dirp, size_t nbytes); 175 int dfs_file_mkdir(const char *path, mode_t mode); 176 int dfs_file_rmdir(const char *pathname); 177 int dfs_file_isdir(const char *path); 178 int dfs_file_access(const char *path, mode_t mode); 179 int dfs_file_chdir(const char *path); 180 char *dfs_file_getcwd(char *buf, size_t size); 181 182 #ifdef RT_USING_SMART 183 int dfs_file_mmap2(struct dfs_file *file, struct dfs_mmap2_args *mmap2); 184 185 int dfs_file_mmap(struct dfs_file *file, struct dfs_mmap2_args *mmap2); 186 #endif 187 188 /* 0x5254 is just a magic number to make these relatively unique ("RT") */ 189 #define RT_FIOFTRUNCATE 0x52540000U 190 #define RT_FIOGETADDR 0x52540001U 191 #define RT_FIOMMAP2 0x52540002U 192 193 /* dfs_file_realpath mode */ 194 #define DFS_REALPATH_EXCEPT_LAST 0 195 #define DFS_REALPATH_EXCEPT_NONE 1 196 #define DFS_REALPATH_ONLY_LAST 3 197 198 char *dfs_file_realpath(struct dfs_mnt **mnt, const char *fullpath, int mode); 199 200 #ifdef __cplusplus 201 } 202 #endif 203 204 #endif 205