9ns: Add 'extensions' to namec()
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 22 Feb 2018 22:32:27 +0000 (17:32 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 6 Apr 2018 19:23:01 +0000 (15:23 -0400)
We'll need this for creating symlinks.  We might be able to use this for
other things, like the crazy open extensions Ron and I talked about years
ago.  Though that might want to get a value back, instead of sending a
value.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/ns.h
kern/src/ns/chan.c
kern/src/ns/sysfile.c
kern/src/syscall.c

index 6d0a8df..54ed587 100644 (file)
@@ -787,9 +787,10 @@ void mousetrack(int unused_int, int, int, int);
 uint64_t ms2fastticks(uint32_t);
 void mul64fract(uint64_t *, uint64_t, uint64_t);
 void muxclose(struct mnt *);
-struct chan *namec(char *unused_char_p_t, int unused_int, int, uint32_t);
+struct chan *namec(char *unused_char_p_t, int unused_int, int, uint32_t,
+                   void *ext);
 struct chan *namec_from(struct chan *c, char *name, int amode, int omode,
-                        uint32_t perm);
+                        uint32_t perm, void *ext);
 struct chan *newchan(void);
 struct egrp *newegrp(void);
 struct mount *newmount(struct mhead *, struct chan *, int unused_int,
index b09cbac..88e7698 100644 (file)
@@ -993,7 +993,8 @@ void *memrchr(void *va, int c, long n)
  * The classic namec() is broken into a front end to get the starting point and
  * a __namec_from, which does the guts of the lookup.  */
 static struct chan *__namec_from(struct chan *c, char *aname, int amode,
-                                 int omode, uint32_t perm, bool can_mount)
+                                 int omode, uint32_t perm, bool can_mount,
+                                 void *ext)
 {
        ERRSTACK(2);
        int len, npath;
@@ -1253,7 +1254,7 @@ Open:
                                cnew->flag |= omode & CEXTERNAL_FLAGS;
                                devtab[cnew->type].create(cnew, e.elems[e.ARRAY_SIZEs - 1],
                                                                                  omode & ~(O_EXCL | O_CLOEXEC),
-                                                                                 perm, NULL);
+                                                                                 perm, ext);
                                poperror();
 
                                if (m)
@@ -1303,7 +1304,7 @@ Open:
        return c;
 }
 
-struct chan *namec(char *name, int amode, int omode, uint32_t perm)
+struct chan *namec(char *name, int amode, int omode, uint32_t perm, void *ext)
 {
        bool can_mount = TRUE;
        struct chan *c;
@@ -1379,11 +1380,11 @@ struct chan *namec(char *name, int amode, int omode, uint32_t perm)
                        chan_incref(c);
                        break;
        }
-       return __namec_from(c, name, amode, omode, perm, can_mount);
+       return __namec_from(c, name, amode, omode, perm, can_mount, ext);
 }
 
 struct chan *namec_from(struct chan *c, char *name, int amode, int omode,
-                        uint32_t perm)
+                        uint32_t perm, void *ext)
 {
        if (name[0] == '\0') {
                /* Our responsibility to cclose 'c' on our error */
@@ -1391,7 +1392,7 @@ struct chan *namec_from(struct chan *c, char *name, int amode, int omode,
                error(EFAIL, "empty file name");
        }
        validname(name, 1);
-       return __namec_from(c, name, amode, omode, perm, TRUE);
+       return __namec_from(c, name, amode, omode, perm, TRUE, ext);
 }
 
 /*
index d2e0c2b..a66b438 100644 (file)
@@ -154,7 +154,7 @@ int syschdir(char *path)
                return -1;
        }
 
-       c = namec(path, Atodir, 0, 0);
+       c = namec(path, Atodir, 0, 0, NULL);
        pg = current->pgrp;
        cclose(pg->dot);
        pg->dot = c;
@@ -194,7 +194,7 @@ int syscreate(char *path, int mode, uint32_t perm)
        }
 
        openmode(mode & ~O_EXCL);       /* error check only; OEXCL okay here */
-       c = namec(path, Acreate, mode, perm);
+       c = namec(path, Acreate, mode, perm, NULL);
        if (waserror()) {
                cclose(c);
                nexterror();
@@ -387,7 +387,7 @@ long bindmount(struct chan *c, char *old, int flag, char *spec)
        if (flag > MMASK || (flag & MORDER) == (MBEFORE | MAFTER))
                error(EINVAL, ERROR_FIXME);
 
-       c1 = namec(old, Amount, 0, 0);
+       c1 = namec(old, Amount, 0, 0, NULL);
        if (waserror()) {
                cclose(c1);
                nexterror();
@@ -410,7 +410,7 @@ int sysbind(char *new, char *old, int flags)
                return -1;
        }
 
-       c0 = namec(new, Abind, 0, 0);
+       c0 = namec(new, Abind, 0, 0, NULL);
        if (waserror()) {
                cclose(c0);
                nexterror();
@@ -485,7 +485,7 @@ int sysunmount(char *src_path, char *onto_path)
                return -1;
        }
 
-       cmount.c = namec(onto_path, Amount, 0, 0);
+       cmount.c = namec(onto_path, Amount, 0, 0, NULL);
        if (src_path != NULL && src_path[0] != '\0') {
                /*
                 * This has to be namec(..., Aopen, ...) because
@@ -493,7 +493,7 @@ int sysunmount(char *src_path, char *onto_path)
                 * opening it is the only way to get at the real
                 * Chan underneath.
                 */
-               cmounted.c = namec(src_path, Aopen, O_READ, 0);
+               cmounted.c = namec(src_path, Aopen, O_READ, 0, NULL);
        }
 
        cunmount(cmount.c, cmounted.c);
@@ -516,7 +516,7 @@ int sysopenat(int fromfd, char *path, int vfs_flags)
        }
        openmode(vfs_flags);    /* error check only */
        if ((path[0] == '/') || (fromfd == AT_FDCWD)) {
-               c = namec(path, Aopen, vfs_flags, 0);
+               c = namec(path, Aopen, vfs_flags, 0, NULL);
        } else {
                /* We don't cclose from.  namec_from will convert it to the new chan
                 * during the walk process (c).  It'll probably close from internally,
@@ -525,7 +525,7 @@ int sysopenat(int fromfd, char *path, int vfs_flags)
                from = fdtochan(&current->open_files, fromfd, -1, FALSE, TRUE);
                if (!(from->flag & O_PATH))
                        error(EINVAL, "Cannot openat from a non-O_PATH FD");
-               c = namec_from(from, path, Aopen, vfs_flags, 0);
+               c = namec_from(from, path, Aopen, vfs_flags, 0, NULL);
        }
        fd = newfd(c, 0, vfs_flags, FALSE);
        if (fd < 0)
@@ -762,7 +762,7 @@ int sysremove(char *path)
                return -1;
        }
 
-       c = namec(path, Aremove, 0, 0);
+       c = namec(path, Aremove, 0, 0, NULL);
        if (waserror()) {
                c->type = -1;   /* see below */
                cclose(c);
@@ -926,7 +926,7 @@ int sysstat(char *path, uint8_t *buf, int n)
                return -1;
        }
 
-       c = namec(path, Aaccess, 0, 0);
+       c = namec(path, Aaccess, 0, 0, NULL);
        if (waserror()) {
                cclose(c);
                nexterror();
@@ -1044,7 +1044,7 @@ int syswstat(char *path, uint8_t * buf, int n)
        }
 
        validstat(buf, n, 0);
-       c = namec(path, Aaccess, 0, 0);
+       c = namec(path, Aaccess, 0, 0, NULL);
        if (waserror()) {
                cclose(c);
                nexterror();
@@ -1102,7 +1102,7 @@ struct dir *sysdirstat(char *name)
                return NULL;
        }
 
-       c = namec(name, Aaccess, 0, 0);
+       c = namec(name, Aaccess, 0, 0, NULL);
        if (waserror()) {
                cclose(c);
                nexterror();
@@ -1297,7 +1297,7 @@ int plan9setup(struct proc *new_proc, struct proc *parent, int flags)
                /* We are probably spawned by the kernel directly, and have no parent to
                 * inherit from. */
                new_proc->pgrp = newpgrp();
-               new_proc->slash = namec("#root", Atodir, 0, 0);
+               new_proc->slash = namec("#root", Atodir, 0, 0, NULL);
                if (!new_proc->slash)
                        panic("no root device");
                /* Want the name to be "/" instead of "#root" */
index 443b638..b6eb3d4 100644 (file)
@@ -2489,7 +2489,7 @@ intreg_t sys_rename(struct proc *p, char *old_path, size_t old_path_l,
 
        /* discard namec error */
        if (!waserror()) {
-               oldchan = namec(from_path, Aaccess, 0, 0);
+               oldchan = namec(from_path, Aaccess, 0, 0, NULL);
        }
        poperror();
        if (!oldchan) {
@@ -2518,7 +2518,7 @@ intreg_t sys_rename(struct proc *p, char *old_path, size_t old_path_l,
        }
 
        /* the omode and perm are of no importance. */
-       newchan = namec(to_path, Acreatechan, 0, 0);
+       newchan = namec(to_path, Acreatechan, 0, 0, NULL);
        if (newchan == NULL) {
                printd("sys_rename %s to %s found no chan\n", from_path, to_path);
                set_errno(EPERM);