From 98a7de479aa6da2d499b893fb1b5e5bfc598ab40 Mon Sep 17 00:00:00 2001
From: chenjiayi <chenjiayi22@huawei.com>
Date: Fri, 26 Jan 2024 15:27:03 +0800
Subject: [PATCH] feature(devmaster): add net_driver builtin to be compatible
 with systemd-udev 255

The net_driver builtin is added to be compatible with systemd-udev 255.
Otherwise devmaster would crash when encounterring net_driver builtin in udev rules.
---
 exts/devmaster/src/lib/builtin/mod.rs        | 12 ++++-
 exts/devmaster/src/lib/builtin/net_driver.rs | 56 ++++++++++++++++++++
 2 files changed, 66 insertions(+), 2 deletions(-)
 create mode 100644 exts/devmaster/src/lib/builtin/net_driver.rs

diff --git a/exts/devmaster/src/lib/builtin/mod.rs b/exts/devmaster/src/lib/builtin/mod.rs
index 259ebd13..30ad9031 100644
--- a/exts/devmaster/src/lib/builtin/mod.rs
+++ b/exts/devmaster/src/lib/builtin/mod.rs
@@ -34,6 +34,7 @@ pub mod hwdb;
 pub mod input_id;
 pub mod keyboard;
 pub mod kmod;
+pub mod net_driver;
 pub mod net_id;
 pub mod net_setup_link;
 pub mod path_id;
@@ -108,8 +109,9 @@ pub enum BuiltinCommand {
     PathId = 8,
     Uaccess = 9,
     UsbId = 10,
-    Example = 11,
-    Max = 12,
+    NetDriver = 11,
+    Example = 12,
+    Max = 13,
 }
 
 impl FromStr for BuiltinCommand {
@@ -135,6 +137,7 @@ impl FromStr for BuiltinCommand {
             "path_id" => Ok(BuiltinCommand::PathId),
             "uaccess" => Ok(BuiltinCommand::Uaccess),
             "usb_id" => Ok(BuiltinCommand::UsbId),
+            "net_driver" => Ok(BuiltinCommand::NetDriver),
             "example" => Ok(BuiltinCommand::Example),
             _ => Err(Error::BuiltinCommandError {
                 msg: "invalid builtin command".to_string(),
@@ -157,6 +160,7 @@ impl Display for BuiltinCommand {
             BuiltinCommand::PathId => "path_id",
             BuiltinCommand::Uaccess => "uaccess",
             BuiltinCommand::UsbId => "usb_id",
+            BuiltinCommand::NetDriver => "net_driver",
             BuiltinCommand::Example => "example",
             _ => "invalid",
         };
@@ -190,6 +194,10 @@ impl BuiltinManager {
         builtins.insert(BuiltinCommand::PathId, Box::new(path_id::PathId {}));
         builtins.insert(BuiltinCommand::Uaccess, Box::new(uaccess::Uaccess {}));
         builtins.insert(BuiltinCommand::UsbId, Box::new(usb_id::UsbId {}));
+        builtins.insert(
+            BuiltinCommand::NetDriver,
+            Box::new(net_driver::NetDriver {}),
+        );
         builtins.insert(BuiltinCommand::Example, Box::new(example::Example {}));
 
         BuiltinManager { builtins }
diff --git a/exts/devmaster/src/lib/builtin/net_driver.rs b/exts/devmaster/src/lib/builtin/net_driver.rs
new file mode 100644
index 00000000..83e6398e
--- /dev/null
+++ b/exts/devmaster/src/lib/builtin/net_driver.rs
@@ -0,0 +1,56 @@
+// Copyright (c) 2022 Huawei Technologies Co.,Ltd. All rights reserved.
+//
+// sysMaster is licensed under Mulan PSL v2.
+// You can use this software according to the terms and conditions of the Mulan
+// PSL v2.
+// You may obtain a copy of Mulan PSL v2 at:
+//         http://license.coscl.org.cn/MulanPSL2
+// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY
+// KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+// NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
+// See the Mulan PSL v2 for more details.
+
+//! net_driver builtin
+//!
+//! Todo: compatible with udev
+
+use crate::builtin::Builtin;
+use crate::error::Result;
+use crate::rules::exec_unit::ExecuteUnit;
+
+/// btrfs builtin command
+pub struct NetDriver;
+
+impl Builtin for NetDriver {
+    /// builtin command
+    fn cmd(
+        &self,
+        _exec_unit: &ExecuteUnit,
+        _argc: i32,
+        _argv: Vec<String>,
+        _test: bool,
+    ) -> Result<bool> {
+        Ok(true)
+    }
+
+    /// builtin init function
+    fn init(&self) {}
+
+    /// builtin exit function
+    fn exit(&self) {}
+
+    /// check whether builtin command should reload
+    fn should_reload(&self) -> bool {
+        false
+    }
+
+    /// the help of builtin command
+    fn help(&self) -> String {
+        "detect network interface driver".to_string()
+    }
+
+    /// whether the builtin command can only run once
+    fn run_once(&self) -> bool {
+        false
+    }
+}
-- 
Gitee
