Major API change:
1. Introduced a cfs_offset_t type that designates file offsets. unsigned int was insufficient on several platforms with non-volatile storage that exceed the capacity of unsigned int. 2. Switched cfs_seek signature to POSIX style with a "whence" parameter.
This commit is contained in:
parent
5e038640e2
commit
3191a2568c
6 changed files with 78 additions and 44 deletions
|
@ -67,7 +67,7 @@
|
||||||
#define COFFEE_FILE_MODIFIED 0x1
|
#define COFFEE_FILE_MODIFIED 0x1
|
||||||
|
|
||||||
#define INVALID_PAGE ((coffee_page_t)-1)
|
#define INVALID_PAGE ((coffee_page_t)-1)
|
||||||
#define UNKNOWN_OFFSET ((coffee_offset_t)-1)
|
#define UNKNOWN_OFFSET ((cfs_offset_t)-1)
|
||||||
|
|
||||||
#define FD_VALID(fd) \
|
#define FD_VALID(fd) \
|
||||||
((fd) >= 0 && (fd) < COFFEE_FD_SET_SIZE && \
|
((fd) >= 0 && (fd) < COFFEE_FD_SET_SIZE && \
|
||||||
|
@ -111,7 +111,7 @@ struct sector_stats {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct file {
|
struct file {
|
||||||
coffee_offset_t end;
|
cfs_offset_t end;
|
||||||
coffee_page_t page;
|
coffee_page_t page;
|
||||||
coffee_page_t max_pages;
|
coffee_page_t max_pages;
|
||||||
int16_t next_log_record;
|
int16_t next_log_record;
|
||||||
|
@ -120,7 +120,7 @@ struct file {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct file_desc {
|
struct file_desc {
|
||||||
coffee_offset_t offset;
|
cfs_offset_t offset;
|
||||||
struct file *file;
|
struct file *file;
|
||||||
uint8_t flags;
|
uint8_t flags;
|
||||||
};
|
};
|
||||||
|
@ -137,7 +137,7 @@ struct file_header {
|
||||||
|
|
||||||
/* This is needed because of a buggy compiler. */
|
/* This is needed because of a buggy compiler. */
|
||||||
struct log_param {
|
struct log_param {
|
||||||
coffee_offset_t offset;
|
cfs_offset_t offset;
|
||||||
const char *buf;
|
const char *buf;
|
||||||
uint16_t size;
|
uint16_t size;
|
||||||
};
|
};
|
||||||
|
@ -170,8 +170,8 @@ read_header(struct file_header *hdr, coffee_page_t page)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static coffee_offset_t
|
static cfs_offset_t
|
||||||
absolute_offset(coffee_page_t page, coffee_offset_t offset)
|
absolute_offset(coffee_page_t page, cfs_offset_t offset)
|
||||||
{
|
{
|
||||||
return page * COFFEE_PAGE_SIZE + sizeof(struct file_header) + offset;
|
return page * COFFEE_PAGE_SIZE + sizeof(struct file_header) + offset;
|
||||||
}
|
}
|
||||||
|
@ -390,7 +390,7 @@ refresh_eof_hint(struct file *file)
|
||||||
}
|
}
|
||||||
#endif /* COFFEE_CONF_EOF_HINT */
|
#endif /* COFFEE_CONF_EOF_HINT */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static coffee_offset_t
|
static cfs_offset_t
|
||||||
file_end(coffee_page_t start)
|
file_end(coffee_page_t start)
|
||||||
{
|
{
|
||||||
struct file_header hdr;
|
struct file_header hdr;
|
||||||
|
@ -519,7 +519,7 @@ remove_by_page(coffee_page_t page, int remove_log, int close_fds)
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static coffee_page_t
|
static coffee_page_t
|
||||||
page_count(coffee_offset_t size)
|
page_count(cfs_offset_t size)
|
||||||
{
|
{
|
||||||
return (size + sizeof(struct file_header) + COFFEE_PAGE_SIZE - 1) /
|
return (size + sizeof(struct file_header) + COFFEE_PAGE_SIZE - 1) /
|
||||||
COFFEE_PAGE_SIZE;
|
COFFEE_PAGE_SIZE;
|
||||||
|
@ -579,7 +579,7 @@ adjust_log_config(struct file_header *hdr,
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
static uint16_t
|
static uint16_t
|
||||||
modify_log_buffer(uint16_t log_record_size,
|
modify_log_buffer(uint16_t log_record_size,
|
||||||
coffee_offset_t *offset, uint16_t *size)
|
cfs_offset_t *offset, uint16_t *size)
|
||||||
{
|
{
|
||||||
uint16_t region;
|
uint16_t region;
|
||||||
|
|
||||||
|
@ -595,7 +595,7 @@ static int
|
||||||
get_record_index(coffee_page_t log_page, uint16_t search_records,
|
get_record_index(coffee_page_t log_page, uint16_t search_records,
|
||||||
uint16_t region)
|
uint16_t region)
|
||||||
{
|
{
|
||||||
coffee_offset_t base;
|
cfs_offset_t base;
|
||||||
uint16_t processed;
|
uint16_t processed;
|
||||||
uint16_t batch_size;
|
uint16_t batch_size;
|
||||||
int16_t match_index, i;
|
int16_t match_index, i;
|
||||||
|
@ -641,7 +641,7 @@ read_log_page(struct file_header *hdr, int16_t last_record, struct log_param *lp
|
||||||
int16_t match_index;
|
int16_t match_index;
|
||||||
uint16_t log_record_size;
|
uint16_t log_record_size;
|
||||||
uint16_t log_records;
|
uint16_t log_records;
|
||||||
coffee_offset_t base;
|
cfs_offset_t base;
|
||||||
uint16_t search_records;
|
uint16_t search_records;
|
||||||
|
|
||||||
adjust_log_config(hdr, &log_record_size, &log_records);
|
adjust_log_config(hdr, &log_record_size, &log_records);
|
||||||
|
@ -654,7 +654,7 @@ read_log_page(struct file_header *hdr, int16_t last_record, struct log_param *lp
|
||||||
}
|
}
|
||||||
|
|
||||||
base = absolute_offset(hdr->log_page, log_records * sizeof(region));
|
base = absolute_offset(hdr->log_page, log_records * sizeof(region));
|
||||||
base += (coffee_offset_t)match_index * log_record_size;
|
base += (cfs_offset_t)match_index * log_record_size;
|
||||||
base += lp->offset;
|
base += lp->offset;
|
||||||
COFFEE_READ(lp->buf, lp->size, base);
|
COFFEE_READ(lp->buf, lp->size, base);
|
||||||
|
|
||||||
|
@ -683,7 +683,7 @@ create_log(struct file *file, struct file_header *hdr)
|
||||||
coffee_page_t log_page;
|
coffee_page_t log_page;
|
||||||
unsigned char log_name[sizeof(hdr->name)];
|
unsigned char log_name[sizeof(hdr->name)];
|
||||||
uint16_t log_record_size, log_records;
|
uint16_t log_record_size, log_records;
|
||||||
coffee_offset_t size;
|
cfs_offset_t size;
|
||||||
struct file *log_file;
|
struct file *log_file;
|
||||||
|
|
||||||
adjust_log_config(hdr, &log_record_size, &log_records);
|
adjust_log_config(hdr, &log_record_size, &log_records);
|
||||||
|
@ -715,7 +715,7 @@ merge_log(coffee_page_t file_page, int extend)
|
||||||
coffee_page_t log_page;
|
coffee_page_t log_page;
|
||||||
struct file_header hdr, hdr2;
|
struct file_header hdr, hdr2;
|
||||||
int fd, n;
|
int fd, n;
|
||||||
coffee_offset_t offset;
|
cfs_offset_t offset;
|
||||||
coffee_page_t max_pages;
|
coffee_page_t max_pages;
|
||||||
struct file *new_file;
|
struct file *new_file;
|
||||||
int i;
|
int i;
|
||||||
|
@ -834,7 +834,7 @@ write_log_page(struct file *file, struct log_param *lp)
|
||||||
int16_t log_record;
|
int16_t log_record;
|
||||||
uint16_t log_record_size;
|
uint16_t log_record_size;
|
||||||
uint16_t log_records;
|
uint16_t log_records;
|
||||||
coffee_offset_t table_base, record_base;
|
cfs_offset_t table_base, record_base;
|
||||||
struct log_param lp_out;
|
struct log_param lp_out;
|
||||||
|
|
||||||
read_header(&hdr, file->page);
|
read_header(&hdr, file->page);
|
||||||
|
@ -958,7 +958,7 @@ cfs_close(int fd)
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
unsigned
|
unsigned
|
||||||
cfs_seek(int fd, unsigned offset)
|
cfs_seek(int fd, unsigned offset, int whence)
|
||||||
{
|
{
|
||||||
struct file_header hdr;
|
struct file_header hdr;
|
||||||
struct file_desc *fdp;
|
struct file_desc *fdp;
|
||||||
|
@ -975,11 +975,21 @@ cfs_seek(int fd, unsigned offset)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(whence == CFS_SEEK_SET) {
|
||||||
|
fdp->offset = offset;
|
||||||
|
} else if(whence == CFS_SEEK_END) {
|
||||||
|
fdp->offset = fdp->file->end + offset;
|
||||||
|
} else if(whence == CFS_SEEK_CUR) {
|
||||||
|
fdp->offset += offset;
|
||||||
|
} else {
|
||||||
|
return (cfs_offset_t)-1;
|
||||||
|
}
|
||||||
|
|
||||||
if(fdp->file->end < offset) {
|
if(fdp->file->end < offset) {
|
||||||
fdp->file->end = offset;
|
fdp->file->end = offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
return fdp->offset = offset;
|
return fdp->offset;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
int
|
int
|
||||||
|
@ -1010,7 +1020,7 @@ cfs_read(int fd, void *buf, unsigned size)
|
||||||
struct file *file;
|
struct file *file;
|
||||||
unsigned remains, read_chunk;
|
unsigned remains, read_chunk;
|
||||||
int r;
|
int r;
|
||||||
coffee_offset_t base, offset;
|
cfs_offset_t base, offset;
|
||||||
struct log_param lp;
|
struct log_param lp;
|
||||||
|
|
||||||
if(!(FD_VALID(fd) && FD_READABLE(fd))) {
|
if(!(FD_VALID(fd) && FD_READABLE(fd))) {
|
||||||
|
@ -1067,7 +1077,7 @@ cfs_write(int fd, const void *buf, unsigned size)
|
||||||
struct file *file;
|
struct file *file;
|
||||||
int i;
|
int i;
|
||||||
struct log_param lp;
|
struct log_param lp;
|
||||||
coffee_offset_t remains;
|
cfs_offset_t remains;
|
||||||
|
|
||||||
if(!(FD_VALID(fd) && FD_WRITABLE(fd))) {
|
if(!(FD_VALID(fd) && FD_WRITABLE(fd))) {
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
*
|
*
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
*
|
*
|
||||||
* $Id: cfs-eeprom.c,v 1.8 2008/11/24 10:56:55 nvt-se Exp $
|
* $Id: cfs-eeprom.c,v 1.9 2009/02/27 14:25:38 nvt-se Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cfs/cfs.h"
|
#include "cfs/cfs.h"
|
||||||
|
@ -106,9 +106,9 @@ cfs_write(int f, const void *buf, unsigned int len)
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
unsigned int
|
unsigned int
|
||||||
cfs_seek(int f, unsigned int o)
|
cfs_seek(int f, unsigned int o, int w)
|
||||||
{
|
{
|
||||||
if(f == 1) {
|
if(w == CFS_SEEK_SET && f == 1) {
|
||||||
file.fileptr = o;
|
file.fileptr = o;
|
||||||
return o;
|
return o;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
*
|
*
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
*
|
*
|
||||||
* $Id: cfs-posix.c,v 1.12 2008/11/24 10:56:55 nvt-se Exp $
|
* $Id: cfs-posix.c,v 1.13 2009/02/27 14:25:38 nvt-se Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -84,10 +84,19 @@ cfs_write(int f, const void *b, unsigned int l)
|
||||||
return write(f, b, l);
|
return write(f, b, l);
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
unsigned int
|
cfs_offset_t
|
||||||
cfs_seek(int f, unsigned int o)
|
cfs_seek(int f, unsigned int o, int w)
|
||||||
{
|
{
|
||||||
return lseek(f, o, SEEK_SET);
|
if(w == CFS_SEEK_SET) {
|
||||||
|
w = SEEK_SET;
|
||||||
|
} else if(w == CFS_SEEK_CUR) {
|
||||||
|
w = SEEK_CUR;
|
||||||
|
} else if(w == CFS_SEEK_END) {
|
||||||
|
w = SEEK_END;
|
||||||
|
} else {
|
||||||
|
return (cfs_offset_t)-1;
|
||||||
|
}
|
||||||
|
return lseek(f, o, w);
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
int
|
int
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
*
|
*
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
*
|
*
|
||||||
* $Id: cfs-ram.c,v 1.9 2008/11/24 10:56:55 nvt-se Exp $
|
* $Id: cfs-ram.c,v 1.10 2009/02/27 14:25:38 nvt-se Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -127,18 +127,17 @@ cfs_write(int f, const void *buf, unsigned int len)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
unsigned int
|
cfs_offset_t
|
||||||
cfs_seek(int f, unsigned int o)
|
cfs_seek(int f, cfs_offset_t o, int w)
|
||||||
{
|
{
|
||||||
if(f == 1) {
|
if(w == CFS_SEEK_SET && f == 1) {
|
||||||
if(o > file.filesize) {
|
if(o > file.filesize) {
|
||||||
o = file.filesize;
|
o = file.filesize;
|
||||||
}
|
}
|
||||||
file.fileptr = o;
|
file.fileptr = o;
|
||||||
return o;
|
return o;
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
return (cfs_offset_t)-1;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
int
|
int
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
*
|
*
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
*
|
*
|
||||||
* $Id: cfs-xmem.c,v 1.10 2008/11/30 22:42:40 nvt-se Exp $
|
* $Id: cfs-xmem.c,v 1.11 2009/02/27 14:25:38 nvt-se Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cfs/cfs.h"
|
#include "cfs/cfs.h"
|
||||||
|
@ -133,18 +133,17 @@ cfs_write(int f, const void *buf, unsigned int len)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
unsigned int
|
cfs_offset_t
|
||||||
cfs_seek(int f, unsigned int o)
|
cfs_seek(int f, cfs_offset_t o, int w)
|
||||||
{
|
{
|
||||||
if(f == 1) {
|
if(w == CFS_SEEK_SET && f == 1) {
|
||||||
if(o > file.filesize) {
|
if(o > file.filesize) {
|
||||||
o = file.filesize;
|
o = file.filesize;
|
||||||
}
|
}
|
||||||
file.fileptr = o;
|
file.fileptr = o;
|
||||||
return o;
|
return o;
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
int
|
int
|
||||||
|
|
|
@ -54,7 +54,7 @@
|
||||||
*
|
*
|
||||||
* Author: Adam Dunkels <adam@sics.se>
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
*
|
*
|
||||||
* $Id: cfs.h,v 1.12 2008/11/24 10:56:55 nvt-se Exp $
|
* $Id: cfs.h,v 1.13 2009/02/27 14:25:38 nvt-se Exp $
|
||||||
*/
|
*/
|
||||||
#ifndef __CFS_H__
|
#ifndef __CFS_H__
|
||||||
#define __CFS_H__
|
#define __CFS_H__
|
||||||
|
@ -70,6 +70,12 @@ struct cfs_dirent {
|
||||||
unsigned int size;
|
unsigned int size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef CFS_OFFSET_TYPE
|
||||||
|
typedef unsigned cfs_offset_t;
|
||||||
|
#else
|
||||||
|
typedef CFS_OFFSET_TYPE cfs_offset_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specify that cfs_open() should open a file for reading.
|
* Specify that cfs_open() should open a file for reading.
|
||||||
*
|
*
|
||||||
|
@ -178,16 +184,27 @@ CCIF int cfs_write(int fd, const void *buf, unsigned int len);
|
||||||
/**
|
/**
|
||||||
* \brief Seek to a specified position in an open file.
|
* \brief Seek to a specified position in an open file.
|
||||||
* \param fd The file descriptor of the open file.
|
* \param fd The file descriptor of the open file.
|
||||||
* \param offset The position in the file.
|
* \param offset A position, either relative or absolute, in the file.
|
||||||
* \return The new position in the file.
|
* \param whence Determines how to interpret the offset parameter.
|
||||||
|
* \return The new position in the file, or (cfs_offset_t)-1 if the seek failed.
|
||||||
*
|
*
|
||||||
* This function moves the file position to the specified
|
* This function moves the file position to the specified
|
||||||
* position in the file. The next byte that is read from
|
* position in the file. The next byte that is read from
|
||||||
* or written to the file will be at the position given by
|
* or written to the file will be at the position given
|
||||||
* the offset parameter.
|
* determined by the combination of the offset parameter
|
||||||
|
* and the whence parameter.
|
||||||
|
*
|
||||||
|
* If whence is CFS_SEEK_SET, the current position is set
|
||||||
|
* to the offset value. CFS_SEEK_CUR moves the position
|
||||||
|
* forward the number of bytes specified by offset. CFS_SEEK
|
||||||
|
* end moves the position offset bytes past the end of the file.
|
||||||
*/
|
*/
|
||||||
#ifndef cfs_seek
|
#ifndef cfs_seek
|
||||||
CCIF unsigned int cfs_seek(int fd, unsigned int offset);
|
#define CFS_SEEK_SET 0
|
||||||
|
#define CFS_SEEK_CUR 1
|
||||||
|
#define CFS_SEEK_END 2
|
||||||
|
|
||||||
|
CCIF cfs_offset_t cfs_seek(int fd, cfs_offset_t offset, int whence);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue