diff options
author | zethra <jediben97@gmail.com> | 2016-11-08 10:23:17 -0500 |
---|---|---|
committer | zethra <jediben97@gmail.com> | 2016-11-08 10:23:17 -0500 |
commit | 1b3aea102e013e06f4245fa987a1e750f057758d (patch) | |
tree | 6edd33bfd602dbd7c94d518fab21674f867e9a16 /src | |
parent | baf6b8d520fe11aa88d202415f637c01c1ba7044 (diff) | |
parent | f8d4c315f5f54d76a986a69f5ffcc51172537c09 (diff) | |
download | nix-1b3aea102e013e06f4245fa987a1e750f057758d.zip |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src')
-rw-r--r-- | src/sched.rs | 1 | ||||
-rw-r--r-- | src/sys/signal.rs | 1 | ||||
-rw-r--r-- | src/unistd.rs | 68 |
3 files changed, 67 insertions, 3 deletions
diff --git a/src/sched.rs b/src/sched.rs index 91a7c42a..4af33203 100644 --- a/src/sched.rs +++ b/src/sched.rs @@ -24,6 +24,7 @@ libc_bitflags!{ CLONE_DETACHED, CLONE_UNTRACED, CLONE_CHILD_SETTID, + CLONE_NEWCGROUP, CLONE_NEWUTS, CLONE_NEWIPC, CLONE_NEWUSER, diff --git a/src/sys/signal.rs b/src/sys/signal.rs index bdc25b47..345e69e3 100644 --- a/src/sys/signal.rs +++ b/src/sys/signal.rs @@ -311,7 +311,6 @@ impl AsRef<libc::sigset_t> for SigSet { } #[allow(unknown_lints)] -#[cfg_attr(not(raw_pointer_derive_allowed), allow(raw_pointer_derive))] #[derive(Clone, Copy, PartialEq)] pub enum SigHandler { SigDfl, diff --git a/src/unistd.rs b/src/unistd.rs index 838b11eb..9bdc5876 100644 --- a/src/unistd.rs +++ b/src/unistd.rs @@ -1,5 +1,5 @@ -//! Standard symbolic constants and types -//! +//! Safe wrappers around functions found in libc "unistd.h" header + use {Errno, Error, Result, NixPath}; use fcntl::{fcntl, OFlag, O_CLOEXEC, FD_CLOEXEC}; use fcntl::FcntlArg::F_SETFD; @@ -366,6 +366,12 @@ fn to_exec_array(args: &[CString]) -> Vec<*const c_char> { args_p } +/// Replace the current process image with a new one (see +/// [exec(3)](http://man7.org/linux/man-pages/man3/exec.3.html)). +/// +/// See the `::nix::unistd::execve` system call for additional details. `execv` +/// performs the same action but does not allow for customization of the +/// environment for the new process. #[inline] pub fn execv(path: &CString, argv: &[CString]) -> Result<Void> { let args_p = to_exec_array(argv); @@ -377,6 +383,24 @@ pub fn execv(path: &CString, argv: &[CString]) -> Result<Void> { Err(Error::Sys(Errno::last())) } + +/// Replace the current process image with a new one (see +/// [execve(2)](http://man7.org/linux/man-pages/man2/execve.2.html)). +/// +/// The execve system call allows for another process to be "called" which will +/// replace the current process image. That is, this process becomes the new +/// command that is run. On success, this function will not return. Instead, +/// the new program will run until it exits. +/// +/// If an error occurs, this function will return with an indication of the +/// cause of failure. See +/// [execve(2)#errors](http://man7.org/linux/man-pages/man2/execve.2.html#ERRORS) +/// for a list of potential problems that maight cause execv to fail. +/// +/// `::nix::unistd::execv` and `::nix::unistd::execve` take as arguments a slice +/// of `::std::ffi::CString`s for `args` and `env` (for `execve`). Each element +/// in the `args` list is an argument to the new process. Each element in the +/// `env` list should be a string in the form "key=value". #[inline] pub fn execve(path: &CString, args: &[CString], env: &[CString]) -> Result<Void> { let args_p = to_exec_array(args); @@ -389,6 +413,15 @@ pub fn execve(path: &CString, args: &[CString], env: &[CString]) -> Result<Void> Err(Error::Sys(Errno::last())) } +/// Replace the current process image with a new one and replicate shell `PATH` +/// searching behavior (see +/// [exec(3)](http://man7.org/linux/man-pages/man3/exec.3.html)). +/// +/// See `::nix::unistd::execve` for additoinal details. `execvp` behaves the +/// same as execv except that it will examine the `PATH` environment variables +/// for file names not specified with a leading slash. For example, `execv` +/// would not work if "bash" was specified for the path argument, but `execvp` +/// would assuming that a bash executable was on the system `PATH`. #[inline] pub fn execvp(filename: &CString, args: &[CString]) -> Result<Void> { let args_p = to_exec_array(args); @@ -400,6 +433,37 @@ pub fn execvp(filename: &CString, args: &[CString]) -> Result<Void> { Err(Error::Sys(Errno::last())) } +/// Daemonize this process by detaching from the controlling terminal (see +/// [daemon(3)](http://man7.org/linux/man-pages/man3/daemon.3.html)). +/// +/// When a process is launched it is typically associated with a parent and it, +/// in turn, by its controlling terminal/process. In order for a process to run +/// in the "background" it must daemonize itself by detaching itself. Under +/// posix, this is done by doing the following: +/// +/// 1. Parent process (this one) forks +/// 2. Parent process exits +/// 3. Child process continues to run. +/// +/// `nochdir`: +/// +/// * `nochdir = true`: The current working directory after daemonizing will +/// be the current working directory. +/// * `nochdir = false`: The current working directory after daemonizing will +/// be the root direcory, `/`. +/// +/// `noclose`: +/// +/// * `noclose = true`: The process' current stdin, stdout, and stderr file +/// descriptors will remain identical after daemonizing. +/// * `noclose = false`: The process' stdin, stdout, and stderr will point to +/// `/dev/null` after daemonizing. +/// +/// The underlying implementation (in libc) calls both +/// [fork(2)](http://man7.org/linux/man-pages/man2/fork.2.html) and +/// [setsid(2)](http://man7.org/linux/man-pages/man2/setsid.2.html) and, as +/// such, error that could be returned by either of those functions could also +/// show up as errors here. pub fn daemon(nochdir: bool, noclose: bool) -> Result<()> { let res = unsafe { libc::daemon(nochdir as c_int, noclose as c_int) }; Errno::result(res).map(drop) |