|
46 | 46 | #include "extmod/vfs_posix.h"
|
47 | 47 | #endif
|
48 | 48 |
|
| 49 | +#if MICROPY_VFS_ROM && MICROPY_VFS_ROM_IOCTL |
| 50 | +#include "extmod/vfs_rom.h" |
| 51 | +#endif |
| 52 | + |
49 | 53 | // For mp_vfs_proxy_call, the maximum number of additional args that can be passed.
|
50 | 54 | // A fixed maximum size is used to avoid the need for a costly variable array.
|
51 | 55 | #define PROXY_MAX_ARGS (2)
|
@@ -552,6 +556,32 @@ int mp_vfs_mount_and_chdir_protected(mp_obj_t bdev, mp_obj_t mount_point) {
|
552 | 556 | return ret;
|
553 | 557 | }
|
554 | 558 |
|
| 559 | +#if MICROPY_VFS_ROM && MICROPY_VFS_ROM_IOCTL |
| 560 | + |
| 561 | +int mp_vfs_mount_romfs_protected(void) { |
| 562 | + int ret; |
| 563 | + nlr_buf_t nlr; |
| 564 | + if (nlr_push(&nlr) == 0) { |
| 565 | + mp_obj_t args[2] = { MP_OBJ_NEW_SMALL_INT(MP_VFS_ROM_IOCTL_GET_SEGMENT), MP_OBJ_NEW_SMALL_INT(0) }; |
| 566 | + mp_obj_t rom = mp_vfs_rom_ioctl(2, args); |
| 567 | + mp_obj_t romfs = mp_call_function_1(MP_OBJ_FROM_PTR(&mp_type_vfs_rom), rom); |
| 568 | + mp_obj_t mount_point = MP_OBJ_NEW_QSTR(MP_QSTR__slash_rom); |
| 569 | + mp_call_function_2(MP_OBJ_FROM_PTR(&mp_vfs_mount_obj), romfs, mount_point); |
| 570 | + #if MICROPY_PY_SYS_PATH_ARGV_DEFAULTS |
| 571 | + // Add "/rom" and "/rom/lib" to `sys.path`. |
| 572 | + mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_rom)); |
| 573 | + mp_obj_list_append(mp_sys_path, MP_OBJ_NEW_QSTR(MP_QSTR__slash_rom_slash_lib)); |
| 574 | + #endif |
| 575 | + ret = 0; // success |
| 576 | + nlr_pop(); |
| 577 | + } else { |
| 578 | + ret = -MP_EIO; |
| 579 | + } |
| 580 | + return ret; |
| 581 | +} |
| 582 | + |
| 583 | +#endif |
| 584 | + |
555 | 585 | MP_REGISTER_ROOT_POINTER(struct _mp_vfs_mount_t *vfs_cur);
|
556 | 586 | MP_REGISTER_ROOT_POINTER(struct _mp_vfs_mount_t *vfs_mount_table);
|
557 | 587 |
|
|
0 commit comments