Blame


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