summaryrefslogtreecommitdiff
path: root/sys/src/cmd/auth
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2016-12-22 21:39:59 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2016-12-22 21:39:59 +0100
commit82bf19941ed8dc4626e8fb3c12b2f67d7d331093 (patch)
tree7e343feefd6ad2ee224fd7ae8c954d66eea7a014 /sys/src/cmd/auth
parent640adc8f8211d26f75c79b2c345040b9d490811f (diff)
auth/as, auth/none, auth/newns: consistent handling of command arguments, cleanup
Diffstat (limited to 'sys/src/cmd/auth')
-rw-r--r--sys/src/cmd/auth/as.c100
-rw-r--r--sys/src/cmd/auth/newns.c57
-rw-r--r--sys/src/cmd/auth/none.c59
3 files changed, 96 insertions, 120 deletions
diff --git a/sys/src/cmd/auth/as.c b/sys/src/cmd/auth/as.c
index 5a4800834..46450a293 100644
--- a/sys/src/cmd/auth/as.c
+++ b/sys/src/cmd/auth/as.c
@@ -11,88 +11,62 @@
#include <authsrv.h>
#include "authcmdlib.h"
-int debug;
+extern int newnsdebug;
+
+char *defargv[] = { "/bin/rc", "-i", nil };
+char *namespace = nil;
int becomeuser(char*);
-void createuser(void);
-void *emalloc(ulong);
-void *erealloc(void*, ulong);
void initcap(void);
-int mkcmd(char*, char*, int);
-int myauth(int, char*);
-int qidcmp(Qid, Qid);
-void runas(char *, char *);
-void usage(void);
-#pragma varargck argpos clog 1
-#pragma varargck argpos fatal 1
+void
+usage(void)
+{
+ fprint(2, "usage: %s [-d] [-n namespace] user [cmd [args...]]\n", argv0);
+ exits("usage");
+}
-static void
-fatal(char *fmt, ...)
+void
+run(char **a)
{
- char msg[256];
- va_list arg;
+ exec(a[0], a);
- va_start(arg, fmt);
- vseprint(msg, msg + sizeof msg, fmt, arg);
- va_end(arg);
- error("%s", msg);
+ if(a[0][0] != '/' && a[0][0] != '#' &&
+ (a[0][0] != '.' || (a[0][1] != '/' &&
+ (a[0][1] != '.' || a[0][2] != '/'))))
+ exec(smprint("/bin/%s", a[0]), a);
+
+ sysfatal("exec: %s: %r", a[0]);
}
void
main(int argc, char *argv[])
{
- debug = 0;
ARGBEGIN{
case 'd':
- debug = 1;
+ newnsdebug = 1;
+ break;
+ case 'n':
+ namespace = EARGF(usage());
break;
default:
usage();
}ARGEND
- initcap();
- if(argc >= 2)
- runas(argv[0], argv[1]);
- else
+ if(argc == 0)
usage();
-}
-void
-runas(char *user, char *cmd)
-{
- if(becomeuser(user) < 0)
- sysfatal("can't change uid for %s: %r", user);
- putenv("service", "rx");
- execl("/bin/rc", "rc", "-lc", cmd, nil);
- sysfatal("exec /bin/rc: %r");
-}
+ initcap();
+ if(becomeuser(argv[0]) < 0)
+ sysfatal("can't change uid for %s: %r", argv[0]);
+ if(newns(argv[0], namespace) < 0)
+ sysfatal("can't build namespace: %r");
-void *
-emalloc(ulong n)
-{
- void *p;
+ argv++;
+ if(--argc == 0)
+ argv = defargv;
- if(p = mallocz(n, 1))
- return p;
- fatal("out of memory");
- return 0;
-}
-
-void *
-erealloc(void *p, ulong n)
-{
- if(p = realloc(p, n))
- return p;
- fatal("out of memory");
- return 0;
-}
-
-void
-usage(void)
-{
- fprint(2, "usage: %s [-c] [user] [command]\n", argv0);
- exits("usage");
+ run(argv);
}
/*
@@ -105,7 +79,7 @@ initcap(void)
{
caphashfd = open("#¤/caphash", OCEXEC|OWRITE);
if(caphashfd < 0)
- fprint(2, "%s: opening #¤/caphash: %r\n", argv0);
+ fprint(2, "%s: opening #¤/caphash: %r", argv0);
}
/*
@@ -126,7 +100,9 @@ mkcap(char *from, char *to)
/* create the capability */
nto = strlen(to);
nfrom = strlen(from);
- cap = emalloc(nfrom+1+nto+1+sizeof(rand)*3+1);
+ cap = malloc(nfrom+1+nto+1+sizeof(rand)*3+1);
+ if(cap == nil)
+ sysfatal("malloc: %r");
sprint(cap, "%s@%s", from, to);
genrandom(rand, sizeof(rand));
key = cap+nfrom+1+nto+1;
@@ -169,7 +145,5 @@ becomeuser(char *new)
return -1;
rv = usecap(cap);
free(cap);
-
- newns(new, nil);
return rv;
}
diff --git a/sys/src/cmd/auth/newns.c b/sys/src/cmd/auth/newns.c
index 792e8e55c..f1762d819 100644
--- a/sys/src/cmd/auth/newns.c
+++ b/sys/src/cmd/auth/newns.c
@@ -2,36 +2,35 @@
#include <libc.h>
#include <auth.h>
+extern int newnsdebug;
+
+char *defargv[] = { "/bin/rc", "-i", nil };
+char *namespace = "/lib/namespace";
+int add = 0;
+
void
usage(void)
{
- fprint(2, "usage: newns [-ad] [-n namespace] [cmd [args...]]\n");
+ fprint(2, "usage: %s [-ad] [-n namespace] [cmd [args...]]\n", argv0);
exits("usage");
}
-static int
-rooted(char *s)
+void
+run(char **a)
{
- if(s[0] == '/')
- return 1;
- if(s[0] == '.' && s[1] == '/')
- return 1;
- if(s[0] == '.' && s[1] == '.' && s[2] == '/')
- return 1;
- return 0;
+ exec(a[0], a);
+
+ if(a[0][0] != '/' && a[0][0] != '#' &&
+ (a[0][0] != '.' || (a[0][1] != '/' &&
+ (a[0][1] != '.' || a[0][2] != '/'))))
+ exec(smprint("/bin/%s", a[0]), a);
+
+ sysfatal("exec: %s: %r", a[0]);
}
void
main(int argc, char **argv)
{
- extern int newnsdebug;
- char *defargv[] = { "/bin/rc", "-i", nil };
- char *nsfile, err[ERRMAX];
- int add;
-
- rfork(RFNAMEG);
- add = 0;
- nsfile = "/lib/namespace";
ARGBEGIN{
case 'a':
add = 1;
@@ -40,23 +39,21 @@ main(int argc, char **argv)
newnsdebug = 1;
break;
case 'n':
- nsfile = ARGF();
+ namespace = EARGF(usage());
break;
default:
usage();
break;
}ARGEND
+
+ if(add){
+ rfork(RFNAMEG);
+ addns(getuser(), namespace);
+ }else
+ newns(getuser(), namespace);
+
if(argc == 0)
argv = defargv;
- if (add)
- addns(getuser(), nsfile);
- else
- newns(getuser(), nsfile);
- exec(argv[0], argv);
- if(!rooted(argv[0])){
- rerrstr(err, sizeof err);
- exec(smprint("/bin/%s", argv[0]), argv);
- errstr(err, sizeof err);
- }
- sysfatal("exec: %s: %r", argv[0]);
+
+ run(argv);
}
diff --git a/sys/src/cmd/auth/none.c b/sys/src/cmd/auth/none.c
index df2a2e5d2..75d8b70fa 100644
--- a/sys/src/cmd/auth/none.c
+++ b/sys/src/cmd/auth/none.c
@@ -2,22 +2,40 @@
#include <libc.h>
#include <auth.h>
-char *namespace;
+extern int newnsdebug;
+
+char *defargv[] = { "/bin/rc", "-i", nil };
+char *namespace = nil;
void
usage(void)
{
- fprint(2, "usage: auth/none [-n namespace] [cmd ...]\n");
+ fprint(2, "usage: %s [-d] [-n namespace] [cmd [args...]]\n", argv0);
exits("usage");
}
void
+run(char **a)
+{
+ exec(a[0], a);
+
+ if(a[0][0] != '/' && a[0][0] != '#' &&
+ (a[0][0] != '.' || (a[0][1] != '/' &&
+ (a[0][1] != '.' || a[0][2] != '/'))))
+ exec(smprint("/bin/%s", a[0]), a);
+
+ sysfatal("exec: %s: %r", a[0]);
+}
+
+void
main(int argc, char *argv[])
{
- char cmd[256];
int fd;
ARGBEGIN{
+ case 'd':
+ newnsdebug = 1;
+ break;
case 'n':
namespace = EARGF(usage());
break;
@@ -25,31 +43,18 @@ main(int argc, char *argv[])
usage();
}ARGEND
- if (rfork(RFENVG|RFNAMEG) < 0)
- sysfatal("can't make new pgrp");
-
fd = open("#c/user", OWRITE);
- if (fd < 0)
- sysfatal("can't open #c/user");
- if (write(fd, "none", strlen("none")) < 0)
- sysfatal("can't become none");
+ if(fd < 0)
+ sysfatal("can't open #c/user: %r");
+ if(write(fd, "none", strlen("none")) < 0)
+ sysfatal("can't become none: %r");
close(fd);
- if (newns("none", namespace) < 0)
- sysfatal("can't build namespace");
-
- if (argc > 0) {
- strecpy(cmd, cmd+sizeof cmd, argv[0]);
- exec(cmd, &argv[0]);
- if (strncmp(cmd, "/", 1) != 0
- && strncmp(cmd, "./", 2) != 0
- && strncmp(cmd, "../", 3) != 0) {
- snprint(cmd, sizeof cmd, "/bin/%s", argv[0]);
- exec(cmd, &argv[0]);
- }
- } else {
- strcpy(cmd, "/bin/rc");
- execl(cmd, cmd, nil);
- }
- sysfatal(cmd);
+ if(newns("none", namespace) < 0)
+ sysfatal("can't build namespace: %r");
+
+ if(argc == 0)
+ argv = defargv;
+
+ run(argv);
}