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