Skip to content

Commit e68f934

Browse files
authored
[dfs][romfs]支持相对地址模式 (#5768)
1 parent da3d61e commit e68f934

File tree

3 files changed

+58
-32
lines changed

3 files changed

+58
-32
lines changed

components/dfs/filesystems/romfs/dfs_romfs.c

+49-29
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,37 @@
1616

1717
int dfs_romfs_mount(struct dfs_filesystem *fs, unsigned long rwflag, const void *data)
1818
{
19-
struct romfs_dirent *root_dirent;
19+
struct root_data *root_data;
2020

2121
if (data == NULL)
2222
return -EIO;
2323

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+
}
2639

2740
return RT_EOK;
2841
}
2942

3043
int dfs_romfs_unmount(struct dfs_filesystem *fs)
3144
{
45+
if (fs->data)
46+
{
47+
rt_free(fs->data);
48+
}
49+
3250
return RT_EOK;
3351
}
3452

@@ -45,26 +63,26 @@ rt_inline int check_dirent(struct romfs_dirent *dirent)
4563
return 0;
4664
}
4765

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)
4967
{
5068
rt_size_t index, found;
5169
const char *subpath, *subpath_end;
5270
struct romfs_dirent *dirent;
5371
rt_size_t dirent_size;
5472

5573
/* Check the root_dirent. */
56-
if (check_dirent(root_dirent) != 0)
74+
if (check_dirent(root_data->dirent) != 0)
5775
return NULL;
5876

5977
if (path[0] == '/' && path[1] == '\0')
6078
{
61-
*size = root_dirent->size;
62-
return root_dirent;
79+
*size = root_data->dirent->size;
80+
return root_data->dirent;
6381
}
6482

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;
6886

6987
/* get the end position of this subpath */
7088
subpath_end = path;
@@ -84,8 +102,8 @@ struct romfs_dirent *dfs_romfs_lookup(struct romfs_dirent *root_dirent, const ch
84102
{
85103
if (check_dirent(&dirent[index]) != 0)
86104
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)
89107
{
90108
dirent_size = dirent[index].size;
91109

@@ -105,7 +123,7 @@ struct romfs_dirent *dfs_romfs_lookup(struct romfs_dirent *root_dirent, const ch
105123
if (dirent[index].type == ROMFS_DIRENT_DIR)
106124
{
107125
/* enter directory */
108-
dirent = (struct romfs_dirent *)dirent[index].data;
126+
dirent = (struct romfs_dirent *)(dirent[index].data + root_data->offset);
109127
found = 1;
110128
break;
111129
}
@@ -132,7 +150,9 @@ int dfs_romfs_read(struct dfs_fd *file, void *buf, size_t count)
132150
{
133151
rt_size_t length;
134152
struct romfs_dirent *dirent;
153+
struct root_data *root_data;
135154

155+
root_data = (struct root_data *)file->fs->data;
136156
dirent = (struct romfs_dirent *)file->data;
137157
RT_ASSERT(dirent != NULL);
138158

@@ -147,7 +167,7 @@ int dfs_romfs_read(struct dfs_fd *file, void *buf, size_t count)
147167
length = file->size - file->pos;
148168

149169
if (length > 0)
150-
rt_memcpy(buf, &(dirent->data[file->pos]), length);
170+
memcpy(buf, &(dirent->data[file->pos]) + root_data->offset, length);
151171

152172
/* update file current position */
153173
file->pos += length;
@@ -157,7 +177,7 @@ int dfs_romfs_read(struct dfs_fd *file, void *buf, size_t count)
157177

158178
int dfs_romfs_lseek(struct dfs_fd *file, off_t offset)
159179
{
160-
if (offset <= file->size)
180+
if (offset <= (off_t)file->size)
161181
{
162182
file->pos = offset;
163183
return file->pos;
@@ -176,19 +196,17 @@ int dfs_romfs_open(struct dfs_fd *file)
176196
{
177197
rt_size_t size;
178198
struct romfs_dirent *dirent;
179-
struct romfs_dirent *root_dirent;
180-
struct dfs_filesystem *fs;
199+
struct root_data *root_data;
181200

182-
fs = (struct dfs_filesystem *)file->data;
183-
root_dirent = (struct romfs_dirent *)fs->data;
201+
root_data = (struct root_data *)file->fs->data;
184202

185-
if (check_dirent(root_dirent) != 0)
203+
if (check_dirent(root_data->dirent) != 0)
186204
return -EIO;
187205

188206
if (file->flags & (O_CREAT | O_WRONLY | O_APPEND | O_TRUNC | O_RDWR))
189207
return -EINVAL;
190208

191-
dirent = dfs_romfs_lookup(root_dirent, file->path, &size);
209+
dirent = dfs_romfs_lookup(root_data, file->path, &size);
192210
if (dirent == NULL)
193211
return -ENOENT;
194212

@@ -216,10 +234,10 @@ int dfs_romfs_stat(struct dfs_filesystem *fs, const char *path, struct stat *st)
216234
{
217235
rt_size_t size;
218236
struct romfs_dirent *dirent;
219-
struct romfs_dirent *root_dirent;
237+
struct root_data *root_data;
220238

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);
223241

224242
if (dirent == NULL)
225243
return -ENOENT;
@@ -242,31 +260,33 @@ int dfs_romfs_stat(struct dfs_filesystem *fs, const char *path, struct stat *st)
242260

243261
int dfs_romfs_getdents(struct dfs_fd *file, struct dirent *dirp, uint32_t count)
244262
{
245-
rt_size_t index;
263+
uint32_t index;
246264
const char *name;
247265
struct dirent *d;
248266
struct romfs_dirent *dirent, *sub_dirent;
267+
struct root_data *root_data;
249268

269+
root_data = (struct root_data *)file->fs->data;
250270
dirent = (struct romfs_dirent *)file->data;
251271
if (check_dirent(dirent) != 0)
252272
return -EIO;
253273
RT_ASSERT(dirent->type == ROMFS_DIRENT_DIR);
254274

255275
/* enter directory */
256-
dirent = (struct romfs_dirent *)dirent->data;
276+
dirent = (struct romfs_dirent *)(dirent->data + root_data->offset);
257277

258278
/* make integer count */
259279
count = (count / sizeof(struct dirent));
260280
if (count == 0)
261281
return -EINVAL;
262282

263283
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 ++)
265285
{
266286
d = dirp + index;
267287

268288
sub_dirent = &dirent[file->pos];
269-
name = sub_dirent->name;
289+
name = sub_dirent->name + root_data->offset;
270290

271291
/* fill dirent */
272292
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)
276296

277297
d->d_namlen = rt_strlen(name);
278298
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);
280300

281301
/* move to next position */
282302
++ file->pos;

components/dfs/filesystems/romfs/dfs_romfs.h

+6
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ struct romfs_dirent
2525
rt_size_t size; /* file size */
2626
};
2727

28+
struct root_data
29+
{
30+
struct romfs_dirent *dirent; /* root dirent */
31+
long long offset;
32+
};
33+
2834
int dfs_romfs_init(void);
2935
extern const struct romfs_dirent romfs_root;
3036

tools/mkromfs.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ def bin_data(self, base_addr=0x0):
191191
else:
192192
assert False, 'Unkown instance:%s' % str(c)
193193

194-
name = bytes(c.bin_name)
194+
name = bytes(c.bin_name.encode('utf-8'))
195195
name_addr = v_len
196196
v_len += len(name)
197197

@@ -200,7 +200,7 @@ def bin_data(self, base_addr=0x0):
200200
# pad the data to 4 bytes boundary
201201
pad_len = 4
202202
if len(data) % pad_len != 0:
203-
data += '\0' * (pad_len - len(data) % pad_len)
203+
data += ('\0' * (pad_len - len(data) % pad_len)).encode('utf-8')
204204
v_len += len(data)
205205

206206
d_li.append(self.bin_fmt.pack(*self.bin_item(
@@ -232,7 +232,7 @@ def get_c_data(tree):
232232

233233
def get_bin_data(tree, base_addr):
234234
v_len = base_addr + Folder.bin_fmt.size
235-
name = bytes('/\0\0\0')
235+
name = bytes('/\0\0\0'.encode("utf-8"))
236236
name_addr = v_len
237237
v_len += len(name)
238238
data_addr = v_len

0 commit comments

Comments
 (0)