Branch data Line data Source code
1 : : /*
2 : : * This file is part of the MicroPython project, http://micropython.org/
3 : : *
4 : : * The MIT License (MIT)
5 : : *
6 : : * Copyright (c) 2016-2022 Damien P. George
7 : : *
8 : : * Permission is hereby granted, free of charge, to any person obtaining a copy
9 : : * of this software and associated documentation files (the "Software"), to deal
10 : : * in the Software without restriction, including without limitation the rights
11 : : * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 : : * copies of the Software, and to permit persons to whom the Software is
13 : : * furnished to do so, subject to the following conditions:
14 : : *
15 : : * The above copyright notice and this permission notice shall be included in
16 : : * all copies or substantial portions of the Software.
17 : : *
18 : : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 : : * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 : : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 : : * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 : : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 : : * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 : : * THE SOFTWARE.
25 : : */
26 : :
27 : : #include "py/mphal.h"
28 : : #include "py/objstr.h"
29 : : #include "py/runtime.h"
30 : :
31 : : #if MICROPY_PY_OS
32 : :
33 : : #include "extmod/misc.h"
34 : : #include "extmod/vfs.h"
35 : :
36 : : #if MICROPY_VFS_FAT
37 : : #include "extmod/vfs_fat.h"
38 : : #if MICROPY_PY_OS_SYNC
39 : : #include "lib/oofatfs/ff.h"
40 : : #include "lib/oofatfs/diskio.h"
41 : : #endif
42 : : #endif
43 : :
44 : : #if MICROPY_VFS_LFS1 || MICROPY_VFS_LFS2
45 : : #include "extmod/vfs_lfs.h"
46 : : #endif
47 : :
48 : : #if MICROPY_VFS_POSIX
49 : : #include "extmod/vfs_posix.h"
50 : : #endif
51 : :
52 : : #if MICROPY_MBFS
53 : : #if MICROPY_VFS
54 : : #error "MICROPY_MBFS requires MICROPY_VFS to be disabled"
55 : : #endif
56 : : #include "ports/nrf/modules/os/microbitfs.h"
57 : : #endif
58 : :
59 : : #if MICROPY_PY_OS_UNAME
60 : : #include "genhdr/mpversion.h"
61 : : #endif
62 : :
63 : : #ifdef MICROPY_PY_OS_INCLUDEFILE
64 : : #include MICROPY_PY_OS_INCLUDEFILE
65 : : #endif
66 : :
67 : : #ifdef MICROPY_BUILD_TYPE
68 : : #define MICROPY_BUILD_TYPE_PAREN " (" MICROPY_BUILD_TYPE ")"
69 : : #else
70 : : #define MICROPY_BUILD_TYPE_PAREN
71 : : #endif
72 : :
73 : : #if MICROPY_PY_OS_SYNC
74 : : // sync()
75 : : // Sync all filesystems.
76 : : static mp_obj_t mp_os_sync(void) {
77 : : #if MICROPY_VFS_FAT
78 : : for (mp_vfs_mount_t *vfs = MP_STATE_VM(vfs_mount_table); vfs != NULL; vfs = vfs->next) {
79 : : if (mp_obj_is_type(vfs->obj, &mp_fat_vfs_type)) {
80 : : disk_ioctl(MP_OBJ_TO_PTR(vfs->obj), CTRL_SYNC, NULL);
81 : : }
82 : : }
83 : : #endif
84 : : return mp_const_none;
85 : : }
86 : : MP_DEFINE_CONST_FUN_OBJ_0(mp_os_sync_obj, mp_os_sync);
87 : : #endif
88 : :
89 : : #if MICROPY_PY_OS_UNAME
90 : :
91 : : #if MICROPY_PY_OS_UNAME_RELEASE_DYNAMIC
92 : : #define CONST_RELEASE
93 : : #else
94 : : #define CONST_RELEASE const
95 : : #endif
96 : :
97 : : static const qstr mp_os_uname_info_fields[] = {
98 : : MP_QSTR_sysname,
99 : : MP_QSTR_nodename,
100 : : MP_QSTR_release,
101 : : MP_QSTR_version,
102 : : MP_QSTR_machine
103 : : };
104 : : static const MP_DEFINE_STR_OBJ(mp_os_uname_info_sysname_obj, MICROPY_PY_SYS_PLATFORM);
105 : : static const MP_DEFINE_STR_OBJ(mp_os_uname_info_nodename_obj, MICROPY_PY_SYS_PLATFORM);
106 : : static CONST_RELEASE MP_DEFINE_STR_OBJ(mp_os_uname_info_release_obj, MICROPY_VERSION_STRING);
107 : : static const MP_DEFINE_STR_OBJ(mp_os_uname_info_version_obj, MICROPY_GIT_TAG " on " MICROPY_BUILD_DATE MICROPY_BUILD_TYPE_PAREN);
108 : : static const MP_DEFINE_STR_OBJ(mp_os_uname_info_machine_obj, MICROPY_HW_BOARD_NAME " with " MICROPY_HW_MCU_NAME);
109 : :
110 : : static MP_DEFINE_ATTRTUPLE(
111 : : mp_os_uname_info_obj,
112 : : mp_os_uname_info_fields,
113 : : 5,
114 : : MP_ROM_PTR(&mp_os_uname_info_sysname_obj),
115 : : MP_ROM_PTR(&mp_os_uname_info_nodename_obj),
116 : : MP_ROM_PTR(&mp_os_uname_info_release_obj),
117 : : MP_ROM_PTR(&mp_os_uname_info_version_obj),
118 : : MP_ROM_PTR(&mp_os_uname_info_machine_obj)
119 : : );
120 : :
121 : 4 : static mp_obj_t mp_os_uname(void) {
122 : : #if MICROPY_PY_OS_UNAME_RELEASE_DYNAMIC
123 : : const char *release = mp_os_uname_release();
124 : : mp_os_uname_info_release_obj.len = strlen(release);
125 : : mp_os_uname_info_release_obj.data = (const byte *)release;
126 : : #endif
127 : 4 : return MP_OBJ_FROM_PTR(&mp_os_uname_info_obj);
128 : : }
129 : : static MP_DEFINE_CONST_FUN_OBJ_0(mp_os_uname_obj, mp_os_uname);
130 : :
131 : : #endif
132 : :
133 : : #if MICROPY_PY_OS_DUPTERM_NOTIFY
134 : : static mp_obj_t mp_os_dupterm_notify(mp_obj_t obj_in) {
135 : : (void)obj_in;
136 : : for (;;) {
137 : : int c = mp_os_dupterm_rx_chr();
138 : : if (c < 0) {
139 : : break;
140 : : }
141 : : ringbuf_put(&stdin_ringbuf, c);
142 : : }
143 : : return mp_const_none;
144 : : }
145 : : static MP_DEFINE_CONST_FUN_OBJ_1(mp_os_dupterm_notify_obj, mp_os_dupterm_notify);
146 : : #endif
147 : :
148 : : static const mp_rom_map_elem_t os_module_globals_table[] = {
149 : : { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_os) },
150 : :
151 : : #if MICROPY_PY_OS_GETENV_PUTENV_UNSETENV
152 : : { MP_ROM_QSTR(MP_QSTR_getenv), MP_ROM_PTR(&mp_os_getenv_obj) },
153 : : { MP_ROM_QSTR(MP_QSTR_putenv), MP_ROM_PTR(&mp_os_putenv_obj) },
154 : : { MP_ROM_QSTR(MP_QSTR_unsetenv), MP_ROM_PTR(&mp_os_unsetenv_obj) },
155 : : #endif
156 : : #if MICROPY_PY_OS_SYNC
157 : : { MP_ROM_QSTR(MP_QSTR_sync), MP_ROM_PTR(&mp_os_sync_obj) },
158 : : #endif
159 : : #if MICROPY_PY_OS_SYSTEM
160 : : { MP_ROM_QSTR(MP_QSTR_system), MP_ROM_PTR(&mp_os_system_obj) },
161 : : #endif
162 : : #if MICROPY_PY_OS_UNAME
163 : : { MP_ROM_QSTR(MP_QSTR_uname), MP_ROM_PTR(&mp_os_uname_obj) },
164 : : #endif
165 : : #if MICROPY_PY_OS_URANDOM
166 : : { MP_ROM_QSTR(MP_QSTR_urandom), MP_ROM_PTR(&mp_os_urandom_obj) },
167 : : #endif
168 : :
169 : : #if MICROPY_VFS
170 : : { MP_ROM_QSTR(MP_QSTR_sep), MP_ROM_QSTR(MP_QSTR__slash_) },
171 : : { MP_ROM_QSTR(MP_QSTR_chdir), MP_ROM_PTR(&mp_vfs_chdir_obj) },
172 : : { MP_ROM_QSTR(MP_QSTR_getcwd), MP_ROM_PTR(&mp_vfs_getcwd_obj) },
173 : : { MP_ROM_QSTR(MP_QSTR_listdir), MP_ROM_PTR(&mp_vfs_listdir_obj) },
174 : : #if MICROPY_VFS_WRITABLE
175 : : { MP_ROM_QSTR(MP_QSTR_mkdir), MP_ROM_PTR(&mp_vfs_mkdir_obj) },
176 : : { MP_ROM_QSTR(MP_QSTR_remove), MP_ROM_PTR(&mp_vfs_remove_obj) },
177 : : { MP_ROM_QSTR(MP_QSTR_rename), MP_ROM_PTR(&mp_vfs_rename_obj) },
178 : : { MP_ROM_QSTR(MP_QSTR_rmdir), MP_ROM_PTR(&mp_vfs_rmdir_obj) },
179 : : { MP_ROM_QSTR(MP_QSTR_unlink), MP_ROM_PTR(&mp_vfs_remove_obj) }, // unlink aliases to remove
180 : : #endif
181 : : { MP_ROM_QSTR(MP_QSTR_stat), MP_ROM_PTR(&mp_vfs_stat_obj) },
182 : : { MP_ROM_QSTR(MP_QSTR_statvfs), MP_ROM_PTR(&mp_vfs_statvfs_obj) },
183 : : #endif
184 : :
185 : : // The following are MicroPython extensions.
186 : :
187 : : #if MICROPY_PY_OS_DUPTERM
188 : : { MP_ROM_QSTR(MP_QSTR_dupterm), MP_ROM_PTR(&mp_os_dupterm_obj) },
189 : : #endif
190 : : #if MICROPY_PY_OS_DUPTERM_NOTIFY
191 : : { MP_ROM_QSTR(MP_QSTR_dupterm_notify), MP_ROM_PTR(&mp_os_dupterm_notify_obj) },
192 : : #endif
193 : : #if MICROPY_PY_OS_ERRNO
194 : : { MP_ROM_QSTR(MP_QSTR_errno), MP_ROM_PTR(&mp_os_errno_obj) },
195 : : #endif
196 : :
197 : : #if MICROPY_VFS
198 : : { MP_ROM_QSTR(MP_QSTR_ilistdir), MP_ROM_PTR(&mp_vfs_ilistdir_obj) },
199 : : #endif
200 : :
201 : : // The following MicroPython extensions are deprecated. Use the `vfs` module instead.
202 : : #if !MICROPY_PREVIEW_VERSION_2 && MICROPY_VFS
203 : : { MP_ROM_QSTR(MP_QSTR_mount), MP_ROM_PTR(&mp_vfs_mount_obj) },
204 : : { MP_ROM_QSTR(MP_QSTR_umount), MP_ROM_PTR(&mp_vfs_umount_obj) },
205 : : #if MICROPY_VFS_FAT
206 : : { MP_ROM_QSTR(MP_QSTR_VfsFat), MP_ROM_PTR(&mp_fat_vfs_type) },
207 : : #endif
208 : : #if MICROPY_VFS_LFS1
209 : : { MP_ROM_QSTR(MP_QSTR_VfsLfs1), MP_ROM_PTR(&mp_type_vfs_lfs1) },
210 : : #endif
211 : : #if MICROPY_VFS_LFS2
212 : : { MP_ROM_QSTR(MP_QSTR_VfsLfs2), MP_ROM_PTR(&mp_type_vfs_lfs2) },
213 : : #endif
214 : : #if MICROPY_VFS_POSIX
215 : : { MP_ROM_QSTR(MP_QSTR_VfsPosix), MP_ROM_PTR(&mp_type_vfs_posix) },
216 : : #endif
217 : : #endif
218 : :
219 : : #if MICROPY_MBFS
220 : : // For special micro:bit filesystem only.
221 : : { MP_ROM_QSTR(MP_QSTR_listdir), MP_ROM_PTR(&os_mbfs_listdir_obj) },
222 : : { MP_ROM_QSTR(MP_QSTR_ilistdir), MP_ROM_PTR(&os_mbfs_ilistdir_obj) },
223 : : { MP_ROM_QSTR(MP_QSTR_stat), MP_ROM_PTR(&os_mbfs_stat_obj) },
224 : : { MP_ROM_QSTR(MP_QSTR_remove), MP_ROM_PTR(&os_mbfs_remove_obj) },
225 : : #endif
226 : : };
227 : : static MP_DEFINE_CONST_DICT(os_module_globals, os_module_globals_table);
228 : :
229 : : const mp_obj_module_t mp_module_os = {
230 : : .base = { &mp_type_module },
231 : : .globals = (mp_obj_dict_t *)&os_module_globals,
232 : : };
233 : :
234 : : MP_REGISTER_EXTENSIBLE_MODULE(MP_QSTR_os, mp_module_os);
235 : :
236 : : #endif // MICROPY_PY_OS
|