📄 pass.c
字号:
/* * This is just a repository for a password. * We don't want to encourage this, there's * no server side. */#include "dat.h"typedef struct State State;struct State { Key *key;};enum{ HavePass, Maxphase,};static char *phasenames[Maxphase] ={[HavePass] "HavePass",};static intpassinit(Proto *p, Fsstate *fss){ int ret; Key *k; Keyinfo ki; State *s; ret = findkey(&k, mkkeyinfo(&ki, fss, nil), "%s", p->keyprompt); if(ret != RpcOk) return ret; setattrs(fss->attr, k->attr); s = emalloc(sizeof(*s)); s->key = k; fss->ps = s; fss->phase = HavePass; return RpcOk;}static voidpassclose(Fsstate *fss){ State *s; s = fss->ps; if(s->key) closekey(s->key); free(s);}static intpassread(Fsstate *fss, void *va, uint *n){ int m; char buf[500]; char *pass, *user; State *s; s = fss->ps; switch(fss->phase){ default: return phaseerror(fss, "read"); case HavePass: user = _strfindattr(s->key->attr, "user"); pass = _strfindattr(s->key->privattr, "!password"); if(user==nil || pass==nil) return failure(fss, "passread cannot happen"); snprint(buf, sizeof buf, "%q %q", user, pass); m = strlen(buf); if(m > *n) return toosmall(fss, m); *n = m; memmove(va, buf, m); return RpcOk; }}static intpasswrite(Fsstate *fss, void*, uint){ return phaseerror(fss, "write");}Proto pass ={.name= "pass",.init= passinit,.write= passwrite,.read= passread,.close= passclose,.addkey= replacekey,.keyprompt= "user? !password?",};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -