X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/c50398ab4cb09658b3b3fff74804d2f26df785e7..refs/heads/eme/taskfs:/lunaix-os/kernel/fs/twimap.c diff --git a/lunaix-os/kernel/fs/twimap.c b/lunaix-os/kernel/fs/twimap.c index 009cdf3..6a6dd0c 100644 --- a/lunaix-os/kernel/fs/twimap.c +++ b/lunaix-os/kernel/fs/twimap.c @@ -3,10 +3,12 @@ #include #include -#include +#include #include -#define TWIMAP_BUFFER_SIZE 1024 +#include + +#define TWIMAP_BUFFER_SIZE PAGE_SIZE void __twimap_default_reset(struct twimap* map) @@ -20,27 +22,39 @@ __twimap_default_gonext(struct twimap* map) return 0; } -int +static int __twimap_file_read(struct v_inode* inode, void* buf, size_t len, size_t fpos) { struct twimap* map = (struct twimap*)(inode->data); return twimap_read(map, buf, len, fpos); } +static int +__twimap_file_read_page(struct v_inode* inode, void* buf, size_t fpos) +{ + return __twimap_file_read(inode, buf, PAGE_SIZE, fpos); +} + int twimap_read(struct twimap* map, void* buffer, size_t len, size_t fpos) { map->buffer = valloc(TWIMAP_BUFFER_SIZE); + map->size_acc = 0; + map->reset(map); // FIXME what if TWIMAP_BUFFER_SIZE is not big enough? - size_t pos = 0; - do { + size_t pos = map->size_acc; + while (pos <= fpos) { map->size_acc = 0; map->read(map); pos += map->size_acc; - } while (pos <= fpos && map->go_next(map)); + + if (!map->go_next(map)) { + break; + } + } if (pos <= fpos) { vfree(map->buffer); @@ -54,12 +68,21 @@ twimap_read(struct twimap* map, void* buffer, size_t len, size_t fpos) size_t acc_size = MIN(len, map->size_acc - (pos - fpos)), rdlen = acc_size; memcpy(buffer, map->buffer + (pos - fpos), acc_size); - while (acc_size < len && map->go_next(map)) { + while (acc_size < len) { map->size_acc = 0; map->read(map); rdlen = MIN(len - acc_size, map->size_acc); memcpy(buffer + acc_size, map->buffer, rdlen); acc_size += rdlen; + + if (!map->go_next(map)) { + break; + } + } + + if (acc_size <= len - 1) { + // pad zero + *(char*)(buffer + acc_size + 1) = 0; } vfree(map->buffer); @@ -74,8 +97,7 @@ twimap_printf(struct twimap* mapping, const char* fmt, ...) char* buf = mapping->buffer + mapping->size_acc; - mapping->size_acc += - __ksprintf_internal(buf, fmt, TWIMAP_BUFFER_SIZE, args); + mapping->size_acc += ksnprintfv(buf, fmt, TWIMAP_BUFFER_SIZE, args) - 1; va_end(args); } @@ -112,6 +134,7 @@ twimap_create(void* data) struct v_file_ops twimap_file_ops = { .close = default_file_close, .read = __twimap_file_read, + .read_page = __twimap_file_read_page, .readdir = default_file_readdir, .seek = default_file_seek, .write = default_file_write }; \ No newline at end of file