musl libc does not provide sys_siglist. It does provide a reentrant implementation of strsignal().
Added a cmake build option for using reentrant strsignal() impls instead of sys_siglist.
Signed-off-by: John Coyle <dx9err@gmail.com>
set(HAVE_THREAD_SAFE_RES_QUERY 1 CACHE INTERNAL "Thread safe res_query supported.")
endif(WITH_THREAD_SAFE_RES_QUERY)
+option(WITH_REENTRANT_STRSIGNAL "strsignal is reentrant" OFF)
+if(WITH_REENTRANT_STRSIGNAL)
+ set(HAVE_REENTRANT_STRSIGNAL 1 CACHE INTERNAL "Reentrant strsignal is supported.")
+endif(WITH_REENTRANT_STRSIGNAL)
+
# Now create a useable config.h
configure_file(
${PROJECT_SOURCE_DIR}/src/include/config-h.in.cmake
extern char *sys_siglist[];
#endif
-
void install_sighandler(int signum, signal_handler_t handler, int flags)
{
int ret;
#else
snprintf(buf, sizeof(buf), "install_sighandler: sigaction returned "
"%d when trying to install a signal handler for %s\n",
- ret, sys_siglist[signum]);
+ ret, sig_str(signum));
#endif
dout_emergency(buf);
exit(1);
"in thread %llx\n", message, (unsigned long long)pthread_self());
#else
snprintf(buf, sizeof(buf), "*** Caught signal (%s) **\n "
- "in thread %llx\n", sys_siglist[signum], (unsigned long long)pthread_self());
+ "in thread %llx\n", sig_str(signum), (unsigned long long)pthread_self());
#endif
dout_emergency(buf);
pidfile_remove();
#include <signal.h>
#include <string>
+#include "acconfig.h"
+
typedef void (*signal_handler_t)(int);
+#ifndef HAVE_REENTRANT_STRSIGNAL
+# define sig_str(signum) sys_siglist[signum]
+#else
+# define sig_str(signum) strsignal(signum)
+#endif
+
void install_sighandler(int signum, signal_handler_t handler, int flags);
// handles SIGHUP
/* res_query is thread safe */
#cmakedefine HAVE_THREAD_SAFE_RES_QUERY
+/* Define if HAVE_REENTRANT_STRSIGNAL */
+#cmakedefine HAVE_REENTRANT_STRSIGNAL
+
#endif /* CONFIG_H */
void MDSDaemon::handle_signal(int signum)
{
assert(signum == SIGINT || signum == SIGTERM);
- derr << "*** got signal " << sys_siglist[signum] << " ***" << dendl;
+ derr << "*** got signal " << sig_str(signum) << " ***" << dendl;
{
Mutex::Locker l(mds_lock);
if (stopping) {
#include "common/perf_counters.h"
#include "common/admin_socket.h"
+#include "global/signal_handler.h"
+
#include "include/color.h"
#include "include/ceph_fs.h"
#include "include/str_list.h"
void Monitor::handle_signal(int signum)
{
assert(signum == SIGINT || signum == SIGTERM);
- derr << "*** Got Signal " << sys_siglist[signum] << " ***" << dendl;
+ derr << "*** Got Signal " << sig_str(signum) << " ***" << dendl;
shutdown();
}
void OSD::handle_signal(int signum)
{
assert(signum == SIGINT || signum == SIGTERM);
- derr << "*** Got signal " << sys_siglist[signum] << " ***" << dendl;
+ derr << "*** Got signal " << sig_str(signum) << " ***" << dendl;
shutdown();
}
if ((signum != SIGINT) && (signum != SIGTERM))
return;
- std::cerr << "*** Got signal " << sys_siglist[signum] << " ***" << std::endl;
+ std::cerr << "*** Got signal " << sig_str(signum) << " ***" << std::endl;
Mutex::Locker l(shutdown_lock);
if (shutdown_timer) {
shutdown_timer->cancel_all_events();