Fixes OREAD / omode checks
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 21 Jan 2014 22:08:40 +0000 (14:08 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 21 Jan 2014 22:08:40 +0000 (14:08 -0800)
The idea behind 424240126 was alright, but when we masked with OREAD, we
were just zeroing everything out.  Did I mention having OREAD/O_RDONLY
the value zero is a bad idea?

Now, we can use the more clear helper IS_RDONLY().  Which we can change
later if so desired.

kern/drivers/dev/alarm.c
kern/drivers/dev/dev.c
kern/drivers/dev/pipe.c
kern/drivers/dev/vm.c
kern/include/ros/fs.h
kern/src/net/devip.c
kern/src/net/netif.c
kern/src/ns/sysfile.c

index 9c7613e..7446001 100644 (file)
@@ -239,7 +239,7 @@ static struct chan *alarmopen(struct chan *c, int omode)
                case Qalarmdir:
                        if (omode & ORCLOSE)
                                error(Eperm);
-                       if ((omode & OREAD) != OREAD)
+                       if (!IS_RDONLY(omode))
                                error(Eisdir);
                        break;
                case Qclone:
index b85b88d..2eabe53 100644 (file)
@@ -359,7 +359,7 @@ devopen(struct chan *c, int omode, struct dirtab *tab, int ntab, Devgen *gen)
        }
 Return:
        c->offset = 0;
-       if ((c->qid.type & QTDIR) && ((omode & OREAD) != OREAD))
+       if ((c->qid.type & QTDIR) && !IS_RDONLY(omode))
                error("Tried opening dir with non-read-only mode %o", omode);
        c->mode = openmode(omode);
        c->flag |= COPEN;
index f4d6585..bb66ffc 100644 (file)
@@ -222,7 +222,7 @@ pipeopen(struct chan *c, int omode)
        Pipe *p;
 
        if(c->qid.type & QTDIR){
-               if ((omode & OREAD) != OREAD)
+               if (!IS_RDONLY(omode))
                        error("Can only open directories OREAD, mode is %o oct", omode);
                c->mode = openmode(omode);
                c->flag |= COPEN;
index 86c1b25..5337dee 100644 (file)
@@ -280,7 +280,7 @@ static struct chan *vmopen(struct chan *c, int omode)
        case Qvmdir:
                if (omode & ORCLOSE)
                        error(Eperm);
-               if ((omode & OREAD) != OREAD)
+               if (!IS_RDONLY(omode))
                        error(Eisdir);
                break;
        case Qclone:
index e01f039..8dd92f1 100644 (file)
@@ -50,6 +50,8 @@ struct kstat {
 #define O_RDWR                 0x02            /* Open read/write */
 #define O_EXEC                 0x04            /* Open for exec (unsupported) */
 #define O_ACCMODE              0x07
+/* Thanks to read-only being 0, we can't just check the flag... */
+#define IS_RDONLY(x) (!((x) & (O_WRONLY | O_RDWR)))
 
 /* Bits OR'd into the second argument to open */
 #define O_CREAT                        00000100        /* not fcntl */
index d9913f6..ddca2c3 100644 (file)
@@ -414,11 +414,11 @@ ipopen(struct chan* c, int omode)
        case Qstats:
        case Qbootp:
        case Qipselftab:
-               if((omode & OREAD) != OREAD)
+               if (!IS_RDONLY(omode))
                        error(Eperm);
                break;
        case Qsnoop:
-               if((omode & OREAD) != OREAD)
+               if (!IS_RDONLY(omode))
                        error(Eperm);
                p = f->p[PROTO(c->qid)];
                cv = p->conv[CONV(c->qid)];
index 088944a..e689217 100644 (file)
@@ -171,7 +171,7 @@ netifopen(struct netif *nif, struct chan *c, int omode)
 
        id = 0;
        if(c->qid.type & QTDIR){
-               if(omode != OREAD)
+               if (!IS_RDONLY(omode))
                        error(Eperm);
        } else {
                switch(NETTYPE(c->qid.path)){
@@ -185,7 +185,7 @@ netifopen(struct netif *nif, struct chan *c, int omode)
                        c->qid.path = NETQID(id, Nctlqid);
                        break;
                default:
-                       if(omode != OREAD)
+                       if (!IS_RDONLY(omode))
                                error(Ebadarg);
                }
                switch(NETTYPE(c->qid.path)){
index 356debb..7742466 100644 (file)
@@ -102,13 +102,15 @@ fdtochan(struct fgrp *f, int fd, int mode, int chkmnt, int iref)
        if(mode<0 || c->mode==ORDWR)
                return c;
 
-       if((mode&OTRUNC) && (c->mode & OREAD) == OREAD) {
+       if ((mode & OTRUNC) && IS_RDONLY(c->mode)) {
                if(iref)
                        cclose(c);
                error(Ebadusefd);
        }
 
+       /* TODO: this is probably wrong */
        if((mode&~OTRUNC) != c->mode) {
+               warn("Trunc mode issue, check this crap out");
                if(iref)
                        cclose(c);
                error(Ebadusefd);
@@ -130,7 +132,7 @@ kchanio(void *vc, void *buf, int n, int mode)
                return -1;
        }
 
-       if ((mode & OREAD) == OREAD)
+       if (IS_RDONLY(mode))
                r = devtab[c->type].read(c, buf, n, c->offset);
        else
                r = devtab[c->type].write(c, buf, n, c->offset);