@@ -18,13 +18,17 @@ use crate::AURAED_RUNTIME;
1818use client:: AuraeSocket ;
1919use clone3:: Flags ;
2020use nix:: {
21+ errno:: Errno ,
2122 libc:: SIGCHLD ,
22- sys:: signal:: { Signal , Signal :: SIGKILL , Signal :: SIGTERM } ,
23+ sys:: {
24+ signal:: { Signal , Signal :: SIGKILL , Signal :: SIGTERM } ,
25+ wait:: { WaitStatus , waitpid} ,
26+ } ,
2327 unistd:: Pid ,
2428} ;
2529use std:: path:: PathBuf ;
2630use std:: {
27- io:: { self , ErrorKind } ,
31+ io,
2832 os:: unix:: process:: { CommandExt , ExitStatusExt } ,
2933 process:: { Command , ExitStatus } ,
3034} ;
@@ -136,9 +140,7 @@ impl NestedAuraed {
136140 }
137141
138142 // Execute the clone system call and create the new process with the relevant namespaces.
139- match unsafe { clone. call ( ) }
140- . map_err ( |e| io:: Error :: from_raw_os_error ( e. 0 ) ) ?
141- {
143+ match unsafe { clone. call ( ) } ? {
142144 0 => {
143145 // child
144146 let command = {
@@ -187,33 +189,67 @@ impl NestedAuraed {
187189 ) -> io:: Result < ( ) > {
188190 let signal = signal. into ( ) ;
189191 let pid = Pid :: from_raw ( self . process . pid ) ;
190-
191- nix:: sys:: signal:: kill ( pid, signal)
192- . map_err ( |e| io:: Error :: from_raw_os_error ( e as i32 ) )
192+ nix:: sys:: signal:: kill ( pid, signal) ?;
193+ Ok ( ( ) )
193194 }
194195
195196 fn wait ( & mut self ) -> io:: Result < ExitStatus > {
196197 let pid = Pid :: from_raw ( self . process . pid ) ;
197198
198- let mut exit_status = 0 ;
199- let _child_pid = loop {
200- let res =
201- unsafe { libc:: waitpid ( pid. as_raw ( ) , & mut exit_status, 0 ) } ;
199+ let status = loop {
200+ match waitpid ( pid, None ) {
201+ Ok ( status) => break status,
202+ Err ( Errno :: EINTR ) => continue ,
203+ Err ( e) => return Err ( e. into ( ) ) ,
204+ }
205+ } ;
202206
203- if res == -1 {
204- let err = io:: Error :: last_os_error ( ) ;
205- match err. kind ( ) {
206- ErrorKind :: Interrupted => continue ,
207- _ => break Err ( err) ,
207+ let exit_status = match status {
208+ WaitStatus :: Exited ( _, code) => {
209+ trace ! ( "Pid {pid} exited with code {code}" ) ;
210+ ExitStatus :: from_raw ( code << 8 )
211+ }
212+ WaitStatus :: Signaled ( _, sig, core_dumped) => {
213+ if core_dumped {
214+ error ! ( "Pid {pid} killed by signal {sig} (core dumped)" ) ;
215+ } else {
216+ trace ! ( "Pid {pid} killed by signal {sig}" ) ;
208217 }
218+ ExitStatus :: from_raw ( sig as i32 )
209219 }
210-
211- break Ok ( res) ;
212- } ?;
213-
214- let exit_status = ExitStatus :: from_raw ( exit_status) ;
215-
216- trace ! ( "Pid {pid} exited with status {exit_status}" ) ;
220+ WaitStatus :: Stopped ( _, sig) => {
221+ error ! ( "Pid {pid} unexpectedly stopped by signal {sig}" ) ;
222+ return Err ( io:: Error :: other ( format ! (
223+ "process {pid} stopped by signal {sig}"
224+ ) ) ) ;
225+ }
226+ WaitStatus :: Continued ( _) => {
227+ error ! ( "Pid {pid} unexpectedly continued" ) ;
228+ return Err ( io:: Error :: other ( format ! (
229+ "process {pid} continued unexpectedly"
230+ ) ) ) ;
231+ }
232+ WaitStatus :: PtraceEvent ( _, sig, event) => {
233+ error ! (
234+ "Pid {pid} unexpected ptrace event {event} (signal {sig})"
235+ ) ;
236+ return Err ( io:: Error :: other ( format ! (
237+ "unexpected ptrace event for process {pid}"
238+ ) ) ) ;
239+ }
240+ WaitStatus :: PtraceSyscall ( _) => {
241+ error ! ( "Pid {pid} unexpected ptrace syscall-stop" ) ;
242+ return Err ( io:: Error :: other ( format ! (
243+ "unexpected ptrace syscall-stop for process {pid}"
244+ ) ) ) ;
245+ }
246+ WaitStatus :: StillAlive => {
247+ error ! ( "Pid {pid} still alive after waitpid" ) ;
248+ return Err ( io:: Error :: other ( format ! (
249+ "process {pid} still alive after waitpid"
250+ ) ) ) ;
251+ }
252+ } ;
217253
218254 Ok ( exit_status)
219255 }
0 commit comments