X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fio%2Fkblock_file.c;h=cd18431d101c6b141804d0651a721d2f05efa7b2;hb=30a088bc2641f3e11c414dd32c672242099a9f5b;hp=ae680815ade31890bcd18693a2f3bf405819e18a;hpb=20c4c2941955bc2f0f812d558405b054cac12042;p=bertos.git diff --git a/bertos/io/kblock_file.c b/bertos/io/kblock_file.c index ae680815..cd18431d 100644 --- a/bertos/io/kblock_file.c +++ b/bertos/io/kblock_file.c @@ -79,13 +79,13 @@ static size_t kblockfile_writeBuf(struct KBlock *b, const void *buf, size_t offs return size; } -static int kblockfile_writeBlock(struct KBlock *b, block_idx_t index, const void *buf) +static size_t kblockfile_writeDirect(struct KBlock *b, block_idx_t index, const void *buf, size_t offset, size_t size) { KBlockFile *f = KBLOCKFILE_CAST(b); ASSERT(buf); ASSERT(index < b->blk_cnt); - fseek(f->fp, index * b->blk_size, SEEK_SET); - return (fwrite(f->b.priv.buf, 1, b->blk_size, f->fp) == b->blk_size) ? 0 : EOF; + fseek(f->fp, index * b->blk_size + offset, SEEK_SET); + return fwrite(buf, 1, size, f->fp); } static int kblockfile_error(struct KBlock *b) @@ -119,7 +119,7 @@ static const KBlockVTable kblockfile_hwbuffered_vt = .writeBuf = kblockfile_writeBuf, .load = kblockfile_load, .store = kblockfile_store, - + .error = kblockfile_error, .clearerr = kblockfile_claererr, .close = kblockfile_close, @@ -128,13 +128,13 @@ static const KBlockVTable kblockfile_hwbuffered_vt = static const KBlockVTable kblockfile_swbuffered_vt = { .readDirect = kblockfile_readDirect, - .writeBlock =kblockfile_writeBlock, - + .writeDirect =kblockfile_writeDirect, + .readBuf = kblock_swReadBuf, .writeBuf = kblock_swWriteBuf, .load = kblock_swLoad, .store = kblock_swStore, - + .error = kblockfile_error, .clearerr = kblockfile_claererr, .close = kblockfile_close, @@ -143,7 +143,7 @@ static const KBlockVTable kblockfile_swbuffered_vt = static const KBlockVTable kblockfile_unbuffered_vt = { .readDirect = kblockfile_readDirect, - .writeBlock =kblockfile_writeBlock, + .writeDirect =kblockfile_writeDirect, .error = kblockfile_error, .clearerr = kblockfile_claererr, @@ -165,7 +165,8 @@ void kblockfile_init(KBlockFile *f, FILE *fp, bool hwbuf, void *buf, size_t bloc f->fp = fp; f->b.blk_size = block_size; f->b.blk_cnt = block_count; - + + f->b.priv.flags |= KB_PARTIAL_WRITE; if (buf) { f->b.priv.flags |= KB_BUFFERED;