Allow devpermcheck() to check perms
[akaros.git] / kern / src / ns / devtab.c
index 1252750..aaa33ce 100644 (file)
@@ -20,8 +20,10 @@ void devtabreset()
 {
        int i;
 
-       for (i = 0; &devtab[i] < __devtabend; i++)
-               devtab[i].reset();
+       for (i = 0; &devtab[i] < __devtabend; i++) {
+               if (devtab[i].reset)
+                       devtab[i].reset();
+       }
 }
 
 void devtabinit()
@@ -30,8 +32,10 @@ void devtabinit()
 
        for (i = 0; &devtab[i] < __devtabend; i++) {
                /* if we have errors, check the align of struct dev and objdump */
-               printd("i %d, dev %p, init %p\n", i, &devtab[i], devtab[i].init);
-               devtab[i].init();
+               printd("i %d, '%s', dev %p, init %p\n", i, devtab[i].name,
+                               &devtab[i], devtab[i].init);
+               if (devtab[i].init)
+                       devtab[i].init();
        }
 }
 
@@ -43,22 +47,20 @@ void devtabshutdown()
         * Shutdown in reverse order.
         */
        for (i = 0; &devtab[i] < __devtabend; i++) ;
-       for (i--; i >= 0; i--)
-               devtab[i].shutdown();
+       for (i--; i >= 0; i--) {
+               if (devtab[i].shutdown)
+                       devtab[i].shutdown();
+       }
 }
 
-struct dev *devtabget(int dc, int user)
+struct dev *devtabget(const char *name, int user)
 {
-       int i;
-
-       for (i = 0; &devtab[i] < __devtabend; i++) {
-               if (devtab[i].dc == dc)
-                       return &devtab[i];
-       }
+       int i = devno(name, user);
+       if (i > 0)
+               return &devtab[i];
 
-       printk("devtabget FAILED %c\n", dc);
-       set_errno(ENOENT);
-       error(Enonexist);
+       printk("devtabget FAILED %s\n", name);
+       error(ENOENT, ERROR_FIXME);
 }
 
 long devtabread(struct chan *c, void *buf, long n, int64_t off)
@@ -69,17 +71,17 @@ long devtabread(struct chan *c, void *buf, long n, int64_t off)
        struct dev *dev;
        char *alloc, *e, *p;
 
-       alloc = kzmalloc(READSTR, KMALLOC_WAIT);
+       alloc = kzmalloc(READSTR, MEM_WAIT);
        if (alloc == NULL)
-               error(Enomem);
+               error(ENOMEM, ERROR_FIXME);
 
        p = alloc;
        e = p + READSTR;
        for (i = 0; &devtab[i] < __devtabend; i++) {
                dev = &devtab[i];
                printd("p %p e %p e-p %d\n", p, e, e - p);
-               printd("do %d %c %s\n", i, dev->dc, dev->name);
-               p += snprintf(p, e - p, "#%c %s\n", dev->dc, dev->name);
+               printd("do %d %s\n", i, dev->name);
+               p += snprintf(p, e - p, "#%s\n", dev->name);
        }
 
        if (waserror()) {