17#include "irx_imports.h"
32#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
33IRX_ID(
"IOX/File_Manager", 1, 1);
35IRX_ID(
"IO/File_Manager", 2, 3);
40#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
47#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
55void iomanX_StdioInit(
int mode);
56static int open_tty_handles(
const char *tty_name);
57static int xx_stat(
int op,
const char *name,
iox_stat_t *stat,
unsigned int statmask);
58static int xx_rename(
int op,
const char *oldname,
const char *newname);
59static int xx_dir(
int op,
const char *name,
int mode);
60static int _ioabort(
const char *str1,
const char *str2);
65static void ShowDrv(
void);
66static void register_tty(
void);
68static void register_dummytty(
void);
71#ifdef IOMANX_USE_DEVICE_LINKED_LIST
72struct ioman_dev_listentry
74 struct ioman_dev_listentry *next;
79static int showdrvflag = 1;
81IOMANX_RETURN_VALUE_IMPL(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(0),
106 IOMANX_RETURN_VALUE_S64(0),
107 IOMANX_RETURN_VALUE(0),
108 IOMANX_RETURN_VALUE(0),
109 IOMANX_RETURN_VALUE(0),
110 IOMANX_RETURN_VALUE(0),
117 &dev_tty_dev_operations,
125 &dev_tty_dev_operations,
128static int adddeldrv_in_process;
129#ifdef IOMANX_USE_ERRNO
130static int errno_local;
132#ifdef IOMANX_USE_DEVICE_LINKED_LIST
133static struct ioman_dev_listentry *device_entry_empty_list_head;
134static struct ioman_dev_listentry *device_entry_used_list_head;
136#ifndef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
140#ifdef IOMANX_USE_DEVICE_LINKED_LIST
141static struct ioman_dev_listentry device_entry_list[MAX_DEVICES];
147#define isnum(c) ((c) >= '0' && (c) <= '9')
152#define EUNSUP ENOTSUP
158#define HANDLE_RESULT_CLEAR_INFO 1
159#define HANDLE_RESULT_CLEAR_INFO_ON_ERROR 2
160#define HANDLE_RESULT_RETURN_ZERO 4
161#define HANDLE_RESULT_RETURN_FD 8
163static inline void write_str_to_stdout(
const char *in_str)
165 iomanX_write(1, (
void *)in_str, strlen(in_str));
168static inline int set_errno(
int in_errno)
170#ifdef IOMANX_USE_ERRNO
171 errno_local = in_errno;
178 if ( (op & HANDLE_RESULT_CLEAR_INFO) )
186 if ( (op & HANDLE_RESULT_CLEAR_INFO_ON_ERROR) )
188 if ( f && (in_result < 0) )
197 handle_result_pre(in_result, f, op);
199 return set_errno(-in_result);
200 if ( (op & HANDLE_RESULT_RETURN_ZERO) )
202 if ( (op & HANDLE_RESULT_RETURN_FD) )
203 return f - file_table;
209 handle_result_pre(in_result, f, op);
211 return set_errno(-(
int)in_result);
212 if ( (op & HANDLE_RESULT_RETURN_ZERO) )
214 if ( (op & HANDLE_RESULT_RETURN_FD) )
215 return f - file_table;
219#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
220extern int hook_ioman();
221extern int unhook_ioman();
224#ifndef IOMANX_ENTRYPOINT
226#define IOMANX_ENTRYPOINT _start
228#define IOMANX_ENTRYPOINT iomanX_start
232#ifndef IOMANX_CLEANUP
233#define IOMANX_CLEANUP shutdown
236int IOMANX_ENTRYPOINT(
int ac,
char **av)
238#ifdef IOMANX_USE_DEVICE_LINKED_LIST
246#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
247 if ( RegisterLibraryEntries(&_exp_iomanx) )
248 return MODULE_NO_RESIDENT_END;
250 if ( RegisterLibraryEntries(&_exp_ioman) )
251 return MODULE_NO_RESIDENT_END;
253 SetRebootTimeLibraryHandlingMode(&_exp_ioman, 2);
256 _exp_ioman.mode &= ~6;
257 _exp_ioman.mode |= 2;
261 adddeldrv_in_process = 0;
262#ifdef IOMANX_USE_DEVICE_LINKED_LIST
264 memset(device_entry_list, 0,
sizeof(device_entry_list));
265 device_entry_used_list_head = NULL;
266 device_entry_empty_list_head = device_entry_list;
268 for ( i = 0; i < ((
sizeof(device_entry_list) /
sizeof(device_entry_list[0])) - 1); i += 1 )
269 device_entry_list[i].next = &device_entry_list[i + 1];
271 memset(device_table, 0,
sizeof(device_table));
274 memset(file_table, 0,
sizeof(file_table));
275#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
277 return MODULE_NO_RESIDENT_END;
281 return MODULE_RESIDENT_END;
284int IOMANX_CLEANUP(
int arg)
286#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
288 return MODULE_NO_RESIDENT_END;
290#ifdef IOMANX_USE_DEVICE_LINKED_LIST
291 struct ioman_dev_listentry *i;
298#ifdef IOMANX_USE_DEVICE_LINKED_LIST
299 for ( i = device_entry_used_list_head; i; i = i->next )
301 i->device->ops->deinit(i->device);
305 for ( i = 0; i < (
sizeof(device_table) /
sizeof(device_table[0])); i += 1 )
307 if ( device_table[i] )
309 device_table[i]->ops->deinit(device_table[i]);
310 device_table[i] = NULL;
315 return MODULE_RESIDENT_END;
319#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
325int mode2modex(
int mode)
329 if ( FIO_SO_ISLNK(mode) )
331 if ( FIO_SO_ISREG(mode) )
333 if ( FIO_SO_ISDIR(mode) )
347int modex2mode(
int modex)
351 if ( FIO_S_ISLNK(modex) )
353 if ( FIO_S_ISREG(modex) )
355 if ( FIO_S_ISDIR(modex) )
375void iomanX_StdioInit(
int mode)
383 BootMode = QueryBootMode(3);
384 if ( BootMode && (BootMode[1] & 4) )
386 ReferThreadStatus(0, &thinfo);
387 ChangeThreadPriority(0, 4);
397 open_tty_handles(
"tty:");
405 open_tty_handles(
"dummytty:");
415 open_tty_handles(
"tty:");
418 ChangeThreadPriority(0, thinfo.currentPriority);
422static int open_tty_handles(
const char *tty_name)
424 if ( iomanX_open(tty_name, 3) != 0 || iomanX_open(tty_name, 2) != 1 )
429int iomanX_open(
const char *name,
int flags, ...)
432 const char *parsefile_res;
437 mode = va_arg(va,
int);
441 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
442 parsefile_res = parsefile(name, &(f->
device), &(f->
unit));
443 if ( !parsefile_res )
444 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
446 return handle_result(
447 f->
device->ops->open(f, parsefile_res, flags, mode),
449 HANDLE_RESULT_CLEAR_INFO_ON_ERROR | HANDLE_RESULT_RETURN_FD);
452int iomanX_lseek(
int fd,
int offset,
int mode)
458 return handle_result(-
EBADF, f, 0);
464 return handle_result(f->
device->ops->lseek(f, offset, mode), f, 0);
466 write_str_to_stdout(
"invalid lseek arg\r\n");
467 return handle_result(-
EINVAL, f, 0);
471s64 iomanX_lseek64(
int fd, s64 offset,
int whence)
477 return handle_result(-
EBADF, f, 0);
479 return handle_result(-
EUNSUP, f, 0);
485 return handle_result64(f->
device->ops->lseek64(f, offset, whence), f, 0);
487 write_str_to_stdout(
"invalid lseek arg\r\n");
488 return handle_result(-
EINVAL, f, 0);
492int iomanX_read(
int fd,
void *ptr,
int size)
497 if ( !f || !(f->
mode & FIO_O_RDONLY) )
498 return handle_result(-
EBADF, f, 0);
499 return handle_result(f->
device->ops->read(f, ptr, size), f, 0);
502int iomanX_write(
int fd,
void *ptr,
int size)
507 if ( !f || !(f->
mode & FIO_O_WRONLY) )
508 return handle_result(-
EBADF, f, 0);
509 return handle_result(f->
device->ops->write(f, ptr, size), f, 0);
512int iomanX_close(
int fd)
518 return handle_result(-
EBADF, f, 0);
519 return handle_result(
520 (f->
mode & FIO_O_DIROPEN) ? f->
device->ops->dclose(f) : f->
device->ops->close(f),
522 HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_FD);
525int iomanX_ioctl(
int fd,
int cmd,
void *param)
531 return handle_result(-
EBADF, f, 0);
532 return handle_result(f->
device->ops->ioctl(f, cmd, param), f, 0);
535int iomanX_ioctl2(
int fd,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen)
541 return handle_result(-
EBADF, f, 0);
544 return handle_result(-
EUNSUP, f, 0);
545 return handle_result(f->
device->ops->ioctl2(f, cmd, arg, arglen, buf, buflen), f, 0);
548int iomanX_dopen(
const char *path)
551 const char *parsefile_res;
555 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
556 parsefile_res = parsefile(path, &(f->
device), &(f->
unit));
557 if ( !parsefile_res )
558 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
559 f->
mode = FIO_O_DIROPEN;
560 return handle_result(
561 f->
device->ops->dopen(f, parsefile_res), f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR | HANDLE_RESULT_RETURN_FD);
569 if ( !f || !(f->
mode & FIO_O_DIROPEN) )
570 return handle_result(-
EBADF, f, 0);
571#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
579 io_dread_t *io_dread;
581 io_dread = (io_dread_t *)f->
device->ops->dread;
582 res = io_dread(f, &io_dirent);
584 buf->stat.mode = mode2modex(io_dirent.stat.mode);
586 buf->stat.attr = io_dirent.stat.attr;
587 buf->stat.size = io_dirent.stat.size;
588 memcpy(buf->stat.ctime, io_dirent.stat.ctime,
sizeof(io_dirent.stat.ctime));
589 memcpy(buf->stat.atime, io_dirent.stat.atime,
sizeof(io_dirent.stat.atime));
590 memcpy(buf->stat.mtime, io_dirent.stat.mtime,
sizeof(io_dirent.stat.mtime));
591 buf->stat.hisize = io_dirent.stat.hisize;
593 strncpy(buf->name, io_dirent.name,
sizeof(buf->name));
594 return handle_result(res, f, 0);
597 return handle_result(f->
device->ops->dread(f, buf), f, 0);
600int iomanX_remove(
const char *name)
603 const char *parsefile_res;
604#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
608#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
613 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
615 parsefile_res = parsefile(name, &(f->
device), &(f->
unit));
616 if ( !parsefile_res )
617 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
618 return handle_result(
619 f->
device->ops->remove(f, parsefile_res), f, HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
622int iomanX_mkdir(
const char *path,
int mode)
624 return xx_dir(4, path, mode);
627int iomanX_rmdir(
const char *path)
629 return xx_dir(5, path, 0);
632static int xx_stat(
int op,
const char *name,
iox_stat_t *stat,
unsigned int statmask)
635 const char *parsefile_res;
636#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
640#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
645 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
647 parsefile_res = parsefile(name, &(f->
device), &(f->
unit));
648 if ( !parsefile_res )
649 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
654#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
661 memcpy(&stat_tmp, stat,
sizeof(stat_tmp));
662 stat_tmp.mode = modex2mode(stat->mode);
663 return handle_result(
664 f->
device->ops->chstat(f, parsefile_res, &stat_tmp, statmask),
666 HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
669 return handle_result(
670 f->
device->ops->chstat(f, parsefile_res, stat, statmask),
672 HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
676#ifdef IOMANX_ENABLE_LEGACY_IOMAN_HOOK
683 res = f->
device->ops->getstat(f, parsefile_res, stat);
685 stat->mode = mode2modex(stat->mode);
686 return handle_result(res, f, HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
689 return handle_result(
690 f->
device->ops->getstat(f, parsefile_res, stat), f, HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
694 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
698int iomanX_getstat(
const char *name,
iox_stat_t *stat)
700 return xx_stat(2, name, stat, 0);
703int iomanX_chstat(
const char *name,
iox_stat_t *stat,
unsigned int statmask)
705 return xx_stat(1, name, stat, statmask);
708int iomanX_format(
const char *dev,
const char *blockdev,
void *arg,
int arglen)
711 const char *parsefile_res;
712#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
716#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
721 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
723 parsefile_res = parsefile(dev, &(f->
device), &(f->
unit));
724 if ( !parsefile_res )
725 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
726 return handle_result(
727 f->
device->ops->format(f, parsefile_res, blockdev, arg, arglen),
729 HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
732static int xx_rename(
int op,
const char *oldname,
const char *newname)
735 const char *parsefile_res;
736 const char *parsefile_res_new;
739#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
743#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
748 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
750 parsefile_res = parsefile(oldname, &(f->
device), &(f->
unit));
751 if ( !parsefile_res )
752 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
754 parsefile_res_new = newname;
757 if ( newname && index(newname,
':') )
758 parsefile_res_new = parsefile(newname, &device_new, &unit_new);
760 if ( !parsefile_res_new || (device_new != f->
device) || (unit_new != f->
unit) )
761 return handle_result(-
EXDEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
764 return handle_result(-
EUNSUP, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
768 return handle_result(
769 f->
device->ops->rename(f, parsefile_res, parsefile_res_new),
771 HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
773 return handle_result(
774 f->
device->ops->symlink(f, parsefile_res, parsefile_res_new),
776 HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
779 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
784int iomanX_rename(
const char *oldname,
const char *newname)
786 return xx_rename(7, oldname, newname);
790int iomanX_symlink(
const char *oldname,
const char *newname)
792 return xx_rename(8, oldname, newname);
795int iomanX_chdir(
const char *name)
797 return xx_dir(0x103, name, 0);
803static int xx_dir(
int op,
const char *name,
int mode)
806 const char *parsefile_res;
807#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
811#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
816 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
818 parsefile_res = parsefile(name, &(f->
device), &(f->
unit));
819 if ( !parsefile_res )
820 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
823 return handle_result(-
EUNSUP, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
827 return handle_result(
828 f->
device->ops->mkdir(f, parsefile_res, mode), f, HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
830 return handle_result(
831 f->
device->ops->rmdir(f, parsefile_res), f, HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
833 return handle_result(
834 f->
device->ops->chdir(f, parsefile_res), f, HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
836 return handle_result(
837 f->
device->ops->sync(f, parsefile_res, mode), f, HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
840 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
844int iomanX_sync(
const char *dev,
int flag)
846 return xx_dir(0x106, dev, flag);
849int iomanX_mount(
const char *fsname,
const char *devname,
int flag,
void *arg,
int arglen)
852 const char *parsefile_res;
853#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
857#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
862 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
864 parsefile_res = parsefile(fsname, &(f->
device), &(f->
unit));
865 if ( !parsefile_res )
866 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
869 return handle_result(-
EUNSUP, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
870 return handle_result(
871 f->
device->ops->mount(f, parsefile_res, devname, flag, arg, arglen),
873 HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
876int iomanX_umount(
const char *fsname)
879 const char *parsefile_res;
880#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
884#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
889 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
891 parsefile_res = parsefile(fsname, &(f->
device), &(f->
unit));
892 if ( !parsefile_res )
893 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
896 return handle_result(-
EUNSUP, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
897 return handle_result(
898 f->
device->ops->umount(f, parsefile_res), f, HANDLE_RESULT_CLEAR_INFO | HANDLE_RESULT_RETURN_ZERO);
901int iomanX_devctl(
const char *name,
int cmd,
void *arg,
unsigned int arglen,
void *buf,
unsigned int buflen)
904 const char *parsefile_res;
905#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
909#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
914 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
916 parsefile_res = parsefile(name, &(f->
device), &(f->
unit));
917 if ( !parsefile_res )
918 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
921 return handle_result(-
EUNSUP, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
922 return handle_result(
923 f->
device->ops->devctl(f, parsefile_res, cmd, arg, arglen, buf, buflen), f, HANDLE_RESULT_CLEAR_INFO);
926int iomanX_readlink(
const char *path,
char *buf,
unsigned int buflen)
929 const char *parsefile_res;
930#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
934#ifdef IOMAN_USE_FILE_STRUCT_TEMP_STACK
939 return handle_result(-
EMFILE, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
941 parsefile_res = parsefile(path, &(f->
device), &(f->
unit));
942 if ( !parsefile_res )
943 return handle_result(-
ENODEV, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
946 return handle_result(-
EUNSUP, f, HANDLE_RESULT_CLEAR_INFO_ON_ERROR);
947 return handle_result(f->
device->ops->readlink(f, parsefile_res, buf, buflen), f, HANDLE_RESULT_CLEAR_INFO);
950static int _ioabort(
const char *str1,
const char *str2)
952 return Kprintf(
"ioabort exit:%s %s\n", str1, str2);
963 file_table_entry = NULL;
964 while ( fd < (
int)(
sizeof(file_table) /
sizeof(file_table[0])) )
966 if ( !file_table[fd].device )
968 file_table_entry = &file_table[fd];
974 if ( file_table_entry )
977 if ( !file_table_entry )
978 _ioabort(
"out of file descriptors",
"[too many open]");
979 return file_table_entry;
984 if ( (fd < 0) || (fd >= (
int)(
sizeof(file_table) /
sizeof(file_table[0]))) || (!file_table[fd].device) )
986 return &file_table[fd];
991#ifdef IOMANX_USE_DEVICE_LINKED_LIST
992 struct ioman_dev_listentry *entry;
1000#ifdef IOMANX_USE_DEVICE_LINKED_LIST
1001 entry = device_entry_used_list_head;
1002 while ( entry && strcmp(name, entry->device->name) )
1003 entry = entry->next;
1004 if ( !entry && show_unkdev_msg )
1006 Kprintf(
"Unknown device '%s'\n", name);
1011 for ( i = 0; i < (
sizeof(device_table) /
sizeof(device_table[0])); i += 1 )
1013 if ( device_table[i] && !strcmp(name, device_table[i]->name) )
1015 device = device_table[i];
1019 if ( !device && show_unkdev_msg )
1021 Kprintf(
"Unknown device '%s'\n", name);
1026#ifdef IOMANX_USE_DEVICE_LINKED_LIST
1027 return entry ? entry->device : NULL;
1033static const char *parsefile(
const char *path,
iomanX_iop_device_t **p_device,
int *p_unit)
1035 const char *path_trimmed;
1042 path_trimmed = path;
1043 while ( *path_trimmed ==
' ' )
1045 colon_index = index(path_trimmed,
':');
1049 Kprintf(
"Unknown device '%s'\n", path_trimmed);
1052 devname_len = colon_index - path_trimmed;
1054 if ( devname_len > (
sizeof(canon) - 1) )
1056 strncpy(canon, path_trimmed, devname_len);
1057 canon[devname_len] = 0;
1060 while ( isnum(canon[devname_len - 1]) )
1062 if ( isnum(canon[devname_len]) )
1063 unit = strtol(&canon[devname_len], 0, 10);
1064 canon[devname_len] = 0;
1066 device = lookup_dev(canon, 1);
1074 return colon_index + 1;
1081#ifdef IOMANX_USE_DEVICE_LINKED_LIST
1082 struct ioman_dev_listentry *entry;
1083 struct ioman_dev_listentry *old_head;
1090 if ( adddeldrv_in_process )
1092 Kprintf(
"AddDrv()/DelDrv() recursive/mutithread call error !!");
1097 adddeldrv_in_process = 1;
1099#ifdef IOMANX_USE_DEVICE_LINKED_LIST
1100 entry = device_entry_empty_list_head;
1102 if ( !entry || lookup_dev(device->name, 0) )
1104 adddeldrv_in_process = 0;
1107 entry->device = device;
1108 device_entry_empty_list_head = entry->next;
1109 if ( device->ops->init(device) < 0 )
1111 old_head = device_entry_empty_list_head;
1112 entry->device = NULL;
1113 device_entry_empty_list_head = entry;
1114 entry->next = old_head;
1115 adddeldrv_in_process = 0;
1118 old_head = device_entry_used_list_head;
1119 device_entry_used_list_head = entry;
1120 entry->next = old_head;
1122 for ( i = 0; i < (
sizeof(device_table) /
sizeof(device_table[0])); i += 1 )
1124 if ( !device_table[i] )
1128 if ( i >= (
sizeof(device_table) /
sizeof(device_table[0])) )
1130 adddeldrv_in_process = 0;
1134 device_table[i] = device;
1138 if ( device->ops->init(device) < 0 )
1140 device_table[i] = NULL;
1141 adddeldrv_in_process = 0;
1146 adddeldrv_in_process = 0;
1150int iomanX_DelDrv(
const char *name)
1152#ifdef IOMANX_USE_DEVICE_LINKED_LIST
1153 struct ioman_dev_listentry *entry;
1154 struct ioman_dev_listentry **p_next;
1155 struct ioman_dev_listentry *old_head;
1162 if ( adddeldrv_in_process )
1164 Kprintf(
"AddDrv()/DelDrv() recursive/mutithread call error !!");
1168 adddeldrv_in_process = 1;
1170#ifdef IOMANX_USE_DEVICE_LINKED_LIST
1171 entry = device_entry_used_list_head;
1172 p_next = &device_entry_used_list_head;
1173 while ( entry && strcmp(name, entry->device->name) )
1175 p_next = &entry->next;
1176 entry = entry->next;
1178 if ( !entry || entry->device->ops->deinit(entry->device) < 0 )
1180 adddeldrv_in_process = 0;
1183 old_head = device_entry_empty_list_head;
1184 entry->device = NULL;
1185 device_entry_empty_list_head = entry;
1186 *p_next = entry->next;
1187 entry->next = old_head;
1188 adddeldrv_in_process = 0;
1191 for ( i = 0; i < (
sizeof(device_table) /
sizeof(device_table[0])); i += 1 )
1193 if ( device_table[i] && !strcmp(name, device_table[i]->name) )
1195 device_table[i]->ops->deinit(device_table[i]);
1196 device_table[i] = NULL;
1197 adddeldrv_in_process = 0;
1202 adddeldrv_in_process = 0;
1207unsigned int iomanX_GetDevType(
int fd)
1213 return handle_result(-
EBADF, f, 0);
1217static void ShowDrv(
void)
1219#ifdef IOMANX_USE_DEVICE_LINKED_LIST
1220 struct ioman_dev_listentry *i;
1227 Kprintf(
"Known devices are ");
1228#ifdef IOMANX_USE_DEVICE_LINKED_LIST
1229 for ( i = device_entry_used_list_head; i; i = i->next )
1230 Kprintf(
" %s:(%s) ", i->device->name, i->device->desc);
1232 for ( i = 0; i < (
sizeof(device_table) /
sizeof(device_table[0])); i += 1 )
1233 if ( device_table[i] != NULL && device_table[i]->name != NULL )
1234 Kprintf(
" %s:(%s) ", device_table[i]->name, device_table[i]->desc);
1240static void register_tty(
void)
1242 iomanX_DelDrv(dev_tty.name);
1243 iomanX_AddDrv(&dev_tty);
1247static void register_dummytty(
void)
1249 iomanX_DelDrv(dev_dummytty.name);
1250 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_device * device