Usermode/AxWin4 - Fix bitmap upscale
[tpg/acess2.git] / KernelLand / Kernel / vfs / fs / root.c
index abe5945..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);
- int   Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags);
-tVFS_Node      *Root_FindDir(tVFS_Node *Node, const char *Name);
-char   *Root_ReadDir(tVFS_Node *Node, int Pos);
-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);
+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, 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, 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,11 +85,24 @@ 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
  */
-int Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags)
+tVFS_Node *Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags)
 {
        tRamFS_File     *parent = Node->ImplPtr;
        tRamFS_File     *child;
@@ -91,21 +111,22 @@ int Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags)
        ENTER("pNode sName xFlags", Node, Name, Flags);
        
        LOG("Sanity check name length - %i > %i", strlen(Name)+1, sizeof(child->Name));
-       if(strlen(Name) + 1 > sizeof(child->Name))
-               LEAVE_RET('i', EINVAL);
+       if(strlen(Name) + 1 > sizeof(child->Name)) {
+               errno = EINVAL;
+               LEAVE_RET('n', NULL);
+       }
        
        // Find last child, while we're at it, check for duplication
        for( child = parent->Data.FirstChild; child; prev = child, child = child->Next )
        {
                if(strcmp(child->Name, Name) == 0) {
                        LOG("Duplicate");
-                       LEAVE('i', EEXIST);
-                       return EEXIST;
+                       errno = EEXIST;
+                       LEAVE_RET('n', NULL);
                }
        }
        
        child = Root_int_AllocFile();
-       memset(child, 0, sizeof(tRamFS_File));
        
        strcpy(child->Name, Name);
        LOG("Name = '%s'", child->Name);
@@ -139,15 +160,15 @@ int Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags)
        
        parent->Node.Size ++;
        
-       LEAVE('i', EOK);
-       return EOK;
+       LEAVE('n', &child->Node);
+       return &child->Node;
 }
 
 /**
  * \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;
@@ -172,22 +193,25 @@ tVFS_Node *Root_FindDir(tVFS_Node *Node, const char *Name)
  * \fn char *Root_ReadDir(tVFS_Node *Node, int Pos)
  * \brief Get an entry from the filesystem
  */
-char *Root_ReadDir(tVFS_Node *Node, int Pos)
+int Root_ReadDir(tVFS_Node *Node, int Pos, char Dest[FILENAME_MAX])
 {
        tRamFS_File     *parent = Node->ImplPtr;
        tRamFS_File     *child = parent->Data.FirstChild;
        
        for( ; child && Pos--; child = child->Next ) ;
        
-       if(child)       return strdup(child->Name);
+       if(child) {
+               strncpy(Dest, child->Name, FILENAME_MAX);
+               return 0;
+       }
        
-       return NULL;
+       return -ENOENT;
 }
 
 /**
  * \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;
        
@@ -206,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;
 
@@ -220,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;
                }
@@ -256,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