Cleanups & Implementations to allow IPStack to compile
[tpg/acess2.git] / Usermode / Libraries / ld-acess.so_src / loadlib.c
index 267555d..b5fb0a1 100644 (file)
 # define DEBUGS(v...)  \r
 #endif\r
 \r
+// === CONSTANTS ===\r
+#define        MAX_LOADED_LIBRARIES    64\r
+#define        MAX_STRINGS_BYTES       4096\r
+#define        SYSTEM_LIB_DIR  "/Acess/Libs/"\r
+\r
 // === PROTOTYPES ===\r
 Uint   IsFileLoaded(char *file);
  int   GetSymbolFromBase(Uint base, char *name, Uint *ret);\r
 \r
 // === GLOABLS ===\r
-#define        MAX_LOADED_LIBRARIES    64\r
-#define        MAX_STRINGS_BYTES       4096\r
 struct {\r
        Uint    Base;\r
        char    *Name;\r
@@ -28,23 +31,48 @@ char        *gsNextAvailString = gsLoadedStrings;
 //tLoadLib     *gpLoadedLibraries = NULL;\r
 \r
 // === CODE ===\r
-Uint LoadLibrary(char *filename, char *SearchDir, char **envp)\r
+char *FindLibrary(char *DestBuf, char *SoName, char *ExtraSearchDir)\r
+{      \r
+       // -- #1: Executable Specified\r
+       if(ExtraSearchDir)\r
+       {\r
+               strcpy(DestBuf, ExtraSearchDir);\r
+               strcat(DestBuf, "/");\r
+               strcat(DestBuf, SoName);\r
+               if(file_exists(DestBuf))        return DestBuf;\r
+       }\r
+       \r
+       // -- #2: System\r
+       strcpy(DestBuf, SYSTEM_LIB_DIR);\r
+       strcat(DestBuf, SoName);\r
+       if(file_exists(DestBuf))        return DestBuf;\r
+       \r
+       // -- #3: Current Directory\r
+       if(file_exists(SoName)) return SoName;\r
+       \r
+       return NULL;\r
+}\r
+\r
+/**\r
+ */\r
+Uint LoadLibrary(char *SoName, char *SearchDir, char **envp)\r
 {\r
-       char    sTmpName[1024] = "/Acess/Libs/";\r
+       char    sTmpName[1024];\r
+       char    *filename;\r
        Uint    iArg;\r
        void    (*fEntry)(int, int, char *[], char**);\r
        \r
        DEBUGS("LoadLibrary: (filename='%s', envp=0x%x)\n", filename, envp);\r
        \r
        // Create Temp Name\r
-       strcpy(&sTmpName[12], filename);\r
-       DEBUGS(" LoadLibrary: sTmpName='%s'\n", sTmpName);\r
+       filename = FindLibrary(sTmpName, SoName, SearchDir);\r
+       DEBUGS(" LoadLibrary: filename='%s'\n", filename);\r
        \r
-       if( (iArg = IsFileLoaded(sTmpName)) )\r
+       if( (iArg = IsFileLoaded(filename)) )\r
                return iArg;\r
        \r
        // Load Library\r
-       iArg = SysLoadBin(sTmpName, (Uint*)&fEntry);\r
+       iArg = SysLoadBin(filename, (Uint*)&fEntry);\r
        if(iArg == 0) {\r
                DEBUGS("LoadLibrary: RETURN 0\n");\r
                return 0;\r
@@ -53,10 +81,10 @@ Uint LoadLibrary(char *filename, char *SearchDir, char **envp)
        DEBUGS(" LoadLibrary: iArg=0x%x, iEntry=0x%x\n", iArg, fEntry);\r
        \r
        // Load Symbols\r
-       fEntry = (void*)DoRelocate( iArg, envp, sTmpName );\r
+       fEntry = (void*)DoRelocate( iArg, envp, filename );\r
        \r
        // Call Entrypoint\r
-       DEBUGS(" LoadLibrary: '%s' Entry 0x%x\n", filename, fEntry);\r
+       DEBUGS(" LoadLibrary: '%s' Entry 0x%x\n", SoName, fEntry);\r
        fEntry(iArg, 0, NULL, envp);\r
        \r
        DEBUGS("LoadLibrary: RETURN 1\n");\r
@@ -70,16 +98,17 @@ Uint LoadLibrary(char *filename, char *SearchDir, char **envp)
 Uint IsFileLoaded(char *file)\r
 {\r
         int    i;\r
-       DEBUGS("IsFileLoaded: (file='%s')\n", file);\r
+       DEBUGS("IsFileLoaded: (file='%s')", file);\r
        for( i = 0; i < MAX_LOADED_LIBRARIES; i++ )\r
        {\r
                if(gLoadedLibraries[i].Base == 0)       break;  // Last entry has Base set to NULL\r
+               DEBUGS(" strcmp('%s', '%s')", gLoadedLibraries[i].Name, file);\r
                if(strcmp(gLoadedLibraries[i].Name, file) == 0) {\r
-                       DEBUGS("IsFileLoaded: Found %i (0x%x)\n", i, gLoadedLibraries[i].Base);\r
+                       DEBUGS("IsFileLoaded: Found %i (0x%x)", i, gLoadedLibraries[i].Base);\r
                        return gLoadedLibraries[i].Base;\r
                }\r
        }\r
-       DEBUGS("IsFileLoaded: Not Found\n");\r
+       DEBUGS("IsFileLoaded: Not Found");\r
        return 0;\r
 }\r
 \r
@@ -169,8 +198,10 @@ Uint GetSymbol(char *name)
        Uint    ret;\r
        for(i=0;i<sizeof(gLoadedLibraries)/sizeof(gLoadedLibraries[0]);i++)\r
        {\r
-               if(gLoadedLibraries[i].Base == 0)       break;
-//             SysDebug(" GetSymbol: Trying 0x%x\n", gLoadedLibraries[i]);
+               if(gLoadedLibraries[i].Base == 0)       break;\r
+               
+               //SysDebug(" GetSymbol: Trying 0x%x, '%s'\n",\r
+               //      gLoadedLibraries[i].Base, gLoadedLibraries[i].Name);
                if(GetSymbolFromBase(gLoadedLibraries[i].Base, name, &ret))     return ret;\r
        }\r
        SysDebug("GetSymbol: === Symbol '%s' not found ===\n", name);\r

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