Replace IS_READONLY with an O_WRITE check [5/7]
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 8 Sep 2015 18:03:34 +0000 (14:03 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 28 Sep 2015 19:14:00 +0000 (15:14 -0400)
When saying "IS_READONLY", we were really asking whether or not we could
write, given the O_* modes.  This was a vestige of always being
readable, with the option of writable.  Checking directly for O_WRITE is
also more clear than something like IS_WRITABLE too.

Note that no one uses kchanio().  It looks like we wanted to do kernel
I/O based on a flag.

kern/drivers/dev/alarm.c
kern/drivers/dev/nix.c
kern/drivers/dev/pipe.c
kern/drivers/dev/srv.c
kern/include/ns.h
kern/src/net/devip.c
kern/src/net/netif.c
kern/src/ns/dev.c
kern/src/ns/sysfile.c
kern/src/vfs.c

index 096d086..2a2ab15 100644 (file)
@@ -239,7 +239,7 @@ static struct chan *alarmopen(struct chan *c, int omode)
                case Qalarmdir:
                        if (omode & ORCLOSE)
                                error(Eperm);
-                       if (!IS_RDONLY(omode))
+                       if (omode & O_WRITE)
                                error(Eisdir);
                        break;
                case Qclone:
index d552b82..765c305 100644 (file)
@@ -321,7 +321,7 @@ static struct chan *nixopen(struct chan *c, int omode)
        case Qnixdir:
                if (omode & ORCLOSE)
                        error(Eperm);
-               if (!IS_RDONLY(omode))
+               if (omode & O_WRITE)
                        error(Eisdir);
                break;
        case Qclone:
index 959a146..09795e2 100644 (file)
@@ -212,7 +212,7 @@ static struct chan *pipeopen(struct chan *c, int omode)
        Pipe *p;
 
        if (c->qid.type & QTDIR) {
-               if (!IS_RDONLY(omode))
+               if (omode & O_WRITE)
                        error("Can only open directories OREAD, mode is %o oct", omode);
                c->mode = openmode(omode);
                c->flag |= COPEN;
index de72388..15399a9 100644 (file)
@@ -182,7 +182,7 @@ static struct chan *srvopen(struct chan *c, int omode)
        struct srvfile *srv;
        openmode(omode);        /* used as an error checker in plan9, does little now */
        if (c->qid.type & QTDIR) {
-               if (!IS_RDONLY(omode))
+               if (omode & O_WRITE)
                        error(Eisdir);
                c->mode = openmode(omode);
                c->flag |= COPEN;
index ed4f386..334d156 100644 (file)
@@ -100,9 +100,6 @@ extern int parseether(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
 #define DMWRITE                0x2     /* mode bit for write permission */
 #define DMEXEC         0x1     /* mode bit for execute permission */
 
-/* Helper for mode checks.  It's poorly named since it's really "not writable"*/
-#define IS_RDONLY(x) (!((x) & O_WRITE))
-
 struct qid {
        uint64_t path;
        uint32_t vers;
index 1071516..095a7ff 100644 (file)
@@ -406,11 +406,11 @@ static struct chan *ipopen(struct chan *c, int omode)
                case Qstats:
                case Qbootp:
                case Qipselftab:
-                       if (!IS_RDONLY(omode))
+                       if (omode & O_WRITE)
                                error(Eperm);
                        break;
                case Qsnoop:
-                       if (!IS_RDONLY(omode))
+                       if (omode & O_WRITE)
                                error(Eperm);
                        p = f->p[PROTO(c->qid)];
                        cv = p->conv[CONV(c->qid)];
index ac753bd..8310834 100644 (file)
@@ -203,7 +203,7 @@ struct chan *netifopen(struct ether *nif, struct chan *c, int omode)
 
        id = 0;
        if (c->qid.type & QTDIR) {
-               if (!IS_RDONLY(omode))
+               if (omode & O_WRITE)
                        error(Eperm);
        } else {
                switch (NETTYPE(c->qid.path)) {
@@ -217,7 +217,7 @@ struct chan *netifopen(struct ether *nif, struct chan *c, int omode)
                                c->qid.path = NETQID(id, Nctlqid);
                                break;
                        default:
-                               if (!IS_RDONLY(omode))
+                               if (omode & O_WRITE)
                                        error(Ebadarg);
                }
                switch (NETTYPE(c->qid.path)) {
index 68fc981..416e47b 100644 (file)
@@ -374,7 +374,7 @@ struct chan *devopen(struct chan *c, int omode, struct dirtab *tab, int ntab,
        }
 Return:
        c->offset = 0;
-       if ((c->qid.type & QTDIR) && !IS_RDONLY(omode))
+       if ((c->qid.type & QTDIR) && (omode & O_WRITE))
                error("Tried opening dir with non-read-only mode %o", omode);
        c->mode = openmode(omode);
        c->flag |= COPEN;
index fc15db5..cb18513 100644 (file)
@@ -54,7 +54,7 @@ struct chan *fdtochan(struct fd_table *fdt, int fd, int mode, int chkmnt,
                return c;
        }
 
-       if ((mode & OTRUNC) && IS_RDONLY(c->mode)) {
+       if ((mode & OTRUNC) && !(c->mode & O_WRITE)) {
                if (iref)
                        cclose(c);
                error(Ebadusefd);
@@ -86,10 +86,12 @@ long kchanio(void *vc, void *buf, int n, int mode)
                return -1;
        }
 
-       if (IS_RDONLY(mode))
+       if (mode == O_READ)
                r = devtab[c->type].read(c, buf, n, c->offset);
-       else
+       else if (mode == O_WRITE)
                r = devtab[c->type].write(c, buf, n, c->offset);
+       else
+               error("kchanio: use only O_READ xor O_WRITE");
 
        spin_lock(&c->lock);
        c->offset += r;
index 516c12b..b01adf8 100644 (file)
@@ -1375,12 +1375,7 @@ struct file *do_file_open(char *path, int flags, int mode)
        nd->intent = LOOKUP_OPEN;
        error = path_lookup(path, LOOKUP_FOLLOW, nd);
        if (!error) {
-               /* If this is a directory, make sure we are opening with O_RDONLY.
-                * Unfortunately we can't just check for O_RDONLY directly because its
-                * value is 0x0.  We instead have to make sure it's not O_WRONLY and
-                * not O_RDWR explicitly. */
-               if (S_ISDIR(nd->dentry->d_inode->i_mode) &&
-                   ((flags & O_WRONLY) || (flags & O_RDWR))) {
+               if (S_ISDIR(nd->dentry->d_inode->i_mode) && (flags & O_WRITE)) {
                        set_errno(EISDIR);
                        goto out_path_only;
                }