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