1 /* vim:tw=78:ts=8:sw=4:set ft=c: */
3 Copyright (C) 2006-2008 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 02110-1301 USA
33 void log_write(const gchar
*fmt
, ...);
35 static gboolean
valid_key(const guchar
*key
, gsize len
)
39 for (b
= 0; b
< len
; b
++) {
47 static file_cache_t
*get_entry(const guchar
*md5file
)
49 gint t
= g_slist_length(key_cache
);
55 for (i
= 0; i
< t
; i
++) {
56 file_cache_t
*p
= g_slist_nth_data(key_cache
, i
);
58 if (!memcmp(p
->filename
, md5file
, sizeof(p
->filename
)))
65 gboolean
cache_get_mutex(const guchar
*md5file
, pth_mutex_t
**result
)
67 file_cache_t
*p
= get_entry(md5file
);
72 return p
? TRUE
: FALSE
;
75 gint
cache_file_count()
77 gint t
= g_slist_length(key_cache
);
81 for (i
= 0; i
< t
; i
++) {
82 file_cache_t
*p
= g_slist_nth_data(key_cache
, i
);
84 if (valid_key(p
->key
, sizeof(p
->key
)) == TRUE
)
91 void cache_adjust_timer()
93 gint t
= g_slist_length(key_cache
);
96 for (i
= 0; i
< t
; i
++) {
97 file_cache_t
*p
= g_slist_nth_data(key_cache
, i
);
103 if (p
->timeout
== 0) {
104 if (valid_key(p
->key
, sizeof(p
->key
)) == TRUE
) {
105 memset(&p
->key
, 0, sizeof(p
->key
));
106 send_status_all(STATUS_CACHE
);
115 gboolean
cache_add_file(const guchar
*md5file
, const guchar
*shakey
)
117 file_cache_t
*p
= g_malloc0(sizeof(file_cache_t
));
121 log_write("%s(%i): %s", __FUNCTION__
, __LINE__
, strerror(ENOMEM
));
125 p
->mutex
= g_malloc(sizeof(pth_mutex_t
));
128 log_write("%s(%i): %s", __FUNCTION__
, __LINE__
, strerror(ENOMEM
));
133 pth_mutex_init(p
->mutex
);
134 memcpy(p
->filename
, md5file
, sizeof(p
->filename
));
137 memcpy(p
->key
, shakey
, sizeof(p
->key
));
139 p
->reset
= p
->timeout
= -2;
141 if (mlock(p
, sizeof(file_cache_t
)))
142 log_write("mlock(): %s", strerror(errno
));
144 new = g_slist_append(key_cache
, p
);
147 log_write("%s(%i): %s", __FUNCTION__
, __LINE__
, strerror(ENOMEM
));
149 memset(p
, 0, sizeof(file_cache_t
));
158 static void free_entry(file_cache_t
*p
)
166 memset(p
, 0, sizeof(file_cache_t
));
167 munlock(p
, sizeof(file_cache_t
));
168 key_cache
= g_slist_remove(key_cache
, p
);
176 for (i
= 0; i
< g_slist_length(key_cache
); i
++) {
177 file_cache_t
*p
= g_slist_nth_data(key_cache
, i
);
183 static void reset_entry(file_cache_t
*p
)
185 if (p
&& !p
->refcount
)
188 memset(p
->key
, 0, sizeof(p
->key
));
191 gboolean
cache_clear(const guchar
*md5file
, gint which
)
194 file_cache_t
*p
= md5file
? get_entry(md5file
) : NULL
;
201 p
= get_entry(md5file
);
202 send_status_all(STATUS_CACHE
);
207 for (i
= 0, t
= cache_file_count(); i
< t
; i
++) {
208 file_cache_t
*p
= g_slist_nth_data(key_cache
, i
);
212 if (t
!= cache_file_count())
216 send_status_all(STATUS_CACHE
);
220 gboolean
cache_iscached(const guchar
*md5file
)
222 file_cache_t
*p
= get_entry(md5file
);
224 return p
? valid_key(p
->key
, sizeof(p
->key
)) : FALSE
;
227 gboolean
cache_reset_timeout(const guchar
*md5file
, glong timeout
)
229 file_cache_t
*p
= get_entry(md5file
);
235 return cache_set_timeout(md5file
, timeout
);
237 return cache_set_timeout(md5file
, p
->reset
);
240 gboolean
cache_set_timeout(const guchar
*md5file
, glong timeout
)
242 file_cache_t
*p
= get_entry(md5file
);
248 p
->timeout
= p
->reset
;
250 p
->reset
= p
->timeout
= timeout
;
255 gboolean
cache_update_key(const guchar
*md5file
, const guchar
*shakey
)
257 file_cache_t
*p
= get_entry(md5file
);
260 return cache_add_file(md5file
, shakey
);
263 memcpy(p
->key
, shakey
, sizeof(p
->key
));
268 gboolean
cache_get_key(const guchar
*md5file
, guchar
*shakey
)
270 file_cache_t
*p
= get_entry(md5file
);
272 if (!p
|| valid_key(p
->key
, sizeof(p
->key
)) == FALSE
)
275 memcpy(shakey
, p
->key
, sizeof(p
->key
));
279 gboolean
cache_has_file(const guchar
*md5file
)
281 file_cache_t
*p
= get_entry(md5file
);
283 return p
? TRUE
: FALSE
;
286 gboolean
cache_decr_refcount(const guchar
*md5file
)
288 file_cache_t
*p
= get_entry(md5file
);
301 gboolean
cache_incr_refcount(const guchar
*md5file
)
303 file_cache_t
*p
= get_entry(md5file
);