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