32#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
33IRX_ID(
"IOX/File_Manager", 1, 1);
35IRX_ID(
"IO/File_Manager", 2, 3);
40#ifndef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
46#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
54void iomanX_StdioInit(
int mode);
55static int open_tty_handles(
const char *tty_name);
56static int xx_stat(
int op,
const char *name,
iox_stat_t *stat,
unsigned int statmask);
57static int xx_rename(
int op,
const char *oldname,
const char *newname);
58static int xx_dir(
int op,
const char *name,
int mode);
59static int _ioabort(
const char *str1,
const char *str2);
62static iomanX_iop_device_t *lookup_dev(
const char *name,
int show_unkdev_msg);
63static const char *parsefile(
const char *path, iomanX_iop_device_t **p_device,
int *p_unit);
64static void ShowDrv(
void);
65static void register_tty(
void);
67static void register_dummytty(
void);
70#ifdef IOMANX_USE_DEVICE_LINKED_LIST
71struct ioman_dev_listentry
73 struct ioman_dev_listentry *next;
74 iomanX_iop_device_t *device;
78static int showdrvflag = 1;
80IOMANX_RETURN_VALUE_IMPL(0);
82static iomanX_iop_device_ops_t dev_tty_dev_operations = {
83 IOMANX_RETURN_VALUE(0),
84 IOMANX_RETURN_VALUE(0),
85 IOMANX_RETURN_VALUE(0),
86 IOMANX_RETURN_VALUE(0),
87 IOMANX_RETURN_VALUE(0),
88 IOMANX_RETURN_VALUE(0),
89 IOMANX_RETURN_VALUE(0),
90 IOMANX_RETURN_VALUE(0),
91 IOMANX_RETURN_VALUE(0),
92 IOMANX_RETURN_VALUE(0),
93 IOMANX_RETURN_VALUE(0),
94 IOMANX_RETURN_VALUE(0),
95 IOMANX_RETURN_VALUE(0),
96 IOMANX_RETURN_VALUE(0),
97 IOMANX_RETURN_VALUE(0),
98 IOMANX_RETURN_VALUE(0),
99 IOMANX_RETURN_VALUE(0),
100 IOMANX_RETURN_VALUE(0),
101 IOMANX_RETURN_VALUE(0),
102 IOMANX_RETURN_VALUE(0),
103 IOMANX_RETURN_VALUE(0),
104 IOMANX_RETURN_VALUE(0),
105 IOMANX_RETURN_VALUE_S64(0),
106 IOMANX_RETURN_VALUE(0),
107 IOMANX_RETURN_VALUE(0),
108 IOMANX_RETURN_VALUE(0),
109 IOMANX_RETURN_VALUE(0),
111static iomanX_iop_device_t dev_tty = {
116 &dev_tty_dev_operations,
119static iomanX_iop_device_t dev_dummytty = {
124 &dev_tty_dev_operations,
127static int adddeldrv_in_process;
128#ifdef IOMANX_USE_ERRNO
129static int errno_local;
131#ifdef IOMANX_USE_DEVICE_LINKED_LIST
132static struct ioman_dev_listentry *device_entry_empty_list_head;
133static struct ioman_dev_listentry *device_entry_used_list_head;
135#ifndef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
139#ifdef IOMANX_USE_DEVICE_LINKED_LIST
140static struct ioman_dev_listentry device_entry_list[MAX_DEVICES];
142static iomanX_iop_device_t *device_table[MAX_DEVICES];
146#define isnum(c) ((c) >= '0' && (c) <= '9')
151#define EUNSUP ENOTSUP
157#define HANDLE_RESULT_CLEAR_INFO 1
158#define HANDLE_RESULT_CLEAR_INFO_ON_ERROR 2
159#define HANDLE_RESULT_RETURN_ZERO 4
160#define HANDLE_RESULT_RETURN_FD 8
162static inline void write_str_to_stdout(
const char *in_str)
164 iomanX_write(1, (
void *)in_str, strlen(in_str));
167static inline int set_errno(
int in_errno)
169#ifdef IOMANX_USE_ERRNO
170 errno_local = in_errno;
177 if ( (op & HANDLE_RESULT_CLEAR_INFO) )
185 if ( (op & HANDLE_RESULT_CLEAR_INFO_ON_ERROR) )
187 if ( f && (in_result < 0) )
196 handle_result_pre(in_result, f, op);
198 return set_errno(-in_result);
199 if ( (op & HANDLE_RESULT_RETURN_ZERO) )
201 if ( (op & HANDLE_RESULT_RETURN_FD) )
202 return f - file_table;
208 handle_result_pre(in_result, f, op);
210 return set_errno(-(
int)in_result);
211 if ( (op & HANDLE_RESULT_RETURN_ZERO) )
213 if ( (op & HANDLE_RESULT_RETURN_FD) )
214 return f - file_table;
218#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
219extern int hook_ioman(
void);
220extern int unhook_ioman(
void);
223#ifndef IOMANX_ENTRYPOINT
225#define IOMANX_ENTRYPOINT _start
227#define IOMANX_ENTRYPOINT iomanX_start
231#ifndef IOMANX_CLEANUP
232#define IOMANX_CLEANUP shutdown
235int IOMANX_ENTRYPOINT(
int ac,
char **av)
237#ifdef IOMANX_USE_DEVICE_LINKED_LIST
241 int ioman_already_registered;
248 adddeldrv_in_process = 0;
249#ifdef IOMANX_USE_DEVICE_LINKED_LIST
251 memset(device_entry_list, 0,
sizeof(device_entry_list));
252 device_entry_used_list_head = NULL;
253 device_entry_empty_list_head = device_entry_list;
255 for ( i = 0; i < ((
sizeof(device_entry_list) /
sizeof(device_entry_list[0])) - 1); i += 1 )
256 device_entry_list[i].next = &device_entry_list[i + 1];
258 memset(device_table, 0,
sizeof(device_table));
261 memset(file_table, 0,
sizeof(file_table));
266 if ( RegisterLibraryEntries(&_exp_iomanx) )
267 return MODULE_NO_RESIDENT_END;
268#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
269 ioman_already_registered = hook_ioman();
271 ioman_already_registered = RegisterLibraryEntries(&_exp_ioman);
273 if ( ioman_already_registered )
274 return MODULE_NO_RESIDENT_END;
276 SetRebootTimeLibraryHandlingMode(&_exp_ioman, 2);
279 _exp_iomanx.mode &= ~6;
280 _exp_iomanx.mode |= 2;
284 return MODULE_RESIDENT_END;
287int IOMANX_CLEANUP(
int arg)
289#ifdef IOMANX_USE_DEVICE_LINKED_LIST
290 struct ioman_dev_listentry *i;
295#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
301#ifdef IOMANX_USE_DEVICE_LINKED_LIST
302 for ( i = device_entry_used_list_head; i; i = i->next )
304 i->device->ops->deinit(i->device);
308 for ( i = 0; i < (
sizeof(device_table) /
sizeof(device_table[0])); i += 1 )
310 if ( device_table[i] )
312 device_table[i]->ops->deinit(device_table[i]);
313 device_table[i] = NULL;
318 return MODULE_RESIDENT_END;
321#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
322iomanX_iop_device_t **iomanX_GetDeviceList(
void)
327int mode2modex(
int mode)
349int modex2mode(
int modex)
377void iomanX_StdioInit(
int mode)
381 iop_thread_info_t thinfo;
385 BootMode = QueryBootMode(3);
386 if ( BootMode && (BootMode[1] & 4) )
388 ReferThreadStatus(
TH_SELF, &thinfo);
389 ChangeThreadPriority(
TH_SELF, 4);
399 open_tty_handles(
"tty:");
407 open_tty_handles(
"dummytty:");
417 open_tty_handles(
"tty:");
420 ChangeThreadPriority(
TH_SELF, thinfo.currentPriority);
424static int open_tty_handles(
const char *tty_name)
426 if ( iomanX_open(tty_name, 3) != 0 || iomanX_open(tty_name, 2) != 1 )
431int iomanX_open(
const char *name,
int flags, ...)
434 const char *parsefile_res;
439 mode = va_arg(va,
int);
443 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
444 parsefile_res = parsefile(name, &(f->
device), &(f->
unit));
445 if ( !parsefile_res )
446 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
448 return handle_result(
449 f->
device->ops->open(f, parsefile_res, flags, mode),
451 HANDLE_RESULT_CLEAR_INFO_ON_ERROR | HANDLE_RESULT_RETURN_FD);
454int iomanX_lseek(
int fd,
int offset,
int mode)
460 return handle_result(-
EBADF, f, 0);
466 return handle_result(f->
device->ops->lseek(f, offset, mode), f, 0);
468 write_str_to_stdout(
"invalid lseek arg\r\n");
469 return handle_result(-
EINVAL, f, 0);
473s64 iomanX_lseek64(
int fd, s64 offset,
int whence)
479 return handle_result(-
EBADF, f, 0);
481 return handle_result(-
EUNSUP, f, 0);
487 return handle_result64(f->
device->ops->lseek64(f, offset, whence), f, 0);
489 write_str_to_stdout(
"invalid lseek arg\r\n");
490 return handle_result(-
EINVAL, f, 0);
494int iomanX_read(
int fd,
void *ptr,
int size)
499 if ( !f || !(f->
mode & FIO_O_RDONLY) )
500 return handle_result(-
EBADF, f, 0);
501 return handle_result(f->
device->ops->read(f, ptr, size), f, 0);
504int iomanX_write(
int fd,
void *ptr,
int size)
509 if ( !f || !(f->
mode & FIO_O_WRONLY) )
510 return handle_result(-
EBADF, f, 0);
511 return handle_result(f->
device->ops->write(f, ptr, size), f, 0);
514int iomanX_close(
int fd)
520 return handle_result(-
EBADF, f, 0);
521 return handle_result(
522 (f->
mode & FIO_O_DIROPEN) ? f->
device->ops->dclose(f) : f->
device->ops->close(f),
524 HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_FD);
527int iomanX_ioctl(
int fd,
int cmd,
void *param)
533 return handle_result(-
EBADF, f, 0);
534 return handle_result(f->
device->ops->ioctl(f, cmd, param), f, 0);
537int iomanX_ioctl2(
int fd,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen)
543 return handle_result(-
EBADF, f, 0);
546 return handle_result(-
EUNSUP, f, 0);
547 return handle_result(f->
device->ops->ioctl2(f, cmd, arg, arglen, buf, buflen), f, 0);
550int iomanX_dopen(
const char *path)
553 const char *parsefile_res;
557 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
558 parsefile_res = parsefile(path, &(f->
device), &(f->
unit));
559 if ( !parsefile_res )
560 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
561 f->
mode = FIO_O_DIROPEN;
562 return handle_result(
563 f->
device->ops->dopen(f, parsefile_res), f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR | HANDLE_RESULT_RETURN_FD);
571 if ( !f || !(f->
mode & FIO_O_DIROPEN) )
572 return handle_result(-
EBADF, f, 0);
573#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
581 io_dread_t *io_dread;
583 io_dread = (io_dread_t *)f->
device->ops->dread;
584 res = io_dread(f, &io_dirent);
586 buf->stat.mode = mode2modex(io_dirent.stat.mode);
588 buf->stat.attr = io_dirent.stat.attr;
589 buf->stat.size = io_dirent.stat.size;
590 memcpy(buf->stat.ctime, io_dirent.stat.ctime,
sizeof(io_dirent.stat.ctime));
591 memcpy(buf->stat.atime, io_dirent.stat.atime,
sizeof(io_dirent.stat.atime));
592 memcpy(buf->stat.mtime, io_dirent.stat.mtime,
sizeof(io_dirent.stat.mtime));
593 buf->stat.hisize = io_dirent.stat.hisize;
595 strncpy(buf->name, io_dirent.name,
sizeof(buf->name));
596 return handle_result(res, f, 0);
599 return handle_result(f->
device->ops->dread(f, buf), f, 0);
602int iomanX_remove(
const char *name)
605 const char *parsefile_res;
606#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
610#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
615 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
617 parsefile_res = parsefile(name, &(f->
device), &(f->
unit));
618 if ( !parsefile_res )
619 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
620 return handle_result(
621 f->
device->ops->remove(f, parsefile_res), f, HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
624int iomanX_mkdir(
const char *path,
int mode)
626 return xx_dir(4, path, mode);
629int iomanX_rmdir(
const char *path)
631 return xx_dir(5, path, 0);
634static int xx_stat(
int op,
const char *name,
iox_stat_t *stat,
unsigned int statmask)
637 const char *parsefile_res;
638#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
642#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
647 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
649 parsefile_res = parsefile(name, &(f->
device), &(f->
unit));
650 if ( !parsefile_res )
651 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
656#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
663 memcpy(&stat_tmp, stat,
sizeof(stat_tmp));
664 stat_tmp.mode = modex2mode(stat->mode);
665 return handle_result(
666 f->
device->ops->chstat(f, parsefile_res, &stat_tmp, statmask),
668 HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
671 return handle_result(
672 f->
device->ops->chstat(f, parsefile_res, stat, statmask),
674 HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
678#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
685 res = f->
device->ops->getstat(f, parsefile_res, stat);
687 stat->mode = mode2modex(stat->mode);
688 return handle_result(res, f, HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
691 return handle_result(
692 f->
device->ops->getstat(f, parsefile_res, stat), f, HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
696 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
700int iomanX_getstat(
const char *name,
iox_stat_t *stat)
702 return xx_stat(2, name, stat, 0);
705int iomanX_chstat(
const char *name,
iox_stat_t *stat,
unsigned int statmask)
707 return xx_stat(1, name, stat, statmask);
710int iomanX_format(
const char *dev,
const char *blockdev,
void *arg,
int arglen)
713 const char *parsefile_res;
714#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
718#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
723 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
725 parsefile_res = parsefile(dev, &(f->
device), &(f->
unit));
726 if ( !parsefile_res )
727 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
728 return handle_result(
729 f->
device->ops->format(f, parsefile_res, blockdev, arg, arglen),
731 HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
734static int xx_rename(
int op,
const char *oldname,
const char *newname)
737 const char *parsefile_res;
738 const char *parsefile_res_new;
739 iomanX_iop_device_t *device_new;
741#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
745#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
750 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
752 parsefile_res = parsefile(oldname, &(f->
device), &(f->
unit));
753 if ( !parsefile_res )
754 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
756 parsefile_res_new = newname;
759 if ( newname && index(newname,
':') )
760 parsefile_res_new = parsefile(newname, &device_new, &unit_new);
762 if ( !parsefile_res_new || (device_new != f->
device) || (unit_new != f->
unit) )
763 return handle_result(-
EXDEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
766 return handle_result(-
EUNSUP, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
770 return handle_result(
771 f->
device->ops->rename(f, parsefile_res, parsefile_res_new),
773 HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
775 return handle_result(
776 f->
device->ops->symlink(f, parsefile_res, parsefile_res_new),
778 HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
781 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
786int iomanX_rename(
const char *oldname,
const char *newname)
788 return xx_rename(7, oldname, newname);
792int iomanX_symlink(
const char *oldname,
const char *newname)
794 return xx_rename(8, oldname, newname);
797int iomanX_chdir(
const char *name)
799 return xx_dir(0x103, name, 0);
805static int xx_dir(
int op,
const char *name,
int mode)
808 const char *parsefile_res;
809#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
813#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
818 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
820 parsefile_res = parsefile(name, &(f->
device), &(f->
unit));
821 if ( !parsefile_res )
822 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
825 return handle_result(-
EUNSUP, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
829 return handle_result(
830 f->
device->ops->mkdir(f, parsefile_res, mode), f, HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
832 return handle_result(
833 f->
device->ops->rmdir(f, parsefile_res), f, HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
835 return handle_result(
836 f->
device->ops->chdir(f, parsefile_res), f, HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
838 return handle_result(
839 f->
device->ops->sync(f, parsefile_res, mode), f, HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
842 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
846int iomanX_sync(
const char *dev,
int flag)
848 return xx_dir(0x106, dev, flag);
851int iomanX_mount(
const char *fsname,
const char *devname,
int flag,
void *arg,
int arglen)
854 const char *parsefile_res;
855#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
859#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
864 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
866 parsefile_res = parsefile(fsname, &(f->
device), &(f->
unit));
867 if ( !parsefile_res )
868 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
871 return handle_result(-
EUNSUP, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
872 return handle_result(
873 f->
device->ops->mount(f, parsefile_res, devname, flag, arg, arglen),
875 HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
878int iomanX_umount(
const char *fsname)
881 const char *parsefile_res;
882#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
886#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
891 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
893 parsefile_res = parsefile(fsname, &(f->
device), &(f->
unit));
894 if ( !parsefile_res )
895 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
898 return handle_result(-
EUNSUP, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
899 return handle_result(
900 f->
device->ops->umount(f, parsefile_res), f, HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
903int iomanX_devctl(
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen)
906 const char *parsefile_res;
907#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
911#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
916 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
918 parsefile_res = parsefile(name, &(f->
device), &(f->
unit));
919 if ( !parsefile_res )
920 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
923 return handle_result(-
EUNSUP, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
924 return handle_result(
925 f->
device->ops->devctl(f, parsefile_res, cmd, arg, arglen, buf, buflen), f, HANDLE_RESULT_CLEAR_INFO);
928int iomanX_readlink(
const char *path,
char *buf,
unsigned int buflen)
931 const char *parsefile_res;
932#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
936#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
941 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
943 parsefile_res = parsefile(path, &(f->
device), &(f->
unit));
944 if ( !parsefile_res )
945 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
948 return handle_result(-
EUNSUP, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
949 return handle_result(f->
device->ops->readlink(f, parsefile_res, buf, buflen), f, HANDLE_RESULT_CLEAR_INFO);
952static int _ioabort(
const char *str1,
const char *str2)
954 return Kprintf(
"ioabort exit:%s %s\n", str1, str2);
965 file_table_entry = NULL;
966 while ( fd < (
int)(
sizeof(file_table) /
sizeof(file_table[0])) )
968 if ( !file_table[fd].device )
970 file_table_entry = &file_table[fd];
976 if ( file_table_entry )
977 file_table_entry->
device = (iomanX_iop_device_t *)(uiptr)0xFFFFFFEC;
979 if ( !file_table_entry )
980 _ioabort(
"out of file descriptors",
"[too many open]");
981 return file_table_entry;
986 if ( (fd < 0) || (fd >= (
int)(
sizeof(file_table) /
sizeof(file_table[0]))) || (!file_table[fd].device) )
988 return &file_table[fd];
991static iomanX_iop_device_t *lookup_dev(
const char *name,
int show_unkdev_msg)
993#ifdef IOMANX_USE_DEVICE_LINKED_LIST
994 struct ioman_dev_listentry *entry;
996 iomanX_iop_device_t *device;
1002#ifdef IOMANX_USE_DEVICE_LINKED_LIST
1003 entry = device_entry_used_list_head;
1004 while ( entry && strcmp(name, entry->device->name) )
1005 entry = entry->next;
1006 if ( !entry && show_unkdev_msg )
1008 Kprintf(
"Unknown device '%s'\n", name);
1013 for ( i = 0; i < (
sizeof(device_table) /
sizeof(device_table[0])); i += 1 )
1015 if ( device_table[i] && !strcmp(name, device_table[i]->name) )
1017 device = device_table[i];
1021 if ( !device && show_unkdev_msg )
1023 Kprintf(
"Unknown device '%s'\n", name);
1028#ifdef IOMANX_USE_DEVICE_LINKED_LIST
1029 return entry ? entry->device : NULL;
1035static const char *parsefile(
const char *path, iomanX_iop_device_t **p_device,
int *p_unit)
1037 const char *path_trimmed;
1040 iomanX_iop_device_t *device;
1044 path_trimmed = path;
1045 while ( *path_trimmed ==
' ' )
1047 colon_index = index(path_trimmed,
':');
1051 Kprintf(
"Unknown device '%s'\n", path_trimmed);
1054 devname_len = colon_index - path_trimmed;
1056 if ( devname_len > (
sizeof(canon) - 1) )
1058 strncpy(canon, path_trimmed, devname_len);
1059 canon[devname_len] = 0;
1062 while ( isnum(canon[devname_len - 1]) )
1064 if ( isnum(canon[devname_len]) )
1065 unit = strtol(&canon[devname_len], 0, 10);
1066 canon[devname_len] = 0;
1068 device = lookup_dev(canon, 1);
1076 return colon_index + 1;
1081int iomanX_AddDrv(iomanX_iop_device_t *device)
1083#ifdef IOMANX_USE_DEVICE_LINKED_LIST
1084 struct ioman_dev_listentry *entry;
1085 struct ioman_dev_listentry *old_head;
1092 if ( adddeldrv_in_process )
1094 Kprintf(
"AddDrv()/DelDrv() recursive/mutithread call error !!");
1099 adddeldrv_in_process = 1;
1101#ifdef IOMANX_USE_DEVICE_LINKED_LIST
1102 entry = device_entry_empty_list_head;
1104 if ( !entry || lookup_dev(device->name, 0) )
1106 adddeldrv_in_process = 0;
1109 entry->device = device;
1110 device_entry_empty_list_head = entry->next;
1111 if ( device->ops->init(device) < 0 )
1113 old_head = device_entry_empty_list_head;
1114 entry->device = NULL;
1115 device_entry_empty_list_head = entry;
1116 entry->next = old_head;
1117 adddeldrv_in_process = 0;
1120 old_head = device_entry_used_list_head;
1121 device_entry_used_list_head = entry;
1122 entry->next = old_head;
1124 for ( i = 0; i < (
sizeof(device_table) /
sizeof(device_table[0])); i += 1 )
1126 if ( !device_table[i] )
1130 if ( i >= (
sizeof(device_table) /
sizeof(device_table[0])) )
1132 adddeldrv_in_process = 0;
1136 device_table[i] = device;
1140 if ( device->ops->init(device) < 0 )
1142 device_table[i] = NULL;
1143 adddeldrv_in_process = 0;
1148 adddeldrv_in_process = 0;
1152int iomanX_DelDrv(
const char *name)
1154#ifdef IOMANX_USE_DEVICE_LINKED_LIST
1155 struct ioman_dev_listentry *entry;
1156 struct ioman_dev_listentry **p_next;
1157 struct ioman_dev_listentry *old_head;
1164 if ( adddeldrv_in_process )
1166 Kprintf(
"AddDrv()/DelDrv() recursive/mutithread call error !!");
1170 adddeldrv_in_process = 1;
1172#ifdef IOMANX_USE_DEVICE_LINKED_LIST
1173 entry = device_entry_used_list_head;
1174 p_next = &device_entry_used_list_head;
1175 while ( entry && strcmp(name, entry->device->name) )
1177 p_next = &entry->next;
1178 entry = entry->next;
1180 if ( !entry || entry->device->ops->deinit(entry->device) < 0 )
1182 adddeldrv_in_process = 0;
1185 old_head = device_entry_empty_list_head;
1186 entry->device = NULL;
1187 device_entry_empty_list_head = entry;
1188 *p_next = entry->next;
1189 entry->next = old_head;
1190 adddeldrv_in_process = 0;
1193 for ( i = 0; i < (
sizeof(device_table) /
sizeof(device_table[0])); i += 1 )
1195 if ( device_table[i] && !strcmp(name, device_table[i]->name) )
1197 device_table[i]->ops->deinit(device_table[i]);
1198 device_table[i] = NULL;
1199 adddeldrv_in_process = 0;
1204 adddeldrv_in_process = 0;
1209unsigned int iomanX_GetDevType(
int fd)
1215 return handle_result(-
EBADF, f, 0);
1219static void ShowDrv(
void)
1221#ifdef IOMANX_USE_DEVICE_LINKED_LIST
1222 struct ioman_dev_listentry *i;
1229 Kprintf(
"Known devices are ");
1230#ifdef IOMANX_USE_DEVICE_LINKED_LIST
1231 for ( i = device_entry_used_list_head; i; i = i->next )
1232 Kprintf(
" %s:(%s) ", i->device->name, i->device->desc);
1234 for ( i = 0; i < (
sizeof(device_table) /
sizeof(device_table[0])); i += 1 )
1235 if ( device_table[i] != NULL && device_table[i]->name != NULL )
1236 Kprintf(
" %s:(%s) ", device_table[i]->name, device_table[i]->desc);
1242static void register_tty(
void)
1244 iomanX_DelDrv(dev_tty.name);
1245 iomanX_AddDrv(&dev_tty);
1249static void register_dummytty(
void)
1251 iomanX_DelDrv(dev_dummytty.name);
1252 iomanX_AddDrv(&dev_dummytty);
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)
int iomanX_format(const char *dev, const char *blockdev, void *arg, int arglen)
struct _iomanX_iop_file iomanX_iop_file_t
struct _iomanX_iop_device * device