Update to detect changes in file size (to support multiple file handles...)
This commit is contained in:
parent
a06077d12d
commit
1dbf1145ca
1 changed files with 30 additions and 3 deletions
|
@ -22,6 +22,17 @@ typedef struct file_impl {
|
||||||
char * filename;
|
char * filename;
|
||||||
} file_impl;
|
} file_impl;
|
||||||
|
|
||||||
|
static int updateEOF(stasis_handle_t * h) {
|
||||||
|
file_impl * impl = h->impl;
|
||||||
|
off_t pos = lseek(impl->fd, 0, SEEK_END);
|
||||||
|
if(pos == (off_t)-1) {
|
||||||
|
return errno;
|
||||||
|
} else {
|
||||||
|
impl->end_pos = pos;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int file_num_copies(stasis_handle_t * h) { return 0; }
|
static int file_num_copies(stasis_handle_t * h) { return 0; }
|
||||||
static int file_num_copies_buffer(stasis_handle_t * h) { return 0; }
|
static int file_num_copies_buffer(stasis_handle_t * h) { return 0; }
|
||||||
|
|
||||||
|
@ -43,10 +54,18 @@ static lsn_t file_start_position(stasis_handle_t *h) {
|
||||||
pthread_mutex_unlock(&(impl->mut));
|
pthread_mutex_unlock(&(impl->mut));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static lsn_t file_end_position(stasis_handle_t *h) {
|
static lsn_t file_end_position(stasis_handle_t *h) {
|
||||||
file_impl * impl = (file_impl*)h->impl;
|
file_impl * impl = (file_impl*)h->impl;
|
||||||
pthread_mutex_lock(&(impl->mut));
|
pthread_mutex_lock(&(impl->mut));
|
||||||
lsn_t ret = impl->end_pos;
|
int error = updateEOF(h);
|
||||||
|
int ret;
|
||||||
|
if(error) {
|
||||||
|
h->error = error;
|
||||||
|
ret = -1;
|
||||||
|
} else {
|
||||||
|
ret = impl->end_pos;
|
||||||
|
}
|
||||||
pthread_mutex_unlock(&(impl->mut));
|
pthread_mutex_unlock(&(impl->mut));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -130,8 +149,13 @@ static int file_read(stasis_handle_t * h,
|
||||||
file_impl * impl = (file_impl*)(h->impl);
|
file_impl * impl = (file_impl*)(h->impl);
|
||||||
pthread_mutex_lock(&(impl->mut));
|
pthread_mutex_lock(&(impl->mut));
|
||||||
int error = 0;
|
int error = 0;
|
||||||
if(off < impl->start_pos || off + len > impl->end_pos) {
|
if(off < impl->start_pos) {
|
||||||
error = EDOM;
|
error = EDOM;
|
||||||
|
} else if(off + len > impl->end_pos) {
|
||||||
|
error = updateEOF(h);
|
||||||
|
if(!error && off + len > impl->end_pos) {
|
||||||
|
error = EDOM;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!error) {
|
if(!error) {
|
||||||
|
@ -387,7 +411,10 @@ static int file_truncate_start(stasis_handle_t * h, lsn_t new_start) {
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
|
||||||
if(new_start > impl->end_pos) {
|
if(new_start > impl->end_pos) {
|
||||||
error = EDOM;
|
updateEOF(h);
|
||||||
|
if(!error && new_start > impl->end_pos) {
|
||||||
|
error = EDOM;
|
||||||
|
}
|
||||||
} else if(new_start > impl->start_pos) {
|
} else if(new_start > impl->start_pos) {
|
||||||
char * tmpfile = malloc(strlen(impl->filename)+2);
|
char * tmpfile = malloc(strlen(impl->filename)+2);
|
||||||
strcpy(tmpfile, impl->filename);
|
strcpy(tmpfile, impl->filename);
|
||||||
|
|
Loading…
Reference in a new issue