Nativelib - Fix clang compilation issues
[tpg/acess2.git] / KernelLand / Kernel / drv / proc.c
index 4f52f5c..60bf4dd 100644 (file)
@@ -31,9 +31,9 @@ typedef struct sSysFS_Ent
  int   SysFS_RemoveFile(int ID);
 #endif
 
-char   *SysFS_Comm_ReadDir(tVFS_Node *Node, int Id);
-tVFS_Node      *SysFS_Comm_FindDir(tVFS_Node *Node, const char *Filename);
-size_t SysFS_Comm_ReadFile(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer);
+ int   SysFS_Comm_ReadDir(tVFS_Node *Node, int Id, char Dest[FILENAME_MAX]);
+tVFS_Node      *SysFS_Comm_FindDir(tVFS_Node *Node, const char *Filename, Uint Flags);
+size_t SysFS_Comm_ReadFile(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags);
 void   SysFS_Comm_CloseFile(tVFS_Node *Node);
 
 // === GLOBALS ===
@@ -50,9 +50,8 @@ tVFS_NodeType gSysFS_DirNodeType = {
        .FindDir = SysFS_Comm_FindDir
        };
 tSysFS_Ent     gSysFS_Version_Kernel = {
-       NULL, NULL,     // Nexts
-       &gSysFS_Version,        // Parent
-       {
+       .Parent = &gSysFS_Version,      // Parent
+       .Node = {
                .Inode = 1,     // File #1
                .ImplPtr = NULL,
                .ImplInt = (Uint)&gSysFS_Version_Kernel,        // Self-Link
@@ -61,12 +60,11 @@ tSysFS_Ent  gSysFS_Version_Kernel = {
                .ACLs = &gVFS_ACL_EveryoneRO,
                .Type = &gSysFS_FileNodeType
        },
-       "Kernel"
+       .Name = {"Kernel"}
 };
 tSysFS_Ent     gSysFS_Version = {
-       NULL, NULL,
-       &gSysFS_Root,
-       {
+       .Parent = &gSysFS_Root,
+       .Node = {
                .Size = 1,
                .ImplPtr = &gSysFS_Version_Kernel,
                .ImplInt = (Uint)&gSysFS_Version,       // Self-Link
@@ -75,7 +73,7 @@ tSysFS_Ent    gSysFS_Version = {
                .Flags = VFS_FFLAG_DIRECTORY,
                .Type = &gSysFS_DirNodeType
        },
-       "Version"
+       .Name = {"Version"}
 };
 // Root of the SysFS tree (just used to keep the code clean)
 tSysFS_Ent     gSysFS_Root = {
@@ -86,7 +84,7 @@ tSysFS_Ent    gSysFS_Root = {
                .ImplPtr = &gSysFS_Version,
                .ImplInt = (Uint)&gSysFS_Root   // Self-Link
        },
-       "/"
+       {"/"}
 };
 tDevFS_Driver  gSysFS_DriverInfo = {
        NULL, "system",
@@ -109,12 +107,8 @@ tSysFS_Ent *gSysFS_FileList;
  */
 int SysFS_Install(char **Options)
 {
-       {
-               const char      *fmt = "Acess2 "EXPAND_STR(KERNEL_VERSION)" "EXPAND_STR(ARCHDIR)" build %i, hash %s";
-               gSysFS_Version_Kernel.Node.Size = sprintf(NULL, fmt, BUILD_NUM, gsGitHash);
-               gSysFS_Version_Kernel.Node.ImplPtr = malloc( gSysFS_Version_Kernel.Node.Size + 1 );
-               sprintf(gSysFS_Version_Kernel.Node.ImplPtr, fmt, BUILD_NUM, gsGitHash);
-       }
+       gSysFS_Version_Kernel.Node.Size = strlen(gsBuildInfo);
+       gSysFS_Version_Kernel.Node.ImplPtr = (void*)gsBuildInfo;
 
        DevFS_AddDevice( &gSysFS_DriverInfo );
        return MODULE_ERR_OK;
@@ -154,6 +148,10 @@ int SysFS_RegisterFile(const char *Path, const char *Data, int Length)
                if( !child )
                {
                        child = calloc( 1, sizeof(tSysFS_Ent)+tmp+1 );
+                       if( !child ) {
+                               Log_Error("SysFS", "calloc(%i) failure", sizeof(tSysFS_Ent)+tmp+1);
+                               return -1;
+                       }
                        child->Next = NULL;
                        memcpy(child->Name, &Path[start], tmp);
                        child->Name[tmp] = '\0';
@@ -178,7 +176,8 @@ int SysFS_RegisterFile(const char *Path, const char *Data, int Length)
                                ent->Node.Size ++;
                        else
                                gSysFS_DriverInfo.RootNode.Size ++;
-                       Log_Log("SysFS", "Added directory '%s'", child->Name);
+                       Log_Log("SysFS", "Added directory '%.*s'", tmp, &Path[start]);
+                       Log_Log("SysFS", "Added directory '%.*s'", tmp, child->Name);
                }
                
                ent = child;
@@ -201,7 +200,7 @@ int SysFS_RegisterFile(const char *Path, const char *Data, int Length)
                        break;
        }
        if( child ) {
-               Log_Warning("SysFS", "'%s' is taken (in '%s')\n", &Path[start], Path);
+               Log_Warning("SysFS", "'%s' is taken (in '%s')", &Path[start], Path);
                return 0;
        }
        
@@ -254,8 +253,9 @@ int SysFS_UpdateFile(int ID, const char *Data, int Length)
        for( ent = gSysFS_FileList; ent; ent = ent->Next )
        {
                // It's a reverse sorted list
-               if(ent->Node.Inode < ID)        return 0;
-               if(ent->Node.Inode == ID)
+               if(ent->Node.Inode < (Uint64)ID)
+                       return 0;
+               if(ent->Node.Inode == (Uint64)ID)
                {
                        ent->Node.ImplPtr = (void*)Data;
                        ent->Node.Size = Length;
@@ -279,14 +279,15 @@ int SysFS_RemoveFile(int ID)
        tSysFS_Ent      *ent, *parent, *prev;
        
        prev = NULL;
-       for( ent = gSysFS_FileList; ent; prev = ent, ent = ent->Next )
+       for( ent = gSysFS_FileList; ent; prev = ent, ent = ent->ListNext )
        {
                // It's a reverse sorted list
-               if(ent->Node.Inode < ID)        return 0;
-               if(ent->Node.Inode == ID)       break;
+               if(ent->Node.Inode <= (Uint64)ID)       break;
+       }
+       if( !ent || ent->Node.Inode != (Uint64)ID) {
+               Log_Notice("SysFS", "ID %i not present", ID);
+               return 0;
        }
-       
-       if(!ent)        return 0;
        
        // Set up for next part
        file = ent;
@@ -300,26 +301,37 @@ int SysFS_RemoveFile(int ID)
        file->Node.Size = 0;
        file->Node.ImplPtr = NULL;
        
-       // Search parent directory
-       for( ent = parent->Node.ImplPtr; ent; prev = ent, ent = ent->Next )
+       // Clean out of parent directory
+       while(parent)
        {
-               if( ent == file )       break;
-       }
-       if(!ent) {
-               Log_Warning("SysFS", "Bookkeeping Error: File in list, but not in directory");
-               return 0;
+               for( ent = parent->Node.ImplPtr; ent; prev = ent, ent = ent->Next )
+               {
+                       if( ent == file )       break;
+               }
+               if(!ent) {
+                       Log_Warning("SysFS", "Bookkeeping Error: File in list, but not in directory");
+                       return 0;
+               }
+               
+               // Remove from parent directory
+               if(prev)
+                       prev->Next = ent->Next;
+               else
+                       parent->Node.ImplPtr = ent->Next;
+
+               // Free if not in use
+               if(file->Node.ReferenceCount == 0) {
+                       free(file);
+               }
+
+               if( parent->Node.ImplPtr )
+                       break;
+
+               // Remove parent from the tree
+               file = parent;
+               parent = parent->Parent;
        }
        
-       // Remove from parent directory
-       if(prev)
-               prev->Next = ent->Next;
-       else
-               parent->Node.ImplPtr = ent->Next;
-       
-       // Free if not in use
-       if(file->Node.ReferenceCount == 0)
-               free(file);
-       
        return 1;
 }
 
@@ -327,23 +339,27 @@ int SysFS_RemoveFile(int ID)
  * \fn char *SysFS_Comm_ReadDir(tVFS_Node *Node, int Pos)
  * \brief Reads from a SysFS directory
  */
-char *SysFS_Comm_ReadDir(tVFS_Node *Node, int Pos)
+int SysFS_Comm_ReadDir(tVFS_Node *Node, int Pos, char Dest[FILENAME_MAX])
 {
        tSysFS_Ent      *child = (tSysFS_Ent*)Node->ImplPtr;
-       if(Pos < 0 || Pos >= Node->Size)        return NULL;
+       if(Pos < 0 || (Uint64)Pos >= Node->Size)
+               return -EINVAL;
        
        for( ; child; child = child->Next, Pos-- )
        {
-               if( Pos == 0 )  return strdup(child->Name);
+               if( Pos == 0 ) {
+                       strncpy(Dest, child->Name, FILENAME_MAX);
+                       return 0;
+               }
        }
-       return NULL;
+       return -ENOENT;
 }
 
 /**
  * \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, const char *Filename)
+tVFS_Node *SysFS_Comm_FindDir(tVFS_Node *Node, const char *Filename, Uint Flags)
 {
        tSysFS_Ent      *child = (tSysFS_Ent*)Node->ImplPtr;
        
@@ -359,7 +375,7 @@ tVFS_Node *SysFS_Comm_FindDir(tVFS_Node *Node, const char *Filename)
 /**
  * \brief Read from an exposed buffer
  */
-size_t SysFS_Comm_ReadFile(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer)
+size_t SysFS_Comm_ReadFile(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags)
 {
        if( Offset > Node->Size )       return -1;
        if( Length > Node->Size )       Length = Node->Size;

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