18 #include <ps2sdkapi.h>
23 #define NEWLIB_PORT_AWARE
35 #ifdef F___fioOpsInitialize
40 extern void __fioOpsInitializeImpl(
void);
43 static void __fioOpsInitialize(
void)
45 __fioOpsInitializeImpl();
53 #ifdef F___fioOpenHelper
54 #define IOP_O_RDONLY 0x0001
55 #define IOP_O_WRONLY 0x0002
56 #define IOP_O_RDWR 0x0003
57 #define IOP_O_DIROPEN 0x0008 // Internal use for dopen
58 #define IOP_O_NBLOCK 0x0010
59 #define IOP_O_APPEND 0x0100
60 #define IOP_O_CREAT 0x0200
61 #define IOP_O_TRUNC 0x0400
62 #define IOP_O_EXCL 0x0800
63 #define IOP_O_NOWAIT 0x8000
72 if ((flags & 3) == O_RDONLY) iop_flags |= IOP_O_RDONLY;
73 if ((flags & 3) == O_WRONLY) iop_flags |= IOP_O_WRONLY;
74 if ((flags & 3) == O_RDWR ) iop_flags |= IOP_O_RDWR;
75 if (flags & O_NONBLOCK) iop_flags |= IOP_O_NBLOCK;
76 if (flags & O_APPEND) iop_flags |= IOP_O_APPEND;
77 if (flags & O_CREAT) iop_flags |= IOP_O_CREAT;
78 if (flags & O_TRUNC) iop_flags |= IOP_O_TRUNC;
79 if (flags & O_EXCL) iop_flags |= IOP_O_EXCL;
81 if (flags & O_DIRECTORY) {
82 iop_flags |= IOP_O_DIROPEN;
86 iop_fd = is_dir ? fioDopen(buf) : fioOpen(buf, iop_flags);
91 buf_len = strlen(buf);
97 userdata->fd = iop_fd;
98 memcpy(userdata->filename, buf, buf_len);
99 userdata->filename[buf_len] =
'\x00';
100 info->userdata = (
void *)userdata;
101 info->ops = is_dir ? &__fio_fdman_ops_dir : &__fio_fdman_ops_file;
110 #ifdef F___fioGetFdHelper
111 int __fioGetFdHelper(
void *userdata)
115 if (userdata == NULL)
124 int __fioGetFdHelper(
void *userdata);
127 #ifdef F___fioGetFilenameHelper
128 char *__fioGetFilenameHelper(
void *userdata)
132 if (userdata == NULL)
138 return finfo->filename;
141 char *__fioGetFilenameHelper(
void *userdata);
144 #ifdef F___fioCloseHelper
145 int __fioCloseHelper(
void *userdata)
150 fd = __fioGetFdHelper(userdata);
161 int __fioCloseHelper(
void *userdata);
164 #ifdef F___fioDcloseHelper
165 int __fioDcloseHelper(
void *userdata)
170 fd = __fioGetFdHelper(userdata);
181 int __fioDcloseHelper(
void *userdata);
184 #ifdef F___fioReadHelper
185 int __fioReadHelper(
void *userdata,
void *buf,
int nbytes)
190 fd = __fioGetFdHelper(userdata);
196 rv = fioRead(fd, buf, nbytes);
200 int __fioReadHelper(
void *userdata,
void *buf,
int nbytes);
203 #ifdef F___fioLseekHelper
204 int __fioLseekHelper(
void *userdata,
int offset,
int whence)
209 fd = __fioGetFdHelper(userdata);
215 rv = fioLseek(fd, offset, whence);
219 int __fioLseekHelper(
void *userdata,
int offset,
int whence);
222 #ifdef F___fioWriteHelper
223 int __fioWriteHelper(
void *userdata,
const void *buf,
int nbytes)
228 fd = __fioGetFdHelper(userdata);
234 rv = fioWrite(fd, buf, nbytes);
238 int __fioWriteHelper(
void *userdata,
const void *buf,
int nbytes);
241 #ifdef F___fioIoctlHelper
242 int __fioIoctlHelper(
void *userdata,
int request,
void *data)
247 fd = __fioGetFdHelper(userdata);
253 rv = fioIoctl(fd,
request, data);
257 int __fioIoctlHelper(
void *userdata,
int request,
void *data);
260 #ifdef F___fioDreadHelper
261 int __fioDreadHelper(
void *userdata,
struct dirent *dir)
268 #define __MAXNAMLEN 256
270 fd = __fioGetFdHelper(userdata);
276 rv = fioDread(fd, &iodir);
283 snprintf(dir->d_name,
sizeof(dir->d_name),
"%.*s", (
int)(
sizeof(iodir.name) - 1), iodir.name);
289 default: dir->d_type = DT_UNKNOWN;
break;
296 int __fioDreadHelper(
void *userdata,
struct dirent *dir);
299 #ifdef F___fioLseekDirHelper
300 int __fioLseekDirHelper(
void *userdata,
int offset,
int whence)
309 fd = __fioGetFdHelper(userdata);
315 filename = __fioGetFilenameHelper(userdata);
317 if (filename == NULL)
322 if (userdata == NULL)
329 if (whence != SEEK_SET)
335 uid = fioDopen(filename);
337 for (i = 0; i < offset; i++) {
338 __fioDreadHelper(userdata, &dir);
344 int __fioLseekDirHelper(
void *userdata,
int offset,
int whence);
347 #ifdef F___libcglue_init_stdio
352 const char *tty0_str =
"tty0:";
354 fnlen = strlen(tty0_str) + 1;
357 if (userdata == NULL)
362 memcpy(userdata->filename, tty0_str, fnlen - 1);
363 userdata->filename[fnlen - 1] =
'\x00';
364 info->userdata = (
void *)userdata;
365 info->ops = &__fio_fdman_ops_file;
371 #ifdef F___fioMkdirHelper
377 return fioMkdir(path);
383 #ifdef F___fioGetstatHelper
384 static time_t io_to_posix_time(
const unsigned char *ps2time)
387 tim.tm_sec = ps2time[1];
388 tim.tm_min = ps2time[2];
389 tim.tm_hour = ps2time[3];
390 tim.tm_mday = ps2time[4];
391 tim.tm_mon = ps2time[5] - 1;
392 tim.tm_year = ((u16)ps2time[6] | ((u16)ps2time[7] << 8)) - 1900;
396 static mode_t io_to_posix_mode(
unsigned int ps2mode)
398 mode_t posixmode = 0;
401 if (ps2mode &
FIO_SO_IROTH) posixmode |= S_IRUSR|S_IRGRP|S_IROTH;
402 if (ps2mode &
FIO_SO_IWOTH) posixmode |= S_IWUSR|S_IWGRP|S_IWOTH;
403 if (ps2mode &
FIO_SO_IXOTH) posixmode |= S_IXUSR|S_IXGRP|S_IXOTH;
407 static void __fill_stat(
struct stat *stat,
const io_stat_t *fiostat)
411 stat->st_mode = io_to_posix_mode(fiostat->mode);
416 stat->st_size = ((off_t)fiostat->hisize << 32) | (off_t)fiostat->size;
417 stat->st_atime = io_to_posix_time(fiostat->atime);
418 stat->st_mtime = io_to_posix_time(fiostat->mtime);
419 stat->st_ctime = io_to_posix_time(fiostat->ctime);
420 stat->st_blksize = 16*1024;
421 stat->st_blocks = stat->st_size / 512;
424 int __fioGetstatHelper(
const char *path,
struct stat *buf)
428 if (strncmp(path,
"tty", 3) == 0 && path[3] >=
'0' && path[3] <=
'9' && path[4] ==
':')
430 memset(buf, 0,
sizeof(
struct stat));
431 buf->st_mode = S_IFCHR;
435 if (fioGetstat(path, &fiostat) < 0) {
440 __fill_stat(buf, &fiostat);
445 int __fioGetstatHelper(
const char *path,
struct stat *buf);
448 #ifdef F___fioOpsInitializeImpl
449 int __attribute__((weak)) _open(
const char *buf,
int flags, ...);
451 int __attribute__((weak)) mkdir(
const char *path, mode_t mode);
453 int __attribute__((weak)) _stat(
const char *path,
struct stat *buf);
456 int __attribute__((weak)) _read(
int fd,
void *buf,
size_t nbytes);
457 off_t
__attribute__((weak)) _lseek(
int fd, off_t offset,
int whence);
458 int __attribute__((weak)) _write(
int fd,
const void *buf,
size_t nbytes);
463 void __fioOpsInitializeImpl(
void)
465 memset(&__fio_fdman_path_ops, 0,
sizeof(__fio_fdman_path_ops));
467 if (&_open) __fio_fdman_path_ops.open = __fioOpenHelper;
469 if (&_unlink) __fio_fdman_path_ops.remove = fioRemove;
473 if (&rmdir) __fio_fdman_path_ops.rmdir = fioRmdir;
475 if ((&_stat) || (&_fstat)) __fio_fdman_path_ops.stat = __fioGetstatHelper;
477 memset(&__fio_fdman_ops_file, 0,
sizeof(__fio_fdman_ops_file));
478 __fio_fdman_ops_file.getfd = __fioGetFdHelper;
479 __fio_fdman_ops_file.getfilename = __fioGetFilenameHelper;
481 if (&_close) __fio_fdman_ops_file.close = __fioCloseHelper;
483 if (&_read) __fio_fdman_ops_file.read = __fioReadHelper;
485 if (&_lseek) __fio_fdman_ops_file.lseek = __fioLseekHelper;
487 if (&_write) __fio_fdman_ops_file.write = __fioWriteHelper;
489 if ((&_ioctl) || (&_ps2sdk_ioctl)) __fio_fdman_ops_file.ioctl = __fioIoctlHelper;
491 memset(&__fio_fdman_ops_dir, 0,
sizeof(__fio_fdman_ops_dir));
492 __fio_fdman_ops_dir.getfd = __fioGetFdHelper;
493 __fio_fdman_ops_dir.getfilename = __fioGetFilenameHelper;
495 if (&_close) __fio_fdman_ops_dir.close = __fioDcloseHelper;
497 if (&_lseek) __fio_fdman_ops_dir.lseek = __fioLseekDirHelper;
499 if (&getdents) __fio_fdman_ops_dir.dread = __fioDreadHelper;
504 #ifdef F__ps2sdk_get_default_fdman_path_ops
507 return &__fio_fdman_path_ops;
511 #ifdef F__libcglue_fdman_path_ops
515 static void __libcglue_fdman_path_ops_initialize(
void)
517 _libcglue_fdman_path_ops = _ps2sdk_get_default_fdman_path_ops();
521 #ifdef F__libcglue_fdman_socket_ops
525 #ifdef F__libcglue_fdman_inet_ops