fix dependency check logic cause config always disabled
[lunaix-os.git] / lunaix-os / kernel / process / taskfs.c
index 6507eb1d9b292453ff615738554b4e7f209cc329..8ab3d65d6555204a31073de63958a3f135de9a72 100644 (file)
@@ -1,13 +1,14 @@
 #include <lunaix/fs/taskfs.h>
 #include <lunaix/fs/twimap.h>
+#include <lunaix/fs/api.h>
 #include <lunaix/mm/valloc.h>
 #include <lunaix/process.h>
 #include <lunaix/sched.h>
 
-#include <klibc/stdio.h>
+#include <klibc/strfmt.h>
 #include <klibc/string.h>
 
-#include <usr/sys/dirent_defs.h>
+#include <usr/lunaix/dirent.h>
 
 #define COUNTER_MASK ((1 << 16) - 1)
 
@@ -52,17 +53,21 @@ taskfs_readdir(struct v_file* file, struct dir_context* dctx)
 {
     struct v_inode* inode = file->inode;
     pid_t pid = inode->id >> 16;
-    int counter = 0;
+    unsigned int counter = 0;
 
     if ((inode->id & COUNTER_MASK)) {
         return ENOTDIR;
     }
 
+    if (fsapi_handle_pseudo_dirent(file, dctx)) {
+        return 1;
+    }
+
     if (pid) {
         struct task_attribute *pos, *n;
         llist_for_each(pos, n, &attributes, siblings)
         {
-            if (counter == dctx->index) {
+            if (counter == file->f_pos) {
                 dctx->read_complete_callback(
                   dctx, pos->key_val, VFS_NAME_MAXLEN, DT_FILE);
                 return 1;
@@ -76,7 +81,7 @@ taskfs_readdir(struct v_file* file, struct dir_context* dctx)
     struct proc_info *root = get_process(pid), *pos, *n;
     llist_for_each(pos, n, &root->tasks, tasks)
     {
-        if (counter == dctx->index) {
+        if (counter == file->f_pos) {
             ksnprintf(name, VFS_NAME_MAXLEN, "%d", pos->pid);
             dctx->read_complete_callback(dctx, name, VFS_NAME_MAXLEN, DT_DIR);
             return 1;
@@ -129,14 +134,16 @@ taskfs_dirlookup(struct v_inode* this, struct v_dnode* dnode)
         return ENOENT;
     }
 
-    return taskfs_mknod(dnode, pid, 0, VFS_IFDIR);
+    return taskfs_mknod(dnode, pid, 0, F_DIR);
 }
 
 static struct v_file_ops taskfs_file_ops = { .close = default_file_close,
                                              .read = default_file_read,
-                                             .read_page = default_file_read,
+                                             .read_page =
+                                               default_file_read_page,
                                              .write = default_file_write,
-                                             .write_page = default_file_write,
+                                             .write_page =
+                                               default_file_write_page,
                                              .readdir = taskfs_readdir,
                                              .seek = default_file_seek };
 static struct v_inode_ops taskfs_inode_ops = { .dir_lookup = taskfs_dirlookup,
@@ -163,6 +170,12 @@ taskfs_mount(struct v_superblock* vsb, struct v_dnode* mount_point)
     return taskfs_mknod(mount_point, 0, 0, VFS_IFDIR);
 }
 
+int
+taskfs_unmount(struct v_superblock* vsb)
+{
+    return 0;
+}
+
 void
 taskfs_invalidate(pid_t pid)
 {
@@ -218,12 +231,14 @@ export_task_attr();
 void
 taskfs_init()
 {
-    struct filesystem* taskfs = fsm_new_fs("taskfs", 5);
-    taskfs->mount = taskfs_mount;
-
-    fsm_register(taskfs);
+    struct filesystem* fs;
+    fs = fsapi_fs_declare("taskfs", FSTYPE_PSEUDO);
+    
+    fsapi_fs_set_mntops(fs, taskfs_mount, taskfs_unmount);
+    fsapi_fs_finalise(fs);
 
     attr_export_table = vcalloc(ATTR_TABLE_LEN, sizeof(struct hbucket));
 
     export_task_attr();
-}
\ No newline at end of file
+}
+EXPORT_FILE_SYSTEM(taskfs, taskfs_init);
\ No newline at end of file