Blame


1 2277c5d7 2004-03-21 devnull #include "std.h"
2 2277c5d7 2004-03-21 devnull #include "dat.h"
3 2277c5d7 2004-03-21 devnull
4 2277c5d7 2004-03-21 devnull Ring ring;
5 2277c5d7 2004-03-21 devnull
6 2277c5d7 2004-03-21 devnull Key*
7 2277c5d7 2004-03-21 devnull keylookup(char *fmt, ...)
8 2277c5d7 2004-03-21 devnull {
9 2277c5d7 2004-03-21 devnull int i;
10 2277c5d7 2004-03-21 devnull Attr *a;
11 2277c5d7 2004-03-21 devnull Key *k;
12 2277c5d7 2004-03-21 devnull va_list arg;
13 2277c5d7 2004-03-21 devnull
14 2277c5d7 2004-03-21 devnull va_start(arg, fmt);
15 2277c5d7 2004-03-21 devnull a = parseattrfmtv(fmt, arg);
16 2277c5d7 2004-03-21 devnull va_end(arg);
17 2277c5d7 2004-03-21 devnull
18 2277c5d7 2004-03-21 devnull for(i=0; i<ring.nkey; i++){
19 2277c5d7 2004-03-21 devnull k = ring.key[i];
20 2277c5d7 2004-03-21 devnull if(matchattr(a, k->attr, k->privattr)){
21 2277c5d7 2004-03-21 devnull k->ref++;
22 2277c5d7 2004-03-21 devnull freeattr(a);
23 2277c5d7 2004-03-21 devnull return k;
24 2277c5d7 2004-03-21 devnull }
25 2277c5d7 2004-03-21 devnull }
26 2277c5d7 2004-03-21 devnull freeattr(a);
27 2277c5d7 2004-03-21 devnull werrstr("no key found");
28 2277c5d7 2004-03-21 devnull return nil;
29 2277c5d7 2004-03-21 devnull }
30 2277c5d7 2004-03-21 devnull
31 2277c5d7 2004-03-21 devnull Key*
32 2277c5d7 2004-03-21 devnull keyfetch(Conv *c, char *fmt, ...)
33 2277c5d7 2004-03-21 devnull {
34 2277c5d7 2004-03-21 devnull int i, tag;
35 2277c5d7 2004-03-21 devnull Attr *a;
36 2277c5d7 2004-03-21 devnull Key *k;
37 2277c5d7 2004-03-21 devnull va_list arg;
38 2277c5d7 2004-03-21 devnull
39 2277c5d7 2004-03-21 devnull va_start(arg, fmt);
40 2277c5d7 2004-03-21 devnull a = parseattrfmtv(fmt, arg);
41 2277c5d7 2004-03-21 devnull va_end(arg);
42 2277c5d7 2004-03-21 devnull
43 2277c5d7 2004-03-21 devnull tag = 0;
44 2277c5d7 2004-03-21 devnull
45 2277c5d7 2004-03-21 devnull for(i=0; i<ring.nkey; i++){
46 2277c5d7 2004-03-21 devnull k = ring.key[i];
47 2277c5d7 2004-03-21 devnull if(tag < k->tag)
48 2277c5d7 2004-03-21 devnull tag = k->tag;
49 2277c5d7 2004-03-21 devnull if(matchattr(a, k->attr, k->privattr)){
50 2277c5d7 2004-03-21 devnull k->ref++;
51 2277c5d7 2004-03-21 devnull if(strfindattr(k->attr, "confirm") && confirmkey(c, k) != 1){
52 2277c5d7 2004-03-21 devnull k->ref--;
53 2277c5d7 2004-03-21 devnull continue;
54 2277c5d7 2004-03-21 devnull }
55 2277c5d7 2004-03-21 devnull freeattr(a);
56 2277c5d7 2004-03-21 devnull return k;
57 2277c5d7 2004-03-21 devnull }
58 2277c5d7 2004-03-21 devnull }
59 2277c5d7 2004-03-21 devnull
60 2277c5d7 2004-03-21 devnull if(needkey(c, a) < 0)
61 2277c5d7 2004-03-21 devnull convneedkey(c, a);
62 2277c5d7 2004-03-21 devnull
63 2277c5d7 2004-03-21 devnull for(i=0; i<ring.nkey; i++){
64 2277c5d7 2004-03-21 devnull k = ring.key[i];
65 2277c5d7 2004-03-21 devnull if(k->tag <= tag)
66 2277c5d7 2004-03-21 devnull continue;
67 2277c5d7 2004-03-21 devnull if(matchattr(a, k->attr, k->privattr)){
68 2277c5d7 2004-03-21 devnull k->ref++;
69 2277c5d7 2004-03-21 devnull if(strfindattr(k->attr, "confirm") && confirmkey(c, k) != 1){
70 2277c5d7 2004-03-21 devnull k->ref--;
71 2277c5d7 2004-03-21 devnull continue;
72 2277c5d7 2004-03-21 devnull }
73 2277c5d7 2004-03-21 devnull freeattr(a);
74 2277c5d7 2004-03-21 devnull return k;
75 2277c5d7 2004-03-21 devnull }
76 2277c5d7 2004-03-21 devnull }
77 2277c5d7 2004-03-21 devnull freeattr(a);
78 2277c5d7 2004-03-21 devnull werrstr("no key found");
79 2277c5d7 2004-03-21 devnull return nil;
80 2277c5d7 2004-03-21 devnull }
81 2277c5d7 2004-03-21 devnull
82 2277c5d7 2004-03-21 devnull static int taggen;
83 2277c5d7 2004-03-21 devnull
84 2277c5d7 2004-03-21 devnull void
85 2277c5d7 2004-03-21 devnull keyadd(Key *k)
86 2277c5d7 2004-03-21 devnull {
87 2277c5d7 2004-03-21 devnull int i;
88 2277c5d7 2004-03-21 devnull
89 2277c5d7 2004-03-21 devnull k->ref++;
90 2277c5d7 2004-03-21 devnull k->tag = ++taggen;
91 2277c5d7 2004-03-21 devnull for(i=0; i<ring.nkey; i++){
92 2277c5d7 2004-03-21 devnull if(matchattr(k->attr, ring.key[i]->attr, nil)
93 2277c5d7 2004-03-21 devnull && matchattr(ring.key[i]->attr, k->attr, nil)){
94 2277c5d7 2004-03-21 devnull keyclose(ring.key[i]);
95 2277c5d7 2004-03-21 devnull ring.key[i] = k;
96 2277c5d7 2004-03-21 devnull return;
97 2277c5d7 2004-03-21 devnull }
98 2277c5d7 2004-03-21 devnull }
99 2277c5d7 2004-03-21 devnull
100 2277c5d7 2004-03-21 devnull ring.key = erealloc(ring.key, (ring.nkey+1)*sizeof(ring.key[0]));
101 2277c5d7 2004-03-21 devnull ring.key[ring.nkey++] = k;
102 2277c5d7 2004-03-21 devnull }
103 2277c5d7 2004-03-21 devnull
104 2277c5d7 2004-03-21 devnull void
105 2277c5d7 2004-03-21 devnull keyclose(Key *k)
106 2277c5d7 2004-03-21 devnull {
107 2277c5d7 2004-03-21 devnull if(k == nil)
108 2277c5d7 2004-03-21 devnull return;
109 2277c5d7 2004-03-21 devnull
110 2277c5d7 2004-03-21 devnull if(--k->ref > 0)
111 2277c5d7 2004-03-21 devnull return;
112 2277c5d7 2004-03-21 devnull
113 2277c5d7 2004-03-21 devnull if(k->proto->closekey)
114 2277c5d7 2004-03-21 devnull (*k->proto->closekey)(k);
115 2277c5d7 2004-03-21 devnull
116 2277c5d7 2004-03-21 devnull freeattr(k->attr);
117 2277c5d7 2004-03-21 devnull freeattr(k->privattr);
118 2277c5d7 2004-03-21 devnull free(k);
119 2277c5d7 2004-03-21 devnull }
120 2277c5d7 2004-03-21 devnull
121 2277c5d7 2004-03-21 devnull Key*
122 2277c5d7 2004-03-21 devnull keyreplace(Conv *c, Key *k, char *fmt, ...)
123 2277c5d7 2004-03-21 devnull {
124 2277c5d7 2004-03-21 devnull Key *kk;
125 2277c5d7 2004-03-21 devnull char *msg;
126 2277c5d7 2004-03-21 devnull Attr *a, *b, *bp;
127 2277c5d7 2004-03-21 devnull va_list arg;
128 2277c5d7 2004-03-21 devnull
129 2277c5d7 2004-03-21 devnull va_start(arg, fmt);
130 2277c5d7 2004-03-21 devnull msg = vsmprint(fmt, arg);
131 2277c5d7 2004-03-21 devnull if(msg == nil)
132 2277c5d7 2004-03-21 devnull sysfatal("out of memory");
133 2277c5d7 2004-03-21 devnull va_end(arg);
134 2277c5d7 2004-03-21 devnull
135 2277c5d7 2004-03-21 devnull /* replace prompted values with prompts */
136 2277c5d7 2004-03-21 devnull a = copyattr(k->attr);
137 2277c5d7 2004-03-21 devnull bp = parseattr(k->proto->keyprompt);
138 2277c5d7 2004-03-21 devnull for(b=bp; b; b=b->next){
139 2277c5d7 2004-03-21 devnull a = delattr(a, b->name);
140 2277c5d7 2004-03-21 devnull a = addattr(a, "%q?", b->name);
141 2277c5d7 2004-03-21 devnull }
142 2277c5d7 2004-03-21 devnull freeattr(bp);
143 2277c5d7 2004-03-21 devnull
144 2277c5d7 2004-03-21 devnull if(badkey(c, k, msg, a) < 0)
145 2277c5d7 2004-03-21 devnull convbadkey(c, k, msg, a);
146 2277c5d7 2004-03-21 devnull kk = keylookup("%A", a);
147 2277c5d7 2004-03-21 devnull freeattr(a);
148 2277c5d7 2004-03-21 devnull keyclose(k);
149 2277c5d7 2004-03-21 devnull if(kk == k){
150 2277c5d7 2004-03-21 devnull keyclose(kk);
151 2277c5d7 2004-03-21 devnull werrstr("%s", msg);
152 2277c5d7 2004-03-21 devnull return nil;
153 2277c5d7 2004-03-21 devnull }
154 2277c5d7 2004-03-21 devnull
155 2277c5d7 2004-03-21 devnull if(strfindattr(kk->attr, "confirm")){
156 2277c5d7 2004-03-21 devnull if(confirmkey(c, kk) != 1){
157 2277c5d7 2004-03-21 devnull werrstr("key use not confirmed");
158 2277c5d7 2004-03-21 devnull keyclose(kk);
159 2277c5d7 2004-03-21 devnull return nil;
160 2277c5d7 2004-03-21 devnull }
161 2277c5d7 2004-03-21 devnull }
162 2277c5d7 2004-03-21 devnull return kk;
163 2277c5d7 2004-03-21 devnull }
164 2277c5d7 2004-03-21 devnull
165 2277c5d7 2004-03-21 devnull void
166 2277c5d7 2004-03-21 devnull keyevict(Conv *c, Key *k, char *fmt, ...)
167 2277c5d7 2004-03-21 devnull {
168 2277c5d7 2004-03-21 devnull char *msg;
169 2277c5d7 2004-03-21 devnull Attr *a, *b, *bp;
170 2277c5d7 2004-03-21 devnull va_list arg;
171 2277c5d7 2004-03-21 devnull
172 2277c5d7 2004-03-21 devnull va_start(arg, fmt);
173 2277c5d7 2004-03-21 devnull msg = vsmprint(fmt, arg);
174 2277c5d7 2004-03-21 devnull if(msg == nil)
175 2277c5d7 2004-03-21 devnull sysfatal("out of memory");
176 2277c5d7 2004-03-21 devnull va_end(arg);
177 2277c5d7 2004-03-21 devnull
178 2277c5d7 2004-03-21 devnull /* replace prompted values with prompts */
179 2277c5d7 2004-03-21 devnull a = copyattr(k->attr);
180 2277c5d7 2004-03-21 devnull bp = parseattr(k->proto->keyprompt);
181 2277c5d7 2004-03-21 devnull for(b=bp; b; b=b->next){
182 2277c5d7 2004-03-21 devnull a = delattr(a, b->name);
183 2277c5d7 2004-03-21 devnull a = addattr(a, "%q?", b->name);
184 2277c5d7 2004-03-21 devnull }
185 2277c5d7 2004-03-21 devnull freeattr(bp);
186 2277c5d7 2004-03-21 devnull
187 2277c5d7 2004-03-21 devnull if(badkey(c, k, msg, nil) < 0)
188 2277c5d7 2004-03-21 devnull convbadkey(c, k, msg, nil);
189 2277c5d7 2004-03-21 devnull keyclose(k);
190 2277c5d7 2004-03-21 devnull }