Start to implement file interface.
authorbatt <batt@38d2e660-2303-0410-9eaa-f027e97ec537>
Wed, 13 Feb 2008 23:06:45 +0000 (23:06 +0000)
committerbatt <batt@38d2e660-2303-0410-9eaa-f027e97ec537>
Wed, 13 Feb 2008 23:06:45 +0000 (23:06 +0000)
git-svn-id: https://src.develer.com/svnoss/bertos/trunk@1105 38d2e660-2303-0410-9eaa-f027e97ec537

fs/battfs.c
fs/battfs.h

index 97bc897d148e7ceaba7e3c3ac583385bfe032632..da7f305977fdf71ca0fc208ae431f2357d527aa1 100644 (file)
@@ -338,7 +338,7 @@ static void findFreeStartNext(struct BattFsSuper *disk, mark_t minl, mark_t maxl
        {
                /*
                 * No valid interval found.
-                * Hopefully the disk is brand new (or new).
+                * Hopefully the disk is brand new (or full).
                 */
                TRACEMSG("No valid marked free block found, new disk or disk full\n");
                disk->free_start = 0;
@@ -585,9 +585,53 @@ bool battfs_init(struct BattFsSuper *disk)
                return false;
        }
 
+       /* Init list for opened files. */
+       LIST_INIT(&disk->file_opened_list);
        return true;    
 }
 
+/**
+ * Open file \a inode from \a disk in \a mode.
+ * File context is stored in \a fd.
+ * \return true if ok, false otherwise.
+ */
+bool battfs_fileopen(BattFsSuper *disk, KFileBattFs *fd, inode_t inode, filemode_t mode)
+{
+       Node *n;
+
+       memset(fd, 0, sizeof(*fd));
+
+       /* Insert file handle in list, ordered by inode, ascending order. */
+       FOREACH_NODE(n, &disk->file_opened_list)
+       {
+               KFileBattFs *file = containerof(n, KFileBattFs, link);
+               if (file->inode >= inode)
+                       break;
+       }
+       INSERT_BEFORE(n, &fd->link);
+
+       /* Fill in data */
+       fd->inode = inode;
+       fd->mode = mode;
+       fd->disk = disk;
+
+#warning TODO battfs_read, battfs_write, etc...
+#if 0
+       fd->fd.read = battfs_read;
+       fd->fd.write = battfs_write;
+       fd->fd.close = battfs_close;
+       fd->fd.reopen = battfs_reopen;
+       fd->fd.flush = battfs_flush;
+       fd->fd.error = battfs_error;
+       fd->fd.clearerr = battfs_clearerr;
+#endif
+       fd->fd.seek = kfile_genericSeek;
+       DB(fd->fd._type = KFT_BATTFS);
+
+#warning Complete me :-)
+       return true;
+}
+
 /**
  * Close \a disk.
  */
index f7518ced38104137c03cd96539097890b3a2471c..247e058538752f867fb1aa5461bfd2f8928f7546 100644 (file)
@@ -44,6 +44,8 @@
 #include <cfg/compiler.h> // uintXX_t; STATIC_ASSERT
 #include <cpu/types.h> // CPU_BITS_PER_CHAR
 #include <algo/rotating_hash.h>
+#include <mware/list.h>
+#include <kern/kfile.h>
 
 typedef uint16_t fill_t;
 typedef fill_t   pgaddr_t;
@@ -196,13 +198,13 @@ typedef struct BattFsSuper
         */
        pgcnt_t *page_array;
 
-    /**
+        /**
         * Lowest free page counter.
         * This is the counter of the first availble free page.
         */
        mark_t free_start;
 
-    /**
+        /**
         * Highest free page counter.
         * This value is the next to be used to mark a block as free.
         */
@@ -211,12 +213,35 @@ typedef struct BattFsSuper
        disk_size_t disk_size;   ///< Size of the disk, in bytes (page_count * page_size).
        disk_size_t free_bytes;  ///< Free space on the disk.
        
+       List file_opened_list;       ///< List used to keep trace of open files.
        /* TODO add other fields. */
 } BattFsSuper;
 
+typedef uint8_t filemode_t; ///< Type for file open.
+
+/**
+ * Describe a BattFs file usign a KFile.
+ */
+typedef struct KFileBattFs
+{
+       KFile fd;           ///< KFile context
+       Node link;          ///< Link for inserting in opened file list
+       inode_t inode;      ///< inode of the opened file
+       BattFsSuper *disk;  ///< Disk context
+       filemode_t mode;    ///< File open mode
+} KFileBattFs;
+
+INLINE KFileBattFs * KFILEBATTFS(KFile *fd)
+{
+       ASSERT(fd->_type == KFT_BATTFS);
+       return (KFileBattFs *)fd;
+}
+
 bool battfs_init(struct BattFsSuper *d);
 bool battfs_close(struct BattFsSuper *disk);
 
+bool battfs_fileopen(BattFsSuper *disk, KFileBattFs *fd, inode_t inode, filemode_t mode);
+
 bool battfs_writeTestBlock(struct BattFsSuper *disk, pgcnt_t page, inode_t inode, seq_t seq, fill_t fill, pgoff_t pgoff, mark_t mark);
 
 #endif /* FS_BATTFS_H */