3232#include "misc.h"
3333#include "qstr.h"
3434#include "obj.h"
35+ #include "objtuple.h"
3536#include "systick.h"
3637#include "rng.h"
3738#include "storage.h"
3839#include "ff.h"
40+ #include "file.h"
3941#include "portmodules.h"
4042
4143#if _USE_LFN
@@ -107,8 +109,7 @@ STATIC mp_obj_t os_listdir(uint n_args, const mp_obj_t *args) {
107109
108110 return dir_list ;
109111}
110-
111- MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (os_listdir_obj , 0 , 1 , os_listdir );
112+ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (os_listdir_obj , 0 , 1 , os_listdir );
112113
113114STATIC mp_obj_t os_mkdir (mp_obj_t path_o ) {
114115 const char * path = mp_obj_str_get_str (path_o );
@@ -123,8 +124,7 @@ STATIC mp_obj_t os_mkdir(mp_obj_t path_o) {
123124 nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_OSError , "Error creating directory '%s'" , path ));
124125 }
125126}
126-
127- MP_DEFINE_CONST_FUN_OBJ_1 (os_mkdir_obj , os_mkdir );
127+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (os_mkdir_obj , os_mkdir );
128128
129129STATIC mp_obj_t os_remove (mp_obj_t path_o ) {
130130 const char * path = mp_obj_str_get_str (path_o );
@@ -137,8 +137,7 @@ STATIC mp_obj_t os_remove(mp_obj_t path_o) {
137137 nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_OSError , "Error removing file '%s'" , path ));
138138 }
139139}
140-
141- MP_DEFINE_CONST_FUN_OBJ_1 (os_remove_obj , os_remove );
140+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (os_remove_obj , os_remove );
142141
143142STATIC mp_obj_t os_rmdir (mp_obj_t path_o ) {
144143 const char * path = mp_obj_str_get_str (path_o );
@@ -151,15 +150,57 @@ STATIC mp_obj_t os_rmdir(mp_obj_t path_o) {
151150 nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_OSError , "Error removing directory '%s'" , path ));
152151 }
153152}
153+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (os_rmdir_obj , os_rmdir );
154+
155+ STATIC mp_obj_t os_stat (mp_obj_t path_in ) {
156+ const char * path = mp_obj_str_get_str (path_in );
157+
158+ FILINFO fno ;
159+ #if _USE_LFN
160+ fno .lfname = NULL ;
161+ fno .lfsize = 0 ;
162+ #endif
154163
155- MP_DEFINE_CONST_FUN_OBJ_1 (os_rmdir_obj , os_rmdir );
164+ FRESULT res = f_stat (path , & fno );
165+ if (res != FR_OK ) {
166+ nlr_raise (mp_obj_new_exception_arg1 (& mp_type_OSError , MP_OBJ_NEW_SMALL_INT (fresult_to_errno_table [res ])));
167+ }
168+
169+ mp_obj_tuple_t * t = mp_obj_new_tuple (10 , NULL );
170+ mp_int_t mode = 0 ;
171+ if (fno .fattrib & AM_DIR ) {
172+ mode |= 0x4000 ; // stat.S_IFDIR
173+ } else {
174+ mode |= 0x8000 ; // stat.S_IFREG
175+ }
176+ mp_int_t seconds = mod_time_seconds_since_2000 (
177+ 1980 + ((fno .fdate >> 9 ) & 0x7f ),
178+ (fno .fdate >> 5 ) & 0x0f ,
179+ fno .fdate & 0x1f ,
180+ (fno .ftime >> 11 ) & 0x1f ,
181+ (fno .ftime >> 5 ) & 0x3f ,
182+ 2 * (fno .ftime & 0x1f )
183+ );
184+ t -> items [0 ] = MP_OBJ_NEW_SMALL_INT (mode ); // st_mode
185+ t -> items [1 ] = MP_OBJ_NEW_SMALL_INT (0 ); // st_ino
186+ t -> items [2 ] = MP_OBJ_NEW_SMALL_INT (0 ); // st_dev
187+ t -> items [3 ] = MP_OBJ_NEW_SMALL_INT (0 ); // st_nlink
188+ t -> items [4 ] = MP_OBJ_NEW_SMALL_INT (0 ); // st_uid
189+ t -> items [5 ] = MP_OBJ_NEW_SMALL_INT (0 ); // st_gid
190+ t -> items [6 ] = MP_OBJ_NEW_SMALL_INT (fno .fsize ); // st_size
191+ t -> items [7 ] = MP_OBJ_NEW_SMALL_INT (seconds ); // st_atime
192+ t -> items [8 ] = MP_OBJ_NEW_SMALL_INT (seconds ); // st_mtime
193+ t -> items [9 ] = MP_OBJ_NEW_SMALL_INT (seconds ); // st_ctime
194+
195+ return t ;
196+ }
197+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (os_stat_obj , os_stat );
156198
157199STATIC mp_obj_t os_sync (void ) {
158200 storage_flush ();
159201 return mp_const_none ;
160202}
161-
162- MP_DEFINE_CONST_FUN_OBJ_0 (os_sync_obj , os_sync );
203+ STATIC MP_DEFINE_CONST_FUN_OBJ_0 (os_sync_obj , os_sync );
163204
164205STATIC mp_obj_t os_urandom (mp_obj_t num ) {
165206 mp_int_t n = mp_obj_get_int (num );
@@ -170,8 +211,7 @@ STATIC mp_obj_t os_urandom(mp_obj_t num) {
170211 }
171212 return mp_obj_str_builder_end (o );
172213}
173-
174- MP_DEFINE_CONST_FUN_OBJ_1 (os_urandom_obj , os_urandom );
214+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (os_urandom_obj , os_urandom );
175215
176216STATIC const mp_map_elem_t os_module_globals_table [] = {
177217 { MP_OBJ_NEW_QSTR (MP_QSTR___name__ ), MP_OBJ_NEW_QSTR (MP_QSTR_os ) },
@@ -180,6 +220,7 @@ STATIC const mp_map_elem_t os_module_globals_table[] = {
180220 { MP_OBJ_NEW_QSTR (MP_QSTR_mkdir ), (mp_obj_t )& os_mkdir_obj },
181221 { MP_OBJ_NEW_QSTR (MP_QSTR_remove ), (mp_obj_t )& os_remove_obj },
182222 { MP_OBJ_NEW_QSTR (MP_QSTR_rmdir ), (mp_obj_t )& os_rmdir_obj },
223+ { MP_OBJ_NEW_QSTR (MP_QSTR_stat ), (mp_obj_t )& os_stat_obj },
183224 { MP_OBJ_NEW_QSTR (MP_QSTR_unlink ), (mp_obj_t )& os_remove_obj }, // unlink aliases to remove
184225
185226 { MP_OBJ_NEW_QSTR (MP_QSTR_sync ), (mp_obj_t )& os_sync_obj },
0 commit comments