X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Femul%2Fkfile_posix.c;h=d196c6aa7eadb5b23fb4d0b42c5a0341eae416b7;hb=7166a2cb55a257889ffc8f0199d048409449f89a;hp=3fce00bcf2b46b54bde179d7c4f18b8ce6fd6d25;hpb=b1c122a36a111f4bb088a8f000a7fc8f8975734e;p=bertos.git diff --git a/bertos/emul/kfile_posix.c b/bertos/emul/kfile_posix.c index 3fce00bc..d196c6aa 100644 --- a/bertos/emul/kfile_posix.c +++ b/bertos/emul/kfile_posix.c @@ -32,22 +32,27 @@ * * \brief KFile interface implementation in Posix systems. * - * \version $Id$ * \author Luca Ottaviano */ #include +#include static size_t kfile_posix_read(struct KFile *_fd, void *buf, size_t size) { KFilePosix *fd = KFILEPOSIX_CAST(_fd); - return fread(buf, sizeof(uint8_t), size, fd->fp); + size_t len = fread(buf, sizeof(uint8_t), size, fd->fp); + fd->fd.seek_pos += len; + return len; } static size_t kfile_posix_write(struct KFile *_fd, const void *buf, size_t size) { KFilePosix *fd = KFILEPOSIX_CAST(_fd); - return fwrite(buf, sizeof(uint8_t), size, fd->fp); + size_t len = fwrite(buf, sizeof(uint8_t), size, fd->fp); + fd->fd.seek_pos += len; + fd->fd.size = MAX(fd->fd.size, fd->fd.seek_pos); + return len; } static kfile_off_t kfile_posix_seek(struct KFile *_fd, kfile_off_t offset, KSeekMode whence) @@ -63,12 +68,18 @@ static kfile_off_t kfile_posix_seek(struct KFile *_fd, kfile_off_t offset, KSeek std_whence = SEEK_END; break; case KSM_SEEK_SET: - /* fall */ - default: std_whence = SEEK_SET; + break; + default: + ASSERT(0); + return EOF; } + int err = fseek(fd->fp, offset, std_whence); + if (err) + return err; - return fseek(fd->fp, offset, std_whence); + fd->fd.seek_pos = ftell(fd->fp); + return fd->fd.seek_pos; } static int kfile_posix_close(struct KFile *_fd) @@ -83,9 +94,10 @@ static int kfile_posix_flush(struct KFile *_fd) return fflush(fd->fp); } -FILE* kfile_posix_init(KFilePosix *file, const char *filename, const char *mode) +FILE *kfile_posix_init(KFilePosix *file, const char *filename, const char *mode) { - file->fd._type = KFT_KFILEPOSIX; + memset(file, 0, sizeof(*file)); + DB(file->fd._type = KFT_KFILEPOSIX); file->fd.read = kfile_posix_read; file->fd.write = kfile_posix_write; file->fd.close = kfile_posix_close; @@ -93,5 +105,8 @@ FILE* kfile_posix_init(KFilePosix *file, const char *filename, const char *mode) file->fd.flush = kfile_posix_flush; file->fp = fopen(filename, mode); + fseek(file->fp, 0, SEEK_END); + file->fd.size = ftell(file->fp); + fseek(file->fp, 0, SEEK_SET); return file->fp; }