8 char *factname = "factotum";
9 char *service = "factotum";
17 fprint(2, "usage: factotum [-Dd] [-a authaddr] [-m mtpt] [-s service]\n");
18 fprint(2, " or factotum -g keypattern\n");
19 fprint(2, " or factotum -g 'badkeyattr\\nmsg\\nkeypattern'\n");
20 threadexitsall("usage");
24 threadmain(int argc, char *argv[])
33 fmtinstall('A', attrfmt);
34 fmtinstall('H', encodefmt);
35 fmtinstall('N', attrnamefmt);
37 if(argc == 3 && strcmp(argv[1], "-g") == 0){
49 authaddr = EARGF(usage());
57 mtpt = EARGF(usage());
60 service = EARGF(usage());
73 if(trysecstore && havesecstore()){
74 while(secstorefetch() < 0){
75 rerrstr(err, sizeof err);
76 if(strcmp(err, "cancel") == 0)
78 fprint(2, "secstorefetch: %r\n");
79 fprint(2, "Enter an empty password to quit.\n");
84 threadpostmountsrv(&fs, service, mtpt, MBEFORE);
89 * prompt user for a key. don't care about memory leaks, runs standalone
92 promptforkey(int fd, char *params)
98 attr = _parseattr(params);
99 fprint(fd, "!adding key:");
100 for(a=attr; a; a=a->next)
101 if(a->type != AttrQuery && a->name[0] != '!')
102 fprint(fd, " %q=%q", a->name, a->val);
105 for(a=attr; a; a=a->next){
107 if(a->type != AttrQuery || v[0]=='!')
110 if(strcmp(v, "user") == 0)
112 a->val = readcons(v, def, 0);
114 sysfatal("user terminated key input");
115 a->type = AttrNameval;
117 for(a=attr; a; a=a->next){
119 if(a->type != AttrQuery || v[0]!='!')
122 if(strcmp(v+1, "user") == 0)
124 a->val = readcons(v+1, def, 1);
126 sysfatal("user terminated key input");
127 a->type = AttrNameval;
135 * send a key to the mounted factotum
144 fid = nsopen("factotum", nil, "ctl", OWRITE);
146 sysfatal("opening factotum/ctl: %r");
147 snprint(buf, sizeof buf, "key %A\n", attr);
148 rv = fswrite(fid, buf, strlen(buf));
154 askuser(int fd, char *params)
158 attr = promptforkey(fd, params);
160 sysfatal("no key supplied");
161 if(sendkey(attr) < 0)
162 sysfatal("sending key to factotum: %r");
172 if((fd = open("/dev/tty", ORDWR)) < 0)
173 sysfatal("open /dev/tty: %r");
175 nf = getfields(s, f, nelem(f), 0, "\n");
176 if(nf == 1){ /* needkey or old badkey */
181 if(nf == 3){ /* new badkey */
183 fprint(fd, "!replace: %s\n", f[0]);
184 fprint(fd, "!because: %s\n", f[1]);