1const 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}