1 2277c5d7 2004-03-21 devnull #include "std.h"
2 2277c5d7 2004-03-21 devnull #include "dat.h"
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*);
12 2277c5d7 2004-03-21 devnull usage(void)
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");
21 2277c5d7 2004-03-21 devnull threadmain(int argc, char *argv[])
23 2277c5d7 2004-03-21 devnull char *mtpt;
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);
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);
37 2277c5d7 2004-03-21 devnull ARGBEGIN{
40 2277c5d7 2004-03-21 devnull case 'D':
41 2277c5d7 2004-03-21 devnull chatty9p++;
43 2277c5d7 2004-03-21 devnull case 'a':
44 2277c5d7 2004-03-21 devnull authaddr = EARGF(usage());
46 2277c5d7 2004-03-21 devnull case 'g':
48 2277c5d7 2004-03-21 devnull case 'm':
49 2277c5d7 2004-03-21 devnull mtpt = EARGF(usage());
51 2277c5d7 2004-03-21 devnull case 's':
52 2277c5d7 2004-03-21 devnull service = EARGF(usage());
56 2277c5d7 2004-03-21 devnull if(argc != 0)
59 2277c5d7 2004-03-21 devnull threadpostmountsrv(&fs, service, mtpt, MBEFORE);
60 2277c5d7 2004-03-21 devnull threadexits(nil);
64 2277c5d7 2004-03-21 devnull * prompt user for a key. don't care about memory leaks, runs standalone
66 2277c5d7 2004-03-21 devnull static Attr*
67 2277c5d7 2004-03-21 devnull promptforkey(int fd, char *params)
70 2277c5d7 2004-03-21 devnull Attr *a, *attr;
71 2277c5d7 2004-03-21 devnull char *def;
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");
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;
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;
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;
110 2277c5d7 2004-03-21 devnull * send a key to the mounted factotum
112 2277c5d7 2004-03-21 devnull static int
113 2277c5d7 2004-03-21 devnull sendkey(Attr *attr)
115 2277c5d7 2004-03-21 devnull int fd, rv;
116 2277c5d7 2004-03-21 devnull char buf[1024];
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;
127 2277c5d7 2004-03-21 devnull static void
128 2277c5d7 2004-03-21 devnull askuser(int fd, char *params)
130 2277c5d7 2004-03-21 devnull Attr *attr;
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");
140 2277c5d7 2004-03-21 devnull gflag(char *s)
142 2277c5d7 2004-03-21 devnull char *f[4];
146 2277c5d7 2004-03-21 devnull if((fd = open("/dev/cons", ORDWR)) < 0)
147 2277c5d7 2004-03-21 devnull sysfatal("open /dev/cons: %r");
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);
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);
162 2277c5d7 2004-03-21 devnull usage();