diff options
author | Canek Peláez Valdés <caneko@gmail.com> | 2010-12-06 09:33:29 -0600 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2010-12-06 09:36:28 -0600 |
commit | 740dc88cb3db3f910948e50b9340016ab8c5e84c (patch) | |
tree | 7dcabb1c2be22f7a8ed4ab68db22a30a63edeea0 | |
parent | bfbf5ef374a192c88488594d9f811007f5f6f831 (diff) |
gentoo: handle both systemd and OpenRC loopback init at runtime
See Gentoo #318365
-rw-r--r-- | src/backends/NetworkManagerGentoo.c | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/src/backends/NetworkManagerGentoo.c b/src/backends/NetworkManagerGentoo.c index 8d9e68c59c..2854901a56 100644 --- a/src/backends/NetworkManagerGentoo.c +++ b/src/backends/NetworkManagerGentoo.c @@ -32,2 +32,3 @@ #include <stdlib.h> +#include <gio/gio.h> @@ -38,2 +39,11 @@ +#define BUFFER_SIZE 512 + +static void openrc_start_lo_if_necessary() +{ + /* No need to run net.lo if it is already running */ + if (nm_spawn_process ("/etc/init.d/net.lo status") != 0) + nm_spawn_process ("/etc/init.d/net.lo start"); +} + /* @@ -46,5 +56,38 @@ void nm_system_enable_loopback (void) { - /* No need to run net.lo if it is already running */ - if (nm_spawn_process ("/etc/init.d/net.lo status") != 0) - nm_spawn_process("/etc/init.d/net.lo start"); + GFile *file; + GFileInputStream *in; + gchar buffer[BUFFER_SIZE]; + gchar *comm, *readed, *tmp; + gssize r; + + file = g_file_new_for_path ("/proc/1/comm"); + in = g_file_read (file, NULL, NULL); + + /* If anything goes wrong trying to open /proc/1/comm, + we will assume OpenRC. */ + if (!in) { + openrc_start_lo_if_necessary (); + return; + } + + comm = g_strdup(""); + while ((r = g_input_stream_read (G_INPUT_STREAM(in), buffer, BUFFER_SIZE, NULL, NULL)) > 0) { + readed = g_strndup (buffer, r); + tmp = g_strconcat (comm, readed, NULL); + g_free (comm); + g_free (readed); + comm = tmp; + } + + if (g_strstr_len (comm, -1, "systemd")) { + /* We use the generic loopback enabler if using systemd. */ + nm_log_info (LOGD_CORE, "NetworkManager is running with systemd..."); + nm_generic_enable_loopback (); + } else { + /* OpenRC otherwise. */ + nm_log_info (LOGD_CORE, "NetworkManager is running with OpenRC..."); + openrc_start_lo_if_necessary(); + } + + g_free (comm); } |