summaryrefslogtreecommitdiffstats
path: root/crates
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2023-09-30 20:21:09 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2023-09-30 20:21:09 +0200
commite77305d3dc7e89474b14f86b180fc0ac51db3678 (patch)
tree81a25f3ea92fd7b3098f035d6475e5e533094b5c /crates
parentfbaa41611d2aa30815a3d9d3c214698825bc6896 (diff)
downloadrebel-e77305d3dc7e89474b14f86b180fc0ac51db3678.tar
rebel-e77305d3dc7e89474b14f86b180fc0ac51db3678.zip
Update dependencies
Diffstat (limited to 'crates')
-rw-r--r--crates/driver/Cargo.toml8
-rw-r--r--crates/driver/src/driver.rs21
-rw-r--r--crates/driver/src/main.rs2
-rw-r--r--crates/runner/Cargo.toml10
-rw-r--r--crates/runner/src/jobserver.rs11
-rw-r--r--crates/runner/src/lib.rs35
-rw-r--r--crates/runner/src/util/unix.rs10
7 files changed, 57 insertions, 40 deletions
diff --git a/crates/driver/Cargo.toml b/crates/driver/Cargo.toml
index 9913a83..ecea8b8 100644
--- a/crates/driver/Cargo.toml
+++ b/crates/driver/Cargo.toml
@@ -11,15 +11,15 @@ edition = "2021"
common = { path = "../common", package = "rebel-common" }
runner = { path = "../runner", package = "rebel-runner" }
-clap = "3.0.0-beta.2"
+clap = { version = "4.0.0", features = ["derive"] }
deb-version = "0.1.1"
enum-kinds = "0.5.1"
handlebars = "4.1.3"
-indoc = "1.0.3"
+indoc = "2.0.4"
lazy_static = "1.4.0"
-nix = "0.23.0"
+nix = { version = "0.27.1", features = ["poll"] }
nom = "7.1.0"
scoped-tls-hkt = "0.1.2"
serde = { version = "1", features = ["derive", "rc"] }
-serde_yaml = "0.8"
+serde_yaml = "0.9"
walkdir = "2"
diff --git a/crates/driver/src/driver.rs b/crates/driver/src/driver.rs
index dfdd6e9..d0abbcb 100644
--- a/crates/driver/src/driver.rs
+++ b/crates/driver/src/driver.rs
@@ -349,17 +349,25 @@ impl<'ctx> Driver<'ctx> {
}
fn wait_for_task(&mut self) -> Result<()> {
- let mut pollfds: Box<[_]> = self
+ let mut pollfds: Vec<_> = self
.tasks_running
- .keys()
- .copied()
- .map(|fd| poll::PollFd::new(fd, poll::PollFlags::POLLIN))
+ .values()
+ .map(|(socket, _)| poll::PollFd::new(socket, poll::PollFlags::POLLIN))
.collect();
while poll::poll(&mut pollfds, -1).context("poll()")? == 0 {}
- for pollfd in &*pollfds {
- let events = pollfd.revents().expect("Unknown events in poll() return");
+ let pollevents: Vec<_> = pollfds
+ .into_iter()
+ .map(|pollfd| {
+ (
+ pollfd.as_fd().as_raw_fd(),
+ pollfd.revents().expect("Unknown events in poll() return"),
+ )
+ })
+ .collect();
+
+ for (fd, events) in pollevents {
if !events.contains(poll::PollFlags::POLLIN) {
if events.intersects(!poll::PollFlags::POLLIN) {
return Err(Error::new(
@@ -369,7 +377,6 @@ impl<'ctx> Driver<'ctx> {
continue;
}
- let fd = pollfd.as_raw_fd();
let (socket, task_ref) = self.tasks_running.remove(&fd).unwrap();
let task_output = Runner::result(&socket)?;
diff --git a/crates/driver/src/main.rs b/crates/driver/src/main.rs
index ea97ee5..98aa10a 100644
--- a/crates/driver/src/main.rs
+++ b/crates/driver/src/main.rs
@@ -16,7 +16,7 @@ use clap::Parser;
use runner::Runner;
#[derive(Parser)]
-#[clap(version = clap::crate_version!())]
+#[clap(version, about)]
struct Opts {
/// Allow N jobs at once.
/// Defaults to the number of available CPUs
diff --git a/crates/runner/Cargo.toml b/crates/runner/Cargo.toml
index 19ad124..bd1287e 100644
--- a/crates/runner/Cargo.toml
+++ b/crates/runner/Cargo.toml
@@ -11,15 +11,15 @@ edition = "2021"
common = { path = "../common", package = "rebel-common" }
bincode = "1.3.3"
-blake3 = { version = "1.0.0", features = ["traits-preview"] }
+blake3 = { version = "1.3.0", features = ["traits-preview"] }
capctl = "0.2.0"
-digest = "0.9.0"
+digest = "0.10.1"
libc = "0.2.84"
-nix = "0.23.0"
+nix = { version = "0.27.1", features = ["user", "fs", "process", "mount", "sched", "poll", "signal", "hostname"] }
olpc-cjson = "0.1.0"
serde = { version = "1", features = ["derive"] }
serde_json = "1.0.62"
tar = "0.4.32"
-tee_readwrite = "0.1.0"
-uds = "0.2.6"
+tee_readwrite = "0.2.0"
+uds = "0.4.1"
walkdir = "2.3.2"
diff --git a/crates/runner/src/jobserver.rs b/crates/runner/src/jobserver.rs
index 3b6c856..d4c670c 100644
--- a/crates/runner/src/jobserver.rs
+++ b/crates/runner/src/jobserver.rs
@@ -1,4 +1,7 @@
-use std::{os::unix::prelude::RawFd, slice};
+use std::{
+ os::{fd::BorrowedFd, unix::prelude::RawFd},
+ slice,
+};
use nix::{errno::Errno, fcntl::OFlag, poll, unistd};
@@ -27,10 +30,14 @@ impl Jobserver {
Ok(Jobserver { tokens, r, w })
}
+ fn read_fd(&self) -> BorrowedFd<'_> {
+ unsafe { BorrowedFd::borrow_raw(self.r) }
+ }
+
pub fn wait(&mut self) -> u8 {
loop {
poll::poll(
- &mut [poll::PollFd::new(self.r, poll::PollFlags::POLLIN)],
+ &mut [poll::PollFd::new(&self.read_fd(), poll::PollFlags::POLLIN)],
-1,
)
.expect("poll()");
diff --git a/crates/runner/src/lib.rs b/crates/runner/src/lib.rs
index cfaf658..308b54c 100644
--- a/crates/runner/src/lib.rs
+++ b/crates/runner/src/lib.rs
@@ -95,6 +95,10 @@ fn handle_socket(ctx: &mut RunnerContext) -> bool {
true
}
+fn borrow_socket_fd(socket: &UnixSeqpacketConn) -> BorrowedFd<'_> {
+ unsafe { BorrowedFd::borrow_raw(socket.as_raw_fd()) }
+}
+
fn runner(uid: Uid, gid: Gid, socket: UnixSeqpacketConn, _lockfile: File, options: &Options) -> ! {
ns::mount_proc();
ns::setup_userns(Uid::from_raw(0), Gid::from_raw(0), uid, gid);
@@ -117,35 +121,36 @@ fn runner(uid: Uid, gid: Gid, socket: UnixSeqpacketConn, _lockfile: File, option
signals.add(signal::Signal::SIGCHLD);
signal::pthread_sigmask(signal::SigmaskHow::SIG_BLOCK, Some(&signals), None)
.expect("pthread_sigmask()");
- let mut sfd = SignalFd::with_flags(&signals, SfdFlags::SFD_CLOEXEC)
+ let mut signal_fd = SignalFd::with_flags(&signals, SfdFlags::SFD_CLOEXEC)
.expect("Failed to create signal file descriptor");
- let mut pollfds = [
- poll::PollFd::new(sfd.as_raw_fd(), poll::PollFlags::POLLIN),
- poll::PollFd::new(ctx.socket.as_raw_fd(), poll::PollFlags::POLLIN),
- ];
-
loop {
+ let socket_fd = borrow_socket_fd(&ctx.socket);
+ let mut pollfds = [
+ poll::PollFd::new(&signal_fd, poll::PollFlags::POLLIN),
+ poll::PollFd::new(&socket_fd, poll::PollFlags::POLLIN),
+ ];
poll::poll(&mut pollfds, -1).expect("poll()");
- let events = pollfds[0]
+ let signal_events = pollfds[0]
+ .revents()
+ .expect("Unknown events in poll() return");
+ let socket_events = pollfds[1]
.revents()
.expect("Unknown events in poll() return");
- if events.contains(poll::PollFlags::POLLIN) {
- let _signal = sfd.read_signal().expect("read_signal()").unwrap();
+
+ if signal_events.contains(poll::PollFlags::POLLIN) {
+ let _signal = signal_fd.read_signal().expect("read_signal()").unwrap();
handle_sigchld(&mut ctx).expect("Task process exited abnormally");
- } else if events.intersects(!poll::PollFlags::POLLIN) {
+ } else if signal_events.intersects(!poll::PollFlags::POLLIN) {
panic!("Unexpected error status for signal file descriptor");
}
- let events = pollfds[1]
- .revents()
- .expect("Unknown events in poll() return");
- if events.contains(poll::PollFlags::POLLIN) {
+ if socket_events.contains(poll::PollFlags::POLLIN) {
if !handle_socket(&mut ctx) {
break;
}
- } else if events.intersects(!poll::PollFlags::POLLIN) {
+ } else if socket_events.intersects(!poll::PollFlags::POLLIN) {
panic!("Unexpected error status for socket file descriptor");
}
}
diff --git a/crates/runner/src/util/unix.rs b/crates/runner/src/util/unix.rs
index 710138c..c3e9ddb 100644
--- a/crates/runner/src/util/unix.rs
+++ b/crates/runner/src/util/unix.rs
@@ -11,9 +11,8 @@ use common::error::*;
use super::fs;
pub fn set_blocking(fd: RawFd, blocking: bool) -> Result<()> {
- let flags = unsafe {
- OFlag::from_bits_unchecked(fcntl::fcntl(fd, FcntlArg::F_GETFL).context("fcntl(F_GETFL)")?)
- };
+ let flags =
+ OFlag::from_bits_retain(fcntl::fcntl(fd, FcntlArg::F_GETFL).context("fcntl(F_GETFL)")?);
let new_flags = if blocking {
flags & !OFlag::O_NONBLOCK
@@ -29,9 +28,8 @@ pub fn set_blocking(fd: RawFd, blocking: bool) -> Result<()> {
}
pub fn set_cloexec(fd: RawFd, cloexec: bool) -> Result<()> {
- let flags = unsafe {
- FdFlag::from_bits_unchecked(fcntl::fcntl(fd, FcntlArg::F_GETFD).context("fcntl(F_GETFD)")?)
- };
+ let flags =
+ FdFlag::from_bits_retain(fcntl::fcntl(fd, FcntlArg::F_GETFD).context("fcntl(F_GETFD)")?);
let new_flags = if cloexec {
flags | FdFlag::FD_CLOEXEC