diff --git a/unix/modos.c b/unix/modos.c index 21b9c6f6a1..02d7e37e02 100644 --- a/unix/modos.c +++ b/unix/modos.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "py/nlr.h" #include "py/runtime.h" @@ -62,6 +63,31 @@ STATIC mp_obj_t mod_os_stat(mp_obj_t path_in) { } STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_os_stat_obj, mod_os_stat); +#if MICROPY_PY_OS_STATVFS +STATIC mp_obj_t mod_os_statvfs(mp_obj_t path_in) { + struct statvfs sb; + mp_uint_t len; + const char *path = mp_obj_str_get_data(path_in, &len); + + int res = statvfs(path, &sb); + RAISE_ERRNO(res, errno); + + mp_obj_tuple_t *t = mp_obj_new_tuple(10, NULL); + t->items[0] = MP_OBJ_NEW_SMALL_INT(sb.f_bsize); + t->items[1] = MP_OBJ_NEW_SMALL_INT(sb.f_frsize); + t->items[2] = MP_OBJ_NEW_SMALL_INT(sb.f_blocks); + t->items[3] = MP_OBJ_NEW_SMALL_INT(sb.f_bfree); + t->items[4] = MP_OBJ_NEW_SMALL_INT(sb.f_bavail); + t->items[5] = MP_OBJ_NEW_SMALL_INT(sb.f_files); + t->items[6] = MP_OBJ_NEW_SMALL_INT(sb.f_ffree); + t->items[7] = MP_OBJ_NEW_SMALL_INT(sb.f_favail); + t->items[8] = MP_OBJ_NEW_SMALL_INT(sb.f_flag); + t->items[9] = MP_OBJ_NEW_SMALL_INT(sb.f_namemax); + return t; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_os_statvfs_obj, mod_os_statvfs); +#endif + STATIC mp_obj_t mod_os_unlink(mp_obj_t path_in) { mp_uint_t len; const char *path = mp_obj_str_get_data(path_in, &len); @@ -88,6 +114,9 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_os_system_obj, mod_os_system); STATIC const mp_map_elem_t mp_module_os_globals_table[] = { { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR__os) }, { MP_OBJ_NEW_QSTR(MP_QSTR_stat), (mp_obj_t)&mod_os_stat_obj }, + #if MICROPY_PY_OS_STATVFS + { MP_OBJ_NEW_QSTR(MP_QSTR_statvfs), (mp_obj_t)&mod_os_statvfs_obj }, + #endif { MP_OBJ_NEW_QSTR(MP_QSTR_system), (mp_obj_t)&mod_os_system_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_unlink),(mp_obj_t)&mod_os_unlink_obj}, }; diff --git a/unix/mpconfigport.h b/unix/mpconfigport.h index 7deef4fdc7..13cf1e87b8 100644 --- a/unix/mpconfigport.h +++ b/unix/mpconfigport.h @@ -93,6 +93,7 @@ #define MICROPY_STACKLESS (0) #define MICROPY_STACKLESS_STRICT (0) +#define MICROPY_PY_OS_STATVFS (1) #define MICROPY_PY_UCTYPES (1) #define MICROPY_PY_UZLIB (1) #define MICROPY_PY_UJSON (1) diff --git a/unix/qstrdefsport.h b/unix/qstrdefsport.h index a04f4b9edc..e91d8fb795 100644 --- a/unix/qstrdefsport.h +++ b/unix/qstrdefsport.h @@ -36,6 +36,9 @@ Q(flush) Q(_os) Q(stat) +#if MICROPY_PY_OS_STATVFS +Q(statvfs) +#endif Q(system) Q(unlink)