2424#include < FS.h>
2525#include < SDFS.h>
2626
27+ // Avoid type ambiguity, force u8 instead of untyped literal
28+ // ref. #6106 as to why we add APPEND to WRITE
29+
30+ inline constexpr uint8_t SDClassFileRead { FILE_READ };
2731#undef FILE_READ
28- #define FILE_READ ((uint8_t )O_READ)
29- #undef FILE_WRITE
30- #define FILE_WRITE ((uint8_t )(O_READ | O_WRITE | O_CREAT | O_APPEND))
32+ #define FILE_READ SDClassFileRead
3133
34+ inline constexpr uint8_t SDClassFileWrite { FILE_WRITE | O_APPEND };
35+ #undef FILE_WRITE
36+ #define FILE_WRITE SDClassFileWrite
37+
38+ static inline constexpr const char * SDClassFileMode (uint8_t mode) {
39+ bool read = false ;
40+ bool write = false ;
41+
42+ switch (mode & O_ACCMODE) {
43+ case O_RDONLY:
44+ read = true ;
45+ break ;
46+ case O_WRONLY:
47+ write = true ;
48+ break ;
49+ case O_RDWR:
50+ read = true ;
51+ write = true ;
52+ break ;
53+ }
54+
55+ const bool append = (mode & O_APPEND) > 0 ;
56+
57+ if ( read && !write ) { return " r" ; }
58+ else if ( !read && write && !append ) { return " w+" ; }
59+ else if ( !read && write && append ) { return " a" ; }
60+ else if ( read && write && !append ) { return " w+" ; } // may be a bug in FS::mode interpretation, "r+" seems proper
61+ else if ( read && write && append ) { return " a+" ; }
62+
63+ return " r" ;
64+ }
3265
3366class SDClass {
3467public:
@@ -45,7 +78,7 @@ class SDClass {
4578 }
4679
4780 fs::File open (const char *filename, uint8_t mode = FILE_READ) {
48- return SDFS.open (filename, getMode (mode));
81+ return SDFS.open (filename, SDClassFileMode (mode));
4982 }
5083
5184 fs::File open (const char *filename, const char *mode) {
@@ -158,18 +191,6 @@ class SDClass {
158191 }
159192
160193private:
161- const char *getMode (uint8_t mode) {
162- bool read = (mode & O_READ) ? true : false ;
163- bool write = (mode & O_WRITE) ? true : false ;
164- bool append = (mode & O_APPEND) ? true : false ;
165- if ( read & !write ) { return " r" ; }
166- else if ( !read & write & !append ) { return " w+" ; }
167- else if ( !read & write & append ) { return " a" ; }
168- else if ( read & write & !append ) { return " w+" ; } // may be a bug in FS::mode interpretation, "r+" seems proper
169- else if ( read & write & append ) { return " a+" ; }
170- else { return " r" ; }
171- }
172-
173194 static time_t wrapperTimeCB (void ) {
174195 extern void (*__SD__userDateTimeCB)(uint16_t *, uint16_t *);
175196 if (__SD__userDateTimeCB) {
0 commit comments