#include <lunaix/mm/valloc.h>
#include <lunaix/spike.h>
-#include <klibc/stdio.h>
+#include <klibc/strfmt.h>
#include <klibc/string.h>
-#define TWIMAP_BUFFER_SIZE 4096
+#include <asm/pagetable.h>
+
+#define TWIMAP_BUFFER_SIZE PAGE_SIZE
void
__twimap_default_reset(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);
char* buf = mapping->buffer + mapping->size_acc;
- mapping->size_acc +=
- __ksprintf_internal(buf, fmt, TWIMAP_BUFFER_SIZE, args) - 1;
+ mapping->size_acc += ksnprintfv(buf, fmt, TWIMAP_BUFFER_SIZE, args) - 1;
va_end(args);
}
struct v_file_ops twimap_file_ops = { .close = default_file_close,
.read = __twimap_file_read,
- .read_page = __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