Skip to content

Commit 4bd9fe6

Browse files
committed
io: use scefios for dirent
1 parent e4b8cb3 commit 4bd9fe6

File tree

2 files changed

+34
-8
lines changed

2 files changed

+34
-8
lines changed

newlib/libc/sys/vita/dirent.c

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

newlib/libc/sys/vita/fios2.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,16 @@ typedef struct SceFiosStat {
130130
int64_t st_mode;
131131
} SceFiosStat;
132132

133+
typedef struct SceFiosDirEntry {
134+
SceFiosOffset fileSize;
135+
uint32_t statFlags;
136+
uint16_t nameLength;
137+
uint16_t fullPathLength;
138+
uint16_t offsetToName;
139+
uint16_t reserved[3];
140+
char fullPath[1024];
141+
} SceFiosDirEntry;
142+
133143
int sceFiosInitialize(const SceFiosParams *params);
134144
void sceFiosTerminate();
135145

@@ -151,7 +161,7 @@ int sceFiosDHStatSync(const SceFiosOpAttr *attr, SceFiosDH fh, SceFiosStat *stat
151161

152162
int sceFiosDirectoryCreateSync(const SceFiosOpAttr *attr, const char *path);
153163
int sceFiosDHOpenSync(const SceFiosOpAttr *attr, SceFiosDH *dh, const char *path, SceFiosBuffer buffer);
154-
int sceFiosDHOpenSync(const SceFiosOpAttr *attr, SceFiosDH *dh, const char *path, const void *params);
164+
int sceFiosDHReadSync(const SceFiosOpAttr *attr, SceFiosDH dh, SceFiosDirEntry *dir);
155165
int sceFiosDHCloseSync(const SceFiosOpAttr *attr, SceFiosDH fh);
156166

157167

0 commit comments

Comments
 (0)