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());
75 if(trysecstore && havesecstore()){
76 while(secstorefetch() < 0){
77 rerrstr(err, sizeof err);
78 if(strcmp(err, "cancel") == 0)
80 fprint(2, "secstorefetch: %r\n");
81 fprint(2, "Enter an empty password to quit.\n");
86 threadpostmountsrv(&fs, service, mtpt, MBEFORE);
91 * prompt user for a key. don't care about memory leaks, runs standalone
94 promptforkey(int fd, char *params)
100 attr = _parseattr(params);
101 fprint(fd, "!adding key:");
102 for(a=attr; a; a=a->next)
103 if(a->type != AttrQuery && a->name[0] != '!')
104 fprint(fd, " %q=%q", a->name, a->val);
107 for(a=attr; a; a=a->next){
109 if(a->type != AttrQuery || v[0]=='!')
112 if(strcmp(v, "user") == 0)
114 a->val = readcons(v, def, 0);
116 sysfatal("user terminated key input");
117 a->type = AttrNameval;
119 for(a=attr; a; a=a->next){
121 if(a->type != AttrQuery || v[0]!='!')
124 if(strcmp(v+1, "user") == 0)
126 a->val = readcons(v+1, def, 1);
128 sysfatal("user terminated key input");
129 a->type = AttrNameval;
137 * send a key to the mounted factotum
146 fid = nsopen("factotum", nil, "ctl", OWRITE);
148 sysfatal("opening factotum/ctl: %r");
149 snprint(buf, sizeof buf, "key %A\n", attr);
150 rv = fswrite(fid, buf, strlen(buf));
156 askuser(int fd, char *params)
160 attr = promptforkey(fd, params);
162 sysfatal("no key supplied");
163 if(sendkey(attr) < 0)
164 sysfatal("sending key to factotum: %r");
174 if((fd = open("/dev/tty", ORDWR)) < 0)
175 sysfatal("open /dev/tty: %r");
177 nf = getfields(s, f, nelem(f), 0, "\n");
178 if(nf == 1){ /* needkey or old badkey */
183 if(nf == 3){ /* new badkey */
185 fprint(fd, "!replace: %s\n", f[0]);
186 fprint(fd, "!because: %s\n", f[1]);