@@ -33,6 +33,7 @@ DEALINGS IN THE SOFTWARE.
3333#include <psp2/types.h>
3434#include <psp2/io/dirent.h>
3535#include <psp2/kernel/threadmgr.h>
36+ #include "fios2.h"
3637#include "vitadescriptor.h"
3738#include "vitaerror.h"
3839
@@ -135,8 +136,8 @@ struct dirent *readdir(DIR *dirp)
135136 return NULL ;
136137 }
137138
138- int res = sceIoDread ( fdmap -> sce_uid , ( SceIoDirent * ) & dirp -> dir ) ;
139-
139+ SceFiosDirEntry fios_dir_entry = { 0 } ;
140+ int res = sceFiosDHReadSync ( NULL , fdmap -> sce_uid , & fios_dir_entry );
140141 __vita_fd_drop (fdmap );
141142
142143 if (res < 0 )
@@ -145,12 +146,25 @@ struct dirent *readdir(DIR *dirp)
145146 return NULL ;
146147 }
147148
148- if (res == 0 )
149+ //TODO end of listing
150+
151+ SceFiosStat fios_stat = {0 };
152+ res = sceFiosStatSync (NULL , fios_dir_entry .fullPath , & fios_stat );
153+
154+ if (res < 0 )
149155 {
150- // end-of-listing shouldn't change errno
156+ errno = __vita_sce_errno_to_errno ( res , ERROR_GENERIC );
151157 return NULL ;
152158 }
153159
160+ strncpy (dirp -> dir .d_name , fios_dir_entry .fullPath + fios_dir_entry .offsetToName , 256 );
161+ dirp -> dir .d_stat .st_mode = fios_stat .st_mode ;
162+ dirp -> dir .d_stat .st_attr = fios_stat .statFlags ;
163+ dirp -> dir .d_stat .st_size = fios_stat .st_size ;
164+ sceFiosDateToSceDateTime (fios_stat .st_ctime , & dirp -> dir .d_stat .st_ctime );
165+ sceFiosDateToSceDateTime (fios_stat .st_atime , & dirp -> dir .d_stat .st_atime );
166+ sceFiosDateToSceDateTime (fios_stat .st_mtime , & dirp -> dir .d_stat .st_mtime );
167+
154168 struct dirent * dir = & dirp -> dir ;
155169 dirp -> index ++ ;
156170 return dir ;
@@ -173,16 +187,18 @@ void rewinddir(DIR *dirp)
173187 return ;
174188 }
175189
176- SceUID dirfd = sceIoDopen (fdmap -> filename ); // filename contains full path, so it's okay to use in sce funcs
190+ SceFiosDH dirfd ;
191+ SceFiosBuffer buf = SCE_FIOS_BUFFER_INITIALIZER ;
192+ int res = sceFiosDHOpenSync (NULL , fdmap -> filename , & dirfd , buf ); // filename contains full path, so it's okay to use in sce funcs
177193
178- if (dirfd < 0 )
194+ if (res < 0 )
179195 {
180196 __vita_fd_drop (fdmap );
181197 errno = __vita_sce_errno_to_errno (dirfd , ERROR_GENERIC );
182198 return ;
183199 }
184200
185- sceIoDclose ( fdmap -> sce_uid );
201+ sceFiosDHCloseSync ( NULL , fdmap -> sce_uid );
186202 fdmap -> sce_uid = dirfd ;
187203 __vita_fd_drop (fdmap );
188204
0 commit comments