mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-04 14:07:36 +00:00
Rollup merge of #55182 - jD91mZM2:rebased, r=alexcrichton
Redox: Update to new changes These are all cherry-picked from our fork: - Remove the `env:` scheme - Update `execve` system call to `fexec` - Interpret shebangs: these are no longer handled by the kernel, which like usual tries to be as minimal as possible
This commit is contained in:
commit
f4ecc1f521
@ -1 +1 @@
|
|||||||
Subproject commit 1844a772b60771d0124a157019f627d60fea4e73
|
Subproject commit c75ca6465a139704e00295be355b1f067af2f535
|
@ -77,6 +77,29 @@ pub fn cvt(result: Result<usize, syscall::Error>) -> io::Result<usize> {
|
|||||||
result.map_err(|err| io::Error::from_raw_os_error(err.errno))
|
result.map_err(|err| io::Error::from_raw_os_error(err.errno))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[doc(hidden)]
|
||||||
|
pub trait IsMinusOne {
|
||||||
|
fn is_minus_one(&self) -> bool;
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! impl_is_minus_one {
|
||||||
|
($($t:ident)*) => ($(impl IsMinusOne for $t {
|
||||||
|
fn is_minus_one(&self) -> bool {
|
||||||
|
*self == -1
|
||||||
|
}
|
||||||
|
})*)
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_is_minus_one! { i8 i16 i32 i64 isize }
|
||||||
|
|
||||||
|
pub fn cvt_libc<T: IsMinusOne>(t: T) -> io::Result<T> {
|
||||||
|
if t.is_minus_one() {
|
||||||
|
Err(io::Error::last_os_error())
|
||||||
|
} else {
|
||||||
|
Ok(t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// On Redox, use an illegal instruction to abort
|
/// On Redox, use an illegal instruction to abort
|
||||||
pub unsafe fn abort_internal() -> ! {
|
pub unsafe fn abort_internal() -> ! {
|
||||||
::core::intrinsics::abort();
|
::core::intrinsics::abort();
|
||||||
|
@ -12,10 +12,12 @@
|
|||||||
|
|
||||||
#![allow(unused_imports)] // lots of cfg code here
|
#![allow(unused_imports)] // lots of cfg code here
|
||||||
|
|
||||||
|
use libc::{self, c_char};
|
||||||
|
|
||||||
use os::unix::prelude::*;
|
use os::unix::prelude::*;
|
||||||
|
|
||||||
use error::Error as StdError;
|
use error::Error as StdError;
|
||||||
use ffi::{OsString, OsStr};
|
use ffi::{CStr, CString, OsStr, OsString};
|
||||||
use fmt;
|
use fmt;
|
||||||
use io::{self, Read, Write};
|
use io::{self, Read, Write};
|
||||||
use iter;
|
use iter;
|
||||||
@ -27,7 +29,7 @@ use ptr;
|
|||||||
use slice;
|
use slice;
|
||||||
use str;
|
use str;
|
||||||
use sys_common::mutex::Mutex;
|
use sys_common::mutex::Mutex;
|
||||||
use sys::{cvt, fd, syscall};
|
use sys::{cvt, cvt_libc, fd, syscall};
|
||||||
use vec;
|
use vec;
|
||||||
|
|
||||||
extern {
|
extern {
|
||||||
@ -129,6 +131,8 @@ pub fn current_exe() -> io::Result<PathBuf> {
|
|||||||
Ok(PathBuf::from(path))
|
Ok(PathBuf::from(path))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub static ENV_LOCK: Mutex = Mutex::new();
|
||||||
|
|
||||||
pub struct Env {
|
pub struct Env {
|
||||||
iter: vec::IntoIter<(OsString, OsString)>,
|
iter: vec::IntoIter<(OsString, OsString)>,
|
||||||
_dont_send_or_sync_me: PhantomData<*mut ()>,
|
_dont_send_or_sync_me: PhantomData<*mut ()>,
|
||||||
@ -140,52 +144,83 @@ impl Iterator for Env {
|
|||||||
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
|
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub unsafe fn environ() -> *mut *const *const c_char {
|
||||||
|
extern { static mut environ: *const *const c_char; }
|
||||||
|
&mut environ
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns a vector of (variable, value) byte-vector pairs for all the
|
/// Returns a vector of (variable, value) byte-vector pairs for all the
|
||||||
/// environment variables of the current process.
|
/// environment variables of the current process.
|
||||||
pub fn env() -> Env {
|
pub fn env() -> Env {
|
||||||
let mut variables: Vec<(OsString, OsString)> = Vec::new();
|
unsafe {
|
||||||
if let Ok(mut file) = ::fs::File::open("env:") {
|
let _guard = ENV_LOCK.lock();
|
||||||
let mut string = String::new();
|
let mut environ = *environ();
|
||||||
if file.read_to_string(&mut string).is_ok() {
|
if environ == ptr::null() {
|
||||||
for line in string.lines() {
|
panic!("os::env() failure getting env string from OS: {}",
|
||||||
let mut parts = line.splitn(2, '=');
|
io::Error::last_os_error());
|
||||||
if let Some(name) = parts.next() {
|
}
|
||||||
let value = parts.next().unwrap_or("");
|
let mut result = Vec::new();
|
||||||
variables.push((OsString::from(name.to_string()),
|
while *environ != ptr::null() {
|
||||||
OsString::from(value.to_string())));
|
if let Some(key_value) = parse(CStr::from_ptr(*environ).to_bytes()) {
|
||||||
}
|
result.push(key_value);
|
||||||
}
|
}
|
||||||
|
environ = environ.offset(1);
|
||||||
|
}
|
||||||
|
return Env {
|
||||||
|
iter: result.into_iter(),
|
||||||
|
_dont_send_or_sync_me: PhantomData,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Env { iter: variables.into_iter(), _dont_send_or_sync_me: PhantomData }
|
|
||||||
|
fn parse(input: &[u8]) -> Option<(OsString, OsString)> {
|
||||||
|
// Strategy (copied from glibc): Variable name and value are separated
|
||||||
|
// by an ASCII equals sign '='. Since a variable name must not be
|
||||||
|
// empty, allow variable names starting with an equals sign. Skip all
|
||||||
|
// malformed lines.
|
||||||
|
if input.is_empty() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
let pos = memchr::memchr(b'=', &input[1..]).map(|p| p + 1);
|
||||||
|
pos.map(|p| (
|
||||||
|
OsStringExt::from_vec(input[..p].to_vec()),
|
||||||
|
OsStringExt::from_vec(input[p+1..].to_vec()),
|
||||||
|
))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn getenv(key: &OsStr) -> io::Result<Option<OsString>> {
|
pub fn getenv(k: &OsStr) -> io::Result<Option<OsString>> {
|
||||||
if ! key.is_empty() {
|
// environment variables with a nul byte can't be set, so their value is
|
||||||
if let Ok(mut file) = ::fs::File::open(&("env:".to_owned() + key.to_str().unwrap())) {
|
// always None as well
|
||||||
let mut string = String::new();
|
let k = CString::new(k.as_bytes())?;
|
||||||
file.read_to_string(&mut string)?;
|
unsafe {
|
||||||
Ok(Some(OsString::from(string)))
|
let _guard = ENV_LOCK.lock();
|
||||||
|
let s = libc::getenv(k.as_ptr()) as *const libc::c_char;
|
||||||
|
let ret = if s.is_null() {
|
||||||
|
None
|
||||||
} else {
|
} else {
|
||||||
Ok(None)
|
Some(OsStringExt::from_vec(CStr::from_ptr(s).to_bytes().to_vec()))
|
||||||
}
|
};
|
||||||
} else {
|
Ok(ret)
|
||||||
Ok(None)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn setenv(key: &OsStr, value: &OsStr) -> io::Result<()> {
|
pub fn setenv(k: &OsStr, v: &OsStr) -> io::Result<()> {
|
||||||
if ! key.is_empty() {
|
let k = CString::new(k.as_bytes())?;
|
||||||
let mut file = ::fs::File::create(&("env:".to_owned() + key.to_str().unwrap()))?;
|
let v = CString::new(v.as_bytes())?;
|
||||||
file.write_all(value.as_bytes())?;
|
|
||||||
file.set_len(value.len() as u64)?;
|
unsafe {
|
||||||
|
let _guard = ENV_LOCK.lock();
|
||||||
|
cvt_libc(libc::setenv(k.as_ptr(), v.as_ptr(), 1)).map(|_| ())
|
||||||
}
|
}
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn unsetenv(key: &OsStr) -> io::Result<()> {
|
pub fn unsetenv(n: &OsStr) -> io::Result<()> {
|
||||||
::fs::remove_file(&("env:".to_owned() + key.to_str().unwrap()))?;
|
let nbuf = CString::new(n.as_bytes())?;
|
||||||
Ok(())
|
|
||||||
|
unsafe {
|
||||||
|
let _guard = ENV_LOCK.lock();
|
||||||
|
cvt_libc(libc::unsetenv(nbuf.as_ptr())).map(|_| ())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn page_size() -> usize {
|
pub fn page_size() -> usize {
|
||||||
|
@ -9,15 +9,19 @@
|
|||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use env::{split_paths};
|
use env::{split_paths};
|
||||||
use ffi::OsStr;
|
use ffi::{CStr, OsStr};
|
||||||
use os::unix::ffi::OsStrExt;
|
|
||||||
use fmt;
|
use fmt;
|
||||||
use io::{self, Error, ErrorKind};
|
use fs::File;
|
||||||
use iter;
|
use io::{self, prelude::*, BufReader, Error, ErrorKind, SeekFrom};
|
||||||
use libc::{EXIT_SUCCESS, EXIT_FAILURE};
|
use libc::{EXIT_SUCCESS, EXIT_FAILURE};
|
||||||
|
use os::unix::ffi::OsStrExt;
|
||||||
use path::{Path, PathBuf};
|
use path::{Path, PathBuf};
|
||||||
|
use ptr;
|
||||||
|
use sys::ext::fs::MetadataExt;
|
||||||
|
use sys::ext::io::AsRawFd;
|
||||||
use sys::fd::FileDesc;
|
use sys::fd::FileDesc;
|
||||||
use sys::fs::{File, OpenOptions};
|
use sys::fs::{File as SysFile, OpenOptions};
|
||||||
|
use sys::os::{ENV_LOCK, environ};
|
||||||
use sys::pipe::{self, AnonPipe};
|
use sys::pipe::{self, AnonPipe};
|
||||||
use sys::{cvt, syscall};
|
use sys::{cvt, syscall};
|
||||||
use sys_common::process::{CommandEnv, DefaultEnvKey};
|
use sys_common::process::{CommandEnv, DefaultEnvKey};
|
||||||
@ -297,12 +301,6 @@ impl Command {
|
|||||||
t!(callback());
|
t!(callback());
|
||||||
}
|
}
|
||||||
|
|
||||||
let args: Vec<[usize; 2]> = iter::once(
|
|
||||||
[self.program.as_ptr() as usize, self.program.len()]
|
|
||||||
).chain(
|
|
||||||
self.args.iter().map(|arg| [arg.as_ptr() as usize, arg.len()])
|
|
||||||
).collect();
|
|
||||||
|
|
||||||
self.env.apply();
|
self.env.apply();
|
||||||
|
|
||||||
let program = if self.program.contains(':') || self.program.contains('/') {
|
let program = if self.program.contains(':') || self.program.contains('/') {
|
||||||
@ -321,14 +319,93 @@ impl Command {
|
|||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(program) = program {
|
let mut file = if let Some(program) = program {
|
||||||
if let Err(err) = syscall::execve(program.as_os_str().as_bytes(), &args) {
|
t!(File::open(program.as_os_str()))
|
||||||
io::Error::from_raw_os_error(err.errno as i32)
|
|
||||||
} else {
|
|
||||||
panic!("return from exec without err");
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
io::Error::from_raw_os_error(syscall::ENOENT)
|
return io::Error::from_raw_os_error(syscall::ENOENT);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Push all the arguments
|
||||||
|
let mut args: Vec<[usize; 2]> = Vec::with_capacity(1 + self.args.len());
|
||||||
|
|
||||||
|
let interpreter = {
|
||||||
|
let mut reader = BufReader::new(&file);
|
||||||
|
|
||||||
|
let mut shebang = [0; 2];
|
||||||
|
let mut read = 0;
|
||||||
|
loop {
|
||||||
|
match t!(reader.read(&mut shebang[read..])) {
|
||||||
|
0 => break,
|
||||||
|
n => read += n,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if &shebang == b"#!" {
|
||||||
|
// This is an interpreted script.
|
||||||
|
// First of all, since we'll be passing another file to
|
||||||
|
// fexec(), we need to manually check that we have permission
|
||||||
|
// to execute this file:
|
||||||
|
let uid = t!(cvt(syscall::getuid()));
|
||||||
|
let gid = t!(cvt(syscall::getgid()));
|
||||||
|
let meta = t!(file.metadata());
|
||||||
|
|
||||||
|
let mode = if uid == meta.uid() as usize {
|
||||||
|
meta.mode() >> 3*2 & 0o7
|
||||||
|
} else if gid == meta.gid() as usize {
|
||||||
|
meta.mode() >> 3*1 & 0o7
|
||||||
|
} else {
|
||||||
|
meta.mode() & 0o7
|
||||||
|
};
|
||||||
|
if mode & 1 == 0 {
|
||||||
|
return io::Error::from_raw_os_error(syscall::EPERM);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Second of all, we need to actually read which interpreter it wants
|
||||||
|
let mut interpreter = Vec::new();
|
||||||
|
t!(reader.read_until(b'\n', &mut interpreter));
|
||||||
|
// Pop one trailing newline, if any
|
||||||
|
if interpreter.ends_with(&[b'\n']) {
|
||||||
|
interpreter.pop().unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: Here we could just reassign `file` directly, if it
|
||||||
|
// wasn't for lexical lifetimes. Remove the whole `let
|
||||||
|
// interpreter = { ... };` hack once NLL lands.
|
||||||
|
// NOTE: Although DO REMEMBER to make sure the interpreter path
|
||||||
|
// still lives long enough to reach fexec.
|
||||||
|
Some(interpreter)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if let Some(ref interpreter) = interpreter {
|
||||||
|
let path: &OsStr = OsStr::from_bytes(&interpreter);
|
||||||
|
file = t!(File::open(path));
|
||||||
|
|
||||||
|
args.push([interpreter.as_ptr() as usize, interpreter.len()]);
|
||||||
|
} else {
|
||||||
|
t!(file.seek(SeekFrom::Start(0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
args.push([self.program.as_ptr() as usize, self.program.len()]);
|
||||||
|
args.extend(self.args.iter().map(|arg| [arg.as_ptr() as usize, arg.len()]));
|
||||||
|
|
||||||
|
// Push all the variables
|
||||||
|
let mut vars: Vec<[usize; 2]> = Vec::new();
|
||||||
|
{
|
||||||
|
let _guard = ENV_LOCK.lock();
|
||||||
|
let mut environ = *environ();
|
||||||
|
while *environ != ptr::null() {
|
||||||
|
let var = CStr::from_ptr(*environ).to_bytes();
|
||||||
|
vars.push([var.as_ptr() as usize, var.len()]);
|
||||||
|
environ = environ.offset(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Err(err) = syscall::fexec(file.as_raw_fd(), &args, &vars) {
|
||||||
|
io::Error::from_raw_os_error(err.errno as i32)
|
||||||
|
} else {
|
||||||
|
panic!("return from exec without err");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -392,7 +469,7 @@ impl Stdio {
|
|||||||
let mut opts = OpenOptions::new();
|
let mut opts = OpenOptions::new();
|
||||||
opts.read(readable);
|
opts.read(readable);
|
||||||
opts.write(!readable);
|
opts.write(!readable);
|
||||||
let fd = File::open(Path::new("null:"), &opts)?;
|
let fd = SysFile::open(Path::new("null:"), &opts)?;
|
||||||
Ok((ChildStdio::Owned(fd.into_fd()), None))
|
Ok((ChildStdio::Owned(fd.into_fd()), None))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -405,8 +482,8 @@ impl From<AnonPipe> for Stdio {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<File> for Stdio {
|
impl From<SysFile> for Stdio {
|
||||||
fn from(file: File) -> Stdio {
|
fn from(file: SysFile) -> Stdio {
|
||||||
Stdio::Fd(file.into_fd())
|
Stdio::Fd(file.into_fd())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -82,12 +82,6 @@ pub fn dup2(fd: usize, newfd: usize, buf: &[u8]) -> Result<usize> {
|
|||||||
unsafe { syscall4(SYS_DUP2, fd, newfd, buf.as_ptr() as usize, buf.len()) }
|
unsafe { syscall4(SYS_DUP2, fd, newfd, buf.as_ptr() as usize, buf.len()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Replace the current process with a new executable
|
|
||||||
pub fn execve<T: AsRef<[u8]>>(path: T, args: &[[usize; 2]]) -> Result<usize> {
|
|
||||||
unsafe { syscall4(SYS_EXECVE, path.as_ref().as_ptr() as usize,
|
|
||||||
path.as_ref().len(), args.as_ptr() as usize, args.len()) }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Exit the current process
|
/// Exit the current process
|
||||||
pub fn exit(status: usize) -> Result<usize> {
|
pub fn exit(status: usize) -> Result<usize> {
|
||||||
unsafe { syscall1(SYS_EXIT, status) }
|
unsafe { syscall1(SYS_EXIT, status) }
|
||||||
@ -110,9 +104,10 @@ pub fn fcntl(fd: usize, cmd: usize, arg: usize) -> Result<usize> {
|
|||||||
unsafe { syscall3(SYS_FCNTL, fd, cmd, arg) }
|
unsafe { syscall3(SYS_FCNTL, fd, cmd, arg) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Register a file for event-based I/O
|
/// Replace the current process with a new executable
|
||||||
pub fn fevent(fd: usize, flags: usize) -> Result<usize> {
|
pub fn fexec(fd: usize, args: &[[usize; 2]], vars: &[[usize; 2]]) -> Result<usize> {
|
||||||
unsafe { syscall2(SYS_FEVENT, fd, flags) }
|
unsafe { syscall5(SYS_FEXEC, fd, args.as_ptr() as usize, args.len(),
|
||||||
|
vars.as_ptr() as usize, vars.len()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Map a file into memory
|
/// Map a file into memory
|
||||||
|
@ -113,4 +113,46 @@ pub const SA_RESTART: usize = 0x10000000;
|
|||||||
pub const SA_NODEFER: usize = 0x40000000;
|
pub const SA_NODEFER: usize = 0x40000000;
|
||||||
pub const SA_RESETHAND: usize = 0x80000000;
|
pub const SA_RESETHAND: usize = 0x80000000;
|
||||||
|
|
||||||
pub const WNOHANG: usize = 1;
|
pub const WNOHANG: usize = 0x01;
|
||||||
|
pub const WUNTRACED: usize = 0x02;
|
||||||
|
pub const WCONTINUED: usize = 0x08;
|
||||||
|
|
||||||
|
/// True if status indicates the child is stopped.
|
||||||
|
pub fn wifstopped(status: usize) -> bool {
|
||||||
|
(status & 0xff) == 0x7f
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If wifstopped(status), the signal that stopped the child.
|
||||||
|
pub fn wstopsig(status: usize) -> usize {
|
||||||
|
(status >> 8) & 0xff
|
||||||
|
}
|
||||||
|
|
||||||
|
/// True if status indicates the child continued after a stop.
|
||||||
|
pub fn wifcontinued(status: usize) -> bool {
|
||||||
|
status == 0xffff
|
||||||
|
}
|
||||||
|
|
||||||
|
/// True if STATUS indicates termination by a signal.
|
||||||
|
pub fn wifsignaled(status: usize) -> bool {
|
||||||
|
((status & 0x7f) + 1) as i8 >= 2
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If wifsignaled(status), the terminating signal.
|
||||||
|
pub fn wtermsig(status: usize) -> usize {
|
||||||
|
status & 0x7f
|
||||||
|
}
|
||||||
|
|
||||||
|
/// True if status indicates normal termination.
|
||||||
|
pub fn wifexited(status: usize) -> bool {
|
||||||
|
wtermsig(status) == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If wifexited(status), the exit status.
|
||||||
|
pub fn wexitstatus(status: usize) -> usize {
|
||||||
|
(status >> 8) & 0xff
|
||||||
|
}
|
||||||
|
|
||||||
|
/// True if status indicates a core dump was created.
|
||||||
|
pub fn wcoredump(status: usize) -> bool {
|
||||||
|
(status & 0x80) != 0
|
||||||
|
}
|
||||||
|
@ -36,6 +36,7 @@ pub const SYS_FCHMOD: usize = SYS_CLASS_FILE | 94;
|
|||||||
pub const SYS_FCHOWN: usize = SYS_CLASS_FILE | 207;
|
pub const SYS_FCHOWN: usize = SYS_CLASS_FILE | 207;
|
||||||
pub const SYS_FCNTL: usize = SYS_CLASS_FILE | 55;
|
pub const SYS_FCNTL: usize = SYS_CLASS_FILE | 55;
|
||||||
pub const SYS_FEVENT: usize = SYS_CLASS_FILE | 927;
|
pub const SYS_FEVENT: usize = SYS_CLASS_FILE | 927;
|
||||||
|
pub const SYS_FEXEC: usize = SYS_CLASS_FILE | 11;
|
||||||
pub const SYS_FMAP: usize = SYS_CLASS_FILE | 90;
|
pub const SYS_FMAP: usize = SYS_CLASS_FILE | 90;
|
||||||
pub const SYS_FUNMAP: usize = SYS_CLASS_FILE | 91;
|
pub const SYS_FUNMAP: usize = SYS_CLASS_FILE | 91;
|
||||||
pub const SYS_FPATH: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 928;
|
pub const SYS_FPATH: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 928;
|
||||||
@ -50,7 +51,6 @@ pub const SYS_BRK: usize = 45;
|
|||||||
pub const SYS_CHDIR: usize = 12;
|
pub const SYS_CHDIR: usize = 12;
|
||||||
pub const SYS_CLOCK_GETTIME: usize = 265;
|
pub const SYS_CLOCK_GETTIME: usize = 265;
|
||||||
pub const SYS_CLONE: usize = 120;
|
pub const SYS_CLONE: usize = 120;
|
||||||
pub const SYS_EXECVE: usize = 11;
|
|
||||||
pub const SYS_EXIT: usize = 1;
|
pub const SYS_EXIT: usize = 1;
|
||||||
pub const SYS_FUTEX: usize = 240;
|
pub const SYS_FUTEX: usize = 240;
|
||||||
pub const SYS_GETCWD: usize = 183;
|
pub const SYS_GETCWD: usize = 183;
|
||||||
|
Loading…
Reference in New Issue
Block a user