let filerefs to operate on ms precision for mtime.

This commit is contained in:
Joris Vink 2018-07-24 19:56:36 +02:00
parent a6e662a805
commit cf1f624367
4 changed files with 19 additions and 9 deletions

View File

@ -51,6 +51,7 @@ extern "C" {
#if defined(__APPLE__)
#undef daemon
extern int daemon(int, int);
#define st_mtim st_mtimespec
#endif
#if !defined(KORE_NO_SENDFILE) && defined(KORE_NO_TLS)
@ -116,7 +117,8 @@ struct kore_fileref {
int flags;
off_t size;
char *path;
time_t mtime;
u_int64_t mtime;
time_t mtime_sec;
u_int64_t expiration;
#if !defined(KORE_USE_PLATFORM_SENDFILE)
void *base;
@ -675,7 +677,8 @@ extern char *kore_filemap_index;
void kore_fileref_init(void);
struct kore_fileref *kore_fileref_get(const char *);
struct kore_fileref *kore_fileref_create(const char *, int, off_t, time_t);
struct kore_fileref *kore_fileref_create(const char *, int, off_t,
struct timespec *);
void kore_fileref_release(struct kore_fileref *);
void kore_domain_init(void);

View File

@ -272,7 +272,7 @@ lookup:
/* kore_fileref_create() takes ownership of the fd. */
ref = kore_fileref_create(fpath, fd,
st.st_size, st.st_mtime);
st.st_size, &st.st_mtim);
if (ref == NULL) {
http_response(req,
HTTP_STATUS_INTERNAL_ERROR, NULL, 0);

View File

@ -44,7 +44,7 @@ kore_fileref_init(void)
}
struct kore_fileref *
kore_fileref_create(const char *path, int fd, off_t size, time_t mtime)
kore_fileref_create(const char *path, int fd, off_t size, struct timespec *ts)
{
struct kore_fileref *ref;
@ -56,12 +56,15 @@ kore_fileref_create(const char *path, int fd, off_t size, time_t mtime)
ref->cnt = 1;
ref->flags = 0;
ref->size = size;
ref->mtime = mtime;
ref->path = kore_strdup(path);
ref->mtime_sec = ts->tv_sec;
ref->mtime = ((u_int64_t)(ts->tv_sec * 1000 + (ts->tv_nsec / 1000000)));
#if !defined(KORE_USE_PLATFORM_SENDFILE)
if ((uintmax_t)size> SIZE_MAX)
if ((uintmax_t)size> SIZE_MAX) {
kore_pool_put(&ref_pool, ref);
return (NULL);
}
ref->base = mmap(NULL, (size_t)size, PROT_READ, MAP_PRIVATE, fd, 0);
if (ref->base == MAP_FAILED)
@ -91,6 +94,7 @@ kore_fileref_get(const char *path)
{
struct stat st;
struct kore_fileref *ref;
u_int64_t mtime;
TAILQ_FOREACH(ref, &refs, list) {
if (!strcmp(ref->path, path)) {
@ -101,7 +105,10 @@ kore_fileref_get(const char *path)
return (NULL);
}
if (st.st_mtime != ref->mtime) {
mtime = ((u_int64_t)(st.st_mtim.tv_sec * 1000 +
(st.st_mtim.tv_nsec / 1000000)));
if (ref->mtime != mtime) {
fileref_soft_remove(ref);
return (NULL);
}

View File

@ -568,14 +568,14 @@ http_response_fileref(struct http_request *req, int status,
if (http_request_header(req, "if-modified-since", &modified)) {
mtime = kore_date_to_time(modified);
if (mtime == ref->mtime) {
if (mtime == ref->mtime_sec) {
kore_fileref_release(ref);
http_response(req, HTTP_STATUS_NOT_MODIFIED, NULL, 0);
return;
}
}
if ((tm = gmtime(&ref->mtime)) != NULL) {
if ((tm = gmtime(&ref->mtime_sec)) != NULL) {
if (strftime(tbuf, sizeof(tbuf),
"%a, %d %b %Y %H:%M:%S GMT", tm) > 0) {
http_response_header(req, "last-modified", tbuf);