X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fvfs%2Ffs%2Froot.c;h=d9660419f969467799c80b417fae52baba062f34;hb=73e8ed89c011abce9b0ae2c5a3eb232bdbe8660e;hp=95e308ae43f70dba71117a82c1e1d94b6c41f7cd;hpb=8bc40333b1401d7616b225945fee53d972c2f418;p=tpg%2Facess2.git diff --git a/Kernel/vfs/fs/root.c b/Kernel/vfs/fs/root.c index 95e308ae..d9660419 100644 --- a/Kernel/vfs/fs/root.c +++ b/Kernel/vfs/fs/root.c @@ -2,6 +2,7 @@ * AcessMicro VFS * - Root Filesystem Driver */ +#include #include #include @@ -9,32 +10,36 @@ #define MAX_FILES 64 // === PROTOTYPES === -tVFS_Node *Root_InitDevice(char *Device, char *Options); - int Root_MkNod(tVFS_Node *Node, char *Name, Uint Flags); -tVFS_Node *Root_FindDir(tVFS_Node *Node, char *Name); +tVFS_Node *Root_InitDevice(char *Device, 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); Uint64 Root_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer); Uint64 Root_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer); -tRamFS_File *Root_int_AllocFile(); +tRamFS_File *Root_int_AllocFile(void); // === GLOBALS === tVFS_Driver gRootFS_Info = { - "rootfs", 0, Root_InitDevice, - NULL -}; + "rootfs", 0, Root_InitDevice, NULL, NULL + }; tRamFS_File RootFS_Files[MAX_FILES]; -tVFS_ACL RootFS_ACLs[3] = { +tVFS_ACL RootFS_DirACLs[3] = { {{0,0}, {0,VFS_PERM_ALL}}, // Owner (Root) {{1,0}, {0,VFS_PERM_ALL}}, // Group (Root) - {{0,-1}, {0,VFS_PERM_ALL}} // World (Nobody) + {{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,-1}, {0,VFS_PERM_READ}} // World (Nobody) }; // === CODE === /** - * \fn tVFS_Node *Root_InitDevice(char *Device, char *Options) + * \fn tVFS_Node *Root_InitDevice(char *Device, char **Options) * \brief Initialise the root filesystem */ -tVFS_Node *Root_InitDevice(char *Device, char *Options) +tVFS_Node *Root_InitDevice(char *Device, char **Options) { tRamFS_File *root; if(strcmp(Device, "root") != 0) { @@ -50,7 +55,7 @@ tVFS_Node *Root_InitDevice(char *Device, char *Options) = root->Node.MTime = root->Node.ATime = now(); root->Node.NumACLs = 3; - root->Node.ACLs = RootFS_ACLs; + root->Node.ACLs = RootFS_DirACLs; //root->Node.Close = Root_CloseFile; // Not Needed (It's a RAM Disk!) //root->Node.Relink = Root_RelinkRoot; // Not Needed (Why relink the root of the tree) @@ -62,21 +67,24 @@ tVFS_Node *Root_InitDevice(char *Device, char *Options) } /** - * \fn int Root_MkNod(tVFS_Node *Node, char *Name, Uint Flags) + * \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, char *Name, Uint Flags) +int Root_MkNod(tVFS_Node *Node, const char *Name, Uint Flags) { tRamFS_File *parent = Node->ImplPtr; tRamFS_File *child = parent->Data.FirstChild; tRamFS_File *prev = (tRamFS_File *) &parent->Data.FirstChild; - Log("Root_MkNod: (Node=%p, Name='%s', Flags=0x%x)", Node, Name, Flags); + ENTER("pNode sName xFlags", Node, Name, Flags); // Find last child, while we're at it, check for duplication for( ; child; prev = child, child = child->Next ) { - if(strcmp(child->Name, Name) == 0) return 0; + if(strcmp(child->Name, Name) == 0) { + LEAVE('i', 0); + return 0; + } } child = Root_int_AllocFile(); @@ -91,29 +99,37 @@ int Root_MkNod(tVFS_Node *Node, char *Name, Uint Flags) child->Node.ImplPtr = child; child->Node.Flags = Flags; - child->Node.NumACLs = 0; + child->Node.NumACLs = 3; child->Node.Size = 0; if(Flags & VFS_FFLAG_DIRECTORY) { + child->Node.ACLs = RootFS_DirACLs; child->Node.ReadDir = Root_ReadDir; child->Node.FindDir = Root_FindDir; child->Node.MkNod = Root_MkNod; } else { + if(Flags & VFS_FFLAG_SYMLINK) + child->Node.ACLs = RootFS_DirACLs; + else + child->Node.ACLs = RootFS_FileACLs; child->Node.Read = Root_Read; child->Node.Write = Root_Write; } prev->Next = child; + parent->Node.Size ++; + + LEAVE('i', 1); return 1; } /** - * \fn tVFS_Node *Root_FindDir(tVFS_Node *Node, char *Name) + * \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, char *Name) +tVFS_Node *Root_FindDir(tVFS_Node *Node, const char *Name) { tRamFS_File *parent = Node->ImplPtr; tRamFS_File *child = parent->Data.FirstChild; @@ -140,9 +156,9 @@ char *Root_ReadDir(tVFS_Node *Node, int Pos) for( ; child && Pos--; child = child->Next ) ; - if(Pos) return child->Name; + if(Pos) return strdup(child->Name); - return child->Name; + return NULL; } /** @@ -177,12 +193,12 @@ Uint64 Root_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) { void *tmp = realloc( file->Data.Bytes, Offset + Length ); if(tmp == NULL) { - Warning("Root_Write - Increasing buffer size failed\n"); + Warning("Root_Write - Increasing buffer size failed"); return -1; } file->Data.Bytes = tmp; Node->Size = Offset + Length; - Log(" Root_Write: Expanded buffer to %i bytes\n", Node->Size); + //LOG("Expanded buffer to %i bytes", Node->Size); } memcpy(file->Data.Bytes+Offset, Buffer, Length); @@ -191,10 +207,10 @@ Uint64 Root_Write(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer) } /** - * \fn tRamFS_File *Root_int_AllocFile() + * \fn tRamFS_File *Root_int_AllocFile(void) * \brief Allocates a file from the pool */ -tRamFS_File *Root_int_AllocFile() +tRamFS_File *Root_int_AllocFile(void) { int i; for( i = 0; i < MAX_FILES; i ++ )