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/libauth/auth_getuserpasswd.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/libauth/auth_getuserpasswd.c')
-rwxr-xr-x | sys/src/libauth/auth_getuserpasswd.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/sys/src/libauth/auth_getuserpasswd.c b/sys/src/libauth/auth_getuserpasswd.c new file mode 100755 index 000000000..4d66dcecb --- /dev/null +++ b/sys/src/libauth/auth_getuserpasswd.c @@ -0,0 +1,75 @@ +#include <u.h> +#include <libc.h> +#include <auth.h> +#include "authlocal.h" + +enum { + ARgiveup = 100, +}; + +static int +dorpc(AuthRpc *rpc, char *verb, char *val, int len, AuthGetkey *getkey) +{ + int ret; + + for(;;){ + if((ret = auth_rpc(rpc, verb, val, len)) != ARneedkey && ret != ARbadkey) + return ret; + if(getkey == nil) + return ARgiveup; /* don't know how */ + if((*getkey)(rpc->arg) < 0) + return ARgiveup; /* user punted */ + } +} + +UserPasswd* +auth_getuserpasswd(AuthGetkey *getkey, char *fmt, ...) +{ + AuthRpc *rpc; + char *f[3], *p, *params; + int fd; + va_list arg; + UserPasswd *up; + + up = nil; + rpc = nil; + params = nil; + + fd = open("/mnt/factotum/rpc", ORDWR); + if(fd < 0) + goto out; + rpc = auth_allocrpc(fd); + if(rpc == nil) + goto out; + quotefmtinstall(); /* just in case */ + va_start(arg, fmt); + params = vsmprint(fmt, arg); + va_end(arg); + if(params == nil) + goto out; + + if(dorpc(rpc, "start", params, strlen(params), getkey) != ARok + || dorpc(rpc, "read", nil, 0, getkey) != ARok) + goto out; + + rpc->arg[rpc->narg] = '\0'; + if(tokenize(rpc->arg, f, 2) != 2){ + werrstr("bad answer from factotum"); + goto out; + } + up = malloc(sizeof(*up)+rpc->narg+1); + if(up == nil) + goto out; + p = (char*)&up[1]; + strcpy(p, f[0]); + up->user = p; + p += strlen(p)+1; + strcpy(p, f[1]); + up->passwd = p; + +out: + free(params); + auth_freerpc(rpc); + close(fd); + return up; +} |