diff --git a/src/filecache.c b/src/filecache.c
index 5bf7dfee31fea538a4486ffb555dd123a14a058a..dfbbae840185b354552e7d72e2763d49ff9cb369 100644 (file)
--- a/src/filecache.c
+++ b/src/filecache.c
char *filename;
int fd;
off_t server_length, length, present;
-
+
int readable;
int writable;
struct file_info *f, *r = NULL;
pthread_mutex_lock(&files_mutex);
-
+
for (f = files; f; f = f->next) {
-
+
pthread_mutex_lock(&f->mutex);
if (!f->dead && f->filename && !strcmp(path, f->filename)) {
f->ref++;
if (r)
break;
}
-
+
pthread_mutex_unlock(&files_mutex);
return f;
}
assert(fi);
pthread_mutex_lock(&files_mutex);
-
+
for (s = files, prev = NULL; s; s = s->next) {
if (s == fi) {
if (prev)
break;
}
-
+
prev = s;
}
-
+
pthread_mutex_unlock(&files_mutex);
}
if (!(length = ne_get_response_header(req, "Content-Length")))
/* dirty hack, since Apache doesn't send the file size if the file is empty */
- fi->server_length = fi->length = 0;
+ fi->server_length = fi->length = 0;
else
fi->server_length = fi->length = atoi(length);
ne_request_destroy(req);
-
+
if (flags & O_RDONLY || flags & O_RDWR) fi->readable = 1;
if (flags & O_WRONLY || flags & O_RDWR) fi->writable = 1;
pthread_mutex_init(&fi->mutex, NULL);
-
+
pthread_mutex_lock(&files_mutex);
fi->next = files;
files = fi;
pthread_mutex_unlock(&files_mutex);
fi->ref = 1;
-
+
return fi;
fail:
free(fi->filename);
free(fi);
}
-
+
return NULL;
}
if (l > fi->server_length)
l = fi->server_length;
-
+
if (l <= fi->present)
return 0;
if (lseek(fi->fd, fi->present, SEEK_SET) != fi->present)
return -1;
-
+
range.start = fi->present;
range.end = l-1;
range.total = 0;
-
+
if (ne_get_range64(session, fi->filename, &range, fi->fd) != NE_OK) {
fprintf(stderr, "GET failed: %s\n", ne_get_error(session));
errno = ENOENT;
int file_cache_read(void *f, char *buf, size_t size, off_t offset) {
struct file_info *fi = f;
ssize_t r = -1;
-
+
assert(fi && buf && size);
pthread_mutex_lock(&fi->mutex);
goto finish;
finish:
-
+
pthread_mutex_unlock(&fi->mutex);
return r;
if (load_up_to_unlocked(fi, offset) < 0)
goto finish;
-
+
if ((r = pwrite(fi->fd, buf, size, offset)) < 0)
goto finish;
finish:
pthread_mutex_unlock(&fi->mutex);
-
+
return r;
}
ne_session *session;
assert(fi);
-
+
if (!fi->writable) {
errno = EBADF;
goto finish;
r = 0;
goto finish;
}
-
+
if (load_up_to_unlocked(fi, (off_t) -1) < 0)
goto finish;
errno = EIO;
goto finish;
}
-
+
if (ne_put(session, fi->filename, fi->fd)) {
fprintf(stderr, "PUT failed: %s\n", ne_get_error(session));
errno = ENOENT;
r = 0;
finish:
-
+
return r;
}
pthread_mutex_lock(&fi->mutex);
r = file_cache_sync_unlocked(fi);
pthread_mutex_unlock(&fi->mutex);
-
+
return r;
}
while (files) {
struct file_info *fi = files;
-
+
pthread_mutex_lock(&fi->mutex);
fi->ref++;
pthread_mutex_unlock(&fi->mutex);