* Acess2
* Common Binary Loader
*/
-#define DEBUG 1
+#define DEBUG 0
#include <acess.h>
#include <binary.h>
#include <mm_virt.h>
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);
/**
* \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;
*/
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;
* \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;
}
// --- Get argc
- for( argc = 0; ArgV && ArgV[argc]; argc ++ );
+ for( argc = 0; ArgV && ArgV[argc]; argc ++ )
+ ;
// --- Set Process Name
Threads_SetName(File);
// --- 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;
- handles = VFS_SaveHandles(nfd, NULL);
- VFS_CloseAllUserHandles();
+ // MM_ClearUser should preserve handles
MM_ClearUser();
- VFS_RestoreHandles(nfd, handles);
- VFS_FreeSavedHandles(nfd, handles);
+ // - NOTE: Not a reliable test, but helps for now
+ ASSERTC( VFS_IOCtl(0, 0, NULL), !=, -1 );
}
// --- Load new binary
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(;;);
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;
}
*/
Uint Binary_GetSymbolEx(const char *Name, Uint *Value)
{
- int i;
tKernelBin *pKBin;
int numKSyms = ((Uint)&gKernelSymbolsEnd-(Uint)&gKernelSymbols)/sizeof(tKernelSymbol);
- LOG("numKSyms = %i", numKSyms);
-
// Scan Kernel
- for( i = 0; i < numKSyms; i++ )
+ for( int i = 0; i < numKSyms; i++ )
{
- LOG("KSym %s = %p", gKernelSymbols[i].Name, gKernelSymbols[i].Value);
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;