/src/httpd/srclib/apr/threadproc/unix/procsup.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* Licensed to the Apache Software Foundation (ASF) under one or more |
2 | | * contributor license agreements. See the NOTICE file distributed with |
3 | | * this work for additional information regarding copyright ownership. |
4 | | * The ASF licenses this file to You under the Apache License, Version 2.0 |
5 | | * (the "License"); you may not use this file except in compliance with |
6 | | * the License. You may obtain a copy of the License at |
7 | | * |
8 | | * http://www.apache.org/licenses/LICENSE-2.0 |
9 | | * |
10 | | * Unless required by applicable law or agreed to in writing, software |
11 | | * distributed under the License is distributed on an "AS IS" BASIS, |
12 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
13 | | * See the License for the specific language governing permissions and |
14 | | * limitations under the License. |
15 | | */ |
16 | | |
17 | | #include "apr_arch_threadproc.h" |
18 | | |
19 | | APR_DECLARE(apr_status_t) apr_proc_detach(int daemonize) |
20 | 0 | { |
21 | 0 | if (chdir("/") == -1) { |
22 | 0 | return errno; |
23 | 0 | } |
24 | | |
25 | 0 | #if !defined(MPE) && !defined(OS2) && !defined(TPF) && !defined(BEOS) |
26 | | /* Don't detach for MPE because child processes can't survive the death of |
27 | | * the parent. */ |
28 | 0 | if (daemonize) { |
29 | 0 | int x; |
30 | |
|
31 | 0 | if ((x = fork()) > 0) { |
32 | 0 | exit(0); |
33 | 0 | } |
34 | 0 | else if (x == -1) { |
35 | 0 | perror("fork"); |
36 | 0 | fprintf(stderr, "unable to fork new process\n"); |
37 | 0 | exit(1); /* we can't do anything here, so just exit. */ |
38 | 0 | } |
39 | | /* RAISE_SIGSTOP(DETACH); */ |
40 | 0 | } |
41 | 0 | #endif |
42 | | |
43 | 0 | #ifdef HAVE_SETSID |
44 | | /* A setsid() failure is not fatal if we didn't just fork(). |
45 | | * The calling process may be the process group leader, in |
46 | | * which case setsid() will fail with EPERM. |
47 | | */ |
48 | 0 | if (setsid() == -1 && daemonize) { |
49 | 0 | return errno; |
50 | 0 | } |
51 | | #elif defined(NEXT) || defined(NEWSOS) |
52 | | if (setpgrp(0, getpid()) == -1) { |
53 | | return errno; |
54 | | } |
55 | | #elif defined(OS2) || defined(TPF) || defined(MPE) |
56 | | /* do nothing */ |
57 | | #else |
58 | | if (setpgid(0, 0) == -1) { |
59 | | return errno; |
60 | | } |
61 | | #endif |
62 | | |
63 | | /* close out the standard file descriptors */ |
64 | 0 | if (freopen("/dev/null", "r", stdin) == NULL) { |
65 | 0 | return errno; |
66 | | /* continue anyhow -- note we can't close out descriptor 0 because we |
67 | | * have nothing to replace it with, and if we didn't have a descriptor |
68 | | * 0 the next file would be created with that value ... leading to |
69 | | * havoc. |
70 | | */ |
71 | 0 | } |
72 | 0 | if (freopen("/dev/null", "w", stdout) == NULL) { |
73 | 0 | return errno; |
74 | 0 | } |
75 | | /* We are going to reopen this again in a little while to the error |
76 | | * log file, but better to do it twice and suffer a small performance |
77 | | * hit for consistancy than not reopen it here. |
78 | | */ |
79 | 0 | if (freopen("/dev/null", "w", stderr) == NULL) { |
80 | 0 | return errno; |
81 | 0 | } |
82 | 0 | return APR_SUCCESS; |
83 | 0 | } |
84 | | |
85 | | #if (!HAVE_WAITPID) |
86 | | /* From ikluft@amdahl.com |
87 | | * this is not ideal but it works for SVR3 variants |
88 | | * Modified by dwd@bell-labs.com to call wait3 instead of wait because |
89 | | * apache started to use the WNOHANG option. |
90 | | */ |
91 | | int waitpid(pid_t pid, int *statusp, int options) |
92 | | { |
93 | | int tmp_pid; |
94 | | if (kill(pid, 0) == -1) { |
95 | | errno = ECHILD; |
96 | | return -1; |
97 | | } |
98 | | while (((tmp_pid = wait3(statusp, options, 0)) != pid) && |
99 | | (tmp_pid != -1) && (tmp_pid != 0) && (pid != -1)) |
100 | | ; |
101 | | return tmp_pid; |
102 | | } |
103 | | #endif |
104 | | |