#define NWRAP_INET_ADDRSTRLEN INET_ADDRSTRLEN
#endif
-#define NWRAP_LOCK(m) do { \
- pthread_mutex_lock(&( m ## _mutex)); \
-} while(0)
-
-#define NWRAP_UNLOCK(m) do { \
- pthread_mutex_unlock(&( m ## _mutex)); \
-} while(0)
-
static pthread_mutex_t libc_symbol_binding_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t nss_module_symbol_binding_mutex = PTHREAD_MUTEX_INITIALIZER;
* nwrap_init() function.
*/
# define NWRAP_LOCK_ALL do { \
- NWRAP_LOCK(libc_symbol_binding); \
- NWRAP_LOCK(nss_module_symbol_binding); \
- NWRAP_LOCK(nwrap_initialized); \
- NWRAP_LOCK(nwrap_global); \
- NWRAP_LOCK(nwrap_gr_global); \
- NWRAP_LOCK(nwrap_he_global); \
- NWRAP_LOCK(nwrap_pw_global); \
- NWRAP_LOCK(nwrap_sp_global); \
+ nwrap_mutex_lock(&libc_symbol_binding_mutex); \
+ nwrap_mutex_lock(&nss_module_symbol_binding_mutex); \
+ nwrap_mutex_lock(&nwrap_initialized_mutex); \
+ nwrap_mutex_lock(&nwrap_global_mutex); \
+ nwrap_mutex_lock(&nwrap_gr_global_mutex); \
+ nwrap_mutex_lock(&nwrap_he_global_mutex); \
+ nwrap_mutex_lock(&nwrap_pw_global_mutex); \
+ nwrap_mutex_lock(&nwrap_sp_global_mutex); \
} while (0);
# define NWRAP_UNLOCK_ALL do {\
- NWRAP_UNLOCK(nwrap_sp_global); \
- NWRAP_UNLOCK(nwrap_pw_global); \
- NWRAP_UNLOCK(nwrap_he_global); \
- NWRAP_UNLOCK(nwrap_gr_global); \
- NWRAP_UNLOCK(nwrap_global); \
- NWRAP_UNLOCK(nwrap_initialized); \
- NWRAP_UNLOCK(nss_module_symbol_binding); \
- NWRAP_UNLOCK(libc_symbol_binding); \
+ nwrap_mutex_unlock(&nwrap_sp_global_mutex); \
+ nwrap_mutex_unlock(&nwrap_pw_global_mutex); \
+ nwrap_mutex_unlock(&nwrap_he_global_mutex); \
+ nwrap_mutex_unlock(&nwrap_gr_global_mutex); \
+ nwrap_mutex_unlock(&nwrap_global_mutex); \
+ nwrap_mutex_unlock(&nwrap_initialized_mutex); \
+ nwrap_mutex_unlock(&nss_module_symbol_binding_mutex); \
+ nwrap_mutex_unlock(&libc_symbol_binding_mutex); \
} while (0);
static void nwrap_init(void);
return func;
}
+#define nwrap_mutex_lock(m) _nwrap_mutex_lock(m, #m, __func__, __LINE__)
+static void _nwrap_mutex_lock(pthread_mutex_t *mutex, const char *name, const char *caller, unsigned line)
+{
+ int ret;
+
+ ret = pthread_mutex_lock(mutex);
+ if (ret != 0) {
+ NWRAP_LOG(NWRAP_LOG_ERROR, "PID(%d):PPID(%d): %s(%u): Couldn't lock pthread mutex(%s) - %s",
+ getpid(), getppid(), caller, line, name, strerror(ret));
+ abort();
+ }
+}
+
+#define nwrap_mutex_unlock(m) _nwrap_mutex_unlock(m, #m, __func__, __LINE__)
+static void _nwrap_mutex_unlock(pthread_mutex_t *mutex, const char *name, const char *caller, unsigned line)
+{
+ int ret;
+
+ ret = pthread_mutex_unlock(mutex);
+ if (ret != 0) {
+ NWRAP_LOG(NWRAP_LOG_ERROR, "PID(%d):PPID(%d): %s(%u): Couldn't unlock pthread mutex(%s) - %s",
+ getpid(), getppid(), caller, line, name, strerror(ret));
+ abort();
+ }
+}
+
#define nwrap_bind_symbol_libc(sym_name) \
- NWRAP_LOCK(libc_symbol_binding); \
+ nwrap_mutex_lock(&libc_symbol_binding_mutex); \
if (nwrap_main_global->libc->symbols._libc_##sym_name.obj == NULL) { \
nwrap_main_global->libc->symbols._libc_##sym_name.obj = \
_nwrap_bind_symbol(NWRAP_LIBC, #sym_name); \
} \
- NWRAP_UNLOCK(libc_symbol_binding)
+ nwrap_mutex_unlock(&libc_symbol_binding_mutex)
#define nwrap_bind_symbol_libc_posix(sym_name) \
- NWRAP_LOCK(libc_symbol_binding); \
+ nwrap_mutex_lock(&libc_symbol_binding_mutex); \
if (nwrap_main_global->libc->symbols._libc_##sym_name.obj == NULL) { \
nwrap_main_global->libc->symbols._libc_##sym_name.obj = \
_nwrap_bind_symbol(NWRAP_LIBC, "__posix_" #sym_name); \
} \
- NWRAP_UNLOCK(libc_symbol_binding)
+ nwrap_mutex_unlock(&libc_symbol_binding_mutex)
#define nwrap_bind_symbol_libnsl(sym_name) \
- NWRAP_LOCK(libc_symbol_binding); \
+ nwrap_mutex_lock(&libc_symbol_binding_mutex); \
if (nwrap_main_global->libc->symbols._libc_##sym_name.obj == NULL) { \
nwrap_main_global->libc->symbols._libc_##sym_name.obj = \
_nwrap_bind_symbol(NWRAP_LIBNSL, #sym_name); \
} \
- NWRAP_UNLOCK(libc_symbol_binding)
+ nwrap_mutex_unlock(&libc_symbol_binding_mutex)
#define nwrap_bind_symbol_libsocket(sym_name) \
- NWRAP_LOCK(libc_symbol_binding); \
+ nwrap_mutex_lock(&libc_symbol_binding_mutex); \
if (nwrap_main_global->libc->symbols._libc_##sym_name.obj == NULL) { \
nwrap_main_global->libc->symbols._libc_##sym_name.obj = \
_nwrap_bind_symbol(NWRAP_LIBSOCKET, #sym_name); \
} \
- NWRAP_UNLOCK(libc_symbol_binding)
+ nwrap_mutex_unlock(&libc_symbol_binding_mutex)
/* INTERNAL HELPER FUNCTIONS */
static void nwrap_lines_unload(struct nwrap_cache *const nwrap)
}
#define nwrap_nss_module_bind_symbol(sym_name) \
- NWRAP_LOCK(nss_module_symbol_binding); \
+ nwrap_mutex_lock(&nss_module_symbol_binding_mutex); \
if (symbols->_nss_##sym_name.obj == NULL) { \
symbols->_nss_##sym_name.obj = \
_nwrap_bind_nss_module_symbol(b, #sym_name); \
} \
- NWRAP_UNLOCK(nss_module_symbol_binding)
+ nwrap_mutex_unlock(&nss_module_symbol_binding_mutex)
#define nwrap_nss_module_bind_symbol2(sym_name, alt_name) \
- NWRAP_LOCK(nss_module_symbol_binding); \
+ nwrap_mutex_lock(&nss_module_symbol_binding_mutex); \
if (symbols->_nss_##sym_name.obj == NULL) { \
symbols->_nss_##sym_name.obj = \
_nwrap_bind_nss_module_symbol(b, #alt_name); \
} \
- NWRAP_UNLOCK(nss_module_symbol_binding)
+ nwrap_mutex_unlock(&nss_module_symbol_binding_mutex)
static struct nwrap_nss_module_symbols *
nwrap_bind_nss_module_symbols(struct nwrap_backend *b)
size_t max_hostents_tmp;
int ok;
- NWRAP_LOCK(nwrap_initialized);
+ nwrap_mutex_lock(&nwrap_initialized_mutex);
if (nwrap_initialized) {
- NWRAP_UNLOCK(nwrap_initialized);
+ nwrap_mutex_unlock(&nwrap_initialized_mutex);
return;
}
* We don't use NWRAP_(UN)LOCK_ALL macros here because we
* want to avoid overhead when other threads do their job.
*/
- NWRAP_LOCK(nwrap_global);
- NWRAP_LOCK(nwrap_gr_global);
- NWRAP_LOCK(nwrap_he_global);
- NWRAP_LOCK(nwrap_pw_global);
- NWRAP_LOCK(nwrap_sp_global);
+ nwrap_mutex_lock(&nwrap_global_mutex);
+ nwrap_mutex_lock(&nwrap_gr_global_mutex);
+ nwrap_mutex_lock(&nwrap_he_global_mutex);
+ nwrap_mutex_lock(&nwrap_pw_global_mutex);
+ nwrap_mutex_lock(&nwrap_sp_global_mutex);
nwrap_initialized = true;
nwrap_he_global.cache->unload = nwrap_he_unload;
/* We hold all locks here so we can use NWRAP_UNLOCK_ALL. */
- NWRAP_UNLOCK(nwrap_sp_global);
- NWRAP_UNLOCK(nwrap_pw_global);
- NWRAP_UNLOCK(nwrap_he_global);
- NWRAP_UNLOCK(nwrap_gr_global);
- NWRAP_UNLOCK(nwrap_global);
- NWRAP_UNLOCK(nwrap_initialized);
+ nwrap_mutex_unlock(&nwrap_sp_global_mutex);
+ nwrap_mutex_unlock(&nwrap_pw_global_mutex);
+ nwrap_mutex_unlock(&nwrap_he_global_mutex);
+ nwrap_mutex_unlock(&nwrap_gr_global_mutex);
+ nwrap_mutex_unlock(&nwrap_global_mutex);
+ nwrap_mutex_unlock(&nwrap_initialized_mutex);
}
bool nss_wrapper_enabled(void)