From 3191a2568c9c9e88d506927b3ae5015a1fc24dae Mon Sep 17 00:00:00 2001 From: nvt-se Date: Fri, 27 Feb 2009 14:25:37 +0000 Subject: [PATCH] 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. --- core/cfs/cfs-coffee.c | 48 ++++++++++++++++++++++++++----------------- core/cfs/cfs-eeprom.c | 6 +++--- core/cfs/cfs-posix.c | 17 +++++++++++---- core/cfs/cfs-ram.c | 11 +++++----- core/cfs/cfs-xmem.c | 11 +++++----- core/cfs/cfs.h | 29 ++++++++++++++++++++------ 6 files changed, 78 insertions(+), 44 deletions(-) diff --git a/core/cfs/cfs-coffee.c b/core/cfs/cfs-coffee.c index 1076e9512..ded02be19 100644 --- a/core/cfs/cfs-coffee.c +++ b/core/cfs/cfs-coffee.c @@ -67,7 +67,7 @@ #define COFFEE_FILE_MODIFIED 0x1 #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) \ ((fd) >= 0 && (fd) < COFFEE_FD_SET_SIZE && \ @@ -111,7 +111,7 @@ struct sector_stats { }; struct file { - coffee_offset_t end; + cfs_offset_t end; coffee_page_t page; coffee_page_t max_pages; int16_t next_log_record; @@ -120,7 +120,7 @@ struct file { }; struct file_desc { - coffee_offset_t offset; + cfs_offset_t offset; struct file *file; uint8_t flags; }; @@ -137,7 +137,7 @@ struct file_header { /* This is needed because of a buggy compiler. */ struct log_param { - coffee_offset_t offset; + cfs_offset_t offset; const char *buf; uint16_t size; }; @@ -170,8 +170,8 @@ read_header(struct file_header *hdr, coffee_page_t page) #endif } /*---------------------------------------------------------------------------*/ -static coffee_offset_t -absolute_offset(coffee_page_t page, coffee_offset_t offset) +static cfs_offset_t +absolute_offset(coffee_page_t page, cfs_offset_t 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 */ /*---------------------------------------------------------------------------*/ -static coffee_offset_t +static cfs_offset_t file_end(coffee_page_t start) { 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 -page_count(coffee_offset_t size) +page_count(cfs_offset_t size) { return (size + sizeof(struct file_header) + COFFEE_PAGE_SIZE - 1) / COFFEE_PAGE_SIZE; @@ -579,7 +579,7 @@ adjust_log_config(struct file_header *hdr, /*---------------------------------------------------------------------------*/ static uint16_t 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; @@ -595,7 +595,7 @@ static int get_record_index(coffee_page_t log_page, uint16_t search_records, uint16_t region) { - coffee_offset_t base; + cfs_offset_t base; uint16_t processed; uint16_t batch_size; 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; uint16_t log_record_size; uint16_t log_records; - coffee_offset_t base; + cfs_offset_t base; uint16_t search_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 += (coffee_offset_t)match_index * log_record_size; + base += (cfs_offset_t)match_index * log_record_size; base += lp->offset; 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; unsigned char log_name[sizeof(hdr->name)]; uint16_t log_record_size, log_records; - coffee_offset_t size; + cfs_offset_t size; struct file *log_file; 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; struct file_header hdr, hdr2; int fd, n; - coffee_offset_t offset; + cfs_offset_t offset; coffee_page_t max_pages; struct file *new_file; int i; @@ -834,7 +834,7 @@ write_log_page(struct file *file, struct log_param *lp) int16_t log_record; uint16_t log_record_size; uint16_t log_records; - coffee_offset_t table_base, record_base; + cfs_offset_t table_base, record_base; struct log_param lp_out; read_header(&hdr, file->page); @@ -958,7 +958,7 @@ cfs_close(int fd) } /*---------------------------------------------------------------------------*/ unsigned -cfs_seek(int fd, unsigned offset) +cfs_seek(int fd, unsigned offset, int whence) { struct file_header hdr; struct file_desc *fdp; @@ -975,11 +975,21 @@ cfs_seek(int fd, unsigned offset) 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) { fdp->file->end = offset; } - return fdp->offset = offset; + return fdp->offset; } /*---------------------------------------------------------------------------*/ int @@ -1010,7 +1020,7 @@ cfs_read(int fd, void *buf, unsigned size) struct file *file; unsigned remains, read_chunk; int r; - coffee_offset_t base, offset; + cfs_offset_t base, offset; struct log_param lp; if(!(FD_VALID(fd) && FD_READABLE(fd))) { @@ -1067,7 +1077,7 @@ cfs_write(int fd, const void *buf, unsigned size) struct file *file; int i; struct log_param lp; - coffee_offset_t remains; + cfs_offset_t remains; if(!(FD_VALID(fd) && FD_WRITABLE(fd))) { return -1; diff --git a/core/cfs/cfs-eeprom.c b/core/cfs/cfs-eeprom.c index 157aa5809..1591523ad 100644 --- a/core/cfs/cfs-eeprom.c +++ b/core/cfs/cfs-eeprom.c @@ -30,7 +30,7 @@ * * Author: Adam Dunkels * - * $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" @@ -106,9 +106,9 @@ cfs_write(int f, const void *buf, unsigned int len) } /*---------------------------------------------------------------------------*/ 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; return o; } else { diff --git a/core/cfs/cfs-posix.c b/core/cfs/cfs-posix.c index 93bdb0bfe..2236f5c3f 100644 --- a/core/cfs/cfs-posix.c +++ b/core/cfs/cfs-posix.c @@ -30,7 +30,7 @@ * * Author: Adam Dunkels * - * $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 @@ -84,10 +84,19 @@ cfs_write(int f, const void *b, unsigned int l) return write(f, b, l); } /*---------------------------------------------------------------------------*/ -unsigned int -cfs_seek(int f, unsigned int o) +cfs_offset_t +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 diff --git a/core/cfs/cfs-ram.c b/core/cfs/cfs-ram.c index 081fea3ee..b12108447 100644 --- a/core/cfs/cfs-ram.c +++ b/core/cfs/cfs-ram.c @@ -30,7 +30,7 @@ * * Author: Adam Dunkels * - * $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 @@ -127,18 +127,17 @@ cfs_write(int f, const void *buf, unsigned int len) } } /*---------------------------------------------------------------------------*/ -unsigned int -cfs_seek(int f, unsigned int o) +cfs_offset_t +cfs_seek(int f, cfs_offset_t o, int w) { - if(f == 1) { + if(w == CFS_SEEK_SET && f == 1) { if(o > file.filesize) { o = file.filesize; } file.fileptr = o; return o; - } else { - return -1; } + return (cfs_offset_t)-1; } /*---------------------------------------------------------------------------*/ int diff --git a/core/cfs/cfs-xmem.c b/core/cfs/cfs-xmem.c index 626c76129..ef48b8cef 100644 --- a/core/cfs/cfs-xmem.c +++ b/core/cfs/cfs-xmem.c @@ -30,7 +30,7 @@ * * Author: Adam Dunkels * - * $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" @@ -133,18 +133,17 @@ cfs_write(int f, const void *buf, unsigned int len) } } /*---------------------------------------------------------------------------*/ -unsigned int -cfs_seek(int f, unsigned int o) +cfs_offset_t +cfs_seek(int f, cfs_offset_t o, int w) { - if(f == 1) { + if(w == CFS_SEEK_SET && f == 1) { if(o > file.filesize) { o = file.filesize; } file.fileptr = o; return o; - } else { - return -1; } + return -1; } /*---------------------------------------------------------------------------*/ int diff --git a/core/cfs/cfs.h b/core/cfs/cfs.h index f909b9998..5fce34a65 100644 --- a/core/cfs/cfs.h +++ b/core/cfs/cfs.h @@ -54,7 +54,7 @@ * * Author: Adam Dunkels * - * $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__ #define __CFS_H__ @@ -70,6 +70,12 @@ struct cfs_dirent { 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. * @@ -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. * \param fd The file descriptor of the open file. - * \param offset The position in the file. - * \return The new position in the file. + * \param offset A position, either relative or absolute, 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 * position in the file. The next byte that is read from - * or written to the file will be at the position given by - * the offset parameter. + * or written to the file will be at the position given + * 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 -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 /**