]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/libauth/newns.c
devloopback: fix wrong device character (thanks romano)
[plan9front.git] / sys / src / libauth / newns.c
index 3486a93ab88f0a648cfa1e5b1497521f80d73566..c0f866b9ba642a4122b1a2be8963a5f29bf49a37 100644 (file)
@@ -16,7 +16,6 @@ static char   *expandarg(char*, char*);
 static int     splitargs(char*, char*[], char*, int);
 static int     nsfile(char*, Biobuf *, AuthRpc *);
 static int     nsop(char*, int, char*[], AuthRpc*);
-static int     callexport(char*, char*);
 static int     catch(void*, char*);
 
 int newnsdebug;
@@ -42,7 +41,7 @@ buildns(int newns, char *user, char *file)
 
        rpc = nil;
        /* try for factotum now because later is impossible */
-       afd = open("/mnt/factotum/rpc", ORDWR);
+       afd = open("/mnt/factotum/rpc", ORDWR|OCEXEC);
        if(afd < 0 && newnsdebug)
                fprint(2, "open /mnt/factotum/rpc: %r\n");
        if(afd >= 0){
@@ -59,8 +58,8 @@ buildns(int newns, char *user, char *file)
                }
                file = "/lib/namespace";
        }
-       b = Bopen(file, OREAD);
-       if(b == 0){
+       b = Bopen(file, OREAD|OCEXEC);
+       if(b == nil){
                werrstr("can't open %s: %r", file);
                return freecloserpc(rpc);
        }
@@ -136,6 +135,8 @@ famount(int fd, AuthRpc *rpc, char *mntpt, int flags, char *aname)
                        auth_freeAI(ai);
        }
        ret = mount(fd, afd, mntpt, flags, aname);
+       if(ret == -1)
+               close(fd);
        if(afd >= 0)
                close(afd);
        return ret;
@@ -152,8 +153,8 @@ nsop(char *fn, int argc, char *argv[], AuthRpc *rpc)
 
        cdroot = 0;
        flags = 0;
-       argv0 = 0;
-       if (newnsdebug){
+       argv0 = nil;
+       if(newnsdebug){
                for (i = 0; i < argc; i++)
                        fprint(2, "%s ", argv[i]);
                fprint(2, "\n");
@@ -177,15 +178,15 @@ nsop(char *fn, int argc, char *argv[], AuthRpc *rpc)
                flags |= MREPL;
 
        if(strcmp(argv0, ".") == 0 && argc == 1){
-               b = Bopen(argv[0], OREAD);
+               b = Bopen(argv[0], OREAD|OCEXEC);
                if(b == nil)
                        return 0;
                cdroot |= nsfile(fn, b, rpc);
                Bterm(b);
-       }else if(strcmp(argv0, "clear") == 0 && argc == 0)
+       }else if(strcmp(argv0, "clear") == 0 && argc == 0){
                rfork(RFCNAMEG);
-       else if(strcmp(argv0, "bind") == 0 && argc == 2){
-               if(bind(argv[0], argv[1], flags) < 0 && newnsdebug)
+       }else if(strcmp(argv0, "bind") == 0 && argc == 2){
+               if(bind(argv[0], argv[1], flags) == -1 && newnsdebug)
                        fprint(2, "%s: bind: %s %s: %r\n", fn, argv[0], argv[1]);
        }else if(strcmp(argv0, "unmount") == 0){
                if(argc == 1)
@@ -194,21 +195,20 @@ nsop(char *fn, int argc, char *argv[], AuthRpc *rpc)
                        unmount(argv[0], argv[1]);
        }else if(strcmp(argv0, "mount") == 0){
                fd = open(argv[0], ORDWR);
+               if(fd < 0){
+                       if(newnsdebug)
+                               fprint(2, "%s: mount: %s: %r\n", fn, argv[0]);
+                       return 0;
+               }
                if(argc == 2){
-                       if(famount(fd, rpc, argv[1], flags, "") < 0 && newnsdebug)
+                       if(famount(fd, rpc, argv[1], flags, "") == -1 && newnsdebug)
                                fprint(2, "%s: mount: %s %s: %r\n", fn, argv[0], argv[1]);
                }else if(argc == 3){
-                       if(famount(fd, rpc, argv[1], flags, argv[2]) < 0 && newnsdebug)
+                       if(famount(fd, rpc, argv[1], flags, argv[2]) == -1 && newnsdebug)
                                fprint(2, "%s: mount: %s %s %s: %r\n", fn, argv[0], argv[1], argv[2]);
+               } else {
+                       close(fd);
                }
-               close(fd);
-       }else if(strcmp(argv0, "import") == 0){
-               fd = callexport(argv[0], argv[1]);
-               if(argc == 2)
-                       famount(fd, rpc, argv[1], flags, "");
-               else if(argc == 3)
-                       famount(fd, rpc, argv[2], flags, "");
-               close(fd);
        }else if(strcmp(argv0, "cd") == 0 && argc == 1){
                if(chdir(argv[0]) == 0 && *argv[0] == '/')
                        cdroot = 1;
@@ -225,27 +225,6 @@ catch(void *x, char *m)
        return strncmp(m, wocp, strlen(wocp)) == 0;
 }
 
-static int
-callexport(char *sys, char *tree)
-{
-       char *na, buf[3];
-       int fd;
-       AuthInfo *ai;
-
-       na = netmkaddr(sys, 0, "exportfs");
-       if((fd = dial(na, 0, 0, 0)) < 0)
-               return -1;
-       if((ai = auth_proxy(fd, auth_getkey, "proto=p9any role=client")) == nil
-       || write(fd, tree, strlen(tree)) < 0
-       || read(fd, buf, 3) != 2 || buf[0]!='O' || buf[1]!= 'K'){
-               close(fd);
-               auth_freeAI(ai);
-               return -1;
-       }
-       auth_freeAI(ai);
-       return fd;
-}
-
 static char*
 unquote(char *s)
 {
@@ -340,7 +319,7 @@ expandarg(char *arg, char *buf)
                strcpy(env, "#e/");
                strncpy(env+3, p, len);
                env[3+len] = '\0';
-               fd = open(env, OREAD);
+               fd = open(env, OREAD|OCEXEC);
                if(fd >= 0){
                        len = read(fd, &buf[n], ANAMELEN - 1);
                        /* some singleton environment variables have trailing NULs */
@@ -369,7 +348,7 @@ setenv(char *name, char *val)
        long s;
 
        sprint(ename, "#e/%s", name);
-       f = create(ename, OWRITE, 0664);
+       f = create(ename, OWRITE|OCEXEC, 0664);
        if(f < 0)
                return -1;
        s = strlen(val);