static nsresult LoadGtkModule(GnomeAccessibilityModule& aModule) { NS_ENSURE_ARG(aModule.libName); if (!(aModule.lib = PR_LoadLibrary(aModule.libName))) { MAI_LOG_DEBUG(("Fail to load lib: %s in default path\n", aModule.libName)); //try to load the module with "gtk-2.0/modules" appended char *curLibPath = PR_GetLibraryPath(); nsCAutoString libPath(curLibPath); #if defined(LINUX) && defined(__x86_64__) libPath.Append(":/usr/lib64:/usr/lib"); #else libPath.Append(":/usr/lib"); #endif MAI_LOG_DEBUG(("Current Lib path=%s\n", libPath.get())); PR_FreeLibraryName(curLibPath); PRInt16 loc1 = 0, loc2 = 0; PRInt16 subLen = 0; while (loc2 >= 0) { loc2 = libPath.FindChar(':', loc1); if (loc2 < 0) subLen = libPath.Length() - loc1; else subLen = loc2 - loc1; nsCAutoString sub(Substring(libPath, loc1, subLen)); sub.Append("/gtk-2.0/modules/"); sub.Append(aModule.libName); aModule.lib = PR_LoadLibrary(sub.get()); if (aModule.lib) { MAI_LOG_DEBUG(("Ok, load %s from %s\n", aModule.libName, sub.get())); break; } loc1 = loc2+1; } if (!aModule.lib) { MAI_LOG_DEBUG(("Fail to load %s\n", aModule.libName)); return NS_ERROR_FAILURE; } } //we have loaded the library, try to get the function ptrs if (!(aModule.init = PR_FindFunctionSymbol(aModule.lib, aModule.initName)) || !(aModule.shutdown = PR_FindFunctionSymbol(aModule.lib, aModule.shutdownName))) { //fail, :( MAI_LOG_DEBUG(("Fail to find symbol %s in %s", aModule.init ? aModule.shutdownName : aModule.initName, aModule.libName)); PR_UnloadLibrary(aModule.lib); aModule.lib = NULL; return NS_ERROR_FAILURE; } return NS_OK; }
OSErr NSGetSharedLibrary(Str255 inLibName, CFragConnectionID* outID, Ptr* outMainAddr) { char* curLibPath; char* freeCurLibPath; OSErr tempErr; Boolean recursive; FSSpec curFolder; GetSharedLibraryFilterProcData filterData; char *endCurLibPath; Boolean done; filterData.outFound = false; filterData.outID = (CFragConnectionID)(-1); filterData.outAddress = NULL; filterData.inName = inLibName; freeCurLibPath = curLibPath = PR_GetLibraryPath(); if (curLibPath == NULL) return (cfragNoLibraryErr); tempErr = cfragNoLibraryErr; do { endCurLibPath = PL_strchr(curLibPath, PR_PATH_SEPARATOR); done = (endCurLibPath == NULL); #if 0 // we overload the first character of a path if it's : // then we want to recursively search that path // see if path should be recursive if (*curLibPath == ':') { // ':' is an illegal character in the name of a file // if we start any path with this, we want to allow // search recursively curLibPath++; recursive = true; } else #endif { recursive = false; } if (!done) *endCurLibPath = '\0'; // NULL terminate the string // convert to FSSpec tempErr = ConvertUnixPathToFSSpec(curLibPath, &curFolder); // now look in this directory if (noErr == tempErr) { filterData.inRecursive = recursive; FSpIterateDirectory(&curFolder, recursive ? 0 : 1, &GetSharedLibraryFilterProc, &filterData); if (filterData.outFound) { *outID = filterData.outID; *outMainAddr = filterData.outAddress; tempErr = noErr; break; } else { tempErr = cfragNoLibraryErr; } } curLibPath = endCurLibPath + 1; // skip to next path (past the '\0'); } while (!done); free(freeCurLibPath); return (tempErr); }