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 6e527fbc 2005-02-13 devnull tag = 0;
71 6e527fbc 2005-02-13 devnull
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;
81 6e527fbc 2005-02-13 devnull }
82 6e527fbc 2005-02-13 devnull freeattr(a);
83 6e527fbc 2005-02-13 devnull return k;
84 6e527fbc 2005-02-13 devnull }
85 6e527fbc 2005-02-13 devnull }
86 6e527fbc 2005-02-13 devnull
87 6e527fbc 2005-02-13 devnull if(needkey(c, a) < 0)
88 6e527fbc 2005-02-13 devnull convneedkey(c, a);
89 6e527fbc 2005-02-13 devnull
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;
99 6e527fbc 2005-02-13 devnull }
100 6e527fbc 2005-02-13 devnull freeattr(a);
101 6e527fbc 2005-02-13 devnull return k;
102 6e527fbc 2005-02-13 devnull }
103 6e527fbc 2005-02-13 devnull }
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;
107 6e527fbc 2005-02-13 devnull }
108 6e527fbc 2005-02-13 devnull
109 6e527fbc 2005-02-13 devnull static int taggen;
110 6e527fbc 2005-02-13 devnull
111 6e527fbc 2005-02-13 devnull void
112 6e527fbc 2005-02-13 devnull keyadd(Key *k)
113 6e527fbc 2005-02-13 devnull {
114 6e527fbc 2005-02-13 devnull int i;
115 6e527fbc 2005-02-13 devnull
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;
123 6e527fbc 2005-02-13 devnull return;
124 6e527fbc 2005-02-13 devnull }
125 6e527fbc 2005-02-13 devnull }
126 6e527fbc 2005-02-13 devnull
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;
129 6e527fbc 2005-02-13 devnull }
130 6e527fbc 2005-02-13 devnull
131 6e527fbc 2005-02-13 devnull void
132 6e527fbc 2005-02-13 devnull keyclose(Key *k)
133 6e527fbc 2005-02-13 devnull {
134 6e527fbc 2005-02-13 devnull if(k == nil)
135 6e527fbc 2005-02-13 devnull return;
136 6e527fbc 2005-02-13 devnull
137 6e527fbc 2005-02-13 devnull if(--k->ref > 0)
138 6e527fbc 2005-02-13 devnull return;
139 6e527fbc 2005-02-13 devnull
140 6e527fbc 2005-02-13 devnull if(k->proto->closekey)
141 6e527fbc 2005-02-13 devnull (*k->proto->closekey)(k);
142 6e527fbc 2005-02-13 devnull
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);
146 6e527fbc 2005-02-13 devnull }
147 6e527fbc 2005-02-13 devnull
148 6e527fbc 2005-02-13 devnull Key*
149 6e527fbc 2005-02-13 devnull keyreplace(Conv *c, Key *k, char *fmt, ...)
150 6e527fbc 2005-02-13 devnull {
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;
155 6e527fbc 2005-02-13 devnull
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);
161 6e527fbc 2005-02-13 devnull
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);
168 6e527fbc 2005-02-13 devnull }
169 6e527fbc 2005-02-13 devnull freeattr(bp);
170 6e527fbc 2005-02-13 devnull
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;
180 6e527fbc 2005-02-13 devnull }
181 6e527fbc 2005-02-13 devnull
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;
187 6e527fbc 2005-02-13 devnull }
188 6e527fbc 2005-02-13 devnull }
189 6e527fbc 2005-02-13 devnull return kk;
190 6e527fbc 2005-02-13 devnull }
191 6e527fbc 2005-02-13 devnull
192 6e527fbc 2005-02-13 devnull void
193 6e527fbc 2005-02-13 devnull keyevict(Conv *c, Key *k, char *fmt, ...)
194 6e527fbc 2005-02-13 devnull {
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;
198 6e527fbc 2005-02-13 devnull
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);
204 6e527fbc 2005-02-13 devnull
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);
211 6e527fbc 2005-02-13 devnull }
212 6e527fbc 2005-02-13 devnull freeattr(bp);
213 6e527fbc 2005-02-13 devnull
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);
217 6e527fbc 2005-02-13 devnull }