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