diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/mount.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/mount.c')
-rwxr-xr-x | sys/src/cmd/mount.c | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/sys/src/cmd/mount.c b/sys/src/cmd/mount.c new file mode 100755 index 000000000..48251fbab --- /dev/null +++ b/sys/src/cmd/mount.c @@ -0,0 +1,111 @@ +#include <u.h> +#include <libc.h> +#include <auth.h> + +void usage(void); +void catch(void*, char*); + +char *keyspec = ""; + +int +amount0(int fd, char *mntpt, int flags, char *aname, char *keyspec) +{ + int rv, afd; + AuthInfo *ai; + + afd = fauth(fd, aname); + if(afd >= 0){ + ai = auth_proxy(afd, amount_getkey, "proto=p9any role=client %s", keyspec); + if(ai != nil) + auth_freeAI(ai); + else + fprint(2, "%s: auth_proxy: %r\n", argv0); + } + rv = mount(fd, afd, mntpt, flags, aname); + if(afd >= 0) + close(afd); + return rv; +} + +void +main(int argc, char *argv[]) +{ + char *spec; + ulong flag = 0; + int qflag = 0; + int noauth = 0; + int fd, rv; + + ARGBEGIN{ + case 'a': + flag |= MAFTER; + break; + case 'b': + flag |= MBEFORE; + break; + case 'c': + flag |= MCREATE; + break; + case 'C': + flag |= MCACHE; + break; + case 'k': + keyspec = EARGF(usage()); + break; + case 'n': + noauth = 1; + break; + case 'q': + qflag = 1; + break; + default: + usage(); + }ARGEND + + spec = 0; + if(argc == 2) + spec = ""; + else if(argc == 3) + spec = argv[2]; + else + usage(); + + if((flag&MAFTER)&&(flag&MBEFORE)) + usage(); + + fd = open(argv[0], ORDWR); + if(fd < 0){ + if(qflag) + exits(0); + fprint(2, "%s: can't open %s: %r\n", argv0, argv[0]); + exits("open"); + } + + notify(catch); + if(noauth) + rv = mount(fd, -1, argv[1], flag, spec); + else + rv = amount0(fd, argv[1], flag, spec, keyspec); + if(rv < 0){ + if(qflag) + exits(0); + fprint(2, "%s: mount %s: %r\n", argv0, argv[1]); + exits("mount"); + } + exits(0); +} + +void +catch(void *x, char *m) +{ + USED(x); + fprint(2, "mount: %s\n", m); + exits(m); +} + +void +usage(void) +{ + fprint(2, "usage: mount [-a|-b] [-cnq] [-k keypattern] /srv/service dir [spec]\n"); + exits("usage"); +} |