@@ -160,10 +160,21 @@ static mp_obj_t vfs_posix_umount(mp_obj_t self_in) {
160
160
}
161
161
static MP_DEFINE_CONST_FUN_OBJ_1 (vfs_posix_umount_obj , vfs_posix_umount ) ;
162
162
163
+ static inline bool vfs_posix_is_readonly (mp_obj_vfs_posix_t * self ) {
164
+ return self -> readonly ;
165
+ }
166
+
167
+ static void vfs_posix_require_writable (mp_obj_t self_in ) {
168
+ mp_obj_vfs_posix_t * self = MP_OBJ_TO_PTR (self_in );
169
+ if (vfs_posix_is_readonly (self )) {
170
+ mp_raise_OSError (MP_EROFS );
171
+ }
172
+ }
173
+
163
174
static mp_obj_t vfs_posix_open (mp_obj_t self_in , mp_obj_t path_in , mp_obj_t mode_in ) {
164
175
mp_obj_vfs_posix_t * self = MP_OBJ_TO_PTR (self_in );
165
176
const char * mode = mp_obj_str_get_str (mode_in );
166
- if (self -> readonly
177
+ if (vfs_posix_is_readonly ( self )
167
178
&& (strchr (mode , 'w' ) != NULL || strchr (mode , 'a' ) != NULL || strchr (mode , '+' ) != NULL )) {
168
179
mp_raise_OSError (MP_EROFS );
169
180
}
@@ -303,6 +314,7 @@ typedef struct _mp_obj_listdir_t {
303
314
} mp_obj_listdir_t ;
304
315
305
316
static mp_obj_t vfs_posix_mkdir (mp_obj_t self_in , mp_obj_t path_in ) {
317
+ vfs_posix_require_writable (self_in );
306
318
mp_obj_vfs_posix_t * self = MP_OBJ_TO_PTR (self_in );
307
319
const char * path = vfs_posix_get_path_str (self , path_in );
308
320
MP_THREAD_GIL_EXIT ();
@@ -320,11 +332,13 @@ static mp_obj_t vfs_posix_mkdir(mp_obj_t self_in, mp_obj_t path_in) {
320
332
static MP_DEFINE_CONST_FUN_OBJ_2 (vfs_posix_mkdir_obj , vfs_posix_mkdir ) ;
321
333
322
334
static mp_obj_t vfs_posix_remove (mp_obj_t self_in , mp_obj_t path_in ) {
335
+ vfs_posix_require_writable (self_in );
323
336
return vfs_posix_fun1_helper (self_in , path_in , unlink );
324
337
}
325
338
static MP_DEFINE_CONST_FUN_OBJ_2 (vfs_posix_remove_obj , vfs_posix_remove ) ;
326
339
327
340
static mp_obj_t vfs_posix_rename (mp_obj_t self_in , mp_obj_t old_path_in , mp_obj_t new_path_in ) {
341
+ vfs_posix_require_writable (self_in );
328
342
mp_obj_vfs_posix_t * self = MP_OBJ_TO_PTR (self_in );
329
343
const char * old_path = vfs_posix_get_path_str (self , old_path_in );
330
344
const char * new_path = vfs_posix_get_path_str (self , new_path_in );
@@ -339,6 +353,7 @@ static mp_obj_t vfs_posix_rename(mp_obj_t self_in, mp_obj_t old_path_in, mp_obj_
339
353
static MP_DEFINE_CONST_FUN_OBJ_3 (vfs_posix_rename_obj , vfs_posix_rename ) ;
340
354
341
355
static mp_obj_t vfs_posix_rmdir (mp_obj_t self_in , mp_obj_t path_in ) {
356
+ vfs_posix_require_writable (self_in );
342
357
return vfs_posix_fun1_helper (self_in , path_in , rmdir );
343
358
}
344
359
static MP_DEFINE_CONST_FUN_OBJ_2 (vfs_posix_rmdir_obj , vfs_posix_rmdir ) ;
0 commit comments