Added explicit errno reporting from error() API.
[akaros.git] / kern / drivers / dev / regress.c
index 274af63..274e678 100644 (file)
 #include <smp.h>
 #include <ip.h>
 #include <console.h>
+#include <ktest.h>
+
+struct dev regressdevtab;
+
+static char *devname(void)
+{
+       return regressdevtab.name;
+}
 
 struct regress
 {
@@ -46,8 +54,7 @@ struct dirtab regresstab[]={
        {"monctl",      {Monitorctlqid},                0,      0600},
 };
 
-static size_t mpstatraw_len(void);
-static size_t mpstat_len(void);
+static char *ctlcommands = "ktest";
 
 static struct chan*
 regressattach(char *spec)
@@ -58,7 +65,7 @@ regressattach(char *spec)
        if (! regress.monitor) {
                printk("monitor allocate failed. No monitor output\n");
        }
-       return devattach('Z', spec);
+       return devattach(devname(), spec);
 }
 
 static void
@@ -87,8 +94,8 @@ static struct chan*
 regressopen(struct chan *c, int omode)
 {
        if(c->qid.type & QTDIR){
-               if(openmode(omode) != OREAD)
-                       error(Eperm);
+               if(openmode(omode) != O_READ)
+                       error(EPERM, NULL);
        }
        c->mode = openmode(omode);
        c->flag |= COPEN;
@@ -112,7 +119,12 @@ regressread(struct chan *c, void *va, long n, int64_t off)
 
        switch((int)c->qid.path){
        case Monitordirqid:
-               return devdirread(c, va, n, regresstab, ARRAY_SIZE(regresstab), devgen);
+               n = devdirread(c, va, n, regresstab, ARRAY_SIZE(regresstab), devgen);
+               break;
+
+       case Monitorctlqid:
+               n = readstr(off, va, n, ctlcommands);
+               break;
 
        case Monitordataqid:
                if (regress.monitor) {
@@ -122,7 +134,7 @@ regressread(struct chan *c, void *va, long n, int64_t off)
                        else
                                n = 0;
                } else
-                       error("no monitor queue");
+                       error(EFAIL, "no monitor queue");
                break;
        default:
                n = 0;
@@ -146,7 +158,11 @@ regresswrite(struct chan *c, void *a, long n, int64_t unused)
 
        switch((int)(c->qid.path)){
        case Monitorctlqid:
-               error("no ctl commands yet");
+               if(strncmp(a, "ktest", 5) == 0){
+                       run_registered_ktest_suites();
+               } else {
+                       error(EFAIL, "regresswrite: only commands are %s", ctlcommands);
+               }
                break;
 
        case Monitordataqid:
@@ -154,7 +170,7 @@ regresswrite(struct chan *c, void *a, long n, int64_t unused)
                        n = -1;
                break;
        default:
-               error(Ebadusefd);
+               error(EBADFD, NULL);
        }
        kfree(cb);
        poperror();
@@ -162,7 +178,6 @@ regresswrite(struct chan *c, void *a, long n, int64_t unused)
 }
 
 struct dev regressdevtab __devtab = {
-       'Z',
        "regress",
 
        devreset,