16
16
17
17
int dfs_romfs_mount (struct dfs_filesystem * fs , unsigned long rwflag , const void * data )
18
18
{
19
- struct romfs_dirent * root_dirent ;
19
+ struct root_data * root_data ;
20
20
21
21
if (data == NULL )
22
22
return - EIO ;
23
23
24
- root_dirent = (struct romfs_dirent * )data ;
25
- fs -> data = root_dirent ;
24
+ root_data = (struct root_data * )rt_malloc (sizeof (struct root_data ));
25
+ if (root_data )
26
+ {
27
+ long long size = sizeof (struct romfs_dirent );
28
+ root_data -> dirent = (struct romfs_dirent * )data ;
29
+ if ((const char * )root_data -> dirent -> data - root_data -> dirent -> name != 0x04 )
30
+ root_data -> offset = 0 ;
31
+ else
32
+ root_data -> offset = (long long )root_data -> dirent -> name != size ? ((long long )data - (long long )root_data -> dirent -> name + size ) : (long long )data ;
33
+ fs -> data = root_data ;
34
+ }
35
+ else
36
+ {
37
+ return - RT_ENOMEM ;
38
+ }
26
39
27
40
return RT_EOK ;
28
41
}
29
42
30
43
int dfs_romfs_unmount (struct dfs_filesystem * fs )
31
44
{
45
+ if (fs -> data )
46
+ {
47
+ rt_free (fs -> data );
48
+ }
49
+
32
50
return RT_EOK ;
33
51
}
34
52
@@ -45,26 +63,26 @@ rt_inline int check_dirent(struct romfs_dirent *dirent)
45
63
return 0 ;
46
64
}
47
65
48
- struct romfs_dirent * dfs_romfs_lookup (struct romfs_dirent * root_dirent , const char * path , rt_size_t * size )
66
+ struct romfs_dirent * dfs_romfs_lookup (struct root_data * root_data , const char * path , rt_size_t * size )
49
67
{
50
68
rt_size_t index , found ;
51
69
const char * subpath , * subpath_end ;
52
70
struct romfs_dirent * dirent ;
53
71
rt_size_t dirent_size ;
54
72
55
73
/* Check the root_dirent. */
56
- if (check_dirent (root_dirent ) != 0 )
74
+ if (check_dirent (root_data -> dirent ) != 0 )
57
75
return NULL ;
58
76
59
77
if (path [0 ] == '/' && path [1 ] == '\0' )
60
78
{
61
- * size = root_dirent -> size ;
62
- return root_dirent ;
79
+ * size = root_data -> dirent -> size ;
80
+ return root_data -> dirent ;
63
81
}
64
82
65
- /* goto root directory entries */
66
- dirent = (struct romfs_dirent * )root_dirent -> data ;
67
- dirent_size = root_dirent -> size ;
83
+ /* goto root directy entries */
84
+ dirent = (struct romfs_dirent * )( root_data -> dirent -> data + root_data -> offset ) ;
85
+ dirent_size = root_data -> dirent -> size ;
68
86
69
87
/* get the end position of this subpath */
70
88
subpath_end = path ;
@@ -84,8 +102,8 @@ struct romfs_dirent *dfs_romfs_lookup(struct romfs_dirent *root_dirent, const ch
84
102
{
85
103
if (check_dirent (& dirent [index ]) != 0 )
86
104
return NULL ;
87
- if (rt_strlen (dirent [index ].name ) == (subpath_end - subpath ) &&
88
- rt_strncmp (dirent [index ].name , subpath , (subpath_end - subpath )) == 0 )
105
+ if (rt_strlen (dirent [index ].name + root_data -> offset ) == (subpath_end - subpath ) &&
106
+ rt_strncmp (dirent [index ].name + root_data -> offset , subpath , (subpath_end - subpath )) == 0 )
89
107
{
90
108
dirent_size = dirent [index ].size ;
91
109
@@ -105,7 +123,7 @@ struct romfs_dirent *dfs_romfs_lookup(struct romfs_dirent *root_dirent, const ch
105
123
if (dirent [index ].type == ROMFS_DIRENT_DIR )
106
124
{
107
125
/* enter directory */
108
- dirent = (struct romfs_dirent * )dirent [index ].data ;
126
+ dirent = (struct romfs_dirent * )( dirent [index ].data + root_data -> offset ) ;
109
127
found = 1 ;
110
128
break ;
111
129
}
@@ -132,7 +150,9 @@ int dfs_romfs_read(struct dfs_fd *file, void *buf, size_t count)
132
150
{
133
151
rt_size_t length ;
134
152
struct romfs_dirent * dirent ;
153
+ struct root_data * root_data ;
135
154
155
+ root_data = (struct root_data * )file -> fs -> data ;
136
156
dirent = (struct romfs_dirent * )file -> data ;
137
157
RT_ASSERT (dirent != NULL );
138
158
@@ -147,7 +167,7 @@ int dfs_romfs_read(struct dfs_fd *file, void *buf, size_t count)
147
167
length = file -> size - file -> pos ;
148
168
149
169
if (length > 0 )
150
- rt_memcpy (buf , & (dirent -> data [file -> pos ]), length );
170
+ memcpy (buf , & (dirent -> data [file -> pos ]) + root_data -> offset , length );
151
171
152
172
/* update file current position */
153
173
file -> pos += length ;
@@ -157,7 +177,7 @@ int dfs_romfs_read(struct dfs_fd *file, void *buf, size_t count)
157
177
158
178
int dfs_romfs_lseek (struct dfs_fd * file , off_t offset )
159
179
{
160
- if (offset <= file -> size )
180
+ if (offset <= ( off_t ) file -> size )
161
181
{
162
182
file -> pos = offset ;
163
183
return file -> pos ;
@@ -176,19 +196,17 @@ int dfs_romfs_open(struct dfs_fd *file)
176
196
{
177
197
rt_size_t size ;
178
198
struct romfs_dirent * dirent ;
179
- struct romfs_dirent * root_dirent ;
180
- struct dfs_filesystem * fs ;
199
+ struct root_data * root_data ;
181
200
182
- fs = (struct dfs_filesystem * )file -> data ;
183
- root_dirent = (struct romfs_dirent * )fs -> data ;
201
+ root_data = (struct root_data * )file -> fs -> data ;
184
202
185
- if (check_dirent (root_dirent ) != 0 )
203
+ if (check_dirent (root_data -> dirent ) != 0 )
186
204
return - EIO ;
187
205
188
206
if (file -> flags & (O_CREAT | O_WRONLY | O_APPEND | O_TRUNC | O_RDWR ))
189
207
return - EINVAL ;
190
208
191
- dirent = dfs_romfs_lookup (root_dirent , file -> path , & size );
209
+ dirent = dfs_romfs_lookup (root_data , file -> path , & size );
192
210
if (dirent == NULL )
193
211
return - ENOENT ;
194
212
@@ -216,10 +234,10 @@ int dfs_romfs_stat(struct dfs_filesystem *fs, const char *path, struct stat *st)
216
234
{
217
235
rt_size_t size ;
218
236
struct romfs_dirent * dirent ;
219
- struct romfs_dirent * root_dirent ;
237
+ struct root_data * root_data ;
220
238
221
- root_dirent = (struct romfs_dirent * )fs -> data ;
222
- dirent = dfs_romfs_lookup (root_dirent , path , & size );
239
+ root_data = (struct root_data * )fs -> data ;
240
+ dirent = dfs_romfs_lookup (root_data , path , & size );
223
241
224
242
if (dirent == NULL )
225
243
return - ENOENT ;
@@ -242,31 +260,33 @@ int dfs_romfs_stat(struct dfs_filesystem *fs, const char *path, struct stat *st)
242
260
243
261
int dfs_romfs_getdents (struct dfs_fd * file , struct dirent * dirp , uint32_t count )
244
262
{
245
- rt_size_t index ;
263
+ uint32_t index ;
246
264
const char * name ;
247
265
struct dirent * d ;
248
266
struct romfs_dirent * dirent , * sub_dirent ;
267
+ struct root_data * root_data ;
249
268
269
+ root_data = (struct root_data * )file -> fs -> data ;
250
270
dirent = (struct romfs_dirent * )file -> data ;
251
271
if (check_dirent (dirent ) != 0 )
252
272
return - EIO ;
253
273
RT_ASSERT (dirent -> type == ROMFS_DIRENT_DIR );
254
274
255
275
/* enter directory */
256
- dirent = (struct romfs_dirent * )dirent -> data ;
276
+ dirent = (struct romfs_dirent * )( dirent -> data + root_data -> offset ) ;
257
277
258
278
/* make integer count */
259
279
count = (count / sizeof (struct dirent ));
260
280
if (count == 0 )
261
281
return - EINVAL ;
262
282
263
283
index = 0 ;
264
- for (index = 0 ; index < count && file -> pos < file -> size ; index ++ )
284
+ for (index = 0 ; index < count && ( size_t ) file -> pos < file -> size ; index ++ )
265
285
{
266
286
d = dirp + index ;
267
287
268
288
sub_dirent = & dirent [file -> pos ];
269
- name = sub_dirent -> name ;
289
+ name = sub_dirent -> name + root_data -> offset ;
270
290
271
291
/* fill dirent */
272
292
if (sub_dirent -> type == ROMFS_DIRENT_DIR )
@@ -276,7 +296,7 @@ int dfs_romfs_getdents(struct dfs_fd *file, struct dirent *dirp, uint32_t count)
276
296
277
297
d -> d_namlen = rt_strlen (name );
278
298
d -> d_reclen = (rt_uint16_t )sizeof (struct dirent );
279
- rt_strncpy (d -> d_name , name , DFS_PATH_MAX );
299
+ rt_strncpy (d -> d_name , name , rt_strlen ( name ) + 1 );
280
300
281
301
/* move to next position */
282
302
++ file -> pos ;
0 commit comments