Kernel/binary - Emit warning when interpreter can't be loaded
[tpg/acess2.git] / KernelLand / Kernel / binary.c
index de94c6f..507b45f 100644 (file)
@@ -31,7 +31,8 @@ extern tKernelSymbol  gKernelSymbolsEnd[];
 extern tBinaryType     gELF_Info;
 
 // === PROTOTYPES ===
- int   Binary_int_CacheArgs(const char **Path, const char ***ArgV, const char ***EnvP, void *DestBuffer);
+size_t Binary_int_CacheArgs(const char **Path, const char ***ArgV, const char ***EnvP, void *DestBuffer);
+ int   Proc_int_Execve(const char *File, const char **ArgV, const char **EnvP, int DataSize, bool bClearUser);
 tVAddr Binary_Load(const char *Path, tVAddr *EntryPoint);
 tBinary        *Binary_GetInfo(tMount MountID, tInode InodeID);
 tVAddr Binary_MapIn(tBinary *Binary, const char *Path, tVAddr LoadMin, tVAddr LoadMax);
@@ -94,9 +95,10 @@ int Proc_Spawn(const char *Path)
 /**
  * \todo Document
  */
-int Binary_int_CacheArgs(const char **Path, const char ***ArgV, const char ***EnvP, void *DestBuffer)
+size_t Binary_int_CacheArgs(const char **Path, const char ***ArgV, const char ***EnvP, void *DestBuffer)
 {
-        int    size, argc=0, envc=0;
+       size_t  size;
+        int    argc=0, envc=0;
         int    i;
        char    *strbuf;
        const char      **arrays;
@@ -171,32 +173,29 @@ int Binary_int_CacheArgs(const char **Path, const char ***ArgV, const char ***En
  */
 int Proc_SysSpawn(const char *Binary, const char **ArgV, const char **EnvP, int nFD, int *FDs)
 {
-       void    *handles;
-       void    *cachebuf;
-        int    size;
-       tPID    ret;
        
        // --- Save File, ArgV and EnvP
-       size = Binary_int_CacheArgs( &Binary, &ArgV, &EnvP, NULL );
-       cachebuf = malloc( size );
+       size_t size = Binary_int_CacheArgs( &Binary, &ArgV, &EnvP, NULL );
+       void *cachebuf = malloc( size );
        Binary_int_CacheArgs( &Binary, &ArgV, &EnvP, cachebuf );
 
        // Cache the VFS handles        
-       handles = VFS_SaveHandles(nFD, FDs);
+       void *handles = VFS_SaveHandles(nFD, FDs);
 
        // Create new process   
-       ret = Proc_Clone(CLONE_VM|CLONE_NOUSER);
+       tPID ret = Proc_Clone(CLONE_VM|CLONE_NOUSER);
        if( ret == 0 )
        {
                VFS_RestoreHandles(nFD, handles);
                VFS_FreeSavedHandles(nFD, handles);
                // Frees cachebuf
-               Proc_Execve(Binary, ArgV, EnvP, size);
+               Proc_int_Execve(Binary, ArgV, EnvP, size, 0);
                for(;;);
        }
-       if( ret < 0 )
+       if( ret == -1 )
        {
                VFS_FreeSavedHandles(nFD, handles);
+               free(cachebuf);
        }
        
        return ret;
@@ -210,6 +209,11 @@ int Proc_SysSpawn(const char *Binary, const char **ArgV, const char **EnvP, int
  * \note Called Proc_ for historical reasons
  */
 int Proc_Execve(const char *File, const char **ArgV, const char **EnvP, int DataSize)
+{
+       return Proc_int_Execve(File, ArgV, EnvP, DataSize, 1);
+}
+
+int Proc_int_Execve(const char *File, const char **ArgV, const char **EnvP, int DataSize, bool bClearUser)
 {
        void    *cachebuf;
        tVAddr  entry;
@@ -235,6 +239,7 @@ int Proc_Execve(const char *File, const char **ArgV, const char **EnvP, int Data
        // --- Clear User Address space
        // NOTE: This is a little roundabout, maybe telling ClearUser to not touch the
        //       PPD area would be a better idea.
+       if( bClearUser )
        {
                 int    nfd = *Threads_GetMaxFD();
                void    *handles;
@@ -249,7 +254,7 @@ int Proc_Execve(const char *File, const char **ArgV, const char **EnvP, int Data
        base = Binary_Load(File, &entry);
        if(base == 0)
        {
-               Log_Warning("Binary", "Proc_Execve - Unable to load '%s'", File);
+               Log_Warning("Binary", "Proc_Execve - Unable to load '%s' [errno=%i]", File, errno);
                LEAVE('-');
                Threads_Exit(0, -10);
                for(;;);
@@ -329,6 +334,8 @@ tVAddr Binary_Load(const char *Path, tVAddr *EntryPoint)
        if(pBinary->Interpreter) {
                tVAddr  start;
                if( Binary_Load(pBinary->Interpreter, &start) == 0 ) {
+                       Log_Error("Binary", "Can't load interpeter '%s' for '%s'",
+                               pBinary->Interpreter, Path);
                        LEAVE('x', 0);
                        return 0;
                }
@@ -818,19 +825,20 @@ int Binary_GetSymbol(const char *Name, Uint *Val)
  */
 Uint Binary_GetSymbolEx(const char *Name, Uint *Value)
 {
-        int    i;
        tKernelBin      *pKBin;
         int    numKSyms = ((Uint)&gKernelSymbolsEnd-(Uint)&gKernelSymbols)/sizeof(tKernelSymbol);
        
        // Scan Kernel
-       for( i = 0; i < numKSyms; i++ )
+       for( int i = 0; i < numKSyms; i++ )
        {
                if(strcmp(Name, gKernelSymbols[i].Name) == 0) {
+                       LOG("KSym %s = %p", gKernelSymbols[i].Name, gKernelSymbols[i].Value);
                        *Value = gKernelSymbols[i].Value;
                        return 1;
                }
        }
        
+       
        // Scan Loaded Libraries
        for(pKBin = glLoadedKernelLibs;
                pKBin;

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