{
int he, i;
- he = a->hash[0] + ((a->hash[1] & 0x0f) << 8);
+ he = a->hash[0] | ((a->hash[1] & 0x0f) << 8);
for(i = 0; i < 4; i++) {
if(!addrcmp(&st->cache[he * 4 + i].a, a))
break;
int he, i;
struct storecache tmp;
- he = a->hash[0] + ((a->hash[1] & 0x0f) << 8);
+ he = a->hash[0] | ((a->hash[1] & 0x0f) << 8);
for(i = 0; i < 4; i++) {
if(!addrcmp(&st->cache[he * 4 + i].a, a))
break;
return;
if(i < 4) {
tmp = st->cache[he * 4 + i];
- memmove(&st->cache[he * 4 + 1], &st->cache[he * 4], i);
+ memmove(&st->cache[he * 4 + 1], &st->cache[he * 4], i * sizeof(struct storecache));
st->cache[he * 4] = tmp;
return;
}
if(st->cache[he * 4 + 3].data != NULL)
free(st->cache[he * 4 + 3].data);
- memmove(&st->cache[he * 4 + 1], &st->cache[he * 4], 3);
+ memmove(&st->cache[he * 4 + 1], &st->cache[he * 4], 3 * sizeof(struct storecache));
st->cache[he * 4].a = *a;
if(len > 0)
st->cache[he * 4].data = memcpy(malloc(len), data, len);
ssize_t storeget(struct store *st, void *buf, size_t len, struct addr *at)
{
ssize_t sz;
+ struct addr at2;
- sz = cacheget(st, at, buf, len);
+ at2 = *at;
+ sz = cacheget(st, &at2, buf, len);
if(sz != -2) {
if(sz == -1)
errno = ENOENT;
return(sz);
}
- sz = st->ops->get(st, buf, len, at);
+ sz = st->ops->get(st, buf, len, &at2);
if((sz < 0) && (errno == ENOENT))
- cacheput(st, at, NULL, -1);
+ cacheput(st, &at2, NULL, -1);
else if(sz >= 0)
- cacheput(st, at, buf, sz);
+ cacheput(st, &at2, buf, sz);
return(sz);
}