portal: start portal automatically with compositor
This commit is contained in:
parent
39d1e49672
commit
4d6f226254
14 changed files with 331 additions and 125 deletions
59
src/utils/clone3.rs
Normal file
59
src/utils/clone3.rs
Normal 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)
|
||||
}
|
||||
}
|
||||
8
src/utils/process_name.rs
Normal file
8
src/utils/process_name.rs
Normal 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
35
src/utils/vecdeque_ext.rs
Normal 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)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue