Usermode/AxWin4 - Fix bitmap upscale
[tpg/acess2.git] / KernelLand / Kernel / vfs / fs / root.c
index 5685861..b820297 100644 (file)
@@ -1,6 +1,11 @@
 /* 
- * AcessMicro VFS
+ * Acess2 Kernel
+ * - By John Hodge (thePowersGang)
+ *
+ * vfs/fs/root.c
  * - Root Filesystem Driver
+ *
+ * TODO: Restrict to directories+symlinks only
  */
 #define DEBUG  0
 #include <acess.h>
 
 // === CONSTANTS ===
 #define MAX_FILES      64
-#define        MAX_FILE_SIZE   1024
+#define        MAX_FILE_SIZE   10*1024*1024
 
 // === PROTOTYPES ===
 tVFS_Node      *Root_InitDevice(const char *Device, const char **Options);
+tVFS_Node      *Root_GetByINode(tVFS_Node *RootNode, Uint64 Inode);
 tVFS_Node      *Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags);
-tVFS_Node      *Root_FindDir(tVFS_Node *Node, const char *Name);
+tVFS_Node      *Root_FindDir(tVFS_Node *Node, const char *Name, Uint Flags);
  int   Root_ReadDir(tVFS_Node *Node, int Pos, char Dest[FILENAME_MAX]);
-size_t Root_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer);
-size_t Root_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer);
+size_t Root_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags);
+size_t Root_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer, Uint Flags);
 tRamFS_File    *Root_int_AllocFile(void);
 
 // === GLOBALS ===
 tVFS_Driver    gRootFS_Info = {
        .Name = "rootfs", 
-       .InitDevice = Root_InitDevice
+       .InitDevice = Root_InitDevice,
+       .GetNodeFromINode = Root_GetByINode
        };
 tRamFS_File    RootFS_Files[MAX_FILES];
 tVFS_ACL       RootFS_DirACLs[3] = {
@@ -32,8 +39,8 @@ tVFS_ACL      RootFS_DirACLs[3] = {
        {{0,-1}, {0,VFS_PERM_ALL^VFS_PERM_WRITE}}       // World (Nobody)
 };
 tVFS_ACL       RootFS_FileACLs[3] = {
-       {{0,0}, {0,VFS_PERM_ALL^VFS_PERM_EXECUTE}},     // Owner (Root)
-       {{1,0}, {0,VFS_PERM_ALL^VFS_PERM_EXECUTE}},     // Group (Root)
+       {{0,0}, {0,VFS_PERM_ALL^VFS_PERM_EXEC}},        // Owner (Root)
+       {{1,0}, {0,VFS_PERM_ALL^VFS_PERM_EXEC}},        // Group (Root)
        {{0,-1}, {0,VFS_PERM_READ}}     // World (Nobody)
 };
 tVFS_NodeType  gRootFS_DirType = {
@@ -78,6 +85,19 @@ tVFS_Node *Root_InitDevice(const char *Device, const char **Options)
        return &root->Node;
 }
 
+tVFS_Node *Root_GetByINode(tVFS_Node *RootNode, Uint64 Inode)
+{
+       if( Inode >= MAX_FILES )
+               return NULL;
+       if( RootFS_Files[Inode].Name[0] == '\0' )
+               return NULL;
+       Debug("Root_GetByINode: (%llx) = '%s' %p",
+               Inode,
+               RootFS_Files[Inode].Name, &RootFS_Files[Inode].Node
+               );
+       return &RootFS_Files[Inode].Node;
+}
+
 /**
  * \fn int Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags)
  * \brief Create an entry in the root directory
@@ -107,7 +127,6 @@ tVFS_Node *Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags)
        }
        
        child = Root_int_AllocFile();
-       memset(child, 0, sizeof(tRamFS_File));
        
        strcpy(child->Name, Name);
        LOG("Name = '%s'", child->Name);
@@ -149,7 +168,7 @@ tVFS_Node *Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags)
  * \fn tVFS_Node *Root_FindDir(tVFS_Node *Node, const char *Name)
  * \brief Find an entry in the filesystem
  */
-tVFS_Node *Root_FindDir(tVFS_Node *Node, const char *Name)
+tVFS_Node *Root_FindDir(tVFS_Node *Node, const char *Name, Uint Flags)
 {
        tRamFS_File     *parent = Node->ImplPtr;
        tRamFS_File     *child = parent->Data.FirstChild;
@@ -192,7 +211,7 @@ int Root_ReadDir(tVFS_Node *Node, int Pos, char Dest[FILENAME_MAX])
 /**
  * \brief Read from a file in the root directory
  */
-size_t Root_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer)
+size_t Root_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags)
 {
        tRamFS_File     *file = Node->ImplPtr;
        
@@ -211,7 +230,7 @@ size_t Root_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer)
 /**
  * \brief Write to a file in the root directory
  */
-size_t Root_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer)
+size_t Root_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer, Uint Flags)
 {
        tRamFS_File     *file = Node->ImplPtr;
 
@@ -225,16 +244,19 @@ size_t Root_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buff
        if(Offset + Length > MAX_FILE_SIZE)
        {
                Length = MAX_FILE_SIZE - Offset;
+               ASSERTC(Length, <=, MAX_FILE_SIZE);
        }
 
-       LOG("Buffer = '%.*s'", (int)Length, Buffer);
+       LOG("Length = %x", Length);
        
        // Check if buffer needs to be expanded
        if(Offset + Length > Node->Size)
        {
-               void *tmp = realloc( file->Data.Bytes, Offset + Length );
+               size_t  newsize = Offset + Length;
+               void *tmp = realloc( file->Data.Bytes, newsize );
                if(tmp == NULL) {
-                       Warning("Root_Write - Increasing buffer size failed");
+                       Warning("Root_Write - Increasing buffer size failed (0x%x)",
+                               newsize);
                        LEAVE('i', -1);
                        return -1;
                }
@@ -261,6 +283,7 @@ tRamFS_File *Root_int_AllocFile(void)
        {
                if( RootFS_Files[i].Name[0] == '\0' )
                {
+                       RootFS_Files[i].Node.Inode = i;
                        return &RootFS_Files[i];
                }
        }

UCC git Repository :: git.ucc.asn.au