struct sSysFS_Ent *Next;
struct sSysFS_Ent *ListNext;
struct sSysFS_Ent *Parent;
- char *Name;
tVFS_Node Node;
+ char Name[];
} tSysFS_Ent;
// === PROTOTYPES ===
int SysFS_Install(char **Arguments);
int SysFS_IOCtl(tVFS_Node *Node, int Id, void *Data);
- int SysFS_RegisterFile(char *Path, char *Data, int Length);
- int SysFS_UpdateFile(int ID, char *Data, int Length);
+#if 0
+ int SysFS_RegisterFile(const char *Path, const char *Data, int Length);
+ int SysFS_UpdateFile(int ID, const char *Data, int Length);
int SysFS_RemoveFile(int ID);
+#endif
char *SysFS_Comm_ReadDir(tVFS_Node *Node, int Id);
-tVFS_Node *SysFS_Comm_FindDir(tVFS_Node *Node, char *Filename);
+tVFS_Node *SysFS_Comm_FindDir(tVFS_Node *Node, const char *Filename);
Uint64 SysFS_Comm_ReadFile(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer);
void SysFS_Comm_CloseFile(tVFS_Node *Node);
tSysFS_Ent gSysFS_Version_Kernel = {
NULL, NULL, // Nexts
&gSysFS_Version, // Parent
- "Kernel",
{
.Inode = 1, // File #1
- .ImplPtr = KERNEL_VERSION_STRING,
+ .ImplPtr = (void*)KERNEL_VERSION_STRING,
.ImplInt = (Uint)&gSysFS_Version_Kernel, // Self-Link
.Size = sizeof(KERNEL_VERSION_STRING)-1,
.NumACLs = 1,
.ACLs = &gVFS_ACL_EveryoneRO,
.Read = SysFS_Comm_ReadFile
- }
+ },
+ "Kernel"
};
tSysFS_Ent gSysFS_Version = {
NULL, NULL,
&gSysFS_Root,
- "Version",
{
.Size = 1,
.ImplPtr = &gSysFS_Version_Kernel,
.Flags = VFS_FFLAG_DIRECTORY,
.ReadDir = SysFS_Comm_ReadDir,
.FindDir = SysFS_Comm_FindDir
- }
+ },
+ "Version"
};
-// Root of the SysFS tree (just used for clean code)
+// Root of the SysFS tree (just used to keep the code clean)
tSysFS_Ent gSysFS_Root = {
NULL, NULL,
NULL,
- "/",
{
.Size = 1,
.ImplPtr = &gSysFS_Version,
.ImplInt = (Uint)&gSysFS_Root // Self-Link
- // .NumACLs = 1,
- // .ACLs = &gVFS_ACL_EveryoneRX,
- // .Flags = VFS_FFLAG_DIRECTORY,
- // .ReadDir = SysFS_Comm_ReadDir,
- // .FindDir = SysFS_Comm_FindDir
- }
+ },
+ "/"
};
tDevFS_Driver gSysFS_DriverInfo = {
NULL, "system",
int SysFS_Install(char **Options)
{
DevFS_AddDevice( &gSysFS_DriverInfo );
- return MODULE_INIT_SUCCESS;
+ return MODULE_ERR_OK;
}
/**
* \param Length Length of the data buffer
* \return The file's identifier
*/
-int SysFS_RegisterFile(char *Path, char *Data, int Length)
+int SysFS_RegisterFile(const char *Path, const char *Data, int Length)
{
int start = 0;
int tmp;
// Need a new directory?
if( !child )
{
- child = calloc( 1, sizeof(tSysFS_Ent) );
+ child = calloc( 1, sizeof(tSysFS_Ent)+tmp+1 );
child->Next = NULL;
- child->Name = malloc(tmp+1);
memcpy(child->Name, &Path[start], tmp);
child->Name[tmp] = '\0';
child->Parent = ent;
child->Node.ReadDir = SysFS_Comm_ReadDir;
child->Node.FindDir = SysFS_Comm_FindDir;
if( !prev ) {
- //if(ent)
+ if(ent)
ent->Node.ImplPtr = child;
- //else
- // gSysFS_DriverInfo.RootNode.ImplPtr = child;
+ else
+ gSysFS_DriverInfo.RootNode.ImplPtr = child;
// ^^^ Impossible (There is already /Version)
}
else
ent->Node.Size ++;
else
gSysFS_DriverInfo.RootNode.Size ++;
- Log("[SYSFS] Added directory '%s'", child->Name);
+ Log_Log("SysFS", "Added directory '%s'", child->Name);
}
ent = child;
child = ent->Node.ImplPtr;
else
child = gSysFS_DriverInfo.RootNode.ImplPtr;
- for( child = ent->Node.ImplPtr; child; prev = child, child = child->Next )
+ for( ; child; child = child->Next )
{
if( strcmp( &Path[start], child->Name ) == 0 )
break;
}
if( child ) {
- Warning("[SYSFS] '%s' is taken (in '%s')\n", &Path[start], Path);
+ Log_Warning("SysFS", "'%s' is taken (in '%s')\n", &Path[start], Path);
return 0;
}
// Create new node
- child = calloc( 1, sizeof(tSysFS_Ent) );
+ child = calloc( 1, sizeof(tSysFS_Ent)+strlen(&Path[start])+1 );
child->Next = NULL;
- child->Name = strdup(&Path[start]);
+ strcpy(child->Name, &Path[start]);
child->Parent = ent;
child->Node.Inode = giSysFS_NextFileID++;
- child->Node.ImplPtr = Data;
+ child->Node.ImplPtr = (void*)Data;
child->Node.ImplInt = (Uint)child; // Uplink
child->Node.Size = Length;
child->Node.NumACLs = 1;
child->ListNext = gSysFS_FileList;
gSysFS_FileList = child;
- Log("[SYSFS] Added '%s' (%p)", Path, Data);
+ Log_Log("SysFS", "Added '%s' (%p)", Path, Data);
return child->Node.Inode;
}
* \param Length Length of the data buffer
* \return Boolean Success
*/
-int SysFS_UpdateFile(int ID, char *Data, int Length)
+int SysFS_UpdateFile(int ID, const char *Data, int Length)
{
tSysFS_Ent *ent;
if(ent->Node.Inode < ID) return 0;
if(ent->Node.Inode == ID)
{
- ent->Node.ImplPtr = Data;
+ ent->Node.ImplPtr = (void*)Data;
ent->Node.Size = Length;
return 1;
}
parent = file->Parent;
// Remove from file list
- prev->ListNext = file->ListNext;
+ if(prev)
+ prev->ListNext = file->ListNext;
+ else
+ gSysFS_FileList = file->ListNext;
file->Node.Size = 0;
file->Node.ImplPtr = NULL;
if( ent == file ) break;
}
if(!ent) {
- Warning("[SYSFS] Bookkeeping Error: File in list, but not in directory");
+ Log_Warning("SysFS", "Bookkeeping Error: File in list, but not in directory");
return 0;
}
// Remove from parent directory
- prev->Next = ent->Next;
+ if(prev)
+ prev->Next = ent->Next;
+ else
+ parent->Node.ImplPtr = ent->Next;
// Free if not in use
if(file->Node.ReferenceCount == 0)
}
/**
- * \fn tVFS_Node *SysFS_Comm_FindDir(tVFS_Node *Node, char *Filename)
+ * \fn tVFS_Node *SysFS_Comm_FindDir(tVFS_Node *Node, const char *Filename)
* \brief Find a file in a SysFS directory
*/
-tVFS_Node *SysFS_Comm_FindDir(tVFS_Node *Node, char *Filename)
+tVFS_Node *SysFS_Comm_FindDir(tVFS_Node *Node, const char *Filename)
{
tSysFS_Ent *child = (tSysFS_Ent*)Node->ImplPtr;