1*706d0b42SXin Li /* Copyright © 2013, Intel Corporation 2*706d0b42SXin Li * 3*706d0b42SXin Li * Permission is hereby granted, free of charge, to any person obtaining a copy 4*706d0b42SXin Li * of this software and associated documentation files (the "Software"), to deal 5*706d0b42SXin Li * in the Software without restriction, including without limitation the rights 6*706d0b42SXin Li * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7*706d0b42SXin Li * copies of the Software, and to permit persons to whom the Software is 8*706d0b42SXin Li * furnished to do so, subject to the following conditions: 9*706d0b42SXin Li * 10*706d0b42SXin Li * The above copyright notice and this permission notice shall be included in 11*706d0b42SXin Li * all copies or substantial portions of the Software. 12*706d0b42SXin Li * 13*706d0b42SXin Li * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14*706d0b42SXin Li * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15*706d0b42SXin Li * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16*706d0b42SXin Li * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17*706d0b42SXin Li * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18*706d0b42SXin Li * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19*706d0b42SXin Li * THE SOFTWARE. 20*706d0b42SXin Li */ 21*706d0b42SXin Li 22*706d0b42SXin Li #ifndef DLWRAP_H 23*706d0b42SXin Li #define DLWRAP_H 24*706d0b42SXin Li 25*706d0b42SXin Li #define _GNU_SOURCE 26*706d0b42SXin Li #include <dlfcn.h> 27*706d0b42SXin Li 28*706d0b42SXin Li /* Call the *real* dlopen. We have our own wrapper for dlopen that, of 29*706d0b42SXin Li * necessity must use claim the symbol 'dlopen'. So whenever anything 30*706d0b42SXin Li * internal needs to call the real, underlying dlopen function, the 31*706d0b42SXin Li * thing to call is dlwrap_real_dlopen. 32*706d0b42SXin Li */ 33*706d0b42SXin Li void * 34*706d0b42SXin Li dlwrap_real_dlopen(const char *filename, int flag); 35*706d0b42SXin Li 36*706d0b42SXin Li /* Perform a dlopen on the libfips library itself. 37*706d0b42SXin Li * 38*706d0b42SXin Li * Many places in fips need to lookup symbols within the libfips 39*706d0b42SXin Li * library itself, (and not in any other library). This function 40*706d0b42SXin Li * provides a reliable way to get a handle for performing such 41*706d0b42SXin Li * lookups. 42*706d0b42SXin Li * 43*706d0b42SXin Li * The returned handle can be passed to dlwrap_real_dlsym for the 44*706d0b42SXin Li * lookups. */ 45*706d0b42SXin Li void * 46*706d0b42SXin Li dlwrap_dlopen_libfips(void); 47*706d0b42SXin Li 48*706d0b42SXin Li /* Call the *real* dlsym. We have our own wrapper for dlsym that, of 49*706d0b42SXin Li * necessity must use claim the symbol 'dlsym'. So whenever anything 50*706d0b42SXin Li * internal needs to call the real, underlying dlysm function, the 51*706d0b42SXin Li * thing to call is dlwrap_real_dlsym. 52*706d0b42SXin Li */ 53*706d0b42SXin Li void * 54*706d0b42SXin Li dlwrap_real_dlsym(void *handle, const char *symbol); 55*706d0b42SXin Li 56*706d0b42SXin Li #define DEFER_TO_GL(library, func, name, args) \ 57*706d0b42SXin Li ({ \ 58*706d0b42SXin Li void *lib = dlwrap_real_dlopen(library, RTLD_LAZY | RTLD_LOCAL); \ 59*706d0b42SXin Li typeof(&func) real_func = dlwrap_real_dlsym(lib, name); \ 60*706d0b42SXin Li /* gcc extension -- func's return value is the return value of \ 61*706d0b42SXin Li * the statement. \ 62*706d0b42SXin Li */ \ 63*706d0b42SXin Li real_func args; \ 64*706d0b42SXin Li }) 65*706d0b42SXin Li 66*706d0b42SXin Li #endif 67*706d0b42SXin Li 68