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;
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){
}
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);
}
auth_freeAI(ai);
}
ret = mount(fd, afd, mntpt, flags, aname);
+ if(ret == -1)
+ close(fd);
if(afd >= 0)
close(afd);
return ret;
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");
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)
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;
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)
{
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 */
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);