summaryrefslogtreecommitdiff
authorCanek Peláez Valdés <caneko@gmail.com>2010-12-06 15:33:29 (GMT)
committer Dan Williams <dcbw@redhat.com>2010-12-06 15:37:06 (GMT)
commitabfea5a7008396960791d6312d1f787e89f9f4d8 (patch) (side-by-side diff)
treed56457b83714228e03b01a9a24dd6ae20facab4b
parent0e31b243aa5c19cedd0b44be01cf77604a1ba5b3 (diff)
downloadNetworkManager-abfea5a7008396960791d6312d1f787e89f9f4d8.zip
NetworkManager-abfea5a7008396960791d6312d1f787e89f9f4d8.tar.gz
gentoo: handle both systemd and OpenRC loopback init at runtime
See Gentoo #318365
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--src/backends/NetworkManagerGentoo.c49
1 files changed, 46 insertions, 3 deletions
diff --git a/src/backends/NetworkManagerGentoo.c b/src/backends/NetworkManagerGentoo.c
index 8d9e68c..2854901 100644
--- a/src/backends/NetworkManagerGentoo.c
+++ b/src/backends/NetworkManagerGentoo.c
@@ -30,12 +30,22 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
+#include <gio/gio.h>
#include "NetworkManagerGeneric.h"
#include "nm-system.h"
#include "NetworkManagerUtils.h"
#include "nm-logging.h"
+#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");
+}
+
/*
* nm_system_enable_loopback
*
@@ -44,9 +54,42 @@
*/
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);
}
/*