diff --git a/Cargo.lock b/Cargo.lock index eadb0808a4..1ab4225db9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1108,6 +1108,8 @@ dependencies = [ "config", "daemon", "libredox", + "serde", + "serde_json", ] [[package]] diff --git a/init.d/00_nulld.service b/init.d/00_nulld.service new file mode 100644 index 0000000000..102db8c530 --- /dev/null +++ b/init.d/00_nulld.service @@ -0,0 +1,4 @@ +{ + "cmd": "nulld", + "type": { "scheme": "null" } +} diff --git a/init.d/00_randd.service b/init.d/00_randd.service new file mode 100644 index 0000000000..886efa0a2c --- /dev/null +++ b/init.d/00_randd.service @@ -0,0 +1,5 @@ +{ + "cmd": "randd", + "args": ["rand"], + "type": { "scheme": "rand" } +} diff --git a/init.d/00_rtcd.service b/init.d/00_rtcd.service new file mode 100644 index 0000000000..ea7ebece99 --- /dev/null +++ b/init.d/00_rtcd.service @@ -0,0 +1,4 @@ +{ + "cmd": "rtcd", + "type": "oneshot" +} diff --git a/init.d/00_runtime b/init.d/00_runtime deleted file mode 100644 index d7d4e3d10f..0000000000 --- a/init.d/00_runtime +++ /dev/null @@ -1,5 +0,0 @@ -# Various daemons that relibc needs to function. -rtcd -scheme null nulld -scheme zero zerod -scheme rand randd diff --git a/init.d/00_zerod.service b/init.d/00_zerod.service new file mode 100644 index 0000000000..e612aaa9c3 --- /dev/null +++ b/init.d/00_zerod.service @@ -0,0 +1,4 @@ +{ + "cmd": "zerod", + "type": { "scheme": "zero" } +} diff --git a/init/Cargo.toml b/init/Cargo.toml index e97eb1673f..2ee0bef18f 100644 --- a/init/Cargo.toml +++ b/init/Cargo.toml @@ -6,6 +6,8 @@ license = "MIT" [dependencies] libredox.workspace = true +serde = { version = "1", features = ["derive"] } +serde_json = "1" config = { path = "../config" } daemon = { path = "../daemon" } diff --git a/init/src/main.rs b/init/src/main.rs index ea16bf226d..04da484ddb 100644 --- a/init/src/main.rs +++ b/init/src/main.rs @@ -1,12 +1,13 @@ use std::collections::BTreeMap; -use std::env; -use std::ffi::OsString; +use std::ffi::{OsStr, OsString}; use std::io::Result; use std::path::Path; +use std::{env, fs}; use libredox::flag::{O_RDONLY, O_WRONLY}; use crate::script::Command; +use crate::service::Service; mod script; mod service; @@ -74,6 +75,12 @@ fn switch_root(prefix: &Path, etcdir: &Path, config: &mut InitConfig) { } fn run(file: &Path, config: &mut InitConfig) -> Result<()> { + if file.extension() == Some(OsStr::new("service")) { + let service: Service = serde_json::from_str(&fs::read_to_string(file).unwrap()).unwrap(); + service.spawn(&config.envs); + return Ok(()); + } + let (script, errors) = script::Script::from_file(file)?; for error in errors { diff --git a/init/src/service.rs b/init/src/service.rs index e7a433e510..618f9e1e22 100644 --- a/init/src/service.rs +++ b/init/src/service.rs @@ -2,15 +2,21 @@ use std::collections::BTreeMap; use std::ffi::OsString; use std::process::Command; -#[derive(Debug)] +use serde::Deserialize; + +#[derive(Debug, Deserialize)] pub struct Service { pub cmd: String, + #[serde(default)] pub args: Vec, + #[serde(default)] pub envs: BTreeMap, + #[serde(rename = "type")] pub type_: ServiceType, } -#[derive(Debug, Default)] +#[derive(Debug, Default, Deserialize)] +#[serde(rename_all = "snake_case")] pub enum ServiceType { #[default] Notify,