diff options
| author | Charles.Forsyth <devnull@localhost> | 2009-03-25 16:37:32 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2009-03-25 16:37:32 +0000 |
| commit | e0a2b8d82a5521d9391ca8c6f055777954c76c2f (patch) | |
| tree | bed98eebad567e161db651e8a173f1a819169292 /emu/port/devtab.c | |
| parent | d8150d92150b08ade63d7cd8b666cb26551110ff (diff) | |
x20090315-1636
Diffstat (limited to 'emu/port/devtab.c')
| -rw-r--r-- | emu/port/devtab.c | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/emu/port/devtab.c b/emu/port/devtab.c new file mode 100644 index 00000000..69c5f7b2 --- /dev/null +++ b/emu/port/devtab.c @@ -0,0 +1,94 @@ +#include "dat.h" +#include "fns.h" +#include "error.h" + +extern Dev* devtab[]; + +void +devtabreset(void) +{ + int i; + + for(i = 0; devtab[i] != nil; i++) + devtab[i]->reset(); +} + +void +devtabinit(void) +{ + int i; + + for(i = 0; devtab[i] != nil; i++) + devtab[i]->init(); +} + +void +devtabshutdown(void) +{ + int i; + + /* + * Shutdown in reverse order. + */ + for(i = 0; devtab[i] != nil; i++) + ; + for(i--; i >= 0; i--) + devtab[i]->shutdown(); +} + + +Dev* +devtabget(int dc, int user) +{ + int i; + + for(i = 0; devtab[i] != nil; i++){ + if(devtab[i]->dc == dc) + return devtab[i]; + } + + if(user == 0) + panic("devtabget %C\n", dc); + + return nil; +} + +Dev* +devbyname(char *name) +{ + int i; + + for(i = 0; devtab[i] != nil; i++) + if(strcmp(devtab[i]->name, name) == 0) + return devtab[i]; + return nil; +} + +long +devtabread(Chan*, void* buf, long n, vlong off) +{ + int i; + Dev *dev; + char *alloc, *e, *p; + + alloc = malloc(READSTR); + if(alloc == nil) + error(Enomem); + + p = alloc; + e = p + READSTR; + for(i = 0; devtab[i] != nil; i++){ + dev = devtab[i]; + p = seprint(p, e, "#%C %s\n", dev->dc, dev->name); + } + + if(waserror()){ + free(alloc); + nexterror(); + } + n = readstr(off, buf, n, alloc); + free(alloc); + poperror(); + + return n; +} |
