mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-30 19:50:32 +01:00
core: merge branch 'danw/signals-bgo743052'
https://bugzilla.gnome.org/show_bug.cgi?id=743052
(cherry picked from commit 1970f59b6f)
This commit is contained in:
commit
57818c0b77
23 changed files with 87 additions and 405 deletions
|
|
@ -364,15 +364,6 @@ check_filename (const char *file_name)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
child_setup (gpointer user_data G_GNUC_UNUSED)
|
||||
{
|
||||
/* We are in the child process at this point */
|
||||
/* Give child a different process group to ensure signal separation. */
|
||||
pid_t pid = getpid ();
|
||||
setpgid (pid, pid);
|
||||
}
|
||||
|
||||
#define SCRIPT_TIMEOUT 600 /* 10 minutes */
|
||||
|
||||
static void
|
||||
|
|
@ -390,7 +381,7 @@ dispatch_one_script (Request *request)
|
|||
if (request->debug)
|
||||
g_message ("Running script '%s'", script->script);
|
||||
|
||||
if (g_spawn_async ("/", argv, request->envp, G_SPAWN_DO_NOT_REAP_CHILD, child_setup, request, &script->pid, &error)) {
|
||||
if (g_spawn_async ("/", argv, request->envp, G_SPAWN_DO_NOT_REAP_CHILD, NULL, request, &script->pid, &error)) {
|
||||
request->script_watch_id = g_child_watch_add (script->pid, (GChildWatchFunc) script_watch_cb, script);
|
||||
request->script_timeout_id = g_timeout_add_seconds (SCRIPT_TIMEOUT, script_timeout_cb, script);
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -326,8 +326,6 @@ nm_sources = \
|
|||
nm-manager.h \
|
||||
nm-policy.c \
|
||||
nm-policy.h \
|
||||
nm-posix-signals.c \
|
||||
nm-posix-signals.h \
|
||||
nm-properties-changed-signal.c \
|
||||
nm-properties-changed-signal.h \
|
||||
nm-rfkill-manager.c \
|
||||
|
|
@ -503,8 +501,6 @@ libnm_iface_helper_la_SOURCES = \
|
|||
nm-enum-types.h \
|
||||
nm-logging.c \
|
||||
nm-logging.h \
|
||||
nm-posix-signals.c \
|
||||
nm-posix-signals.h \
|
||||
NetworkManagerUtils.c \
|
||||
NetworkManagerUtils.h
|
||||
|
||||
|
|
|
|||
|
|
@ -47,7 +47,6 @@
|
|||
#include "nm-setting-wireless.h"
|
||||
#include "nm-setting-wireless-security.h"
|
||||
#include "nm-auth-utils.h"
|
||||
#include "nm-posix-signals.h"
|
||||
#include "nm-dbus-glib-types.h"
|
||||
#include "gsystem-local-alloc.h"
|
||||
|
||||
|
|
@ -164,7 +163,7 @@ nm_spawn_process (const char *args, GError **error)
|
|||
g_return_val_if_fail (!error || !*error, -1);
|
||||
|
||||
if (g_shell_parse_argv (args, &num_args, &argv, &local)) {
|
||||
g_spawn_sync ("/", argv, NULL, 0, nm_unblock_posix_signals, NULL, NULL, NULL, &status, &local);
|
||||
g_spawn_sync ("/", argv, NULL, 0, NULL, NULL, NULL, NULL, &status, &local);
|
||||
g_strfreev (argv);
|
||||
}
|
||||
|
||||
|
|
@ -2690,3 +2689,21 @@ nm_utils_ip6_routes_from_gvalue (const GValue *value)
|
|||
|
||||
return g_slist_reverse (list);
|
||||
}
|
||||
|
||||
/**
|
||||
* nm_utils_setpgid:
|
||||
* @unused: unused
|
||||
*
|
||||
* This can be passed as a child setup function to the g_spawn*() family
|
||||
* of functions, to ensure that the child is in its own process group
|
||||
* (and thus, in some situations, will not be killed when NetworkManager
|
||||
* is killed).
|
||||
*/
|
||||
void
|
||||
nm_utils_setpgid (gpointer unused G_GNUC_UNUSED)
|
||||
{
|
||||
pid_t pid;
|
||||
|
||||
pid = getpid ();
|
||||
setpgid (pid, pid);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -209,4 +209,6 @@ GHashTable *nm_utils_connection_dict_to_hash (GVariant *dict);
|
|||
GSList *nm_utils_ip4_routes_from_gvalue (const GValue *value);
|
||||
GSList *nm_utils_ip6_routes_from_gvalue (const GValue *value);
|
||||
|
||||
void nm_utils_setpgid (gpointer unused);
|
||||
|
||||
#endif /* __NETWORKMANAGER_UTILS_H__ */
|
||||
|
|
|
|||
|
|
@ -60,7 +60,6 @@
|
|||
#include "nm-enum-types.h"
|
||||
#include "nm-settings-connection.h"
|
||||
#include "nm-connection-provider.h"
|
||||
#include "nm-posix-signals.h"
|
||||
#include "nm-auth-utils.h"
|
||||
#include "nm-dbus-glib-types.h"
|
||||
#include "nm-dispatcher.h"
|
||||
|
|
@ -2919,23 +2918,6 @@ aipd_timeout_cb (gpointer user_data)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
aipd_child_setup (gpointer user_data G_GNUC_UNUSED)
|
||||
{
|
||||
/* We are in the child process at this point.
|
||||
* Give child it's own program group for signal
|
||||
* separation.
|
||||
*/
|
||||
pid_t pid = getpid ();
|
||||
setpgid (pid, pid);
|
||||
|
||||
/*
|
||||
* We blocked signals in main(). We need to restore original signal
|
||||
* mask for avahi-autoipd here so that it can receive signals.
|
||||
*/
|
||||
nm_unblock_posix_signals (NULL);
|
||||
}
|
||||
|
||||
/* default to installed helper, but can be modified for testing */
|
||||
const char *nm_device_autoipd_helper_path = LIBEXECDIR "/nm-avahi-autoipd.action";
|
||||
|
||||
|
|
@ -2975,7 +2957,7 @@ aipd_start (NMDevice *self, NMDeviceStateReason *reason)
|
|||
g_free (cmdline);
|
||||
|
||||
if (!g_spawn_async ("/", (char **) argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD,
|
||||
&aipd_child_setup, NULL, &(priv->aipd_pid), &error)) {
|
||||
nm_utils_setpgid, NULL, &(priv->aipd_pid), &error)) {
|
||||
_LOGW (LOGD_DEVICE | LOGD_AUTOIP4,
|
||||
"Activation: Stage 3 of 5 (IP Configure Start) failed"
|
||||
" to start avahi-autoipd: %s",
|
||||
|
|
@ -5341,8 +5323,7 @@ send_arps (NMDevice *self, const char *mode_arg)
|
|||
"arping: run %s", (tmp_str = g_strjoinv (" ", (char **) argv)));
|
||||
success = g_spawn_async (NULL, (char **) argv, NULL,
|
||||
G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL,
|
||||
nm_unblock_posix_signals,
|
||||
NULL, NULL, &error);
|
||||
NULL, NULL, NULL, &error);
|
||||
if (!success) {
|
||||
_LOGW (LOGD_DEVICE | LOGD_IP4,
|
||||
"arping: could not send ARP for local address %s: %s",
|
||||
|
|
@ -6483,7 +6464,7 @@ spawn_ping (NMDevice *self,
|
|||
(gchar **) args,
|
||||
NULL,
|
||||
G_SPAWN_DO_NOT_REAP_CHILD,
|
||||
nm_unblock_posix_signals,
|
||||
NULL,
|
||||
NULL,
|
||||
&priv->gw_ping.pid,
|
||||
&error);
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@
|
|||
#include "nm-dbus-manager.h"
|
||||
#include "nm-enum-types.h"
|
||||
#include "nm-team-enum-types.h"
|
||||
#include "nm-posix-signals.h"
|
||||
#include "nm-core-internal.h"
|
||||
#include "gsystem-local-alloc.h"
|
||||
|
||||
|
|
@ -424,23 +423,6 @@ teamd_process_watch_cb (GPid pid, gint status, gpointer user_data)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
teamd_child_setup (gpointer user_data G_GNUC_UNUSED)
|
||||
{
|
||||
/* We are in the child process at this point.
|
||||
* Give child it's own program group for signal
|
||||
* separation.
|
||||
*/
|
||||
pid_t pid = getpid ();
|
||||
setpgid (pid, pid);
|
||||
|
||||
/*
|
||||
* We blocked signals in main(). We need to restore original signal
|
||||
* mask for avahi-autoipd here so that it can receive signals.
|
||||
*/
|
||||
nm_unblock_posix_signals (NULL);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
teamd_kill (NMDeviceTeam *self, const char *teamd_binary, GError **error)
|
||||
{
|
||||
|
|
@ -463,7 +445,7 @@ teamd_kill (NMDeviceTeam *self, const char *teamd_binary, GError **error)
|
|||
g_ptr_array_add (argv, NULL);
|
||||
|
||||
_LOGD (LOGD_TEAM, "running: %s", (tmp_str = g_strjoinv (" ", (gchar **) argv->pdata)));
|
||||
return g_spawn_sync ("/", (char **) argv->pdata, NULL, 0, nm_unblock_posix_signals, NULL, NULL, NULL, NULL, error);
|
||||
return g_spawn_sync ("/", (char **) argv->pdata, NULL, 0, NULL, NULL, NULL, NULL, NULL, error);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
|
@ -514,7 +496,7 @@ teamd_start (NMDevice *device, NMSettingTeam *s_team)
|
|||
|
||||
_LOGD (LOGD_TEAM, "running: %s", (tmp_str = g_strjoinv (" ", (gchar **) argv->pdata)));
|
||||
if (!g_spawn_async ("/", (char **) argv->pdata, NULL, G_SPAWN_DO_NOT_REAP_CHILD,
|
||||
teamd_child_setup, NULL, &priv->teamd_pid, &error)) {
|
||||
nm_utils_setpgid, NULL, &priv->teamd_pid, &error)) {
|
||||
_LOGW (LOGD_TEAM, "Activation: (team) failed to start teamd: %s", error->message);
|
||||
teamd_cleanup (device, TRUE);
|
||||
return FALSE;
|
||||
|
|
|
|||
|
|
@ -41,7 +41,6 @@
|
|||
#include "nm-logging.h"
|
||||
#include "nm-dhcp-dhclient-utils.h"
|
||||
#include "nm-dhcp-manager.h"
|
||||
#include "nm-posix-signals.h"
|
||||
#include "NetworkManagerUtils.h"
|
||||
#include "nm-dhcp-listener.h"
|
||||
#include "gsystem-local-alloc.h"
|
||||
|
|
@ -301,20 +300,6 @@ create_dhclient_config (const char *iface,
|
|||
}
|
||||
|
||||
|
||||
static void
|
||||
dhclient_child_setup (gpointer user_data G_GNUC_UNUSED)
|
||||
{
|
||||
/* We are in the child process at this point */
|
||||
pid_t pid = getpid ();
|
||||
setpgid (pid, pid);
|
||||
|
||||
/*
|
||||
* We blocked signals in main(). We need to restore original signal
|
||||
* mask for dhclient here so that it can receive signals.
|
||||
*/
|
||||
nm_unblock_posix_signals (NULL);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
dhclient_start (NMDhcpClient *client,
|
||||
const char *mode_opt,
|
||||
|
|
@ -457,7 +442,7 @@ dhclient_start (NMDhcpClient *client,
|
|||
|
||||
if (g_spawn_async (NULL, (char **) argv->pdata, NULL,
|
||||
G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL,
|
||||
&dhclient_child_setup, NULL, &pid, &error)) {
|
||||
nm_utils_setpgid, NULL, &pid, &error)) {
|
||||
g_assert (pid > 0);
|
||||
nm_log_info (log_domain, "dhclient started with pid %d", pid);
|
||||
if (release == FALSE)
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@
|
|||
#include "nm-dhcp-manager.h"
|
||||
#include "nm-utils.h"
|
||||
#include "nm-logging.h"
|
||||
#include "nm-posix-signals.h"
|
||||
#include "NetworkManagerUtils.h"
|
||||
#include "nm-dhcp-listener.h"
|
||||
|
||||
|
|
@ -59,20 +58,6 @@ nm_dhcp_dhcpcd_get_path (void)
|
|||
return path;
|
||||
}
|
||||
|
||||
static void
|
||||
dhcpcd_child_setup (gpointer user_data G_GNUC_UNUSED)
|
||||
{
|
||||
/* We are in the child process at this point */
|
||||
pid_t pid = getpid ();
|
||||
setpgid (pid, pid);
|
||||
|
||||
/*
|
||||
* We blocked signals in main(). We need to restore original signal
|
||||
* mask for dhcpcd here so that it can receive signals.
|
||||
*/
|
||||
nm_unblock_posix_signals (NULL);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
ip4_start (NMDhcpClient *client, const char *dhcp_anycast_addr, const char *last_ip4_address)
|
||||
{
|
||||
|
|
@ -143,7 +128,7 @@ ip4_start (NMDhcpClient *client, const char *dhcp_anycast_addr, const char *last
|
|||
|
||||
if (g_spawn_async (NULL, (char **) argv->pdata, NULL,
|
||||
G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL,
|
||||
&dhcpcd_child_setup, NULL, &pid, &error)) {
|
||||
nm_utils_setpgid, NULL, &pid, &error)) {
|
||||
g_assert (pid > 0);
|
||||
nm_log_info (LOGD_DHCP4, "dhcpcd started with pid %d", pid);
|
||||
nm_dhcp_client_watch_child (client, pid);
|
||||
|
|
|
|||
|
|
@ -43,7 +43,6 @@
|
|||
#include "nm-ip6-config.h"
|
||||
#include "nm-logging.h"
|
||||
#include "NetworkManagerUtils.h"
|
||||
#include "nm-posix-signals.h"
|
||||
#include "nm-config.h"
|
||||
|
||||
#include "nm-dns-plugin.h"
|
||||
|
|
@ -233,19 +232,6 @@ merge_one_ip6_config (NMResolvConfData *rc, NMIP6Config *src)
|
|||
/**********************************/
|
||||
/* SUSE */
|
||||
|
||||
static void
|
||||
netconfig_child_setup (gpointer user_data G_GNUC_UNUSED)
|
||||
{
|
||||
pid_t pid = getpid ();
|
||||
setpgid (pid, pid);
|
||||
|
||||
/*
|
||||
* We blocked signals in main(). We need to restore original signal
|
||||
* mask for netconfig here so that it can receive signals.
|
||||
*/
|
||||
nm_unblock_posix_signals (NULL);
|
||||
}
|
||||
|
||||
static GPid
|
||||
run_netconfig (GError **error, gint *stdin_fd)
|
||||
{
|
||||
|
|
@ -263,7 +249,7 @@ run_netconfig (GError **error, gint *stdin_fd)
|
|||
nm_log_dbg (LOGD_DNS, "spawning '%s'", tmp);
|
||||
g_free (tmp);
|
||||
|
||||
if (!g_spawn_async_with_pipes (NULL, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD, netconfig_child_setup,
|
||||
if (!g_spawn_async_with_pipes (NULL, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD, NULL,
|
||||
NULL, &pid, stdin_fd, NULL, NULL, error))
|
||||
return -1;
|
||||
|
||||
|
|
|
|||
|
|
@ -28,7 +28,6 @@
|
|||
|
||||
#include "nm-dns-plugin.h"
|
||||
#include "nm-logging.h"
|
||||
#include "nm-posix-signals.h"
|
||||
#include "NetworkManagerUtils.h"
|
||||
|
||||
typedef struct {
|
||||
|
|
@ -136,20 +135,6 @@ watch_cb (GPid pid, gint status, gpointer user_data)
|
|||
g_signal_emit (self, signals[CHILD_QUIT], 0, status);
|
||||
}
|
||||
|
||||
static void
|
||||
child_setup (gpointer user_data G_GNUC_UNUSED)
|
||||
{
|
||||
/* We are in the child process at this point */
|
||||
pid_t pid = getpid ();
|
||||
setpgid (pid, pid);
|
||||
|
||||
/*
|
||||
* We blocked signals in main(). We need to restore original signal
|
||||
* mask for DNS plugin here so that it can receive signals.
|
||||
*/
|
||||
nm_unblock_posix_signals (NULL);
|
||||
}
|
||||
|
||||
GPid
|
||||
nm_dns_plugin_child_spawn (NMDnsPlugin *self,
|
||||
const char **argv,
|
||||
|
|
@ -183,8 +168,8 @@ nm_dns_plugin_child_spawn (NMDnsPlugin *self,
|
|||
priv->pid = 0;
|
||||
if (g_spawn_async (NULL, (char **) argv, NULL,
|
||||
G_SPAWN_DO_NOT_REAP_CHILD,
|
||||
child_setup,
|
||||
NULL, &priv->pid,
|
||||
nm_utils_setpgid, NULL,
|
||||
&priv->pid,
|
||||
&error)) {
|
||||
nm_log_dbg (LOGD_DNS, "%s started with pid %d", priv->progname, priv->pid);
|
||||
priv->watch_id = g_child_watch_add (priv->pid, (GChildWatchFunc) watch_cb, self);
|
||||
|
|
|
|||
|
|
@ -32,7 +32,6 @@
|
|||
#include "nm-dnsmasq-utils.h"
|
||||
#include "nm-logging.h"
|
||||
#include "nm-glib-compat.h"
|
||||
#include "nm-posix-signals.h"
|
||||
#include "nm-utils.h"
|
||||
#include "NetworkManagerUtils.h"
|
||||
|
||||
|
|
@ -296,20 +295,6 @@ create_dm_cmd_line (const char *iface,
|
|||
return cmd;
|
||||
}
|
||||
|
||||
static void
|
||||
dm_child_setup (gpointer user_data G_GNUC_UNUSED)
|
||||
{
|
||||
/* We are in the child process at this point */
|
||||
pid_t pid = getpid ();
|
||||
setpgid (pid, pid);
|
||||
|
||||
/*
|
||||
* We blocked signals in main(). We need to restore original signal
|
||||
* mask for dnsmasq here so that it can receive signals.
|
||||
*/
|
||||
nm_unblock_posix_signals (NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
kill_existing_for_iface (const char *iface, const char *pidfile)
|
||||
{
|
||||
|
|
@ -374,9 +359,9 @@ nm_dnsmasq_manager_start (NMDnsMasqManager *manager,
|
|||
|
||||
priv->pid = 0;
|
||||
if (!g_spawn_async (NULL, (char **) dm_cmd->array->pdata, NULL,
|
||||
G_SPAWN_DO_NOT_REAP_CHILD,
|
||||
dm_child_setup,
|
||||
NULL, &priv->pid, error)) {
|
||||
G_SPAWN_DO_NOT_REAP_CHILD,
|
||||
nm_utils_setpgid, NULL,
|
||||
&priv->pid, error)) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
|
|||
112
src/main-utils.c
112
src/main-utils.c
|
|
@ -31,105 +31,63 @@
|
|||
|
||||
#include <glib.h>
|
||||
#include <glib/gi18n.h>
|
||||
#include <glib-unix.h>
|
||||
#include <gmodule.h>
|
||||
|
||||
#include "nm-glib-compat.h"
|
||||
|
||||
#include "gsystem-local-alloc.h"
|
||||
#include "main-utils.h"
|
||||
#include "nm-posix-signals.h"
|
||||
#include "NetworkManagerUtils.h"
|
||||
#include "nm-logging.h"
|
||||
|
||||
static sigset_t signal_set;
|
||||
static gboolean *quit_early = NULL;
|
||||
|
||||
/*
|
||||
* Thread function waiting for signals and processing them.
|
||||
* Wait for signals in signal set. The semantics of sigwait() require that all
|
||||
* threads (including the thread calling sigwait()) have the signal masked, for
|
||||
* reliable operation. Otherwise, a signal that arrives while this thread is
|
||||
* not blocked in sigwait() might be delivered to another thread.
|
||||
*/
|
||||
static void *
|
||||
signal_handling_thread (void *arg)
|
||||
static gboolean
|
||||
sighup_handler (gpointer user_data)
|
||||
{
|
||||
GMainLoop *main_loop = arg;
|
||||
int signo;
|
||||
/* Reread config stuff like system config files, VPN service files, etc */
|
||||
nm_main_config_reload ();
|
||||
|
||||
while (1) {
|
||||
sigwait (&signal_set, &signo);
|
||||
return G_SOURCE_CONTINUE;
|
||||
}
|
||||
|
||||
switch (signo) {
|
||||
case SIGINT:
|
||||
case SIGTERM:
|
||||
nm_log_info (LOGD_CORE, "caught signal %d, shutting down normally.", signo);
|
||||
*quit_early = TRUE; /* for quitting before entering the main loop */
|
||||
g_main_loop_quit (main_loop);
|
||||
break;
|
||||
case SIGHUP:
|
||||
/* Reread config stuff like system config files, VPN service files, etc */
|
||||
nm_main_config_reload ();
|
||||
break;
|
||||
case SIGPIPE:
|
||||
/* silently ignore signal */
|
||||
break;
|
||||
default:
|
||||
nm_log_err (LOGD_CORE, "caught unexpected signal %d", signo);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
static gboolean
|
||||
sigint_handler (gpointer user_data)
|
||||
{
|
||||
GMainLoop *main_loop = user_data;
|
||||
|
||||
nm_log_info (LOGD_CORE, "caught SIGINT, shutting down normally.");
|
||||
g_main_loop_quit (main_loop);
|
||||
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
sigterm_handler (gpointer user_data)
|
||||
{
|
||||
GMainLoop *main_loop = user_data;
|
||||
|
||||
nm_log_info (LOGD_CORE, "caught SIGTERM, shutting down normally.");
|
||||
g_main_loop_quit (main_loop);
|
||||
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
/**
|
||||
* nm_main_utils_setup_signals:
|
||||
* @main_loop: the #GMainLoop to quit when SIGINT or SIGTERM is received
|
||||
* @quit_early: location of a variable that will be set to TRUE when
|
||||
* SIGINT or SIGTERM is received
|
||||
*
|
||||
* Mask the signals we are interested in and create a signal handling thread.
|
||||
* Because all threads inherit the signal mask from their creator, all threads
|
||||
* in the process will have the signals masked. That's why setup_signals() has
|
||||
* to be called before creating other threads.
|
||||
*
|
||||
* Returns: %TRUE on success
|
||||
* Sets up signal handling for NetworkManager.
|
||||
*/
|
||||
gboolean
|
||||
nm_main_utils_setup_signals (GMainLoop *main_loop, gboolean *quit_early_ptr)
|
||||
void
|
||||
nm_main_utils_setup_signals (GMainLoop *main_loop)
|
||||
{
|
||||
pthread_t signal_thread_id;
|
||||
sigset_t old_sig_mask;
|
||||
int status;
|
||||
g_return_if_fail (main_loop != NULL);
|
||||
|
||||
g_return_val_if_fail (main_loop != NULL, FALSE);
|
||||
g_return_val_if_fail (quit_early_ptr != NULL, FALSE);
|
||||
signal (SIGPIPE, SIG_IGN);
|
||||
|
||||
quit_early = quit_early_ptr;
|
||||
|
||||
sigemptyset (&signal_set);
|
||||
sigaddset (&signal_set, SIGHUP);
|
||||
sigaddset (&signal_set, SIGINT);
|
||||
sigaddset (&signal_set, SIGTERM);
|
||||
sigaddset (&signal_set, SIGPIPE);
|
||||
|
||||
/* Block all signals of interest. */
|
||||
status = pthread_sigmask (SIG_BLOCK, &signal_set, &old_sig_mask);
|
||||
if (status != 0) {
|
||||
fprintf (stderr, _("Failed to set signal mask: %d"), status);
|
||||
return FALSE;
|
||||
}
|
||||
/* Save original mask so that we could use it for child processes. */
|
||||
nm_save_original_signal_mask (old_sig_mask);
|
||||
|
||||
/* Create the signal handling thread. */
|
||||
status = pthread_create (&signal_thread_id, NULL, signal_handling_thread, main_loop);
|
||||
if (status != 0) {
|
||||
fprintf (stderr, _("Failed to create signal handling thread: %d"), status);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
g_unix_signal_add (SIGHUP, sighup_handler, NULL);
|
||||
g_unix_signal_add (SIGINT, sigint_handler, main_loop);
|
||||
g_unix_signal_add (SIGTERM, sigterm_handler, main_loop);
|
||||
}
|
||||
|
||||
gboolean
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@
|
|||
|
||||
void nm_main_utils_ensure_root (void);
|
||||
|
||||
gboolean nm_main_utils_setup_signals (GMainLoop *main_loop, gboolean *quit_early_ptr);
|
||||
void nm_main_utils_setup_signals (GMainLoop *main_loop);
|
||||
|
||||
void nm_main_utils_ensure_rundir (void);
|
||||
|
||||
|
|
|
|||
11
src/main.c
11
src/main.c
|
|
@ -54,7 +54,6 @@
|
|||
#include "nm-vpn-manager.h"
|
||||
#include "nm-logging.h"
|
||||
#include "nm-config.h"
|
||||
#include "nm-posix-signals.h"
|
||||
#include "nm-session-monitor.h"
|
||||
#include "nm-dispatcher.h"
|
||||
#include "nm-settings.h"
|
||||
|
|
@ -69,7 +68,7 @@
|
|||
#define NM_DEFAULT_SYSTEM_STATE_FILE NMSTATEDIR "/NetworkManager.state"
|
||||
|
||||
static GMainLoop *main_loop = NULL;
|
||||
static gboolean quit_early = FALSE;
|
||||
static gboolean configure_and_quit = FALSE;
|
||||
|
||||
static struct {
|
||||
gboolean show_version;
|
||||
|
|
@ -226,7 +225,7 @@ manager_configure_quit (NMManager *manager, gpointer user_data)
|
|||
{
|
||||
nm_log_info (LOGD_CORE, "quitting now that startup is complete");
|
||||
g_main_loop_quit (main_loop);
|
||||
quit_early = TRUE;
|
||||
configure_and_quit = TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -400,8 +399,7 @@ main (int argc, char *argv[])
|
|||
}
|
||||
|
||||
/* Set up unix signal handling - before creating threads, but after daemonizing! */
|
||||
if (!nm_main_utils_setup_signals (main_loop, &quit_early))
|
||||
exit (1);
|
||||
nm_main_utils_setup_signals (main_loop);
|
||||
|
||||
nm_logging_syslog_openlog (global_opt.debug);
|
||||
|
||||
|
|
@ -516,8 +514,7 @@ main (int argc, char *argv[])
|
|||
|
||||
success = TRUE;
|
||||
|
||||
/* Told to quit before getting to the mainloop by the signal handler */
|
||||
if (!quit_early)
|
||||
if (configure_and_quit == FALSE)
|
||||
g_main_loop_run (main_loop);
|
||||
|
||||
nm_manager_stop (manager);
|
||||
|
|
|
|||
|
|
@ -35,7 +35,6 @@
|
|||
#include "nm-device.h"
|
||||
#include "nm-active-connection.h"
|
||||
#include "nm-settings-connection.h"
|
||||
#include "nm-posix-signals.h"
|
||||
#include "nm-auth-subject.h"
|
||||
|
||||
G_DEFINE_TYPE (NMActRequest, nm_act_request, NM_TYPE_ACTIVE_CONNECTION)
|
||||
|
|
@ -196,16 +195,6 @@ clear_share_rules (NMActRequest *req)
|
|||
priv->share_rules = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
share_child_setup (gpointer user_data G_GNUC_UNUSED)
|
||||
{
|
||||
/* We are in the child process at this point */
|
||||
pid_t pid = getpid ();
|
||||
setpgid (pid, pid);
|
||||
|
||||
nm_unblock_posix_signals (NULL);
|
||||
}
|
||||
|
||||
void
|
||||
nm_act_request_set_shared (NMActRequest *req, gboolean shared)
|
||||
{
|
||||
|
|
@ -243,7 +232,7 @@ nm_act_request_set_shared (NMActRequest *req, gboolean shared)
|
|||
|
||||
nm_log_info (LOGD_SHARING, "Executing: %s", cmd);
|
||||
if (!g_spawn_sync ("/", argv, envp, G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL,
|
||||
share_child_setup, NULL, NULL, NULL, &status, &error)) {
|
||||
NULL, NULL, NULL, NULL, &status, &error)) {
|
||||
nm_log_warn (LOGD_SHARING, "Error executing command: (%d) %s",
|
||||
error ? error->code : -1,
|
||||
(error && error->message) ? error->message : "(unknown)");
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@
|
|||
#include "nm-dcb.h"
|
||||
#include "nm-platform.h"
|
||||
#include "NetworkManagerUtils.h"
|
||||
#include "nm-posix-signals.h"
|
||||
#include "nm-logging.h"
|
||||
|
||||
static const char *helper_names[] = { "dcbtool", "fcoeadm" };
|
||||
|
|
@ -305,7 +304,7 @@ run_helper (char **argv, guint which, gpointer user_data, GError **error)
|
|||
nm_log_dbg (LOGD_DCB, "%s", cmdline);
|
||||
|
||||
success = g_spawn_sync ("/", argv, NULL, 0 /*G_SPAWN_DEFAULT*/,
|
||||
nm_unblock_posix_signals, NULL,
|
||||
NULL, NULL,
|
||||
&outmsg, &errmsg, &exit_status, error);
|
||||
/* Log any stderr output */
|
||||
if (success && WIFEXITED (exit_status) && WEXITSTATUS (exit_status) && (errmsg || outmsg)) {
|
||||
|
|
|
|||
|
|
@ -263,24 +263,16 @@ rdisc_ra_timeout (NMRDisc *rdisc, gpointer user_data)
|
|||
static gboolean
|
||||
quit_handler (gpointer user_data)
|
||||
{
|
||||
gboolean *quit_early_ptr = user_data;
|
||||
|
||||
*quit_early_ptr = TRUE;
|
||||
g_main_loop_quit (main_loop);
|
||||
return G_SOURCE_CONTINUE;
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
static void
|
||||
setup_signals (gboolean *quit_early_ptr)
|
||||
setup_signals (void)
|
||||
{
|
||||
sigset_t sigmask;
|
||||
|
||||
sigemptyset (&sigmask);
|
||||
pthread_sigmask (SIG_SETMASK, &sigmask, NULL);
|
||||
|
||||
signal (SIGPIPE, SIG_IGN);
|
||||
g_unix_signal_add (SIGINT, quit_handler, quit_early_ptr);
|
||||
g_unix_signal_add (SIGTERM, quit_handler, quit_early_ptr);
|
||||
g_unix_signal_add (SIGINT, quit_handler, NULL);
|
||||
g_unix_signal_add (SIGTERM, quit_handler, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -338,7 +330,6 @@ main (int argc, char *argv[])
|
|||
GError *error = NULL;
|
||||
gboolean wrote_pidfile = FALSE;
|
||||
gs_free char *pidfile = NULL;
|
||||
gboolean quit_early = FALSE;
|
||||
gs_unref_object NMDhcpClient *dhcp4_client = NULL;
|
||||
gs_unref_object NMRDisc *rdisc = NULL;
|
||||
GByteArray *hwaddr = NULL;
|
||||
|
|
@ -415,7 +406,7 @@ main (int argc, char *argv[])
|
|||
|
||||
/* Set up unix signal handling - before creating threads, but after daemonizing! */
|
||||
main_loop = g_main_loop_new (NULL, FALSE);
|
||||
setup_signals (&quit_early);
|
||||
setup_signals ();
|
||||
|
||||
nm_logging_syslog_openlog (global_opt.debug);
|
||||
|
||||
|
|
@ -493,8 +484,7 @@ main (int argc, char *argv[])
|
|||
nm_rdisc_start (rdisc);
|
||||
}
|
||||
|
||||
if (!quit_early)
|
||||
g_main_loop_run (main_loop);
|
||||
g_main_loop_run (main_loop);
|
||||
|
||||
g_clear_pointer (&hwaddr, g_byte_array_unref);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,62 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||
/* NetworkManager -- Network link manager
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 2012 Red Hat, Inc.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <signal.h>
|
||||
|
||||
#include "nm-posix-signals.h"
|
||||
|
||||
|
||||
/* Stores the original signal mask of NetworkManager process */
|
||||
static sigset_t nm_original_signal_mask;
|
||||
|
||||
void
|
||||
nm_save_original_signal_mask (sigset_t sig_mask)
|
||||
{
|
||||
nm_original_signal_mask = sig_mask;
|
||||
}
|
||||
|
||||
const sigset_t *
|
||||
nm_get_original_signal_mask (void)
|
||||
{
|
||||
return &nm_original_signal_mask;
|
||||
}
|
||||
|
||||
/*
|
||||
* Unblock signals.
|
||||
* If a signal set is passed, those signals are unblocked. If user_data is NULL
|
||||
* the process' signal mask is set to the saved original mask.
|
||||
* Note: This function can be used in g_spawn_* as GSpawnChildSetupFunc()
|
||||
* callback.
|
||||
*/
|
||||
void
|
||||
nm_unblock_posix_signals (gpointer user_data)
|
||||
{
|
||||
sigset_t *user_sigset = (sigset_t *) user_data;
|
||||
|
||||
if (user_sigset != NULL) {
|
||||
pthread_sigmask (SIG_UNBLOCK, user_sigset, NULL);
|
||||
} else {
|
||||
const sigset_t *orig_sig_mask = nm_get_original_signal_mask ();
|
||||
pthread_sigmask (SIG_SETMASK, orig_sig_mask, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||
/* NetworkManager -- Network link manager
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Copyright (C) 2012 Red Hat, Inc.
|
||||
*/
|
||||
|
||||
#ifndef __NETWORKMANAGER_POSIX_SIGNALS_H__
|
||||
#define __NETWORKMANAGER_POSIX_SIGNALS_H__
|
||||
|
||||
#include <glib.h>
|
||||
#include <signal.h>
|
||||
|
||||
/*
|
||||
* This function can be used in g_spawn_* as GSpawnChildSetupFunc()
|
||||
* callback.
|
||||
*/
|
||||
void nm_unblock_posix_signals (gpointer user_data);
|
||||
|
||||
void nm_save_original_signal_mask (sigset_t sig_mask);
|
||||
const sigset_t *nm_get_original_signal_mask (void);
|
||||
|
||||
#endif /* __NETWORKMANAGER_POSIX_SIGNALS_H__ */
|
||||
|
|
@ -47,7 +47,6 @@
|
|||
#include "nm-ppp-manager.h"
|
||||
#include "nm-dbus-manager.h"
|
||||
#include "nm-logging.h"
|
||||
#include "nm-posix-signals.h"
|
||||
#include "nm-platform.h"
|
||||
#include "nm-core-internal.h"
|
||||
|
||||
|
|
@ -1030,20 +1029,6 @@ create_pppd_cmd_line (NMPPPManager *self,
|
|||
return cmd;
|
||||
}
|
||||
|
||||
static void
|
||||
pppd_child_setup (gpointer user_data G_GNUC_UNUSED)
|
||||
{
|
||||
/* We are in the child process at this point */
|
||||
pid_t pid = getpid ();
|
||||
setpgid (pid, pid);
|
||||
|
||||
/*
|
||||
* We blocked signals in main(). We need to restore original signal
|
||||
* mask for pppd here so that it can receive signals.
|
||||
*/
|
||||
nm_unblock_posix_signals (NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
pppoe_fill_defaults (NMSettingPpp *setting)
|
||||
{
|
||||
|
|
@ -1141,8 +1126,8 @@ nm_ppp_manager_start (NMPPPManager *manager,
|
|||
priv->pid = 0;
|
||||
if (!g_spawn_async (NULL, (char **) ppp_cmd->array->pdata, NULL,
|
||||
G_SPAWN_DO_NOT_REAP_CHILD,
|
||||
pppd_child_setup,
|
||||
NULL, &priv->pid, err)) {
|
||||
nm_utils_setpgid, NULL,
|
||||
&priv->pid, err)) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@
|
|||
|
||||
#include "nm-core-internal.h"
|
||||
#include "nm-platform.h"
|
||||
#include "nm-posix-signals.h"
|
||||
#include "NetworkManagerUtils.h"
|
||||
#include "nm-logging.h"
|
||||
|
||||
|
|
@ -44,22 +43,6 @@
|
|||
|
||||
#define PARSE_WARNING(msg...) nm_log_warn (LOGD_SETTINGS, " " msg)
|
||||
|
||||
static void
|
||||
iscsiadm_child_setup (gpointer user_data G_GNUC_UNUSED)
|
||||
{
|
||||
/* We are in the child process here; set a different process group to
|
||||
* ensure signal isolation between child and parent.
|
||||
*/
|
||||
pid_t pid = getpid ();
|
||||
setpgid (pid, pid);
|
||||
|
||||
/*
|
||||
* We blocked signals in main(). We need to restore original signal
|
||||
* mask for iscsiadm here so that it can receive signals.
|
||||
*/
|
||||
nm_unblock_posix_signals (NULL);
|
||||
}
|
||||
|
||||
/* Removes trailing whitespace and whitespace before and immediately after the '=' */
|
||||
static char *
|
||||
remove_most_whitespace (const char *src)
|
||||
|
|
@ -126,7 +109,7 @@ read_ibft_blocks (const char *iscsiadm_path,
|
|||
g_return_val_if_fail (out_blocks != NULL && *out_blocks == NULL, FALSE);
|
||||
|
||||
if (!g_spawn_sync ("/", (char **) argv, (char **) envp, 0,
|
||||
iscsiadm_child_setup, NULL, &out, &err, &status, error))
|
||||
NULL, NULL, &out, &err, &status, error))
|
||||
goto done;
|
||||
|
||||
if (!WIFEXITED (status)) {
|
||||
|
|
|
|||
|
|
@ -53,7 +53,6 @@
|
|||
#include <nm-utils.h>
|
||||
|
||||
#include "nm-platform.h"
|
||||
#include "nm-posix-signals.h"
|
||||
#include "NetworkManagerUtils.h"
|
||||
#include "nm-logging.h"
|
||||
#include "gsystem-local-alloc.h"
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@
|
|||
#include "nm-vpn-service.h"
|
||||
#include "nm-dbus-manager.h"
|
||||
#include "nm-logging.h"
|
||||
#include "nm-posix-signals.h"
|
||||
#include "nm-vpn-manager.h"
|
||||
#include "nm-glib-compat.h"
|
||||
|
||||
|
|
@ -167,20 +166,6 @@ nm_vpn_service_stop_connections (NMVpnService *service,
|
|||
g_clear_pointer (&priv->pending, g_slist_free);
|
||||
}
|
||||
|
||||
static void
|
||||
_daemon_setup (gpointer user_data G_GNUC_UNUSED)
|
||||
{
|
||||
/* We are in the child process at this point */
|
||||
pid_t pid = getpid ();
|
||||
setpgid (pid, pid);
|
||||
|
||||
/*
|
||||
* We blocked signals in main(). We need to restore original signal
|
||||
* mask for VPN service here so that it can receive signals.
|
||||
*/
|
||||
nm_unblock_posix_signals (NULL);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
_daemon_exec_timeout (gpointer data)
|
||||
{
|
||||
|
|
@ -207,7 +192,7 @@ nm_vpn_service_daemon_exec (NMVpnService *service, GError **error)
|
|||
vpn_argv[0] = priv->program;
|
||||
vpn_argv[1] = NULL;
|
||||
|
||||
success = g_spawn_async (NULL, vpn_argv, NULL, 0, _daemon_setup, NULL, &pid, &spawn_error);
|
||||
success = g_spawn_async (NULL, vpn_argv, NULL, 0, nm_utils_setpgid, NULL, &pid, &spawn_error);
|
||||
if (success) {
|
||||
nm_log_info (LOGD_VPN, "VPN service '%s' started (%s), PID %ld",
|
||||
priv->name, priv->dbus_service, (long int) pid);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue