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 Ring ring;
5 6e527fbc 2005-02-13 devnull
6 6e527fbc 2005-02-13 devnull Key*
7 6e527fbc 2005-02-13 devnull keyiterate(int skip, char *fmt, ...)
8 6e527fbc 2005-02-13 devnull {
9 6e527fbc 2005-02-13 devnull int i;
10 6e527fbc 2005-02-13 devnull Attr *a;
11 6e527fbc 2005-02-13 devnull Key *k;
12 6e527fbc 2005-02-13 devnull va_list arg;
13 6e527fbc 2005-02-13 devnull
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);
17 6e527fbc 2005-02-13 devnull
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;
26 6e527fbc 2005-02-13 devnull }
27 6e527fbc 2005-02-13 devnull }
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;
31 6e527fbc 2005-02-13 devnull }
32 6e527fbc 2005-02-13 devnull
33 6e527fbc 2005-02-13 devnull Key*
34 6e527fbc 2005-02-13 devnull keylookup(char *fmt, ...)
35 6e527fbc 2005-02-13 devnull {
36 6e527fbc 2005-02-13 devnull int i;
37 6e527fbc 2005-02-13 devnull Attr *a;
38 6e527fbc 2005-02-13 devnull Key *k;
39 6e527fbc 2005-02-13 devnull va_list arg;
40 6e527fbc 2005-02-13 devnull
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);
44 6e527fbc 2005-02-13 devnull
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;
51 6e527fbc 2005-02-13 devnull }
52 6e527fbc 2005-02-13 devnull }
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;
56 6e527fbc 2005-02-13 devnull }
57 6e527fbc 2005-02-13 devnull
58 6e527fbc 2005-02-13 devnull Key*
59 6e527fbc 2005-02-13 devnull keyfetch(Conv *c, char *fmt, ...)
60 6e527fbc 2005-02-13 devnull {
61 6e527fbc 2005-02-13 devnull int i, tag;
62 6e527fbc 2005-02-13 devnull Attr *a;
63 6e527fbc 2005-02-13 devnull Key *k;
64 6e527fbc 2005-02-13 devnull va_list arg;
65 6e527fbc 2005-02-13 devnull
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);
69 6e527fbc 2005-02-13 devnull
70 5f6612ba 2008-05-31 rsc flog("keyfetch %A", a);
71 6e527fbc 2005-02-13 devnull tag = 0;
72 6e527fbc 2005-02-13 devnull
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;
82 6e527fbc 2005-02-13 devnull }
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;
86 6e527fbc 2005-02-13 devnull }
87 6e527fbc 2005-02-13 devnull }
88 6e527fbc 2005-02-13 devnull
89 6e527fbc 2005-02-13 devnull if(needkey(c, a) < 0)
90 6e527fbc 2005-02-13 devnull convneedkey(c, a);
91 6e527fbc 2005-02-13 devnull
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;
101 6e527fbc 2005-02-13 devnull }
102 6e527fbc 2005-02-13 devnull freeattr(a);
103 6e527fbc 2005-02-13 devnull return k;
104 6e527fbc 2005-02-13 devnull }
105 6e527fbc 2005-02-13 devnull }
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;
109 6e527fbc 2005-02-13 devnull }
110 6e527fbc 2005-02-13 devnull
111 6e527fbc 2005-02-13 devnull static int taggen;
112 6e527fbc 2005-02-13 devnull
113 6e527fbc 2005-02-13 devnull void
114 6e527fbc 2005-02-13 devnull keyadd(Key *k)
115 6e527fbc 2005-02-13 devnull {
116 6e527fbc 2005-02-13 devnull int i;
117 6e527fbc 2005-02-13 devnull
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;
125 6e527fbc 2005-02-13 devnull return;
126 6e527fbc 2005-02-13 devnull }
127 6e527fbc 2005-02-13 devnull }
128 6e527fbc 2005-02-13 devnull
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;
131 6e527fbc 2005-02-13 devnull }
132 6e527fbc 2005-02-13 devnull
133 6e527fbc 2005-02-13 devnull void
134 6e527fbc 2005-02-13 devnull keyclose(Key *k)
135 6e527fbc 2005-02-13 devnull {
136 6e527fbc 2005-02-13 devnull if(k == nil)
137 6e527fbc 2005-02-13 devnull return;
138 6e527fbc 2005-02-13 devnull
139 6e527fbc 2005-02-13 devnull if(--k->ref > 0)
140 6e527fbc 2005-02-13 devnull return;
141 6e527fbc 2005-02-13 devnull
142 6e527fbc 2005-02-13 devnull if(k->proto->closekey)
143 6e527fbc 2005-02-13 devnull (*k->proto->closekey)(k);
144 6e527fbc 2005-02-13 devnull
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);
148 6e527fbc 2005-02-13 devnull }
149 6e527fbc 2005-02-13 devnull
150 6e527fbc 2005-02-13 devnull Key*
151 6e527fbc 2005-02-13 devnull keyreplace(Conv *c, Key *k, char *fmt, ...)
152 6e527fbc 2005-02-13 devnull {
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;
157 6e527fbc 2005-02-13 devnull
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);
163 6e527fbc 2005-02-13 devnull
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);
170 6e527fbc 2005-02-13 devnull }
171 6e527fbc 2005-02-13 devnull freeattr(bp);
172 6e527fbc 2005-02-13 devnull
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;
182 6e527fbc 2005-02-13 devnull }
183 6e527fbc 2005-02-13 devnull
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;
189 6e527fbc 2005-02-13 devnull }
190 6e527fbc 2005-02-13 devnull }
191 6e527fbc 2005-02-13 devnull return kk;
192 6e527fbc 2005-02-13 devnull }
193 6e527fbc 2005-02-13 devnull
194 6e527fbc 2005-02-13 devnull void
195 6e527fbc 2005-02-13 devnull keyevict(Conv *c, Key *k, char *fmt, ...)
196 6e527fbc 2005-02-13 devnull {
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;
200 6e527fbc 2005-02-13 devnull
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);
206 6e527fbc 2005-02-13 devnull
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);
213 6e527fbc 2005-02-13 devnull }
214 6e527fbc 2005-02-13 devnull freeattr(bp);
215 6e527fbc 2005-02-13 devnull
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);
219 6e527fbc 2005-02-13 devnull }