xref: /onnv-gate/usr/src/lib/libdll/common/dllopen.c (revision 12068:08a39a083754)
110898Sroland.mainz@nrubsig.org /***********************************************************************
210898Sroland.mainz@nrubsig.org *                                                                      *
310898Sroland.mainz@nrubsig.org *               This software is part of the ast package               *
4*12068SRoger.Faulkner@Oracle.COM *          Copyright (c) 1997-2010 AT&T Intellectual Property          *
510898Sroland.mainz@nrubsig.org *                      and is licensed under the                       *
610898Sroland.mainz@nrubsig.org *                  Common Public License, Version 1.0                  *
710898Sroland.mainz@nrubsig.org *                    by AT&T Intellectual Property                     *
810898Sroland.mainz@nrubsig.org *                                                                      *
910898Sroland.mainz@nrubsig.org *                A copy of the License is available at                 *
1010898Sroland.mainz@nrubsig.org *            http://www.opensource.org/licenses/cpl1.0.txt             *
1110898Sroland.mainz@nrubsig.org *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
1210898Sroland.mainz@nrubsig.org *                                                                      *
1310898Sroland.mainz@nrubsig.org *              Information and Software Systems Research               *
1410898Sroland.mainz@nrubsig.org *                            AT&T Research                             *
1510898Sroland.mainz@nrubsig.org *                           Florham Park NJ                            *
1610898Sroland.mainz@nrubsig.org *                                                                      *
1710898Sroland.mainz@nrubsig.org *                 Glenn Fowler <gsf@research.att.com>                  *
1810898Sroland.mainz@nrubsig.org *                                                                      *
1910898Sroland.mainz@nrubsig.org ***********************************************************************/
2010898Sroland.mainz@nrubsig.org #pragma prototyped
2110898Sroland.mainz@nrubsig.org /*
2210898Sroland.mainz@nrubsig.org  * Glenn Fowler
2310898Sroland.mainz@nrubsig.org  * at&t research
2410898Sroland.mainz@nrubsig.org  */
2510898Sroland.mainz@nrubsig.org 
2610898Sroland.mainz@nrubsig.org #include <ast.h>
2710898Sroland.mainz@nrubsig.org #include <dlldefs.h>
2810898Sroland.mainz@nrubsig.org #include <error.h>
2910898Sroland.mainz@nrubsig.org 
3010898Sroland.mainz@nrubsig.org #if 0
3110898Sroland.mainz@nrubsig.org 
3210898Sroland.mainz@nrubsig.org /*
3310898Sroland.mainz@nrubsig.org  * dlopen() wrapper that properly initializes LIBPATH
3410898Sroland.mainz@nrubsig.org  * with the path of the dll to be opened
3510898Sroland.mainz@nrubsig.org  *
3610898Sroland.mainz@nrubsig.org  * 2009-04-15 -- if ld.so re-checked the env this would work ...
3710898Sroland.mainz@nrubsig.org  */
3810898Sroland.mainz@nrubsig.org 
3910898Sroland.mainz@nrubsig.org void*
4010898Sroland.mainz@nrubsig.org dllopen(const char* name, int mode)
4110898Sroland.mainz@nrubsig.org {
4210898Sroland.mainz@nrubsig.org 	void*		dll;
4310898Sroland.mainz@nrubsig.org 	Dllinfo_t*	info;
4410898Sroland.mainz@nrubsig.org 	char*		olibpath;
4510898Sroland.mainz@nrubsig.org 	char*		path;
4610898Sroland.mainz@nrubsig.org 	char*		oenv;
4710898Sroland.mainz@nrubsig.org 	char*		nenv[2];
4810898Sroland.mainz@nrubsig.org 	char*		dir;
4910898Sroland.mainz@nrubsig.org 	char*		base;
5010898Sroland.mainz@nrubsig.org 	int		len;
5110898Sroland.mainz@nrubsig.org 
5210898Sroland.mainz@nrubsig.org 	if (!environ)
5310898Sroland.mainz@nrubsig.org 	{
5410898Sroland.mainz@nrubsig.org 		nenv[0] = nenv[1] = 0;
5510898Sroland.mainz@nrubsig.org 		environ = nenv;
5610898Sroland.mainz@nrubsig.org 	}
5710898Sroland.mainz@nrubsig.org 	info = dllinfo();
5810898Sroland.mainz@nrubsig.org 	oenv = environ[0];
5910898Sroland.mainz@nrubsig.org 	olibpath = getenv(info->env);
6010898Sroland.mainz@nrubsig.org 	if (base = strrchr(name, '/'))
6110898Sroland.mainz@nrubsig.org 	{
6210898Sroland.mainz@nrubsig.org 		dir = (char*)name;
6310898Sroland.mainz@nrubsig.org 		len = ++base - dir;
6410898Sroland.mainz@nrubsig.org 	}
6510898Sroland.mainz@nrubsig.org 	else
6610898Sroland.mainz@nrubsig.org 	{
6710898Sroland.mainz@nrubsig.org 		dir = "./";
6810898Sroland.mainz@nrubsig.org 		len = 2;
6910898Sroland.mainz@nrubsig.org 		base = (char*)name;
7010898Sroland.mainz@nrubsig.org 	}
7110898Sroland.mainz@nrubsig.org 	path = sfprints("%-.*s%s%c%s=%-.*s%s%s", len, dir, base, 0, info->env, len, dir, olibpath ? ":" : "", olibpath ? olibpath : "");
7210898Sroland.mainz@nrubsig.org 	environ[0] = path + strlen(path) + 1;
7310898Sroland.mainz@nrubsig.org 	dll = dlopen(path, mode);
7410898Sroland.mainz@nrubsig.org 	if (environ == nenv)
7510898Sroland.mainz@nrubsig.org 		environ = 0;
7610898Sroland.mainz@nrubsig.org 	else
7710898Sroland.mainz@nrubsig.org 		environ[0] = oenv;
7810898Sroland.mainz@nrubsig.org 	return dll;
7910898Sroland.mainz@nrubsig.org }
8010898Sroland.mainz@nrubsig.org 
8110898Sroland.mainz@nrubsig.org #else
8210898Sroland.mainz@nrubsig.org 
8310898Sroland.mainz@nrubsig.org /*
8410898Sroland.mainz@nrubsig.org  * dlopen() wrapper -- waiting for prestidigitaions
8510898Sroland.mainz@nrubsig.org  */
8610898Sroland.mainz@nrubsig.org 
8710898Sroland.mainz@nrubsig.org void*
dllopen(const char * name,int mode)8810898Sroland.mainz@nrubsig.org dllopen(const char* name, int mode)
8910898Sroland.mainz@nrubsig.org {
9010898Sroland.mainz@nrubsig.org 	return dlopen(name, mode);
9110898Sroland.mainz@nrubsig.org }
9210898Sroland.mainz@nrubsig.org 
9310898Sroland.mainz@nrubsig.org #endif
94