about summary refs log tree commit diff
path: root/src/nm-initrd-generator
diff options
context:
space:
mode:
Diffstat (limited to 'src/nm-initrd-generator')
-rw-r--r--src/nm-initrd-generator/meson.build7
-rwxr-xr-xsrc/nm-initrd-generator/nm-initrd-generator.sh50
-rw-r--r--src/nm-initrd-generator/nmi-cmdline-reader.c2
3 files changed, 58 insertions, 1 deletions
diff --git a/src/nm-initrd-generator/meson.build b/src/nm-initrd-generator/meson.build
index 6b02e066..2315ebe4 100644
--- a/src/nm-initrd-generator/meson.build
+++ b/src/nm-initrd-generator/meson.build
@@ -46,3 +46,10 @@ executable(
   install: true,
   install_dir: nm_libexecdir,
 )
+
+if install_systemdgeneratordir
+  install_data(
+    'nm-initrd-generator.sh',
+    install_dir: systemd_systemdsystemgeneratordir,
+  )
+endif
diff --git a/src/nm-initrd-generator/nm-initrd-generator.sh b/src/nm-initrd-generator/nm-initrd-generator.sh
new file mode 100755
index 00000000..20ff78cc
--- /dev/null
+++ b/src/nm-initrd-generator/nm-initrd-generator.sh
@@ -0,0 +1,50 @@
+#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+# initrd-specific units
+initrd_units=(
+    NetworkManager-config-initrd.service
+    NetworkManager-initrd.service
+    NetworkManager-wait-online-initrd.service
+)
+
+# host-specific units
+host_units=(
+    NetworkManager.service
+    NetworkManager-dispatcher.service
+    NetworkManager-wait-online.service
+)
+
+# Get generator normal directory
+normal_dir=$1
+
+# Since NetworkManager-initrd.service and NetworkManager.service are allocated
+# for the same bus name org.freedesktop.NetworkManager, we should mask one of
+# them depending on if we are in the initrd or on the host.
+if [ "$SYSTEMD_IN_INITRD" != 1 ]; then
+    # Mask initrd units in the host
+    for unit in "${initrd_units[@]}"; do
+        ln -s /dev/null "$normal_dir"/"$unit" 2> /dev/null
+    done
+    # Nothing else to do
+    exit 0
+fi
+
+# Mask host units in the initrd
+for unit in "${host_units[@]}"; do
+    ln -s /dev/null "$normal_dir"/"$unit" 2> /dev/null
+done
+
+# Install initrd units in the unit file hierarchy
+mkdir -p "$normal_dir"/initrd.target.wants
+mkdir -p "$normal_dir"/network-online.target.wants
+for unit in "${initrd_units[@]}"; do
+    ln -s /usr/lib/systemd/system/"$unit" \
+        "$normal_dir"/initrd.target.wants/"$unit"
+    if [ "$unit" = "NetworkManager-wait-online-initrd.service" ]; then
+        ln -s /usr/lib/systemd/system/"$unit" \
+            "$normal_dir"/network-online.target.wants/"$unit"
+    fi
+done
+
+exit 0
diff --git a/src/nm-initrd-generator/nmi-cmdline-reader.c b/src/nm-initrd-generator/nmi-cmdline-reader.c
index f9b0fa16..5d91d157 100644
--- a/src/nm-initrd-generator/nmi-cmdline-reader.c
+++ b/src/nm-initrd-generator/nmi-cmdline-reader.c
@@ -409,7 +409,7 @@ reader_read_all_connections_from_fw(Reader *reader, const char *sysfs_dir)
 
         if (!nmi_ibft_update_connection_from_nic(connection, nic, &error)) {
             _LOGW(LOGD_CORE, "Unable to merge iBFT configuration: %s", error->message);
-            g_error_free(error);
+            g_clear_error(&error);
             continue;
         }