gentoo: handle both systemd and OpenRC loopback init at runtime

See Gentoo #318365
This commit is contained in:
Canek Peláez Valdés
2010-12-06 09:33:29 -06:00
committed by Dan Williams
parent bfbf5ef374
commit 740dc88cb3

View File

@@ -30,12 +30,22 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <gio/gio.h>
#include "NetworkManagerGeneric.h" #include "NetworkManagerGeneric.h"
#include "nm-system.h" #include "nm-system.h"
#include "NetworkManagerUtils.h" #include "NetworkManagerUtils.h"
#include "nm-logging.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 * nm_system_enable_loopback
* *
@@ -44,9 +54,42 @@
*/ */
void nm_system_enable_loopback (void) void nm_system_enable_loopback (void)
{ {
/* No need to run net.lo if it is already running */ GFile *file;
if (nm_spawn_process ("/etc/init.d/net.lo status") != 0) GFileInputStream *in;
nm_spawn_process("/etc/init.d/net.lo start"); 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);
} }
/* /*