1d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca/************************************************************************** 2d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * 3d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * Copyright 2009 VMware, Inc. 4d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * Copyright 1999-2008 Brian Paul 5d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * All Rights Reserved. 6d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * 7d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 8d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * copy of this software and associated documentation files (the 9d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * "Software"), to deal in the Software without restriction, including 10d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish, 11d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to 12d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to 13d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * the following conditions: 14d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * 15d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 19d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * USE OR OTHER DEALINGS IN THE SOFTWARE. 22d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * 23d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * The above copyright notice and this permission notice (including the 24d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * next paragraph) shall be included in all copies or substantial portions 25d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * of the Software. 26d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca * 27d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca **************************************************************************/ 28d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca 29d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca 30d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#include "pipe/p_config.h" 31063f1238d1a62c489a4638968a72bd5e451fe227José Fonseca#include "pipe/p_compiler.h" 32d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca 33d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#if defined(PIPE_OS_UNIX) 34d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#include <dlfcn.h> 35d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#endif 36d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#if defined(PIPE_OS_WINDOWS) 37d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#include <windows.h> 38d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#endif 39d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca 40d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#include "u_dl.h" 41e1e7843d030c0a14521642131097d795c0103685Brian Paul#include "u_pointer.h" 42d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca 43d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca 44d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonsecastruct util_dl_library * 45d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonsecautil_dl_open(const char *filename) 46d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca{ 47d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#if defined(PIPE_OS_UNIX) 48d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca return (struct util_dl_library *)dlopen(filename, RTLD_LAZY | RTLD_GLOBAL); 49d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#elif defined(PIPE_OS_WINDOWS) 50d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca return (struct util_dl_library *)LoadLibraryA(filename); 51d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#else 52d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca return NULL; 53d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#endif 54d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca} 55d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca 56d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca 57d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonsecautil_dl_proc 58d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonsecautil_dl_get_proc_address(struct util_dl_library *library, 59d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca const char *procname) 60d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca{ 61d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#if defined(PIPE_OS_UNIX) 62e1e7843d030c0a14521642131097d795c0103685Brian Paul return (util_dl_proc) pointer_to_func(dlsym((void *)library, procname)); 63d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#elif defined(PIPE_OS_WINDOWS) 64d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca return (util_dl_proc)GetProcAddress((HMODULE)library, procname); 65d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#else 66d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca return (util_dl_proc)NULL; 67d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#endif 68d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca} 69d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca 70d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca 71d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonsecavoid 72d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonsecautil_dl_close(struct util_dl_library *library) 73d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca{ 74d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#if defined(PIPE_OS_UNIX) 75d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca dlclose((void *)library); 76d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#elif defined(PIPE_OS_WINDOWS) 77d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca FreeLibrary((HMODULE)library); 78d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#else 79d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca (void)library; 80d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca#endif 81d508bf862bdb2c706a6c8a3a0a7f99de77e5c8ccJosé Fonseca} 823258058d3b3fe0412007bfa699918bbe1665939dBrian Paul 833258058d3b3fe0412007bfa699918bbe1665939dBrian Paul 843258058d3b3fe0412007bfa699918bbe1665939dBrian Paulconst char * 853258058d3b3fe0412007bfa699918bbe1665939dBrian Paulutil_dl_error(void) 863258058d3b3fe0412007bfa699918bbe1665939dBrian Paul{ 873258058d3b3fe0412007bfa699918bbe1665939dBrian Paul#if defined(PIPE_OS_UNIX) 883258058d3b3fe0412007bfa699918bbe1665939dBrian Paul return dlerror(); 893258058d3b3fe0412007bfa699918bbe1665939dBrian Paul#elif defined(PIPE_OS_WINDOWS) 903258058d3b3fe0412007bfa699918bbe1665939dBrian Paul return "unknown error"; 913258058d3b3fe0412007bfa699918bbe1665939dBrian Paul#else 923258058d3b3fe0412007bfa699918bbe1665939dBrian Paul return "unknown error"; 933258058d3b3fe0412007bfa699918bbe1665939dBrian Paul#endif 943258058d3b3fe0412007bfa699918bbe1665939dBrian Paul} 95