1 6e527fbc 2005-02-13 devnull #include "std.h"
2 6e527fbc 2005-02-13 devnull #include "dat.h"
4 6e527fbc 2005-02-13 devnull Ring ring;
7 6e527fbc 2005-02-13 devnull keyiterate(int skip, char *fmt, ...)
12 6e527fbc 2005-02-13 devnull va_list arg;
14 6e527fbc 2005-02-13 devnull va_start(arg, fmt);
15 6e527fbc 2005-02-13 devnull a = parseattrfmtv(fmt, arg);
16 6e527fbc 2005-02-13 devnull va_end(arg);
18 6e527fbc 2005-02-13 devnull for(i=0; i<ring.nkey; i++){
19 6e527fbc 2005-02-13 devnull k = ring.key[i];
20 6e527fbc 2005-02-13 devnull if(matchattr(a, k->attr, k->privattr)){
21 6e527fbc 2005-02-13 devnull if(skip-- > 0)
22 6e527fbc 2005-02-13 devnull continue;
23 6e527fbc 2005-02-13 devnull k->ref++;
24 6e527fbc 2005-02-13 devnull freeattr(a);
25 6e527fbc 2005-02-13 devnull return k;
28 6e527fbc 2005-02-13 devnull freeattr(a);
29 6e527fbc 2005-02-13 devnull werrstr("no key found");
30 6e527fbc 2005-02-13 devnull return nil;
34 6e527fbc 2005-02-13 devnull keylookup(char *fmt, ...)
39 6e527fbc 2005-02-13 devnull va_list arg;
41 6e527fbc 2005-02-13 devnull va_start(arg, fmt);
42 6e527fbc 2005-02-13 devnull a = parseattrfmtv(fmt, arg);
43 6e527fbc 2005-02-13 devnull va_end(arg);
45 6e527fbc 2005-02-13 devnull for(i=0; i<ring.nkey; i++){
46 6e527fbc 2005-02-13 devnull k = ring.key[i];
47 6e527fbc 2005-02-13 devnull if(matchattr(a, k->attr, k->privattr)){
48 6e527fbc 2005-02-13 devnull k->ref++;
49 6e527fbc 2005-02-13 devnull freeattr(a);
50 6e527fbc 2005-02-13 devnull return k;
53 6e527fbc 2005-02-13 devnull freeattr(a);
54 6e527fbc 2005-02-13 devnull werrstr("no key found");
55 6e527fbc 2005-02-13 devnull return nil;
59 6e527fbc 2005-02-13 devnull keyfetch(Conv *c, char *fmt, ...)
61 6e527fbc 2005-02-13 devnull int i, tag;
64 6e527fbc 2005-02-13 devnull va_list arg;
66 6e527fbc 2005-02-13 devnull va_start(arg, fmt);
67 6e527fbc 2005-02-13 devnull a = parseattrfmtv(fmt, arg);
68 6e527fbc 2005-02-13 devnull va_end(arg);
70 5f6612ba 2008-05-31 rsc flog("keyfetch %A", a);
73 6e527fbc 2005-02-13 devnull for(i=0; i<ring.nkey; i++){
74 6e527fbc 2005-02-13 devnull k = ring.key[i];
75 6e527fbc 2005-02-13 devnull if(tag < k->tag)
76 6e527fbc 2005-02-13 devnull tag = k->tag;
77 6e527fbc 2005-02-13 devnull if(matchattr(a, k->attr, k->privattr)){
78 6e527fbc 2005-02-13 devnull k->ref++;
79 6e527fbc 2005-02-13 devnull if(strfindattr(k->attr, "confirm") && confirmkey(c, k) != 1){
80 6e527fbc 2005-02-13 devnull k->ref--;
81 6e527fbc 2005-02-13 devnull continue;
83 6e527fbc 2005-02-13 devnull freeattr(a);
84 5f6612ba 2008-05-31 rsc flog("using key %A %N", k->attr, k->privattr);
85 6e527fbc 2005-02-13 devnull return k;
89 6e527fbc 2005-02-13 devnull if(needkey(c, a) < 0)
90 6e527fbc 2005-02-13 devnull convneedkey(c, a);
92 6e527fbc 2005-02-13 devnull for(i=0; i<ring.nkey; i++){
93 6e527fbc 2005-02-13 devnull k = ring.key[i];
94 6e527fbc 2005-02-13 devnull if(k->tag <= tag)
95 6e527fbc 2005-02-13 devnull continue;
96 6e527fbc 2005-02-13 devnull if(matchattr(a, k->attr, k->privattr)){
97 6e527fbc 2005-02-13 devnull k->ref++;
98 6e527fbc 2005-02-13 devnull if(strfindattr(k->attr, "confirm") && confirmkey(c, k) != 1){
99 6e527fbc 2005-02-13 devnull k->ref--;
100 6e527fbc 2005-02-13 devnull continue;
102 6e527fbc 2005-02-13 devnull freeattr(a);
103 6e527fbc 2005-02-13 devnull return k;
106 6e527fbc 2005-02-13 devnull freeattr(a);
107 6e527fbc 2005-02-13 devnull werrstr("no key found");
108 6e527fbc 2005-02-13 devnull return nil;
111 6e527fbc 2005-02-13 devnull static int taggen;
114 6e527fbc 2005-02-13 devnull keyadd(Key *k)
118 6e527fbc 2005-02-13 devnull k->ref++;
119 6e527fbc 2005-02-13 devnull k->tag = ++taggen;
120 6e527fbc 2005-02-13 devnull for(i=0; i<ring.nkey; i++){
121 6e527fbc 2005-02-13 devnull if(matchattr(k->attr, ring.key[i]->attr, nil)
122 6e527fbc 2005-02-13 devnull && matchattr(ring.key[i]->attr, k->attr, nil)){
123 6e527fbc 2005-02-13 devnull keyclose(ring.key[i]);
124 6e527fbc 2005-02-13 devnull ring.key[i] = k;
129 6e527fbc 2005-02-13 devnull ring.key = erealloc(ring.key, (ring.nkey+1)*sizeof(ring.key[0]));
130 6e527fbc 2005-02-13 devnull ring.key[ring.nkey++] = k;
134 6e527fbc 2005-02-13 devnull keyclose(Key *k)
136 6e527fbc 2005-02-13 devnull if(k == nil)
139 6e527fbc 2005-02-13 devnull if(--k->ref > 0)
142 6e527fbc 2005-02-13 devnull if(k->proto->closekey)
143 6e527fbc 2005-02-13 devnull (*k->proto->closekey)(k);
145 6e527fbc 2005-02-13 devnull freeattr(k->attr);
146 6e527fbc 2005-02-13 devnull freeattr(k->privattr);
147 6e527fbc 2005-02-13 devnull free(k);
151 6e527fbc 2005-02-13 devnull keyreplace(Conv *c, Key *k, char *fmt, ...)
153 6e527fbc 2005-02-13 devnull Key *kk;
154 6e527fbc 2005-02-13 devnull char *msg;
155 6e527fbc 2005-02-13 devnull Attr *a, *b, *bp;
156 6e527fbc 2005-02-13 devnull va_list arg;
158 6e527fbc 2005-02-13 devnull va_start(arg, fmt);
159 6e527fbc 2005-02-13 devnull msg = vsmprint(fmt, arg);
160 6e527fbc 2005-02-13 devnull if(msg == nil)
161 6e527fbc 2005-02-13 devnull sysfatal("out of memory");
162 6e527fbc 2005-02-13 devnull va_end(arg);
164 fa325e9b 2020-01-10 cross /* replace prompted values with prompts */
165 6e527fbc 2005-02-13 devnull a = copyattr(k->attr);
166 6e527fbc 2005-02-13 devnull bp = parseattr(k->proto->keyprompt);
167 6e527fbc 2005-02-13 devnull for(b=bp; b; b=b->next){
168 6e527fbc 2005-02-13 devnull a = delattr(a, b->name);
169 6e527fbc 2005-02-13 devnull a = addattr(a, "%q?", b->name);
171 6e527fbc 2005-02-13 devnull freeattr(bp);
173 6e527fbc 2005-02-13 devnull if(badkey(c, k, msg, a) < 0)
174 6e527fbc 2005-02-13 devnull convbadkey(c, k, msg, a);
175 6e527fbc 2005-02-13 devnull kk = keylookup("%A", a);
176 6e527fbc 2005-02-13 devnull freeattr(a);
177 6e527fbc 2005-02-13 devnull keyclose(k);
178 6e527fbc 2005-02-13 devnull if(kk == k){
179 6e527fbc 2005-02-13 devnull keyclose(kk);
180 6e527fbc 2005-02-13 devnull werrstr("%s", msg);
181 6e527fbc 2005-02-13 devnull return nil;
184 6e527fbc 2005-02-13 devnull if(strfindattr(kk->attr, "confirm")){
185 6e527fbc 2005-02-13 devnull if(confirmkey(c, kk) != 1){
186 6e527fbc 2005-02-13 devnull werrstr("key use not confirmed");
187 6e527fbc 2005-02-13 devnull keyclose(kk);
188 6e527fbc 2005-02-13 devnull return nil;
191 6e527fbc 2005-02-13 devnull return kk;
195 6e527fbc 2005-02-13 devnull keyevict(Conv *c, Key *k, char *fmt, ...)
197 6e527fbc 2005-02-13 devnull char *msg;
198 6e527fbc 2005-02-13 devnull Attr *a, *b, *bp;
199 6e527fbc 2005-02-13 devnull va_list arg;
201 6e527fbc 2005-02-13 devnull va_start(arg, fmt);
202 6e527fbc 2005-02-13 devnull msg = vsmprint(fmt, arg);
203 6e527fbc 2005-02-13 devnull if(msg == nil)
204 6e527fbc 2005-02-13 devnull sysfatal("out of memory");
205 6e527fbc 2005-02-13 devnull va_end(arg);
207 fa325e9b 2020-01-10 cross /* replace prompted values with prompts */
208 6e527fbc 2005-02-13 devnull a = copyattr(k->attr);
209 6e527fbc 2005-02-13 devnull bp = parseattr(k->proto->keyprompt);
210 6e527fbc 2005-02-13 devnull for(b=bp; b; b=b->next){
211 6e527fbc 2005-02-13 devnull a = delattr(a, b->name);
212 6e527fbc 2005-02-13 devnull a = addattr(a, "%q?", b->name);
214 6e527fbc 2005-02-13 devnull freeattr(bp);
216 6e527fbc 2005-02-13 devnull if(badkey(c, k, msg, nil) < 0)
217 6e527fbc 2005-02-13 devnull convbadkey(c, k, msg, nil);
218 6e527fbc 2005-02-13 devnull keyclose(k);