23#define NEWLIB_PORT_AWARE
36#ifdef F___fileXioOpsInitialize
41extern void __fileXioOpsInitializeImpl(
void);
44static void __fileXioOpsInitialize(
void)
46 __fileXioOpsInitializeImpl();
54#ifdef F___fileXioOpenHelper
56#define IOP_O_RDONLY 0x0001
57#define IOP_O_WRONLY 0x0002
58#define IOP_O_RDWR 0x0003
59#define IOP_O_DIROPEN 0x0008
60#define IOP_O_NBLOCK 0x0010
61#define IOP_O_APPEND 0x0100
62#define IOP_O_CREAT 0x0200
63#define IOP_O_TRUNC 0x0400
64#define IOP_O_EXCL 0x0800
65#define IOP_O_NOWAIT 0x8000
74 if ((flags & 3) == O_RDONLY) iop_flags |= IOP_O_RDONLY;
75 if ((flags & 3) == O_WRONLY) iop_flags |= IOP_O_WRONLY;
76 if ((flags & 3) == O_RDWR ) iop_flags |= IOP_O_RDWR;
77 if (flags & O_NONBLOCK) iop_flags |= IOP_O_NBLOCK;
78 if (flags & O_APPEND) iop_flags |= IOP_O_APPEND;
79 if (flags & O_CREAT) iop_flags |= IOP_O_CREAT;
80 if (flags & O_TRUNC) iop_flags |= IOP_O_TRUNC;
81 if (flags & O_EXCL) iop_flags |= IOP_O_EXCL;
83 if (flags & O_DIRECTORY) {
84 iop_flags |= IOP_O_DIROPEN;
88 iop_fd = is_dir ? fileXioDopen(buf) : fileXioOpen(buf, iop_flags, mode);
93 buf_len = strlen(buf);
99 userdata->fd = iop_fd;
100 memcpy(userdata->filename, buf, buf_len);
101 userdata->filename[buf_len] =
'\x00';
102 info->userdata = (
void *)userdata;
103 info->ops = is_dir ? &__fileXio_fdman_ops_dir : &__fileXio_fdman_ops_file;
112#ifdef F___fileXioGetFdHelper
113int __fileXioGetFdHelper(
void *userdata)
117 if (userdata == NULL)
126int __fileXioGetFdHelper(
void *userdata);
129#ifdef F___fileXioGetFilenameHelper
130char *__fileXioGetFilenameHelper(
void *userdata)
134 if (userdata == NULL)
140 return finfo->filename;
143char *__fileXioGetFilenameHelper(
void *userdata);
146#ifdef F___fileXioGetstatHelper
147static time_t io_to_posix_time(
const unsigned char *ps2time)
150 tim.tm_sec = ps2time[1];
151 tim.tm_min = ps2time[2];
152 tim.tm_hour = ps2time[3];
153 tim.tm_mday = ps2time[4];
154 tim.tm_mon = ps2time[5] - 1;
155 tim.tm_year = ((u16)ps2time[6] | ((u16)ps2time[7] << 8)) - 1900;
159static mode_t iox_to_posix_mode(
unsigned int ps2mode)
161 mode_t posixmode = 0;
176static void fill_stat(
struct stat *stat,
const iox_stat_t *fiostat)
180 stat->st_mode = iox_to_posix_mode(fiostat->mode);
185 stat->st_size = ((off_t)fiostat->hisize << 32) | (off_t)fiostat->size;
186 stat->st_atime = io_to_posix_time(fiostat->atime);
187 stat->st_mtime = io_to_posix_time(fiostat->mtime);
188 stat->st_ctime = io_to_posix_time(fiostat->ctime);
189 stat->st_blksize = 16*1024;
190 stat->st_blocks = stat->st_size / 512;
193int __fileXioGetstatHelper(
const char *path,
struct stat *buf) {
196 if (strncmp(path,
"tty", 3) == 0 && path[3] >=
'0' && path[3] <=
'9' && path[4] ==
':')
198 memset(buf, 0,
sizeof(
struct stat));
199 buf->st_mode = S_IFCHR;
203 if (fileXioGetStat(path, &fiostat) < 0) {
208 fill_stat(buf, &fiostat);
213int __fileXioGetstatHelper(
const char *path,
struct stat *buf);
216#ifdef F___fileXioCloseHelper
217int __fileXioCloseHelper(
void *userdata)
222 fd = __fileXioGetFdHelper(userdata);
228 rv = fileXioClose(fd);
233int __fileXioCloseHelper(
void *userdata);
236#ifdef F___fileXioDcloseHelper
237int __fileXioDcloseHelper(
void *userdata)
242 fd = __fileXioGetFdHelper(userdata);
248 rv = fileXioDclose(fd);
253int __fileXioDcloseHelper(
void *userdata);
256#ifdef F___fileXioReadHelper
257int __fileXioReadHelper(
void *userdata,
void *buf,
int nbytes)
262 fd = __fileXioGetFdHelper(userdata);
268 rv = fileXioRead(fd, buf, nbytes);
272int __fileXioReadHelper(
void *userdata,
void *buf,
int nbytes);
275#ifdef F___fileXioLseekHelper
276int __fileXioLseekHelper(
void *userdata,
int offset,
int whence)
281 fd = __fileXioGetFdHelper(userdata);
287 rv = fileXioLseek(fd, offset, whence);
291int __fileXioLseekHelper(
void *userdata,
int offset,
int whence);
294#ifdef F___fileXioLseek64Helper
295int64_t __fileXioLseek64Helper(
void *userdata, int64_t offset,
int whence)
299 fd = __fileXioGetFdHelper(userdata);
305 return fileXioLseek64(fd, offset, whence);
308int64_t __fileXioLseek64Helper(
void *userdata, int64_t offset,
int whence);
311#ifdef F___fileXioWriteHelper
312int __fileXioWriteHelper(
void *userdata,
const void *buf,
int nbytes)
317 fd = __fileXioGetFdHelper(userdata);
323 rv = fileXioWrite(fd, buf, nbytes);
327int __fileXioWriteHelper(
void *userdata,
const void *buf,
int nbytes);
330#ifdef F___fileXioIoctlHelper
331int __fileXioIoctlHelper(
void *userdata,
int request,
void *data)
336 fd = __fileXioGetFdHelper(userdata);
342 rv = fileXioIoctl(fd,
request, data);
346int __fileXioIoctlHelper(
void *userdata,
int request,
void *data);
349#ifdef F___fileXioIoctl2Helper
350int __fileXioIoctl2Helper(
void *userdata,
int request,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen)
355 fd = __fileXioGetFdHelper(userdata);
361 rv = fileXioIoctl2(fd,
request, arg, arglen, buf, buflen);
365int __fileXioIoctl2Helper(
void *userdata,
int request,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen);
368#ifdef F___fileXioDreadHelper
369int __fileXioDreadHelper(
void *userdata,
struct dirent *dir)
376 #define __MAXNAMLEN 256
378 fd = __fileXioGetFdHelper(userdata);
384 rv = fileXioDread(fd, &ioxdir);
390 strncpy(dir->d_name, ioxdir.name, __MAXNAMLEN);
391 dir->d_name[__MAXNAMLEN - 1] = 0;
397 default: dir->d_type = DT_UNKNOWN;
break;
403int __fileXioDreadHelper(
void *userdata,
struct dirent *dir);
406#ifdef F___fileXioLseekDirHelper
407int __fileXioLseekDirHelper(
void *userdata,
int offset,
int whence)
416 fd = __fileXioGetFdHelper(userdata);
422 filename = __fileXioGetFilenameHelper(userdata);
424 if (filename == NULL)
429 if (userdata == NULL)
436 if (whence != SEEK_SET)
442 uid = fileXioDopen(filename);
444 for (i = 0; i < offset; i++) {
445 __fileXioDreadHelper(userdata, &dir);
451int __fileXioLseekDirHelper(
void *userdata,
int offset,
int whence);
454#ifdef F___fileXioOpsInitializeImpl
455int __attribute__((weak)) _open(
const char *buf,
int flags, ...);
457int __attribute__((weak)) _rename(
const char *old,
const char *
new);
458int __attribute__((weak)) mkdir(
const char *path, mode_t mode);
460int __attribute__((weak)) _stat(
const char *path,
struct stat *buf);
462ssize_t
__attribute__((weak)) readlink(
const char *path,
char *buf,
size_t bufsiz);
463int __attribute__((weak)) symlink(
const char *target,
const char *linkpath);
465int __attribute__((weak)) _read(
int fd,
void *buf,
size_t nbytes);
466off_t
__attribute__((weak)) _lseek(
int fd, off_t offset,
int whence);
467off64_t
__attribute__((weak)) lseek64(
int fd, off64_t offset,
int whence);
468int __attribute__((weak)) _write(
int fd,
const void *buf,
size_t nbytes);
473extern void __fileXioOpsInitializeImpl(
void)
475 memset(&__fileXio_fdman_path_ops, 0,
sizeof(__fileXio_fdman_path_ops));
477 if (&_open) __fileXio_fdman_path_ops.open = __fileXioOpenHelper;
479 if (&_unlink) __fileXio_fdman_path_ops.remove = fileXioRemove;
481 if (&_rename) __fileXio_fdman_path_ops.rename = fileXioRename;
483 if (&mkdir) __fileXio_fdman_path_ops.mkdir = fileXioMkdir;
485 if (&rmdir) __fileXio_fdman_path_ops.rmdir = fileXioRmdir;
487 if ((&_stat) || (&_fstat)) __fileXio_fdman_path_ops.stat = __fileXioGetstatHelper;
489 if (&readlink) __fileXio_fdman_path_ops.readlink = fileXioReadlink;
491 if (&symlink) __fileXio_fdman_path_ops.symlink = fileXioSymlink;
493 memset(&__fileXio_fdman_ops_file, 0,
sizeof(__fileXio_fdman_ops_file));
494 __fileXio_fdman_ops_file.getfd = __fileXioGetFdHelper;
495 __fileXio_fdman_ops_file.getfilename = __fileXioGetFilenameHelper;
497 if (&_close) __fileXio_fdman_ops_file.close = __fileXioCloseHelper;
499 if (&_read) __fileXio_fdman_ops_file.read = __fileXioReadHelper;
501 if (&_lseek) __fileXio_fdman_ops_file.lseek = __fileXioLseekHelper;
503 if (&lseek64) __fileXio_fdman_ops_file.lseek64 = __fileXioLseek64Helper;
505 if (&_write) __fileXio_fdman_ops_file.write = __fileXioWriteHelper;
507 if ((&_ioctl) || (&_ps2sdk_ioctl)) __fileXio_fdman_ops_file.ioctl = __fileXioIoctlHelper;
508 __fileXio_fdman_ops_file.ioctl2 = __fileXioIoctl2Helper;
510 memset(&__fileXio_fdman_ops_dir, 0,
sizeof(__fileXio_fdman_ops_dir));
511 __fileXio_fdman_ops_dir.getfd = __fileXioGetFdHelper;
512 __fileXio_fdman_ops_dir.getfilename = __fileXioGetFilenameHelper;
514 if (&_close) __fileXio_fdman_ops_dir.close = __fileXioDcloseHelper;
516 if (&_lseek) __fileXio_fdman_ops_dir.lseek = __fileXioLseekDirHelper;
518 if (&getdents) __fileXio_fdman_ops_dir.dread = __fileXioDreadHelper;
522#ifdef F__ps2sdk_fileXio_init_deinit
526void _ps2sdk_fileXio_init()
528 _backup_libcglue_fdman_path_ops = _libcglue_fdman_path_ops;
529 _libcglue_fdman_path_ops = &__fileXio_fdman_path_ops;
532void _ps2sdk_fileXio_deinit()
534 _libcglue_fdman_path_ops = _backup_libcglue_fdman_path_ops;
u32 count
start sector of fragmented bd/file