23#define NEWLIB_PORT_AWARE
36_libcglue_fdman_path_ops_t __fileXio_fdman_path_ops;
37_libcglue_fdman_fd_ops_t __fileXio_fdman_ops_file;
38_libcglue_fdman_fd_ops_t __fileXio_fdman_ops_dir;
40extern void __fileXioOpsInitializeImpl(
void);
43static void __fileXioOpsInitialize(
void)
45 __fileXioOpsInitializeImpl();
49#define IOP_O_RDONLY 0x0001
50#define IOP_O_WRONLY 0x0002
51#define IOP_O_RDWR 0x0003
52#define IOP_O_DIROPEN 0x0008
53#define IOP_O_NBLOCK 0x0010
54#define IOP_O_APPEND 0x0100
55#define IOP_O_CREAT 0x0200
56#define IOP_O_TRUNC 0x0400
57#define IOP_O_EXCL 0x0800
58#define IOP_O_NOWAIT 0x8000
60int __fileXioOpenHelper(_libcglue_fdman_fd_info_t *info,
const char *buf,
int flags, mode_t mode)
67 if ((flags & 3) == O_RDONLY) iop_flags |= IOP_O_RDONLY;
68 if ((flags & 3) == O_WRONLY) iop_flags |= IOP_O_WRONLY;
69 if ((flags & 3) == O_RDWR ) iop_flags |= IOP_O_RDWR;
70 if (flags & O_NONBLOCK) iop_flags |= IOP_O_NBLOCK;
71 if (flags & O_APPEND) iop_flags |= IOP_O_APPEND;
72 if (flags & O_CREAT) iop_flags |= IOP_O_CREAT;
73 if (flags & O_TRUNC) iop_flags |= IOP_O_TRUNC;
74 if (flags & O_EXCL) iop_flags |= IOP_O_EXCL;
76 if (flags & O_DIRECTORY) {
77 iop_flags |= IOP_O_DIROPEN;
81 iop_fd = is_dir ? fileXioDopen(buf) : fileXioOpen(buf, iop_flags, mode);
83 _fxio_file_info_t *userdata;
86 buf_len = strlen(buf);
87 userdata = malloc(
sizeof(_fxio_file_info_t) + buf_len + 1);
92 userdata->fd = iop_fd;
93 memcpy(userdata->filename, buf, buf_len);
94 userdata->filename[buf_len] =
'\x00';
95 info->userdata = (
void *)userdata;
96 info->ops = is_dir ? &__fileXio_fdman_ops_dir : &__fileXio_fdman_ops_file;
102int __fileXioGetFdHelper(
void *userdata)
104 _fxio_file_info_t *finfo;
106 if (userdata == NULL)
111 finfo = (_fxio_file_info_t *)userdata;
115char *__fileXioGetFilenameHelper(
void *userdata)
117 _fxio_file_info_t *finfo;
119 if (userdata == NULL)
124 finfo = (_fxio_file_info_t *)userdata;
125 return finfo->filename;
128static time_t io_to_posix_time(
const unsigned char *ps2time)
131 tim.tm_sec = ps2time[1];
132 tim.tm_min = ps2time[2];
133 tim.tm_hour = ps2time[3];
134 tim.tm_mday = ps2time[4];
135 tim.tm_mon = ps2time[5] - 1;
136 tim.tm_year = ((u16)ps2time[6] | ((u16)ps2time[7] << 8)) - 1900;
140static mode_t iox_to_posix_mode(
unsigned int ps2mode)
142 mode_t posixmode = 0;
157static void fill_stat(
struct stat *stat,
const iox_stat_t *fiostat)
161 stat->st_mode = iox_to_posix_mode(fiostat->mode);
166 stat->st_size = ((off_t)fiostat->hisize << 32) | (off_t)fiostat->size;
167 stat->st_atime = io_to_posix_time(fiostat->atime);
168 stat->st_mtime = io_to_posix_time(fiostat->mtime);
169 stat->st_ctime = io_to_posix_time(fiostat->ctime);
170 stat->st_blksize = 16*1024;
171 stat->st_blocks = stat->st_size / 512;
174int __fileXioGetstatHelper(
const char *path,
struct stat *buf) {
177 if (strncmp(path,
"tty", 3) == 0 && path[3] >=
'0' && path[3] <=
'9' && path[4] ==
':')
179 memset(buf, 0,
sizeof(
struct stat));
180 buf->st_mode = S_IFCHR;
184 if (fileXioGetStat(path, &fiostat) < 0) {
188 fill_stat(buf, &fiostat);
193int __fileXioCloseHelper(
void *userdata)
198 fd = __fileXioGetFdHelper(userdata);
204 rv = fileXioClose(fd);
209int __fileXioDcloseHelper(
void *userdata)
214 fd = __fileXioGetFdHelper(userdata);
220 rv = fileXioDclose(fd);
225int __fileXioReadHelper(
void *userdata,
void *buf,
int nbytes)
230 fd = __fileXioGetFdHelper(userdata);
236 rv = fileXioRead(fd, buf, nbytes);
240int __fileXioLseekHelper(
void *userdata,
int offset,
int whence)
245 fd = __fileXioGetFdHelper(userdata);
251 rv = fileXioLseek(fd, offset, whence);
255int64_t __fileXioLseek64Helper(
void *userdata, int64_t offset,
int whence)
259 fd = __fileXioGetFdHelper(userdata);
265 return fileXioLseek64(fd, offset, whence);
268int __fileXioWriteHelper(
void *userdata,
const void *buf,
int nbytes)
273 fd = __fileXioGetFdHelper(userdata);
279 rv = fileXioWrite(fd, buf, nbytes);
283int __fileXioIoctlHelper(
void *userdata,
int request,
void *data)
288 fd = __fileXioGetFdHelper(userdata);
294 rv = fileXioIoctl(fd,
request, data);
298int __fileXioIoctl2Helper(
void *userdata,
int request,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen)
303 fd = __fileXioGetFdHelper(userdata);
309 rv = fileXioIoctl2(fd,
request, arg, arglen, buf, buflen);
313int __fileXioDreadHelper(
void *userdata,
struct dirent *dir)
320 #define __MAXNAMLEN 256
322 fd = __fileXioGetFdHelper(userdata);
328 rv = fileXioDread(fd, &ioxdir);
334 snprintf(dir->d_name,
sizeof(dir->d_name),
"%.*s", (
int)(
sizeof(ioxdir.name) - 1), ioxdir.name);
340 default: dir->d_type = DT_UNKNOWN;
break;
346int __fileXioLseekDirHelper(
void *userdata,
int offset,
int whence)
351 _fxio_file_info_t *finfo;
355 fd = __fileXioGetFdHelper(userdata);
361 filename = __fileXioGetFilenameHelper(userdata);
363 if (filename == NULL)
368 if (userdata == NULL)
373 finfo = (_fxio_file_info_t *)userdata;
375 if (whence != SEEK_SET)
381 uid = fileXioDopen(filename);
383 for (i = 0; i < offset; i++) {
384 __fileXioDreadHelper(userdata, &dir);
390int __attribute__((weak)) _open(
const char *buf,
int flags, ...);
392int __attribute__((weak)) _rename(
const char *old,
const char *new_);
393int __attribute__((weak)) mkdir(
const char *path, mode_t mode);
395int __attribute__((weak)) _stat(
const char *path,
struct stat *buf);
397ssize_t
__attribute__((weak)) readlink(
const char *path,
char *buf,
size_t bufsiz);
398int __attribute__((weak)) symlink(
const char *target,
const char *linkpath);
400int __attribute__((weak)) _read(
int fd,
void *buf,
size_t nbytes);
401off_t
__attribute__((weak)) _lseek(
int fd, off_t offset,
int whence);
402off64_t
__attribute__((weak)) lseek64(
int fd, off64_t offset,
int whence);
403int __attribute__((weak)) _write(
int fd,
const void *buf,
size_t nbytes);
408extern void __fileXioOpsInitializeImpl(
void)
410 memset(&__fileXio_fdman_path_ops, 0,
sizeof(__fileXio_fdman_path_ops));
412 if (&_open) __fileXio_fdman_path_ops.open = __fileXioOpenHelper;
414 if (&_unlink) __fileXio_fdman_path_ops.remove = fileXioRemove;
416 if (&_rename) __fileXio_fdman_path_ops.rename = fileXioRename;
418 if (&mkdir) __fileXio_fdman_path_ops.mkdir = fileXioMkdir;
420 if (&rmdir) __fileXio_fdman_path_ops.rmdir = fileXioRmdir;
422 if ((&_stat) || (&_fstat)) __fileXio_fdman_path_ops.stat = __fileXioGetstatHelper;
424 if (&readlink) __fileXio_fdman_path_ops.readlink = fileXioReadlink;
426 if (&symlink) __fileXio_fdman_path_ops.symlink = fileXioSymlink;
428 memset(&__fileXio_fdman_ops_file, 0,
sizeof(__fileXio_fdman_ops_file));
429 __fileXio_fdman_ops_file.getfd = __fileXioGetFdHelper;
430 __fileXio_fdman_ops_file.getfilename = __fileXioGetFilenameHelper;
432 if (&_close) __fileXio_fdman_ops_file.close = __fileXioCloseHelper;
434 if (&_read) __fileXio_fdman_ops_file.read = __fileXioReadHelper;
436 if (&_lseek) __fileXio_fdman_ops_file.lseek = __fileXioLseekHelper;
438 if (&lseek64) __fileXio_fdman_ops_file.lseek64 = __fileXioLseek64Helper;
440 if (&_write) __fileXio_fdman_ops_file.write = __fileXioWriteHelper;
442 if ((&_ioctl) || (&_ps2sdk_ioctl)) __fileXio_fdman_ops_file.ioctl = __fileXioIoctlHelper;
443 __fileXio_fdman_ops_file.ioctl2 = __fileXioIoctl2Helper;
445 memset(&__fileXio_fdman_ops_dir, 0,
sizeof(__fileXio_fdman_ops_dir));
446 __fileXio_fdman_ops_dir.getfd = __fileXioGetFdHelper;
447 __fileXio_fdman_ops_dir.getfilename = __fileXioGetFilenameHelper;
449 if (&_close) __fileXio_fdman_ops_dir.close = __fileXioDcloseHelper;
451 if (&_lseek) __fileXio_fdman_ops_dir.lseek = __fileXioLseekDirHelper;
453 if (&getdents) __fileXio_fdman_ops_dir.dread = __fileXioDreadHelper;
457static _libcglue_fdman_path_ops_t *_backup_libcglue_fdman_path_ops;
459void _ps2sdk_fileXio_init()
461 _backup_libcglue_fdman_path_ops = _libcglue_fdman_path_ops;
462 _libcglue_fdman_path_ops = &__fileXio_fdman_path_ops;
465void _ps2sdk_fileXio_deinit()
467 _libcglue_fdman_path_ops = _backup_libcglue_fdman_path_ops;
u32 count
start sector of fragmented bd/file