Blob


1 #include "std.h"
2 #include "dat.h"
4 int debug;
5 char *factname = "factotum";
6 char *service = nil;
7 char *owner;
8 char *authaddr;
9 void gflag(char*);
11 void
12 usage(void)
13 {
14 fprint(2, "usage: factotum [-Dd] [-a authaddr] [-m mtpt]\n");
15 fprint(2, " or factotum -g keypattern\n");
16 fprint(2, " or factotum -g 'badkeyattr\nmsg\nkeypattern'");
17 exits("usage");
18 }
20 void
21 threadmain(int argc, char *argv[])
22 {
23 char *mtpt;
25 mtpt = "/mnt";
26 owner = getuser();
27 quotefmtinstall();
28 fmtinstall('A', attrfmt);
29 fmtinstall('H', encodefmt);
30 fmtinstall('N', attrnamefmt);
32 if(argc == 3 && strcmp(argv[1], "-g") == 0){
33 gflag(argv[2]);
34 exits(nil);
35 }
37 ARGBEGIN{
38 default:
39 usage();
40 case 'D':
41 chatty9p++;
42 break;
43 case 'a':
44 authaddr = EARGF(usage());
45 break;
46 case 'g':
47 usage();
48 case 'm':
49 mtpt = EARGF(usage());
50 break;
51 case 's':
52 service = EARGF(usage());
53 break;
54 }ARGEND
56 if(argc != 0)
57 usage();
59 threadpostmountsrv(&fs, service, mtpt, MBEFORE);
60 threadexits(nil);
61 }
63 /*
64 * prompt user for a key. don't care about memory leaks, runs standalone
65 */
66 static Attr*
67 promptforkey(int fd, char *params)
68 {
69 char *v;
70 Attr *a, *attr;
71 char *def;
73 attr = _parseattr(params);
74 fprint(fd, "!adding key:");
75 for(a=attr; a; a=a->next)
76 if(a->type != AttrQuery && a->name[0] != '!')
77 fprint(fd, " %q=%q", a->name, a->val);
78 fprint(fd, "\n");
80 for(a=attr; a; a=a->next){
81 v = a->name;
82 if(a->type != AttrQuery || v[0]=='!')
83 continue;
84 def = nil;
85 if(strcmp(v, "user") == 0)
86 def = getuser();
87 a->val = readcons(v, def, 0);
88 if(a->val == nil)
89 sysfatal("user terminated key input");
90 a->type = AttrNameval;
91 }
92 for(a=attr; a; a=a->next){
93 v = a->name;
94 if(a->type != AttrQuery || v[0]!='!')
95 continue;
96 def = nil;
97 if(strcmp(v+1, "user") == 0)
98 def = getuser();
99 a->val = readcons(v+1, def, 1);
100 if(a->val == nil)
101 sysfatal("user terminated key input");
102 a->type = AttrNameval;
104 fprint(fd, "!\n");
105 close(fd);
106 return attr;
109 /*
110 * send a key to the mounted factotum
111 */
112 static int
113 sendkey(Attr *attr)
115 int fd, rv;
116 char buf[1024];
118 fd = open("/mnt/factotum/ctl", ORDWR);
119 if(fd < 0)
120 sysfatal("opening /mnt/factotum/ctl: %r");
121 rv = fprint(fd, "key %A\n", attr);
122 read(fd, buf, sizeof buf);
123 close(fd);
124 return rv;
127 static void
128 askuser(int fd, char *params)
130 Attr *attr;
132 attr = promptforkey(fd, params);
133 if(attr == nil)
134 sysfatal("no key supplied");
135 if(sendkey(attr) < 0)
136 sysfatal("sending key to factotum: %r");
139 void
140 gflag(char *s)
142 char *f[4];
143 int nf;
144 int fd;
146 if((fd = open("/dev/cons", ORDWR)) < 0)
147 sysfatal("open /dev/cons: %r");
149 nf = getfields(s, f, nelem(f), 0, "\n");
150 if(nf == 1){ /* needkey or old badkey */
151 fprint(fd, "\n");
152 askuser(fd, s);
153 exits(nil);
155 if(nf == 3){ /* new badkey */
156 fprint(fd, "\n");
157 fprint(fd, "!replace: %s\n", f[0]);
158 fprint(fd, "!because: %s\n", f[1]);
159 askuser(fd, f[2]);
160 exits(nil);
162 usage();