1
0
Fork 0
forked from wry/wry

portal: start portal automatically with compositor

This commit is contained in:
Julian Orth 2024-03-19 21:00:36 +01:00
parent 39d1e49672
commit 4d6f226254
14 changed files with 331 additions and 125 deletions

59
src/utils/clone3.rs Normal file
View file

@ -0,0 +1,59 @@
use {
crate::forker::ForkerError,
std::mem,
uapi::{c, OwnedFd},
};
#[derive(Default, Copy, Clone)]
#[allow(non_camel_case_types, dead_code)]
struct clone_args {
flags: u64,
pidfd: u64,
child_tid: u64,
parent_tid: u64,
exit_signal: u64,
stack: u64,
stack_size: u64,
tls: u64,
set_tid: u64,
set_tid_size: u64,
cgroup: u64,
}
pub enum Forked {
Parent { pid: c::pid_t, pidfd: OwnedFd },
Child { pidfd: Option<OwnedFd> },
}
pub fn fork_with_pidfd(pidfd_for_child: bool) -> Result<Forked, ForkerError> {
let mut pidfd: c::c_int = 0;
let mut args = clone_args {
flags: c::CLONE_PIDFD as u64,
pidfd: (&mut pidfd as *mut c::c_int) as _,
exit_signal: c::SIGCHLD as _,
..Default::default()
};
let mut child_pidfd = None;
if pidfd_for_child {
child_pidfd = Some(uapi::pidfd_open(uapi::getpid(), 0).unwrap());
}
unsafe {
let pid = c::syscall(
c::SYS_clone3,
&mut args as *const _ as usize,
mem::size_of::<clone_args>(),
);
if let Err(e) = uapi::map_err!(pid) {
return Err(ForkerError::Fork(e.into()));
}
let res = if pid == 0 {
Forked::Child { pidfd: child_pidfd }
} else {
Forked::Parent {
pid: pid as _,
pidfd: OwnedFd::new(pidfd),
}
};
Ok(res)
}
}

View file

@ -0,0 +1,8 @@
use uapi::{c, IntoUstr};
pub fn set_process_name(name: &str) {
unsafe {
let name = name.into_ustr();
c::prctl(c::PR_SET_NAME, name.as_ptr());
}
}

35
src/utils/vecdeque_ext.rs Normal file
View file

@ -0,0 +1,35 @@
use std::{
collections::{Bound, VecDeque},
ops::RangeBounds,
};
pub trait VecDequeExt<T> {
fn get_slices(&self, range: impl RangeBounds<usize>) -> (&[T], &[T]);
}
impl<T> VecDequeExt<T> for VecDeque<T> {
fn get_slices(&self, range: impl RangeBounds<usize>) -> (&[T], &[T]) {
let (l, r) = self.as_slices();
let start = match range.start_bound().cloned() {
Bound::Included(n) => n,
Bound::Excluded(n) => n + 1,
Bound::Unbounded => 0,
};
let end = match range.end_bound().cloned() {
Bound::Included(n) => n + 1,
Bound::Excluded(n) => n,
Bound::Unbounded => self.len(),
};
let left = {
let lo = start.min(l.len());
let hi = end.min(l.len());
&l[lo..hi]
};
let right = {
let lo = start.saturating_sub(l.len());
let hi = end.saturating_sub(l.len());
&r[lo..hi]
};
(left, right)
}
}