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:36:28 (GMT)
commit740dc88cb3db3f910948e50b9340016ab8c5e84c (patch) (side-by-side diff)
tree7dcabb1c2be22f7a8ed4ab68db22a30a63edeea0
parentbfbf5ef374a192c88488594d9f811007f5f6f831 (diff)
downloadNetworkManager-740dc88cb3db3f910948e50b9340016ab8c5e84c.zip
NetworkManager-740dc88cb3db3f910948e50b9340016ab8c5e84c.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);
}
/*