Kernel - VFS API Update - ReadDir caller provided buffer
[tpg/acess2.git] / KernelLand / Kernel / drv / proc.c
index 73f4535..1e0c6bd 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);
+ int   SysFS_Comm_ReadDir(tVFS_Node *Node, int Id, char Dest[FILENAME_MAX]);
 tVFS_Node      *SysFS_Comm_FindDir(tVFS_Node *Node, const char *Filename);
-Uint64 SysFS_Comm_ReadFile(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer);
+size_t SysFS_Comm_ReadFile(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer);
 void   SysFS_Comm_CloseFile(tVFS_Node *Node);
 
 // === GLOBALS ===
@@ -109,12 +109,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;
@@ -254,8 +250,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;
@@ -282,8 +279,8 @@ int SysFS_RemoveFile(int ID)
        for( ent = gSysFS_FileList; ent; prev = ent, ent = ent->Next )
        {
                // 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)        return 0;
+               if(ent->Node.Inode == (Uint64)ID)       break;
        }
        
        if(!ent)        return 0;
@@ -327,16 +324,20 @@ 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;
 }
 
 /**
@@ -357,10 +358,9 @@ tVFS_Node *SysFS_Comm_FindDir(tVFS_Node *Node, const char *Filename)
 }
 
 /**
- * \fn Uint64 SysFS_Comm_ReadFile(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
  * \brief Read from an exposed buffer
  */
-Uint64 SysFS_Comm_ReadFile(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer)
+size_t SysFS_Comm_ReadFile(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer)
 {
        if( Offset > Node->Size )       return -1;
        if( Length > Node->Size )       Length = Node->Size;

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