23#define NEWLIB_PORT_AWARE
35_libcglue_fdman_path_ops_t __fio_fdman_path_ops;
36_libcglue_fdman_fd_ops_t __fio_fdman_ops_file;
37_libcglue_fdman_fd_ops_t __fio_fdman_ops_dir;
39extern void __fioOpsInitializeImpl(
void);
42static void __fioOpsInitialize(
void)
44 __fioOpsInitializeImpl();
47#define IOP_O_RDONLY 0x0001
48#define IOP_O_WRONLY 0x0002
49#define IOP_O_RDWR 0x0003
50#define IOP_O_DIROPEN 0x0008
51#define IOP_O_NBLOCK 0x0010
52#define IOP_O_APPEND 0x0100
53#define IOP_O_CREAT 0x0200
54#define IOP_O_TRUNC 0x0400
55#define IOP_O_EXCL 0x0800
56#define IOP_O_NOWAIT 0x8000
58int __fioOpenHelper(_libcglue_fdman_fd_info_t *info,
const char *buf,
int flags, mode_t mode)
65 if ((flags & 3) == O_RDONLY) iop_flags |= IOP_O_RDONLY;
66 if ((flags & 3) == O_WRONLY) iop_flags |= IOP_O_WRONLY;
67 if ((flags & 3) == O_RDWR ) iop_flags |= IOP_O_RDWR;
68 if (flags & O_NONBLOCK) iop_flags |= IOP_O_NBLOCK;
69 if (flags & O_APPEND) iop_flags |= IOP_O_APPEND;
70 if (flags & O_CREAT) iop_flags |= IOP_O_CREAT;
71 if (flags & O_TRUNC) iop_flags |= IOP_O_TRUNC;
72 if (flags & O_EXCL) iop_flags |= IOP_O_EXCL;
74 if (flags & O_DIRECTORY) {
75 iop_flags |= IOP_O_DIROPEN;
79 iop_fd = is_dir ? fioDopen(buf) : fioOpen(buf, iop_flags);
81 _fio_file_info_t *userdata;
84 buf_len = strlen(buf);
85 userdata = malloc(
sizeof(_fio_file_info_t) + buf_len + 1);
90 userdata->fd = iop_fd;
91 memcpy(userdata->filename, buf, buf_len);
92 userdata->filename[buf_len] =
'\x00';
93 info->userdata = (
void *)userdata;
94 info->ops = is_dir ? &__fio_fdman_ops_dir : &__fio_fdman_ops_file;
100int __fioGetFdHelper(
void *userdata)
102 _fio_file_info_t *finfo;
104 if (userdata == NULL)
109 finfo = (_fio_file_info_t *)userdata;
113char *__fioGetFilenameHelper(
void *userdata)
115 _fio_file_info_t *finfo;
117 if (userdata == NULL)
122 finfo = (_fio_file_info_t *)userdata;
123 return finfo->filename;
126int __fioCloseHelper(
void *userdata)
131 fd = __fioGetFdHelper(userdata);
142int __fioDcloseHelper(
void *userdata)
147 fd = __fioGetFdHelper(userdata);
158int __fioReadHelper(
void *userdata,
void *buf,
int nbytes)
163 fd = __fioGetFdHelper(userdata);
169 rv = fioRead(fd, buf, nbytes);
173int __fioLseekHelper(
void *userdata,
int offset,
int whence)
178 fd = __fioGetFdHelper(userdata);
184 rv = fioLseek(fd, offset, whence);
188int __fioWriteHelper(
void *userdata,
const void *buf,
int nbytes)
193 fd = __fioGetFdHelper(userdata);
199 rv = fioWrite(fd, buf, nbytes);
203int __fioIoctlHelper(
void *userdata,
int request,
void *data)
208 fd = __fioGetFdHelper(userdata);
214 rv = fioIoctl(fd,
request, data);
218int __fioDreadHelper(
void *userdata,
struct dirent *dir)
227 #define __MAXNAMLEN 256
229 fd = __fioGetFdHelper(userdata);
235 rv = fioDread(fd, iodir);
242 snprintf(dir->d_name,
sizeof(dir->d_name),
"%.*s", (
int)(
sizeof(iodir->name) - 1), iodir->name);
248 default: dir->d_type = DT_UNKNOWN;
break;
255int __fioLseekDirHelper(
void *userdata,
int offset,
int whence)
260 _fio_file_info_t *finfo;
264 fd = __fioGetFdHelper(userdata);
270 filename = __fioGetFilenameHelper(userdata);
272 if (filename == NULL)
277 if (userdata == NULL)
282 finfo = (_fio_file_info_t *)userdata;
284 if (whence != SEEK_SET)
290 uid = fioDopen(filename);
292 for (i = 0; i < offset; i++) {
293 __fioDreadHelper(userdata, &dir);
299int __libcglue_init_stdio(_libcglue_fdman_fd_info_t *info,
int fd)
301 _fio_file_info_t *userdata;
303 const char *tty0_str =
"tty0:";
305 fnlen = strlen(tty0_str) + 1;
307 userdata = malloc(
sizeof(_fio_file_info_t) + fnlen);
308 if (userdata == NULL)
313 memcpy(userdata->filename, tty0_str, fnlen - 1);
314 userdata->filename[fnlen - 1] =
'\x00';
315 info->userdata = (
void *)userdata;
316 info->ops = &__fio_fdman_ops_file;
326 return fioMkdir(path);
329static time_t io_to_posix_time(
const unsigned char *ps2time)
332 tim.tm_sec = ps2time[1];
333 tim.tm_min = ps2time[2];
334 tim.tm_hour = ps2time[3];
335 tim.tm_mday = ps2time[4];
336 tim.tm_mon = ps2time[5] - 1;
337 tim.tm_year = ((u16)ps2time[6] | ((u16)ps2time[7] << 8)) - 1900;
341static mode_t io_to_posix_mode(
unsigned int ps2mode)
343 mode_t posixmode = 0;
346 if (ps2mode &
FIO_SO_IROTH) posixmode |= S_IRUSR|S_IRGRP|S_IROTH;
347 if (ps2mode &
FIO_SO_IWOTH) posixmode |= S_IWUSR|S_IWGRP|S_IWOTH;
348 if (ps2mode &
FIO_SO_IXOTH) posixmode |= S_IXUSR|S_IXGRP|S_IXOTH;
352static void __fill_stat(
struct stat *stat,
const io_stat_t *fiostat)
356 stat->st_mode = io_to_posix_mode(fiostat->mode);
361 stat->st_size = ((off_t)fiostat->hisize << 32) | (off_t)fiostat->size;
362 stat->st_atime = io_to_posix_time(fiostat->atime);
363 stat->st_mtime = io_to_posix_time(fiostat->mtime);
364 stat->st_ctime = io_to_posix_time(fiostat->ctime);
365 stat->st_blksize = 16*1024;
366 stat->st_blocks = stat->st_size / 512;
369int __fioGetstatHelper(
const char *path,
struct stat *buf)
372 struct { io_stat_t st; }
__attribute__((aligned(64))) aligned_stat;
375 if (strncmp(path,
"tty", 3) == 0 && path[3] >=
'0' && path[3] <=
'9' && path[4] ==
':')
377 memset(buf, 0,
sizeof(
struct stat));
378 buf->st_mode = S_IFCHR;
382 if (fioGetstat(path, fiostat_p) < 0) {
386 __fill_stat(buf, fiostat_p);
391int __attribute__((weak)) _open(
const char *buf,
int flags, ...);
393int __attribute__((weak)) mkdir(
const char *path, mode_t mode);
395int __attribute__((weak)) _stat(
const char *path,
struct stat *buf);
398int __attribute__((weak)) _read(
int fd,
void *buf,
size_t nbytes);
399off_t
__attribute__((weak)) _lseek(
int fd, off_t offset,
int whence);
400int __attribute__((weak)) _write(
int fd,
const void *buf,
size_t nbytes);
405void __fioOpsInitializeImpl(
void)
407 memset(&__fio_fdman_path_ops, 0,
sizeof(__fio_fdman_path_ops));
409 if (&_open) __fio_fdman_path_ops.open = __fioOpenHelper;
411 if (&_unlink) __fio_fdman_path_ops.remove = fioRemove;
415 if (&rmdir) __fio_fdman_path_ops.rmdir = fioRmdir;
417 if ((&_stat) || (&_fstat)) __fio_fdman_path_ops.stat = __fioGetstatHelper;
419 memset(&__fio_fdman_ops_file, 0,
sizeof(__fio_fdman_ops_file));
420 __fio_fdman_ops_file.getfd = __fioGetFdHelper;
421 __fio_fdman_ops_file.getfilename = __fioGetFilenameHelper;
423 if (&_close) __fio_fdman_ops_file.close = __fioCloseHelper;
425 if (&_read) __fio_fdman_ops_file.read = __fioReadHelper;
427 if (&_lseek) __fio_fdman_ops_file.lseek = __fioLseekHelper;
429 if (&_write) __fio_fdman_ops_file.write = __fioWriteHelper;
431 if ((&_ioctl) || (&_ps2sdk_ioctl)) __fio_fdman_ops_file.ioctl = __fioIoctlHelper;
433 memset(&__fio_fdman_ops_dir, 0,
sizeof(__fio_fdman_ops_dir));
434 __fio_fdman_ops_dir.getfd = __fioGetFdHelper;
435 __fio_fdman_ops_dir.getfilename = __fioGetFilenameHelper;
437 if (&_close) __fio_fdman_ops_dir.close = __fioDcloseHelper;
439 if (&_lseek) __fio_fdman_ops_dir.lseek = __fioLseekDirHelper;
441 if (&getdents) __fio_fdman_ops_dir.dread = __fioDreadHelper;
444extern _libcglue_fdman_path_ops_t * _ps2sdk_get_default_fdman_path_ops(
void);
445_libcglue_fdman_path_ops_t *
__attribute__((weak)) _ps2sdk_get_default_fdman_path_ops(
void)
447 return &__fio_fdman_path_ops;
450_libcglue_fdman_path_ops_t *_libcglue_fdman_path_ops = NULL;
453static void __libcglue_fdman_path_ops_initialize(
void)
455 _libcglue_fdman_path_ops = _ps2sdk_get_default_fdman_path_ops();
458_libcglue_fdman_socket_ops_t *_libcglue_fdman_socket_ops = NULL;
475int libcglue_ps2ip_setconfig(
const t_ip_info *ip_info)
477 if (_libcglue_fdman_socket_ops == NULL || _libcglue_fdman_socket_ops->setconfig == NULL)
482 return _libcglue_fdman_socket_ops->setconfig(ip_info);
485int libcglue_ps2ip_getconfig(
char *netif_name,
t_ip_info *ip_info)
487 if (_libcglue_fdman_socket_ops == NULL || _libcglue_fdman_socket_ops->getconfig == NULL)
492 return _libcglue_fdman_socket_ops->getconfig(netif_name, ip_info);
495void libcglue_dns_setserver(u8 numdns,
const ip_addr_t *dnsserver)
497 if (_libcglue_fdman_socket_ops == NULL || _libcglue_fdman_socket_ops->dns_setserver == NULL)
501 _libcglue_fdman_socket_ops->dns_setserver(numdns, dnsserver);
504const ip_addr_t *libcglue_dns_getserver(u8 numdns)
506 if (_libcglue_fdman_socket_ops == NULL || _libcglue_fdman_socket_ops->dns_getserver == NULL)
510 return _libcglue_fdman_socket_ops->dns_getserver(numdns);
513_libcglue_fdman_inet_ops_t *_libcglue_fdman_inet_ops = NULL;
int __fioMkdirHelper(const char *path, int mode)
u32 count
start sector of fragmented bd/file