17 #include "irx_imports.h"
24 #define Kprintf printf
32 #ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
33 IRX_ID(
"IOX/File_Manager", 1, 1);
35 IRX_ID(
"IO/File_Manager", 2, 3);
40 #ifndef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
46 #ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
47 #define MAX_DEVICES 32
50 #define MAX_DEVICES 16
54 void iomanX_StdioInit(
int mode);
55 static int open_tty_handles(
const char *tty_name);
56 static int xx_stat(
int op,
const char *name,
iox_stat_t *stat,
unsigned int statmask);
57 static int xx_rename(
int op,
const char *oldname,
const char *newname);
58 static int xx_dir(
int op,
const char *name,
int mode);
59 static int _ioabort(
const char *str1,
const char *str2);
63 static const char *parsefile(
const char *path,
iomanX_iop_device_t **p_device,
int *p_unit);
64 static void ShowDrv(
void);
65 static void register_tty(
void);
67 static void register_dummytty(
void);
70 #ifdef IOMANX_USE_DEVICE_LINKED_LIST
71 struct ioman_dev_listentry
73 struct ioman_dev_listentry *next;
78 static int showdrvflag = 1;
80 IOMANX_RETURN_VALUE_IMPL(0);
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),
116 &dev_tty_dev_operations,
124 &dev_tty_dev_operations,
127 static int adddeldrv_in_process;
128 #ifdef IOMANX_USE_ERRNO
129 static int errno_local;
131 #ifdef IOMANX_USE_DEVICE_LINKED_LIST
132 static struct ioman_dev_listentry *device_entry_empty_list_head;
133 static struct ioman_dev_listentry *device_entry_used_list_head;
135 #ifndef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
139 #ifdef IOMANX_USE_DEVICE_LINKED_LIST
140 static struct ioman_dev_listentry device_entry_list[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
162 static inline void write_str_to_stdout(
const char *in_str)
164 iomanX_write(1, (
void *)in_str, strlen(in_str));
167 static inline int set_errno(
int in_errno)
169 #ifdef IOMANX_USE_ERRNO
170 errno_local = in_errno;
175 static inline void handle_result_pre(
int in_result,
iomanX_iop_file_t *f,
int op)
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
219 extern int hook_ioman(
void);
220 extern 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
235 int 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;
287 int 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
327 int mode2modex(
int mode)
349 int modex2mode(
int modex)
377 void iomanX_StdioInit(
int mode)
385 BootMode = QueryBootMode(3);
386 if ( BootMode && (BootMode[1] & 4) )
388 ReferThreadStatus(0, &thinfo);
389 ChangeThreadPriority(0, 4);
399 open_tty_handles(
"tty:");
407 open_tty_handles(
"dummytty:");
417 open_tty_handles(
"tty:");
420 ChangeThreadPriority(0, thinfo.currentPriority);
424 static int open_tty_handles(
const char *tty_name)
426 if ( iomanX_open(tty_name, 3) != 0 || iomanX_open(tty_name, 2) != 1 )
431 int 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);
454 int 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);
473 s64 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);
494 int 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);
504 int 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);
514 int 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);
527 int 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);
537 int 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);
550 int 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);
602 int 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);
624 int iomanX_mkdir(
const char *path,
int mode)
626 return xx_dir(4, path, mode);
629 int iomanX_rmdir(
const char *path)
631 return xx_dir(5, path, 0);
634 static 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);
700 int iomanX_getstat(
const char *name,
iox_stat_t *stat)
702 return xx_stat(2, name, stat, 0);
705 int iomanX_chstat(
const char *name,
iox_stat_t *stat,
unsigned int statmask)
707 return xx_stat(1, name, stat, statmask);
710 int 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);
734 static int xx_rename(
int op,
const char *oldname,
const char *newname)
737 const char *parsefile_res;
738 const char *parsefile_res_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);
786 int iomanX_rename(
const char *oldname,
const char *newname)
788 return xx_rename(7, oldname, newname);
792 int iomanX_symlink(
const char *oldname,
const char *newname)
794 return xx_rename(8, oldname, newname);
797 int iomanX_chdir(
const char *name)
799 return xx_dir(0x103, name, 0);
805 static 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);
846 int iomanX_sync(
const char *dev,
int flag)
848 return xx_dir(0x106, dev, flag);
851 int 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);
878 int 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);
903 int 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);
928 int 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);
952 static 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 )
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];
993 #ifdef IOMANX_USE_DEVICE_LINKED_LIST
994 struct ioman_dev_listentry *entry;
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;
1035 static const char *parsefile(
const char *path,
iomanX_iop_device_t **p_device,
int *p_unit)
1037 const char *path_trimmed;
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;
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;
1152 int 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;
1209 unsigned int iomanX_GetDevType(
int fd)
1215 return handle_result(-
EBADF, f, 0);
1219 static 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);
1242 static void register_tty(
void)
1244 iomanX_DelDrv(dev_tty.name);
1245 iomanX_AddDrv(&dev_tty);
1249 static void register_dummytty(
void)
1251 iomanX_DelDrv(dev_dummytty.name);
1252 iomanX_AddDrv(&dev_dummytty);