Framework for exporting system header to user space (#59)
[lunaix-os.git] / lunaix-os / kernel / fs / twimap.c
index 1021db077e924f047cc0a203f2f48eac3bd53cb5..62bdaeda41a53b27a520ffdb8f06826cb4ef0e8d 100644 (file)
@@ -6,7 +6,9 @@
 #include <klibc/strfmt.h>
 #include <klibc/string.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)
 
 void
 __twimap_default_reset(struct twimap* map)
@@ -20,27 +22,39 @@ __twimap_default_gonext(struct twimap* map)
     return 0;
 }
 
     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);
 }
 
 __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);
 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?
 
     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;
         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);
 
     if (pos <= fpos) {
         vfree(map->buffer);
@@ -79,8 +93,7 @@ twimap_printf(struct twimap* mapping, const char* fmt, ...)
 
     char* buf = mapping->buffer + mapping->size_acc;
 
 
     char* buf = mapping->buffer + mapping->size_acc;
 
-    mapping->size_acc +=
-      ksnprintfv(buf, fmt, TWIMAP_BUFFER_SIZE, args) - 1;
+    mapping->size_acc += ksnprintfv(buf, fmt, TWIMAP_BUFFER_SIZE, args) - 1;
 
     va_end(args);
 }
 
     va_end(args);
 }
@@ -117,7 +130,7 @@ twimap_create(void* data)
 
 struct v_file_ops twimap_file_ops = { .close = default_file_close,
                                       .read = __twimap_file_read,
 
 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
                                       .readdir = default_file_readdir,
                                       .seek = default_file_seek,
                                       .write = default_file_write };
\ No newline at end of file