1 /* vim:tw=78:ts=8:sw=4:set ft=c: */
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
29 static gboolean
valid_key(const guchar
*key
, gsize len
)
33 for (b
= 0; b
< len
; b
++) {
41 gint
cache_file_count()
48 for (p
= shm_data
, len
= 0; len
< MUTEX_OFFSET
;) {
49 memcpy(&f
, p
, sizeof(file_cache_t
));
54 p
+= sizeof(file_cache_t
);
55 len
+= sizeof(file_cache_t
);
57 if (len
+ sizeof(file_cache_t
) >= MUTEX_OFFSET
)
61 memset(&f
, 0, sizeof(file_cache_t
));
65 void cache_adjust_timer()
71 for (p
= shm_data
, len
= 0; len
< MUTEX_OFFSET
;) {
72 memcpy(&f
, p
, sizeof(file_cache_t
));
74 if (f
.used
== TRUE
&& f
.reset
>= 0) {
78 memset(&f
.key
, 0, sizeof(f
.key
));
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
) >= MUTEX_OFFSET
)
92 memset(&f
, 0, sizeof(file_cache_t
));
95 gboolean
cache_add_file(const guchar
*md5file
, const guchar
*shakey
)
99 gint nfiles
= cache_file_count();
103 * Make sure there is enough secure memory.
105 if (!md5file
|| (nfiles
+ 1) * sizeof(file_cache_t
) >= MUTEX_OFFSET
)
109 * Find the first available "slot".
111 for (p
= shm_data
, len
= 0; len
< MUTEX_OFFSET
;) {
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
));
119 memcpy(&f
.key
, shakey
, sizeof(f
.key
));
122 f
.reset
= f
.timeout
= -2;
123 memcpy(p
, &f
, sizeof(file_cache_t
));
124 memset(&f
, 0, sizeof(file_cache_t
));
128 p
+= sizeof(file_cache_t
);
129 len
+= sizeof(file_cache_t
);
131 if (len
+ sizeof(file_cache_t
) >= MUTEX_OFFSET
)
135 memset(&f
, 0, sizeof(file_cache_t
));
139 gboolean
cache_clear(const guchar
*md5filename
, gint which
)
145 for (p
= shm_data
, len
= 0; len
< MUTEX_OFFSET
;) {
146 memcpy(&f
, p
, sizeof(file_cache_t
));
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
));
160 p
+= sizeof(file_cache_t
);
161 len
+= sizeof(file_cache_t
);
163 if (len
+ sizeof(file_cache_t
) >= MUTEX_OFFSET
)
167 memset(&f
, 0, sizeof(file_cache_t
));
168 return (which
== 2) ? TRUE
: FALSE
;
171 gboolean
cache_iscached(const guchar
*md5filename
)
176 gboolean ret
= FALSE
;
178 for (p
= shm_data
, len
= 0; len
< MUTEX_OFFSET
;) {
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
= valid_key(f
.key
, sizeof(f
.key
));
184 memset(&f
, 0, sizeof(file_cache_t
));
189 p
+= sizeof(file_cache_t
);
190 len
+= sizeof(file_cache_t
);
192 if (len
+ sizeof(file_cache_t
) >= MUTEX_OFFSET
)
196 memset(&f
, 0, sizeof(file_cache_t
));
200 gboolean
cache_reset_timeout(const guchar
*md5filename
, glong timeout
)
210 for (p
= shm_data
, len
= 0; len
< MUTEX_OFFSET
;) {
211 memcpy(&f
, p
, sizeof(file_cache_t
));
213 if (memcmp((gchar
*)f
.filename
, (gchar
*)md5filename
, sizeof(f
.filename
)) == 0) {
218 p
+= sizeof(file_cache_t
);
219 len
+= sizeof(file_cache_t
);
221 if (len
+ sizeof(file_cache_t
) >= MUTEX_OFFSET
)
225 memset(&f
, 0, sizeof(file_cache_t
));
228 return cache_set_timeout(md5filename
, timeout
);
230 return cache_set_timeout(md5filename
, t
);
233 gboolean
cache_set_timeout(const guchar
*md5filename
, glong timeout
)
239 for (p
= shm_data
, len
= 0; len
< MUTEX_OFFSET
;) {
240 memcpy(&f
, p
, sizeof(file_cache_t
));
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
));
251 p
+= sizeof(file_cache_t
);
252 len
+= sizeof(file_cache_t
);
254 if (len
+ sizeof(file_cache_t
) >= MUTEX_OFFSET
)
258 memset(&f
, 0, sizeof(file_cache_t
));
259 return (md5filename
) ? FALSE
: TRUE
;
262 gboolean
cache_update_key(const guchar
*md5filename
, const guchar
*shakey
)
268 for (p
= shm_data
, len
= 0; len
< MUTEX_OFFSET
;) {
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
));
280 p
+= sizeof(file_cache_t
);
281 len
+= sizeof(file_cache_t
);
283 if (len
+ sizeof(file_cache_t
) >= MUTEX_OFFSET
)
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
)
297 for (p
= shm_data
, len
= 0; len
< MUTEX_OFFSET
;) {
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 (valid_key(f
.key
, sizeof(f
.key
)) == FALSE
)
308 memcpy(shakey
, &f
.key
, sizeof(f
.key
));
309 memset(&f
, 0, sizeof(file_cache_t
));
314 p
+= sizeof(file_cache_t
);
315 len
+= sizeof(file_cache_t
);
317 if (len
+ sizeof(file_cache_t
) >= MUTEX_OFFSET
)
322 memset(&f
, 0, sizeof(file_cache_t
));
326 gboolean
cache_has_file(const guchar
*md5file
)
332 for (p
= shm_data
, len
= 0; len
< MUTEX_OFFSET
;) {
333 memcpy(&f
, p
, sizeof(file_cache_t
));
335 if (memcmp(&f
.filename
, md5file
, sizeof(f
.filename
)) == 0) {
336 memset(&f
, 0, sizeof(file_cache_t
));
340 p
+= sizeof(file_cache_t
);
341 len
+= sizeof(file_cache_t
);
343 if (len
+ sizeof(file_cache_t
) >= MUTEX_OFFSET
)
347 memset(&f
, 0, sizeof(file_cache_t
));