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);
72 6e527fbc 2005-02-13 devnull for(i=0; i<ring.nkey; i++){
73 6e527fbc 2005-02-13 devnull k = ring.key[i];
74 6e527fbc 2005-02-13 devnull if(tag < k->tag)
75 6e527fbc 2005-02-13 devnull tag = k->tag;
76 6e527fbc 2005-02-13 devnull if(matchattr(a, k->attr, k->privattr)){
77 6e527fbc 2005-02-13 devnull k->ref++;
78 6e527fbc 2005-02-13 devnull if(strfindattr(k->attr, "confirm") && confirmkey(c, k) != 1){
79 6e527fbc 2005-02-13 devnull k->ref--;
80 6e527fbc 2005-02-13 devnull continue;
82 6e527fbc 2005-02-13 devnull freeattr(a);
83 6e527fbc 2005-02-13 devnull return k;
87 6e527fbc 2005-02-13 devnull if(needkey(c, a) < 0)
88 6e527fbc 2005-02-13 devnull convneedkey(c, a);
90 6e527fbc 2005-02-13 devnull for(i=0; i<ring.nkey; i++){
91 6e527fbc 2005-02-13 devnull k = ring.key[i];
92 6e527fbc 2005-02-13 devnull if(k->tag <= tag)
93 6e527fbc 2005-02-13 devnull continue;
94 6e527fbc 2005-02-13 devnull if(matchattr(a, k->attr, k->privattr)){
95 6e527fbc 2005-02-13 devnull k->ref++;
96 6e527fbc 2005-02-13 devnull if(strfindattr(k->attr, "confirm") && confirmkey(c, k) != 1){
97 6e527fbc 2005-02-13 devnull k->ref--;
98 6e527fbc 2005-02-13 devnull continue;
100 6e527fbc 2005-02-13 devnull freeattr(a);
101 6e527fbc 2005-02-13 devnull return k;
104 6e527fbc 2005-02-13 devnull freeattr(a);
105 6e527fbc 2005-02-13 devnull werrstr("no key found");
106 6e527fbc 2005-02-13 devnull return nil;
109 6e527fbc 2005-02-13 devnull static int taggen;
112 6e527fbc 2005-02-13 devnull keyadd(Key *k)
116 6e527fbc 2005-02-13 devnull k->ref++;
117 6e527fbc 2005-02-13 devnull k->tag = ++taggen;
118 6e527fbc 2005-02-13 devnull for(i=0; i<ring.nkey; i++){
119 6e527fbc 2005-02-13 devnull if(matchattr(k->attr, ring.key[i]->attr, nil)
120 6e527fbc 2005-02-13 devnull && matchattr(ring.key[i]->attr, k->attr, nil)){
121 6e527fbc 2005-02-13 devnull keyclose(ring.key[i]);
122 6e527fbc 2005-02-13 devnull ring.key[i] = k;
127 6e527fbc 2005-02-13 devnull ring.key = erealloc(ring.key, (ring.nkey+1)*sizeof(ring.key[0]));
128 6e527fbc 2005-02-13 devnull ring.key[ring.nkey++] = k;
132 6e527fbc 2005-02-13 devnull keyclose(Key *k)
134 6e527fbc 2005-02-13 devnull if(k == nil)
137 6e527fbc 2005-02-13 devnull if(--k->ref > 0)
140 6e527fbc 2005-02-13 devnull if(k->proto->closekey)
141 6e527fbc 2005-02-13 devnull (*k->proto->closekey)(k);
143 6e527fbc 2005-02-13 devnull freeattr(k->attr);
144 6e527fbc 2005-02-13 devnull freeattr(k->privattr);
145 6e527fbc 2005-02-13 devnull free(k);
149 6e527fbc 2005-02-13 devnull keyreplace(Conv *c, Key *k, char *fmt, ...)
151 6e527fbc 2005-02-13 devnull Key *kk;
152 6e527fbc 2005-02-13 devnull char *msg;
153 6e527fbc 2005-02-13 devnull Attr *a, *b, *bp;
154 6e527fbc 2005-02-13 devnull va_list arg;
156 6e527fbc 2005-02-13 devnull va_start(arg, fmt);
157 6e527fbc 2005-02-13 devnull msg = vsmprint(fmt, arg);
158 6e527fbc 2005-02-13 devnull if(msg == nil)
159 6e527fbc 2005-02-13 devnull sysfatal("out of memory");
160 6e527fbc 2005-02-13 devnull va_end(arg);
162 6e527fbc 2005-02-13 devnull /* replace prompted values with prompts */
163 6e527fbc 2005-02-13 devnull a = copyattr(k->attr);
164 6e527fbc 2005-02-13 devnull bp = parseattr(k->proto->keyprompt);
165 6e527fbc 2005-02-13 devnull for(b=bp; b; b=b->next){
166 6e527fbc 2005-02-13 devnull a = delattr(a, b->name);
167 6e527fbc 2005-02-13 devnull a = addattr(a, "%q?", b->name);
169 6e527fbc 2005-02-13 devnull freeattr(bp);
171 6e527fbc 2005-02-13 devnull if(badkey(c, k, msg, a) < 0)
172 6e527fbc 2005-02-13 devnull convbadkey(c, k, msg, a);
173 6e527fbc 2005-02-13 devnull kk = keylookup("%A", a);
174 6e527fbc 2005-02-13 devnull freeattr(a);
175 6e527fbc 2005-02-13 devnull keyclose(k);
176 6e527fbc 2005-02-13 devnull if(kk == k){
177 6e527fbc 2005-02-13 devnull keyclose(kk);
178 6e527fbc 2005-02-13 devnull werrstr("%s", msg);
179 6e527fbc 2005-02-13 devnull return nil;
182 6e527fbc 2005-02-13 devnull if(strfindattr(kk->attr, "confirm")){
183 6e527fbc 2005-02-13 devnull if(confirmkey(c, kk) != 1){
184 6e527fbc 2005-02-13 devnull werrstr("key use not confirmed");
185 6e527fbc 2005-02-13 devnull keyclose(kk);
186 6e527fbc 2005-02-13 devnull return nil;
189 6e527fbc 2005-02-13 devnull return kk;
193 6e527fbc 2005-02-13 devnull keyevict(Conv *c, Key *k, char *fmt, ...)
195 6e527fbc 2005-02-13 devnull char *msg;
196 6e527fbc 2005-02-13 devnull Attr *a, *b, *bp;
197 6e527fbc 2005-02-13 devnull va_list arg;
199 6e527fbc 2005-02-13 devnull va_start(arg, fmt);
200 6e527fbc 2005-02-13 devnull msg = vsmprint(fmt, arg);
201 6e527fbc 2005-02-13 devnull if(msg == nil)
202 6e527fbc 2005-02-13 devnull sysfatal("out of memory");
203 6e527fbc 2005-02-13 devnull va_end(arg);
205 6e527fbc 2005-02-13 devnull /* replace prompted values with prompts */
206 6e527fbc 2005-02-13 devnull a = copyattr(k->attr);
207 6e527fbc 2005-02-13 devnull bp = parseattr(k->proto->keyprompt);
208 6e527fbc 2005-02-13 devnull for(b=bp; b; b=b->next){
209 6e527fbc 2005-02-13 devnull a = delattr(a, b->name);
210 6e527fbc 2005-02-13 devnull a = addattr(a, "%q?", b->name);
212 6e527fbc 2005-02-13 devnull freeattr(bp);
214 6e527fbc 2005-02-13 devnull if(badkey(c, k, msg, nil) < 0)
215 6e527fbc 2005-02-13 devnull convbadkey(c, k, msg, nil);
216 6e527fbc 2005-02-13 devnull keyclose(k);