1da2e3ebdSchin /*********************************************************************** 2da2e3ebdSchin * * 3da2e3ebdSchin * This software is part of the ast package * 4*34f9b3eeSRoland Mainz * Copyright (c) 1997-2009 AT&T Intellectual Property * 5da2e3ebdSchin * and is licensed under the * 6da2e3ebdSchin * Common Public License, Version 1.0 * 77c2fbfb3SApril Chin * by AT&T Intellectual Property * 8da2e3ebdSchin * * 9da2e3ebdSchin * A copy of the License is available at * 10da2e3ebdSchin * http://www.opensource.org/licenses/cpl1.0.txt * 11da2e3ebdSchin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 12da2e3ebdSchin * * 13da2e3ebdSchin * Information and Software Systems Research * 14da2e3ebdSchin * AT&T Research * 15da2e3ebdSchin * Florham Park NJ * 16da2e3ebdSchin * * 17da2e3ebdSchin * Glenn Fowler <gsf@research.att.com> * 18da2e3ebdSchin * * 19da2e3ebdSchin ***********************************************************************/ 20da2e3ebdSchin #pragma prototyped 21da2e3ebdSchin /* 22da2e3ebdSchin * Glenn Fowler 23da2e3ebdSchin * AT&T Research 24da2e3ebdSchin */ 25da2e3ebdSchin 26da2e3ebdSchin #include <ast.h> 27da2e3ebdSchin #include <dlldefs.h> 28da2e3ebdSchin #include <error.h> 29da2e3ebdSchin 30da2e3ebdSchin /* 31da2e3ebdSchin * find and load lib plugin/module library name with optional version ver and dlopen() flags 32da2e3ebdSchin * at least one dlopen() is called to initialize dlerror() 33da2e3ebdSchin * if path!=0 then library path up to size chars copied to path with trailing 0 34da2e3ebdSchin * if name contains a directory prefix then library search is limited to the dir and siblings 35da2e3ebdSchin */ 36da2e3ebdSchin 37da2e3ebdSchin extern void* 38da2e3ebdSchin dllplug(const char* lib, const char* name, const char* ver, int flags, char* path, size_t size) 39da2e3ebdSchin { 40da2e3ebdSchin void* dll; 41da2e3ebdSchin int hit; 42da2e3ebdSchin Dllscan_t* dls; 43da2e3ebdSchin Dllent_t* dle; 44da2e3ebdSchin 45da2e3ebdSchin hit = 0; 46da2e3ebdSchin for (;;) 47da2e3ebdSchin { 48da2e3ebdSchin if (dls = dllsopen(lib, name, ver)) 49da2e3ebdSchin { 50da2e3ebdSchin while (dle = dllsread(dls)) 51da2e3ebdSchin { 52da2e3ebdSchin hit = 1; 53*34f9b3eeSRoland Mainz if (dll = dllopen(dle->path, flags|RTLD_GLOBAL|RTLD_PARENT)) 54da2e3ebdSchin { 55da2e3ebdSchin if (path && size) 56da2e3ebdSchin strncopy(path, dle->path, size); 57da2e3ebdSchin break; 58da2e3ebdSchin } 59da2e3ebdSchin else 60da2e3ebdSchin errorf("dll", NiL, 1, "%s: dlopen failed: %s", dle->path, dlerror()); 61da2e3ebdSchin } 62da2e3ebdSchin dllsclose(dls); 63da2e3ebdSchin } 64da2e3ebdSchin if (hit) 65da2e3ebdSchin return dll; 66da2e3ebdSchin if (!lib) 67da2e3ebdSchin break; 68da2e3ebdSchin lib = 0; 69da2e3ebdSchin } 70*34f9b3eeSRoland Mainz if ((dll = dllopen(name, flags)) && dll && path && size) 71da2e3ebdSchin strncopy(path, name, size); 72da2e3ebdSchin return dll; 73da2e3ebdSchin } 74