Blame


1 6e527fbc 2005-02-13 devnull #include "std.h"
2 6e527fbc 2005-02-13 devnull #include "dat.h"
3 6e527fbc 2005-02-13 devnull
4 6e527fbc 2005-02-13 devnull /*
5 6e527fbc 2005-02-13 devnull * key attr=val... - add a key
6 6e527fbc 2005-02-13 devnull * the attr=val pairs are protocol-specific.
7 6e527fbc 2005-02-13 devnull * for example, both of these are valid:
8 6e527fbc 2005-02-13 devnull * key p9sk1 gre cs.bell-labs.com mysecret
9 6e527fbc 2005-02-13 devnull * key p9sk1 gre cs.bell-labs.com 11223344556677 fmt=des7hex
10 6e527fbc 2005-02-13 devnull * delkey ... - delete a key
11 6e527fbc 2005-02-13 devnull * if given, the attr=val pairs are used to narrow the search
12 6e527fbc 2005-02-13 devnull * [maybe should require a password?]
13 6e527fbc 2005-02-13 devnull *
14 6e527fbc 2005-02-13 devnull * debug - toggle debugging
15 6e527fbc 2005-02-13 devnull */
16 6e527fbc 2005-02-13 devnull
17 6e527fbc 2005-02-13 devnull static char *msg[] = {
18 6e527fbc 2005-02-13 devnull "key",
19 6e527fbc 2005-02-13 devnull "delkey",
20 cbeb0b26 2006-04-01 devnull "debug"
21 6e527fbc 2005-02-13 devnull };
22 6e527fbc 2005-02-13 devnull
23 6e527fbc 2005-02-13 devnull static int
24 6e527fbc 2005-02-13 devnull classify(char *s)
25 6e527fbc 2005-02-13 devnull {
26 6e527fbc 2005-02-13 devnull int i;
27 6e527fbc 2005-02-13 devnull
28 6e527fbc 2005-02-13 devnull for(i=0; i<nelem(msg); i++)
29 6e527fbc 2005-02-13 devnull if(strcmp(msg[i], s) == 0)
30 6e527fbc 2005-02-13 devnull return i;
31 6e527fbc 2005-02-13 devnull return -1;
32 6e527fbc 2005-02-13 devnull }
33 6e527fbc 2005-02-13 devnull
34 6e527fbc 2005-02-13 devnull int
35 6e527fbc 2005-02-13 devnull ctlwrite(char *a)
36 6e527fbc 2005-02-13 devnull {
37 6e527fbc 2005-02-13 devnull char *p;
38 6e527fbc 2005-02-13 devnull int i, nmatch, ret;
39 fb7a39bc 2005-02-13 devnull Attr *attr, *kpa, **l, **lpriv, **lprotos, *pa, *priv, *protos;
40 6e527fbc 2005-02-13 devnull Key *k;
41 6e527fbc 2005-02-13 devnull Proto *proto;
42 6e527fbc 2005-02-13 devnull
43 ce94dbe6 2005-02-13 devnull while(*a == ' ' || *a == '\t' || *a == '\n')
44 ce94dbe6 2005-02-13 devnull a++;
45 ce94dbe6 2005-02-13 devnull
46 6e527fbc 2005-02-13 devnull if(a[0] == '#' || a[0] == '\0')
47 6e527fbc 2005-02-13 devnull return 0;
48 6e527fbc 2005-02-13 devnull
49 6e527fbc 2005-02-13 devnull /*
50 6e527fbc 2005-02-13 devnull * it would be nice to emit a warning of some sort here.
51 6e527fbc 2005-02-13 devnull * we ignore all but the first line of the write. this helps
52 6e527fbc 2005-02-13 devnull * both with things like "echo delkey >/mnt/factotum/ctl"
53 6e527fbc 2005-02-13 devnull * and writes that (incorrectly) contain multiple key lines.
54 6e527fbc 2005-02-13 devnull */
55 6e527fbc 2005-02-13 devnull if(p = strchr(a, '\n')){
56 6e527fbc 2005-02-13 devnull if(p[1] != '\0'){
57 6e527fbc 2005-02-13 devnull werrstr("multiline write not allowed");
58 6e527fbc 2005-02-13 devnull return -1;
59 6e527fbc 2005-02-13 devnull }
60 6e527fbc 2005-02-13 devnull *p = '\0';
61 6e527fbc 2005-02-13 devnull }
62 6e527fbc 2005-02-13 devnull
63 6e527fbc 2005-02-13 devnull if((p = strchr(a, ' ')) == nil)
64 6e527fbc 2005-02-13 devnull p = "";
65 6e527fbc 2005-02-13 devnull else
66 6e527fbc 2005-02-13 devnull *p++ = '\0';
67 6e527fbc 2005-02-13 devnull switch(classify(a)){
68 6e527fbc 2005-02-13 devnull default:
69 ce94dbe6 2005-02-13 devnull werrstr("unknown verb %s", a);
70 6e527fbc 2005-02-13 devnull return -1;
71 6e527fbc 2005-02-13 devnull case 0: /* key */
72 6e527fbc 2005-02-13 devnull attr = parseattr(p);
73 6e527fbc 2005-02-13 devnull /* separate out proto= attributes */
74 6e527fbc 2005-02-13 devnull lprotos = &protos;
75 6e527fbc 2005-02-13 devnull for(l=&attr; (*l); ){
76 6e527fbc 2005-02-13 devnull if(strcmp((*l)->name, "proto") == 0){
77 6e527fbc 2005-02-13 devnull *lprotos = *l;
78 6e527fbc 2005-02-13 devnull lprotos = &(*l)->next;
79 6e527fbc 2005-02-13 devnull *l = (*l)->next;
80 6e527fbc 2005-02-13 devnull }else
81 6e527fbc 2005-02-13 devnull l = &(*l)->next;
82 6e527fbc 2005-02-13 devnull }
83 6e527fbc 2005-02-13 devnull *lprotos = nil;
84 6e527fbc 2005-02-13 devnull if(protos == nil){
85 6e527fbc 2005-02-13 devnull werrstr("key without protos");
86 6e527fbc 2005-02-13 devnull freeattr(attr);
87 6e527fbc 2005-02-13 devnull return -1;
88 6e527fbc 2005-02-13 devnull }
89 6e527fbc 2005-02-13 devnull
90 6e527fbc 2005-02-13 devnull /* separate out private attributes */
91 6e527fbc 2005-02-13 devnull lpriv = &priv;
92 6e527fbc 2005-02-13 devnull for(l=&attr; (*l); ){
93 6e527fbc 2005-02-13 devnull if((*l)->name[0] == '!'){
94 6e527fbc 2005-02-13 devnull *lpriv = *l;
95 6e527fbc 2005-02-13 devnull lpriv = &(*l)->next;
96 6e527fbc 2005-02-13 devnull *l = (*l)->next;
97 6e527fbc 2005-02-13 devnull }else
98 6e527fbc 2005-02-13 devnull l = &(*l)->next;
99 6e527fbc 2005-02-13 devnull }
100 6e527fbc 2005-02-13 devnull *lpriv = nil;
101 5f6612ba 2008-05-31 rsc flog("addkey %A %A %N", protos, attr, priv);
102 6e527fbc 2005-02-13 devnull
103 6e527fbc 2005-02-13 devnull /* add keys */
104 6e527fbc 2005-02-13 devnull ret = 0;
105 6e527fbc 2005-02-13 devnull for(pa=protos; pa; pa=pa->next){
106 6e527fbc 2005-02-13 devnull if((proto = protolookup(pa->val)) == nil){
107 6e527fbc 2005-02-13 devnull werrstr("unknown proto %s", pa->val);
108 5f6612ba 2008-05-31 rsc flog("addkey: %r");
109 6e527fbc 2005-02-13 devnull ret = -1;
110 6e527fbc 2005-02-13 devnull continue;
111 6e527fbc 2005-02-13 devnull }
112 fb7a39bc 2005-02-13 devnull if(proto->keyprompt){
113 fb7a39bc 2005-02-13 devnull kpa = parseattr(proto->keyprompt);
114 fb7a39bc 2005-02-13 devnull if(!matchattr(kpa, attr, priv)){
115 fb7a39bc 2005-02-13 devnull freeattr(kpa);
116 fb7a39bc 2005-02-13 devnull werrstr("missing attributes -- want %s", proto->keyprompt);
117 5f6612ba 2008-05-31 rsc flog("addkey %s: %r", proto->name);
118 fb7a39bc 2005-02-13 devnull ret = -1;
119 fb7a39bc 2005-02-13 devnull continue;
120 fb7a39bc 2005-02-13 devnull }
121 fb7a39bc 2005-02-13 devnull freeattr(kpa);
122 6e527fbc 2005-02-13 devnull }
123 6e527fbc 2005-02-13 devnull k = emalloc(sizeof(Key));
124 6e527fbc 2005-02-13 devnull k->attr = mkattr(AttrNameval, "proto", proto->name, copyattr(attr));
125 6e527fbc 2005-02-13 devnull k->privattr = copyattr(priv);
126 6e527fbc 2005-02-13 devnull k->ref = 1;
127 6e527fbc 2005-02-13 devnull k->proto = proto;
128 fb7a39bc 2005-02-13 devnull if(proto->checkkey && (*proto->checkkey)(k) < 0){
129 5f6612ba 2008-05-31 rsc flog("addkey %s: %r", proto->name);
130 6e527fbc 2005-02-13 devnull ret = -1;
131 6e527fbc 2005-02-13 devnull keyclose(k);
132 6e527fbc 2005-02-13 devnull continue;
133 6e527fbc 2005-02-13 devnull }
134 5f6612ba 2008-05-31 rsc flog("adding key: %A %N", k->attr, k->privattr);
135 6e527fbc 2005-02-13 devnull keyadd(k);
136 6e527fbc 2005-02-13 devnull keyclose(k);
137 6e527fbc 2005-02-13 devnull }
138 6e527fbc 2005-02-13 devnull freeattr(attr);
139 6e527fbc 2005-02-13 devnull freeattr(priv);
140 6e527fbc 2005-02-13 devnull freeattr(protos);
141 6e527fbc 2005-02-13 devnull return ret;
142 6e527fbc 2005-02-13 devnull case 1: /* delkey */
143 6e527fbc 2005-02-13 devnull nmatch = 0;
144 6e527fbc 2005-02-13 devnull attr = parseattr(p);
145 5f6612ba 2008-05-31 rsc flog("delkey %A", attr);
146 6e527fbc 2005-02-13 devnull for(pa=attr; pa; pa=pa->next){
147 6e527fbc 2005-02-13 devnull if(pa->type != AttrQuery && pa->name[0]=='!'){
148 6e527fbc 2005-02-13 devnull werrstr("only !private? patterns are allowed for private fields");
149 6e527fbc 2005-02-13 devnull freeattr(attr);
150 6e527fbc 2005-02-13 devnull return -1;
151 6e527fbc 2005-02-13 devnull }
152 6e527fbc 2005-02-13 devnull }
153 6e527fbc 2005-02-13 devnull for(i=0; i<ring.nkey; ){
154 6e527fbc 2005-02-13 devnull if(matchattr(attr, ring.key[i]->attr, ring.key[i]->privattr)){
155 6e527fbc 2005-02-13 devnull nmatch++;
156 5f6612ba 2008-05-31 rsc flog("deleting %A %N", ring.key[i]->attr, ring.key[i]->privattr);
157 6e527fbc 2005-02-13 devnull keyclose(ring.key[i]);
158 6e527fbc 2005-02-13 devnull ring.nkey--;
159 6e527fbc 2005-02-13 devnull memmove(&ring.key[i], &ring.key[i+1], (ring.nkey-i)*sizeof(ring.key[0]));
160 6e527fbc 2005-02-13 devnull }else
161 6e527fbc 2005-02-13 devnull i++;
162 6e527fbc 2005-02-13 devnull }
163 6e527fbc 2005-02-13 devnull freeattr(attr);
164 6e527fbc 2005-02-13 devnull if(nmatch == 0){
165 6e527fbc 2005-02-13 devnull werrstr("found no keys to delete");
166 6e527fbc 2005-02-13 devnull return -1;
167 6e527fbc 2005-02-13 devnull }
168 6e527fbc 2005-02-13 devnull return 0;
169 6e527fbc 2005-02-13 devnull case 2: /* debug */
170 6e527fbc 2005-02-13 devnull debug ^= 1;
171 5f6612ba 2008-05-31 rsc flog("debug = %d", debug);
172 6e527fbc 2005-02-13 devnull return 0;
173 6e527fbc 2005-02-13 devnull }
174 6e527fbc 2005-02-13 devnull }