/*
- * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include "poll-loop.h"
#include "shash.h"
#include "sset.h"
+#include "signals.h"
#include "socket-util.h"
#include "util.h"
#include "vlog.h"
+#include "type-props.h"
+
+#ifndef SIG_ATOMIC_MAX
+#define SIG_ATOMIC_MAX TYPE_MAXIMUM(sig_atomic_t)
+#endif
+
VLOG_DEFINE_THIS_MODULE(fatal_signal);
/* Signals to catch. */
inited = true;
- if (pipe(signal_fds)) {
- ovs_fatal(errno, "could not create pipe");
- }
+ xpipe(signal_fds);
set_nonblocking(signal_fds[0]);
set_nonblocking(signal_fds[1]);
struct sigaction old_sa;
sigaddset(&fatal_signal_set, sig_nr);
- if (sigaction(sig_nr, NULL, &old_sa)) {
- ovs_fatal(errno, "sigaction");
- }
+ xsigaction(sig_nr, NULL, &old_sa);
if (old_sa.sa_handler == SIG_DFL
&& signal(sig_nr, fatal_signal_handler) == SIG_ERR) {
- ovs_fatal(errno, "signal");
+ VLOG_FATAL("signal failed (%s)", strerror(errno));
}
}
atexit(atexit_handler);
void
fatal_signal_run(void)
{
- int sig_nr;
+ sig_atomic_t sig_nr;
fatal_signal_init();
sig_nr = stored_sig_nr;
if (sig_nr != SIG_ATOMIC_MAX) {
+ VLOG_WARN("terminating with signal %d (%s)",
+ (int)sig_nr, signal_name(sig_nr));
call_hooks(sig_nr);
/* Re-raise the signal with the default handling so that the program