xref: /titanic_50/usr/src/lib/libdll/common/dllopen.c (revision 34f9b3eef6fdadbda0a846aa4d68691ac40eace5)
1*34f9b3eeSRoland Mainz /***********************************************************************
2*34f9b3eeSRoland Mainz *                                                                      *
3*34f9b3eeSRoland Mainz *               This software is part of the ast package               *
4*34f9b3eeSRoland Mainz *          Copyright (c) 1997-2009 AT&T Intellectual Property          *
5*34f9b3eeSRoland Mainz *                      and is licensed under the                       *
6*34f9b3eeSRoland Mainz *                  Common Public License, Version 1.0                  *
7*34f9b3eeSRoland Mainz *                    by AT&T Intellectual Property                     *
8*34f9b3eeSRoland Mainz *                                                                      *
9*34f9b3eeSRoland Mainz *                A copy of the License is available at                 *
10*34f9b3eeSRoland Mainz *            http://www.opensource.org/licenses/cpl1.0.txt             *
11*34f9b3eeSRoland Mainz *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
12*34f9b3eeSRoland Mainz *                                                                      *
13*34f9b3eeSRoland Mainz *              Information and Software Systems Research               *
14*34f9b3eeSRoland Mainz *                            AT&T Research                             *
15*34f9b3eeSRoland Mainz *                           Florham Park NJ                            *
16*34f9b3eeSRoland Mainz *                                                                      *
17*34f9b3eeSRoland Mainz *                 Glenn Fowler <gsf@research.att.com>                  *
18*34f9b3eeSRoland Mainz *                                                                      *
19*34f9b3eeSRoland Mainz ***********************************************************************/
20*34f9b3eeSRoland Mainz #pragma prototyped
21*34f9b3eeSRoland Mainz /*
22*34f9b3eeSRoland Mainz  * Glenn Fowler
23*34f9b3eeSRoland Mainz  * at&t research
24*34f9b3eeSRoland Mainz  */
25*34f9b3eeSRoland Mainz 
26*34f9b3eeSRoland Mainz #include <ast.h>
27*34f9b3eeSRoland Mainz #include <dlldefs.h>
28*34f9b3eeSRoland Mainz #include <error.h>
29*34f9b3eeSRoland Mainz 
30*34f9b3eeSRoland Mainz #if 0
31*34f9b3eeSRoland Mainz 
32*34f9b3eeSRoland Mainz /*
33*34f9b3eeSRoland Mainz  * dlopen() wrapper that properly initializes LIBPATH
34*34f9b3eeSRoland Mainz  * with the path of the dll to be opened
35*34f9b3eeSRoland Mainz  *
36*34f9b3eeSRoland Mainz  * 2009-04-15 -- if ld.so re-checked the env this would work ...
37*34f9b3eeSRoland Mainz  */
38*34f9b3eeSRoland Mainz 
39*34f9b3eeSRoland Mainz void*
40*34f9b3eeSRoland Mainz dllopen(const char* name, int mode)
41*34f9b3eeSRoland Mainz {
42*34f9b3eeSRoland Mainz 	void*		dll;
43*34f9b3eeSRoland Mainz 	Dllinfo_t*	info;
44*34f9b3eeSRoland Mainz 	char*		olibpath;
45*34f9b3eeSRoland Mainz 	char*		path;
46*34f9b3eeSRoland Mainz 	char*		oenv;
47*34f9b3eeSRoland Mainz 	char*		nenv[2];
48*34f9b3eeSRoland Mainz 	char*		dir;
49*34f9b3eeSRoland Mainz 	char*		base;
50*34f9b3eeSRoland Mainz 	int		len;
51*34f9b3eeSRoland Mainz 
52*34f9b3eeSRoland Mainz 	if (!environ)
53*34f9b3eeSRoland Mainz 	{
54*34f9b3eeSRoland Mainz 		nenv[0] = nenv[1] = 0;
55*34f9b3eeSRoland Mainz 		environ = nenv;
56*34f9b3eeSRoland Mainz 	}
57*34f9b3eeSRoland Mainz 	info = dllinfo();
58*34f9b3eeSRoland Mainz 	oenv = environ[0];
59*34f9b3eeSRoland Mainz 	olibpath = getenv(info->env);
60*34f9b3eeSRoland Mainz 	if (base = strrchr(name, '/'))
61*34f9b3eeSRoland Mainz 	{
62*34f9b3eeSRoland Mainz 		dir = (char*)name;
63*34f9b3eeSRoland Mainz 		len = ++base - dir;
64*34f9b3eeSRoland Mainz 	}
65*34f9b3eeSRoland Mainz 	else
66*34f9b3eeSRoland Mainz 	{
67*34f9b3eeSRoland Mainz 		dir = "./";
68*34f9b3eeSRoland Mainz 		len = 2;
69*34f9b3eeSRoland Mainz 		base = (char*)name;
70*34f9b3eeSRoland Mainz 	}
71*34f9b3eeSRoland Mainz 	path = sfprints("%-.*s%s%c%s=%-.*s%s%s", len, dir, base, 0, info->env, len, dir, olibpath ? ":" : "", olibpath ? olibpath : "");
72*34f9b3eeSRoland Mainz 	environ[0] = path + strlen(path) + 1;
73*34f9b3eeSRoland Mainz 	dll = dlopen(path, mode);
74*34f9b3eeSRoland Mainz 	if (environ == nenv)
75*34f9b3eeSRoland Mainz 		environ = 0;
76*34f9b3eeSRoland Mainz 	else
77*34f9b3eeSRoland Mainz 		environ[0] = oenv;
78*34f9b3eeSRoland Mainz 	return dll;
79*34f9b3eeSRoland Mainz }
80*34f9b3eeSRoland Mainz 
81*34f9b3eeSRoland Mainz #else
82*34f9b3eeSRoland Mainz 
83*34f9b3eeSRoland Mainz /*
84*34f9b3eeSRoland Mainz  * dlopen() wrapper -- waiting for prestidigitaions
85*34f9b3eeSRoland Mainz  */
86*34f9b3eeSRoland Mainz 
87*34f9b3eeSRoland Mainz void*
88*34f9b3eeSRoland Mainz dllopen(const char* name, int mode)
89*34f9b3eeSRoland Mainz {
90*34f9b3eeSRoland Mainz 	return dlopen(name, mode);
91*34f9b3eeSRoland Mainz }
92*34f9b3eeSRoland Mainz 
93*34f9b3eeSRoland Mainz #endif
94