Blame


1 a0a331aa 2005-01-06 devnull #include <u.h>
2 a0a331aa 2005-01-06 devnull #include <sys/time.h>
3 a0a331aa 2005-01-06 devnull #include <sys/resource.h>
4 ddb664da 2004-12-28 devnull #include "threadimpl.h"
5 ddb664da 2004-12-28 devnull
6 230ead2f 2005-01-04 devnull #undef waitpid
7 ddb664da 2004-12-28 devnull #undef pipe
8 ddb664da 2004-12-28 devnull #undef wait
9 ddb664da 2004-12-28 devnull
10 ddb664da 2004-12-28 devnull static int sigpid;
11 b3a20a96 2020-12-30 rsc static int threadpassfd = -1;
12 e9dbe11d 2005-01-11 devnull static int gotsigchld;
13 ddb664da 2004-12-28 devnull
14 ddb664da 2004-12-28 devnull static void
15 ddb664da 2004-12-28 devnull child(void)
16 ddb664da 2004-12-28 devnull {
17 1d2533d0 2004-12-28 devnull int status, pid;
18 a0a331aa 2005-01-06 devnull struct rlimit rl;
19 230ead2f 2005-01-04 devnull
20 230ead2f 2005-01-04 devnull notedisable("sys: child");
21 230ead2f 2005-01-04 devnull pid = waitpid(sigpid, &status, 0);
22 230ead2f 2005-01-04 devnull if(pid < 0){
23 230ead2f 2005-01-04 devnull fprint(2, "%s: wait: %r\n", argv0);
24 230ead2f 2005-01-04 devnull _exit(97);
25 230ead2f 2005-01-04 devnull }
26 230ead2f 2005-01-04 devnull if(WIFEXITED(status))
27 1d2533d0 2004-12-28 devnull _exit(WEXITSTATUS(status));
28 230ead2f 2005-01-04 devnull if(WIFSIGNALED(status)){
29 a0a331aa 2005-01-06 devnull /*
30 a0a331aa 2005-01-06 devnull * Make sure we don't scribble over the nice
31 a0a331aa 2005-01-06 devnull * core file that our child just wrote out.
32 a0a331aa 2005-01-06 devnull */
33 a0a331aa 2005-01-06 devnull rl.rlim_cur = 0;
34 a0a331aa 2005-01-06 devnull rl.rlim_max = 0;
35 a0a331aa 2005-01-06 devnull setrlimit(RLIMIT_CORE, &rl);
36 a0a331aa 2005-01-06 devnull
37 230ead2f 2005-01-04 devnull signal(WTERMSIG(status), SIG_DFL);
38 230ead2f 2005-01-04 devnull raise(WTERMSIG(status));
39 230ead2f 2005-01-04 devnull _exit(98); /* not reached */
40 230ead2f 2005-01-04 devnull }
41 37cc72d3 2005-01-11 devnull if(WIFSTOPPED(status)){
42 37cc72d3 2005-01-11 devnull fprint(2, "%s: wait pid %d stopped\n", argv0, pid);
43 37cc72d3 2005-01-11 devnull return;
44 37cc72d3 2005-01-11 devnull }
45 c8b6342d 2005-01-13 devnull #ifdef WIFCONTINUED
46 37cc72d3 2005-01-11 devnull if(WIFCONTINUED(status)){
47 37cc72d3 2005-01-11 devnull fprint(2, "%s: wait pid %d continued\n", argv0, pid);
48 37cc72d3 2005-01-11 devnull return;
49 37cc72d3 2005-01-11 devnull }
50 c8b6342d 2005-01-13 devnull #endif
51 37cc72d3 2005-01-11 devnull fprint(2, "%s: wait pid %d status 0x%ux\n", argv0, pid, status);
52 230ead2f 2005-01-04 devnull _exit(99);
53 ddb664da 2004-12-28 devnull }
54 ddb664da 2004-12-28 devnull
55 ddb664da 2004-12-28 devnull static void
56 ddb664da 2004-12-28 devnull sigpass(int sig)
57 ddb664da 2004-12-28 devnull {
58 e9dbe11d 2005-01-11 devnull if(sigpid == 1){
59 e9dbe11d 2005-01-11 devnull gotsigchld = 1;
60 e9dbe11d 2005-01-11 devnull return;
61 e9dbe11d 2005-01-11 devnull }
62 e9dbe11d 2005-01-11 devnull
63 ddb664da 2004-12-28 devnull if(sig == SIGCHLD)
64 ddb664da 2004-12-28 devnull child();
65 ddb664da 2004-12-28 devnull else
66 ddb664da 2004-12-28 devnull kill(sigpid, sig);
67 ddb664da 2004-12-28 devnull }
68 ddb664da 2004-12-28 devnull
69 fa325e9b 2020-01-10 cross static int sigs[] =
70 e9dbe11d 2005-01-11 devnull {
71 e9dbe11d 2005-01-11 devnull SIGHUP, SIGINT, SIGQUIT, SIGILL,
72 e9dbe11d 2005-01-11 devnull SIGTRAP, SIGABRT, SIGBUS, SIGFPE,
73 e9dbe11d 2005-01-11 devnull SIGUSR1, SIGSEGV, SIGUSR2, SIGPIPE,
74 e9dbe11d 2005-01-11 devnull SIGALRM, SIGTERM, SIGCHLD, SIGSTOP,
75 fa325e9b 2020-01-10 cross /*SIGTSTP, SIGTTIN, SIGTTOU,*/ SIGURG,
76 e9dbe11d 2005-01-11 devnull SIGXCPU, SIGXFSZ, SIGVTALRM, SIGPROF,
77 bc7da029 2005-05-07 devnull #ifdef SIGWINCH
78 bc7da029 2005-05-07 devnull SIGWINCH,
79 bc7da029 2005-05-07 devnull #endif
80 bc7da029 2005-05-07 devnull #ifdef SIGIO
81 bc7da029 2005-05-07 devnull SIGIO,
82 bc7da029 2005-05-07 devnull #endif
83 1ac19816 2005-01-14 devnull #ifdef SIGEMT
84 1ac19816 2005-01-14 devnull SIGEMT,
85 1ac19816 2005-01-14 devnull #endif
86 1ac19816 2005-01-14 devnull #ifdef SIGPWR
87 fa325e9b 2020-01-10 cross SIGPWR,
88 1ac19816 2005-01-14 devnull #endif
89 1ac19816 2005-01-14 devnull #ifdef SIGINFO
90 1ac19816 2005-01-14 devnull SIGINFO,
91 1ac19816 2005-01-14 devnull #endif
92 1ac19816 2005-01-14 devnull SIGSYS
93 e9dbe11d 2005-01-11 devnull };
94 e9dbe11d 2005-01-11 devnull
95 ddb664da 2004-12-28 devnull void
96 ddb664da 2004-12-28 devnull _threadsetupdaemonize(void)
97 ddb664da 2004-12-28 devnull {
98 ddb664da 2004-12-28 devnull int i, n, pid;
99 ddb664da 2004-12-28 devnull int p[2];
100 ddb664da 2004-12-28 devnull char buf[20];
101 ddb664da 2004-12-28 devnull
102 ddb664da 2004-12-28 devnull sigpid = 1;
103 ddb664da 2004-12-28 devnull
104 52b599a6 2021-01-14 rsc /*
105 52b599a6 2021-01-14 rsc * We've been told this program is likely to background itself.
106 52b599a6 2021-01-14 rsc * Put it in its own process group so that we don't get a SIGHUP
107 52b599a6 2021-01-14 rsc * when the parent exits.
108 52b599a6 2021-01-14 rsc */
109 70cc6e5b 2021-04-22 crossd setpgid(0, 0);
110 52b599a6 2021-01-14 rsc
111 ddb664da 2004-12-28 devnull if(pipe(p) < 0)
112 ddb664da 2004-12-28 devnull sysfatal("passer pipe: %r");
113 ddb664da 2004-12-28 devnull
114 ddb664da 2004-12-28 devnull /* hide these somewhere they won't cause harm */
115 a0d2173c 2005-01-16 devnull /* can't go too high: NetBSD max is 64, for example */
116 a0d2173c 2005-01-16 devnull if(dup(p[0], 28) < 0 || dup(p[1], 29) < 0)
117 ddb664da 2004-12-28 devnull sysfatal("passer pipe dup: %r");
118 ddb664da 2004-12-28 devnull close(p[0]);
119 ddb664da 2004-12-28 devnull close(p[1]);
120 a0d2173c 2005-01-16 devnull p[0] = 28;
121 a0d2173c 2005-01-16 devnull p[1] = 29;
122 ddb664da 2004-12-28 devnull
123 ddb664da 2004-12-28 devnull /* close on exec */
124 ddb664da 2004-12-28 devnull if(fcntl(p[0], F_SETFD, 1) < 0 || fcntl(p[1], F_SETFD, 1) < 0)
125 ddb664da 2004-12-28 devnull sysfatal("passer pipe pipe fcntl: %r");
126 ddb664da 2004-12-28 devnull
127 230ead2f 2005-01-04 devnull noteenable("sys: child");
128 1d2533d0 2004-12-28 devnull signal(SIGCHLD, sigpass);
129 ddb664da 2004-12-28 devnull switch(pid = fork()){
130 ddb664da 2004-12-28 devnull case -1:
131 ddb664da 2004-12-28 devnull sysfatal("passer fork: %r");
132 ddb664da 2004-12-28 devnull default:
133 ddb664da 2004-12-28 devnull close(p[1]);
134 ddb664da 2004-12-28 devnull break;
135 ddb664da 2004-12-28 devnull case 0:
136 230ead2f 2005-01-04 devnull notedisable("sys: child");
137 1d2533d0 2004-12-28 devnull signal(SIGCHLD, SIG_DFL);
138 e9dbe11d 2005-01-11 devnull /* rfork(RFNOTEG); */
139 ddb664da 2004-12-28 devnull close(p[0]);
140 ddb664da 2004-12-28 devnull threadpassfd = p[1];
141 ddb664da 2004-12-28 devnull return;
142 ddb664da 2004-12-28 devnull }
143 ddb664da 2004-12-28 devnull
144 ddb664da 2004-12-28 devnull sigpid = pid;
145 e9dbe11d 2005-01-11 devnull if(gotsigchld)
146 e9dbe11d 2005-01-11 devnull sigpass(SIGCHLD);
147 e9dbe11d 2005-01-11 devnull
148 e9dbe11d 2005-01-11 devnull for(i=0; i<nelem(sigs); i++){
149 ddb664da 2004-12-28 devnull struct sigaction sa;
150 ddb664da 2004-12-28 devnull
151 ddb664da 2004-12-28 devnull memset(&sa, 0, sizeof sa);
152 ddb664da 2004-12-28 devnull sa.sa_handler = sigpass;
153 ddb664da 2004-12-28 devnull sa.sa_flags |= SA_RESTART;
154 e9dbe11d 2005-01-11 devnull sigaction(sigs[i], &sa, nil);
155 ddb664da 2004-12-28 devnull }
156 ddb664da 2004-12-28 devnull
157 ddb664da 2004-12-28 devnull for(;;){
158 ddb664da 2004-12-28 devnull n = read(p[0], buf, sizeof buf-1);
159 230ead2f 2005-01-04 devnull if(n == 0){ /* program exited */
160 ddb664da 2004-12-28 devnull child();
161 230ead2f 2005-01-04 devnull }
162 ddb664da 2004-12-28 devnull if(n > 0)
163 ddb664da 2004-12-28 devnull break;
164 d54ead7f 2004-12-28 devnull print("passer read: %r\n");
165 ddb664da 2004-12-28 devnull }
166 ddb664da 2004-12-28 devnull buf[n] = 0;
167 ddb664da 2004-12-28 devnull _exit(atoi(buf));
168 ddb664da 2004-12-28 devnull }
169 ddb664da 2004-12-28 devnull
170 ddb664da 2004-12-28 devnull void
171 230ead2f 2005-01-04 devnull _threaddaemonize(void)
172 ddb664da 2004-12-28 devnull {
173 b3a20a96 2020-12-30 rsc if(threadpassfd < 0)
174 b3a20a96 2020-12-30 rsc sysfatal("threads in main proc exited w/o threadmaybackground");
175 b3a20a96 2020-12-30 rsc write(threadpassfd, "0", 1);
176 b3a20a96 2020-12-30 rsc close(threadpassfd);
177 b3a20a96 2020-12-30 rsc threadpassfd = -1;
178 ddb664da 2004-12-28 devnull }