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