diff --git a/Cargo.toml b/Cargo.toml index b3ccdcf..d2a4af7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,3 @@ [workspace] -members = ["judge-core", "judger"] -resolver = "2" \ No newline at end of file +members = ["judge-core", "judger", "runguard"] +resolver = "2" diff --git a/runguard/Cargo.toml b/runguard/Cargo.toml new file mode 100644 index 0000000..92f6db0 --- /dev/null +++ b/runguard/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "runguard" +version = "0.1.0" +edition = "2021" + +[dependencies] +clap = { version = "4.5", features = ["derive"] } diff --git a/runguard/README.md b/runguard/README.md new file mode 100644 index 0000000..03d6527 --- /dev/null +++ b/runguard/README.md @@ -0,0 +1,5 @@ +# runguard + +A Rust version of +[Domjudge runguard](https://github.com/DOMjudge/domjudge/blob/main/judge/runguard.cc) +written in C++. diff --git a/runguard/src/main.rs b/runguard/src/main.rs new file mode 100644 index 0000000..56b6f83 --- /dev/null +++ b/runguard/src/main.rs @@ -0,0 +1,35 @@ +use clap::Parser; + +#[derive(Parser)] +#[command( + override_usage = "runguard [OPTION]... ...", + about = "Run COMMAND with specified options.", + after_help = "Note that root privileges are needed for the `root' and `user' options. \ +If `user' is set, then `group' defaults to the same to prevent security issues, \ +since otherwise the process would retain group root permissions. \ +The COMMAND path is relative to the changed ROOT directory if specified. \ +TIME may be specified as a float; two floats separated by `:' are treated as soft and hard limits. \ +The runtime written to file is that of the last of wall/cpu time options set, \ +and defaults to CPU time when neither is set. \ +When run setuid without the `user' option, the user ID is set to the real user ID." +)] +struct Cli { + /// run COMMAND with root directory set to ROOT + #[arg(short, long)] + root: String, + + /// run COMMAND as user with username or ID USER + #[arg(short, long)] + user: String, + + /// run COMMAND under group with name or ID GROUP + #[arg(short, long)] + group: String, + + #[arg(required = true)] + command: Vec, +} + +fn main() { + let _ = Cli::parse(); +}