Skip to main content

c/
daemon.rs

1// daemon() - ported from musl/src/legacy/daemon.c
2// Include in libc/src/lib.rs in the "unistd.h: process primitives" section.
3
4const ROOT_PATH: &[u8] = b"/\0";
5const DEV_NULL: &[u8] = b"/dev/null\0";
6
7#[no_mangle]
8pub unsafe extern "C" fn daemon(nochdir: c_int, noclose: c_int) -> c_int {
9    if nochdir == 0 {
10        let r = sys_chdir(ROOT_PATH.as_ptr());
11        if r < 0 {
12            ERRNO = (-r) as c_int;
13            return -1;
14        }
15    }
16    if noclose == 0 {
17        let fd = sys_open(DEV_NULL.as_ptr(), O_RDWR as i64, 0);
18        if fd < 0 {
19            ERRNO = (-fd) as c_int;
20            return -1;
21        }
22        let mut failed = false;
23        let mut err = 0i64;
24        let r0 = sys_dup2(fd as i32, 0);
25        if r0 < 0 {
26            failed = true;
27            err = -r0;
28        }
29        let r1 = sys_dup2(fd as i32, 1);
30        if r1 < 0 && !failed {
31            failed = true;
32            err = -r1;
33        }
34        let r2 = sys_dup2(fd as i32, 2);
35        if r2 < 0 && !failed {
36            failed = true;
37            err = -r2;
38        }
39        if fd > 2 {
40            sys_close(fd);
41        }
42        if failed {
43            ERRNO = err as c_int;
44            return -1;
45        }
46    }
47    let ret = sys_fork();
48    match ret {
49        0 => {}
50        -1 => {
51            ERRNO = (-ret) as c_int;
52            return -1;
53        }
54        _ => _exit(0),
55    }
56    let r = sys_setsid();
57    if r < 0 {
58        ERRNO = (-r) as c_int;
59        return -1;
60    }
61    let ret = sys_fork();
62    match ret {
63        0 => {}
64        -1 => {
65            ERRNO = (-ret) as c_int;
66            return -1;
67        }
68        _ => _exit(0),
69    }
70    0
71}