When the OPEN, CLEARCACHE or CACHETIMEOUT commands succeed, a status
[pwmd.git] / src / cache.c
blob2733902f04c1f93cd37d6a06707ac336a9526bc8
1 /* vim:tw=78:ts=8:sw=4:set ft=c: */
2 /*
3 Copyright (C) 2006-2007 Ben Kibbey <bjk@luxsci.net>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #include <stdio.h>
20 #include <glib.h>
21 #include <string.h>
23 #ifdef HAVE_CONFIG_H
24 #include <config.h>
25 #endif
27 #include "cache.h"
29 static gint cache_valid_key(const guchar *key, gsize len)
31 gint b;
33 for (b = 0; b < len; b++) {
34 if (key[b])
35 return TRUE;
38 return FALSE;
41 gint cache_file_count()
43 void *p;
44 gint n = 0;
45 glong len;
46 file_cache_t f;
48 for (p = shm_data, len = 0; len <= cache_size;) {
49 memcpy(&f, p, sizeof(file_cache_t));
51 if (f.used == TRUE)
52 n++;
54 p += sizeof(file_cache_t);
55 len += sizeof(file_cache_t);
57 if (len + sizeof(file_cache_t) > cache_size)
58 break;
61 memset(&f, 0, sizeof(file_cache_t));
62 return n;
65 void cache_adjust_timer()
67 file_cache_t f;
68 void *p;
69 glong len;
71 for (p = shm_data, len = 0; len <= cache_size;) {
72 memcpy(&f, p, sizeof(file_cache_t));
74 if (f.used == TRUE && f.reset >= 0) {
75 f.timeout--;
77 if (f.timeout <= 0) {
78 memset(&f.key, 0, sizeof(f.key));
79 f.timeout = 0;
82 memcpy(p, &f, sizeof(file_cache_t));
85 p += sizeof(file_cache_t);
86 len += sizeof(file_cache_t);
88 if (len + sizeof(file_cache_t) > cache_size)
89 break;
92 memset(&f, 0, sizeof(file_cache_t));
95 gboolean cache_add_file(const guchar *md5file, const guchar *shakey)
97 void *p;
98 file_cache_t f;
99 gint nfiles = cache_file_count();
100 glong len;
103 * Make sure there is enough secure memory.
105 if (!md5file || (nfiles + 1) * sizeof(file_cache_t) > cache_size)
106 return FALSE;
109 * Find the first available "slot".
111 for (p = shm_data, len = 0; len <= cache_size;) {
112 memcpy(&f, p, sizeof(file_cache_t));
114 if (f.used == FALSE) {
115 memset(&f, 0, sizeof(f));
116 memcpy(&f.filename, md5file, sizeof(f.filename));
118 if (shakey)
119 memcpy(&f.key, shakey, sizeof(f.key));
121 f.used = TRUE;
122 f.reset = f.timeout = -2;
123 memcpy(p, &f, sizeof(file_cache_t));
124 memset(&f, 0, sizeof(file_cache_t));
125 return TRUE;
128 p += sizeof(file_cache_t);
129 len += sizeof(file_cache_t);
131 if (len + sizeof(file_cache_t) > cache_size)
132 break;
135 memset(&f, 0, sizeof(file_cache_t));
136 return FALSE;
139 gboolean cache_clear(const guchar *md5filename, gint which)
141 void *p;
142 file_cache_t f;
143 glong len;
145 for (p = shm_data, len = 0; len <= cache_size;) {
146 memcpy(&f, p, sizeof(file_cache_t));
148 if (which == 2) {
149 memset(&f, 0, sizeof(file_cache_t));
150 memcpy(p, &f, sizeof(file_cache_t));
152 else if (f.used == TRUE && which == 1) {
153 if (memcmp(&f.filename, md5filename, sizeof(f.filename)) == 0) {
154 memset(&f, 0, sizeof(file_cache_t));
155 memcpy(p, &f, sizeof(file_cache_t));
156 return TRUE;
160 p += sizeof(file_cache_t);
161 len += sizeof(file_cache_t);
163 if (len + sizeof(file_cache_t) > cache_size)
164 break;
167 memset(&f, 0, sizeof(file_cache_t));
168 return (which == 2) ? TRUE : FALSE;
171 gboolean cache_iscached(const guchar *md5filename)
173 void *p;
174 file_cache_t f;
175 glong len;
176 gboolean ret = FALSE;
178 for (p = shm_data, len = 0; len <= cache_size;) {
179 memcpy(&f, p, sizeof(file_cache_t));
181 if (f.used == TRUE) {
182 if (memcmp(&f.filename, md5filename, sizeof(f.filename)) == 0) {
183 ret = cache_valid_key(f.key, sizeof(f.key));
184 memset(&f, 0, sizeof(file_cache_t));
185 return ret;
189 p += sizeof(file_cache_t);
190 len += sizeof(file_cache_t);
192 if (len + sizeof(file_cache_t) > cache_size)
193 break;
196 memset(&f, 0, sizeof(file_cache_t));
197 return FALSE;
200 gboolean cache_reset_timeout(const guchar *md5filename, glong timeout)
202 void *p;
203 file_cache_t f;
204 glong len;
205 glong t = -2;
207 if (!md5filename)
208 return FALSE;
210 for (p = shm_data, len = 0; len <= cache_size;) {
211 memcpy(&f, p, sizeof(file_cache_t));
213 if (memcmp((gchar *)f.filename, (gchar *)md5filename, sizeof(f.filename)) == 0) {
214 t = f.reset;
215 break;
218 p += sizeof(file_cache_t);
219 len += sizeof(file_cache_t);
221 if (len + sizeof(file_cache_t) > cache_size)
222 break;
225 memset(&f, 0, sizeof(file_cache_t));
227 if (t == -2)
228 return cache_set_timeout(md5filename, timeout);
230 return cache_set_timeout(md5filename, t);
233 gboolean cache_set_timeout(const guchar *md5filename, glong timeout)
235 void *p;
236 file_cache_t f;
237 glong len;
239 for (p = shm_data, len = 0; len <= cache_size;) {
240 memcpy(&f, p, sizeof(file_cache_t));
242 if (md5filename) {
243 if (memcmp((gchar *)f.filename, (gchar *)md5filename, sizeof(f.filename)) == 0) {
244 f.reset = f.timeout = timeout;
245 memcpy(p, &f, sizeof(file_cache_t));
246 memset(&f, 0, sizeof(file_cache_t));
247 return TRUE;
251 p += sizeof(file_cache_t);
252 len += sizeof(file_cache_t);
254 if (len + sizeof(file_cache_t) > cache_size)
255 break;
258 memset(&f, 0, sizeof(file_cache_t));
259 return (md5filename) ? FALSE : TRUE;
262 gboolean cache_update_key(const guchar *md5filename, const guchar *shakey)
264 void *p;
265 file_cache_t f;
266 glong len;
268 for (p = shm_data, len = 0; len <= cache_size;) {
269 memcpy(&f, p, sizeof(file_cache_t));
271 if (f.used == TRUE) {
272 if (memcmp((gchar *)f.filename, (gchar *)md5filename, sizeof(f.filename)) == 0) {
273 memcpy(&f.key, shakey, sizeof(f.key));
274 memcpy(p, &f, sizeof(file_cache_t));
275 memset(&f, 0, sizeof(file_cache_t));
276 return TRUE;
280 p += sizeof(file_cache_t);
281 len += sizeof(file_cache_t);
283 if (len + sizeof(file_cache_t) > cache_size)
284 break;
287 memset(&f, 0, sizeof(file_cache_t));
288 return cache_add_file(md5filename, shakey);
291 gboolean cache_get_key(const guchar *md5file, guchar *shakey)
293 void *p;
294 file_cache_t f;
295 glong len;
297 for (p = shm_data, len = 0; len <= cache_size;) {
298 memcpy(&f, p, sizeof(file_cache_t));
301 * The slot may be used but not yet contain a key.
303 if (f.used == TRUE) {
304 if (memcmp(&f.filename, md5file, sizeof(f.filename)) == 0) {
305 if (cache_valid_key(f.key, sizeof(f.key)) == FALSE)
306 goto fail;
308 memcpy(shakey, &f.key, sizeof(f.key));
309 memset(&f, 0, sizeof(file_cache_t));
310 return TRUE;
314 p += sizeof(file_cache_t);
315 len += sizeof(file_cache_t);
317 if (len + sizeof(file_cache_t) > cache_size)
318 break;
321 fail:
322 memset(&f, 0, sizeof(file_cache_t));
323 return FALSE;