Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Mesa 3-D graphics library
  3.  *
  4.  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the "Software"),
  8.  * to deal in the Software without restriction, including without limitation
  9.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10.  * and/or sell copies of the Software, and to permit persons to whom the
  11.  * Software is furnished to do so, subject to the following conditions:
  12.  *
  13.  * The above copyright notice and this permission notice shall be included
  14.  * in all copies or substantial portions of the Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  17.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  19.  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  20.  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  21.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  22.  */
  23.  
  24.  
  25. /**
  26.  * Wrapper functions for dlopen(), dlsym(), dlclose().
  27.  * Note that the #ifdef tests for various environments should be expanded.
  28.  */
  29.  
  30.  
  31. #include "compiler.h"
  32. #include "dlopen.h"
  33.  
  34. #if defined(_GNU_SOURCE) && !defined(__MINGW32__) && !defined(__blrts)
  35. #include <dlfcn.h>
  36. #endif
  37. #if defined(_WIN32)
  38. #include <windows.h>
  39. #endif
  40.  
  41.  
  42. /**
  43.  * Wrapper for dlopen().
  44.  * Note that 'flags' isn't used at this time.
  45.  */
  46. void *
  47. _mesa_dlopen(const char *libname, int flags)
  48. {
  49. #if defined(__blrts)
  50.    return NULL;
  51. #elif defined(_GNU_SOURCE)
  52.    flags = RTLD_LAZY | RTLD_GLOBAL; /* Overriding flags at this time */
  53.    return dlopen(libname, flags);
  54. #elif defined(__MINGW32__)
  55.    return LoadLibraryA(libname);
  56. #else
  57.    return NULL;
  58. #endif
  59. }
  60.  
  61.  
  62. /**
  63.  * Wrapper for dlsym() that does a cast to a generic function type,
  64.  * rather than a void *.  This reduces the number of warnings that are
  65.  * generated.
  66.  */
  67. GenericFunc
  68. _mesa_dlsym(void *handle, const char *fname)
  69. {
  70.    union {
  71.       void *v;
  72.       GenericFunc f;
  73.    } u;
  74. #if defined(__blrts)
  75.    u.v = NULL;
  76. #elif defined(__DJGPP__)
  77.    /* need '_' prefix on symbol names */
  78.    char fname2[1000];
  79.    fname2[0] = '_';
  80.    strncpy(fname2 + 1, fname, 998);
  81.    fname2[999] = 0;
  82.    u.v = dlsym(handle, fname2);
  83. #elif defined(_GNU_SOURCE)
  84.    u.v = dlsym(handle, fname);
  85. #elif defined(__MINGW32__)
  86.    u.v = (void *) GetProcAddress(handle, fname);
  87. #else
  88.    u.v = NULL;
  89. #endif
  90.    return u.f;
  91. }
  92.  
  93.  
  94. /**
  95.  * Wrapper for dlclose().
  96.  */
  97. void
  98. _mesa_dlclose(void *handle)
  99. {
  100. #if defined(__blrts)
  101.    (void) handle;
  102. #elif defined(_GNU_SOURCE)
  103.    dlclose(handle);
  104. #elif defined(__MINGW32__)
  105.    FreeLibrary(handle);
  106. #else
  107.    (void) handle;
  108. #endif
  109. }
  110.  
  111.  
  112.  
  113.