app/shim: separate signal handler implementation
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Test / Create distribution (push) Successful in 33s
				
			
		
			
				
	
				Test / Sandbox (push) Successful in 1m57s
				
			
		
			
				
	
				Test / Planterette (push) Successful in 3m44s
				
			
		
			
				
	
				Test / Sandbox (race detector) (push) Successful in 3m50s
				
			
		
			
				
	
				Test / Hakurei (race detector) (push) Successful in 4m25s
				
			
		
			
				
	
				Test / Hakurei (push) Successful in 2m0s
				
			
		
			
				
	
				Test / Flake checks (push) Successful in 1m19s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	Test / Create distribution (push) Successful in 33s
				
			Test / Sandbox (push) Successful in 1m57s
				
			Test / Planterette (push) Successful in 3m44s
				
			Test / Sandbox (race detector) (push) Successful in 3m50s
				
			Test / Hakurei (race detector) (push) Successful in 4m25s
				
			Test / Hakurei (push) Successful in 2m0s
				
			Test / Flake checks (push) Successful in 1m19s
				
			Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
		
							parent
							
								
									d6b07f12ff
								
							
						
					
					
						commit
						a0f499e30a
					
				
							
								
								
									
										48
									
								
								internal/app/shim-signal.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								internal/app/shim-signal.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | ||||
| #include "shim-signal.h" | ||||
| #include <errno.h> | ||||
| #include <signal.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <unistd.h> | ||||
| 
 | ||||
| static pid_t hakurei_shim_param_ppid = -1; | ||||
| 
 | ||||
| // this cannot unblock hlog since Go code is not async-signal-safe
 | ||||
| static void hakurei_shim_sigaction(int sig, siginfo_t *si, void *ucontext) { | ||||
|   if (sig != SIGCONT || si == NULL) { | ||||
|     // unreachable
 | ||||
|     fprintf(stderr, "sigaction: sa_sigaction got invalid siginfo\n"); | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   // monitor requests shim exit
 | ||||
|   if (si->si_pid == hakurei_shim_param_ppid) | ||||
|     exit(254); | ||||
| 
 | ||||
|   fprintf(stderr, "sigaction: got SIGCONT from process %d\n", si->si_pid); | ||||
| 
 | ||||
|   // shim orphaned before monitor delivers a signal
 | ||||
|   if (getppid() != hakurei_shim_param_ppid) | ||||
|     exit(3); | ||||
| } | ||||
| 
 | ||||
| void hakurei_shim_setup_cont_signal(pid_t ppid) { | ||||
|   struct sigaction new_action = {0}, old_action = {0}; | ||||
|   if (sigaction(SIGCONT, NULL, &old_action) != 0) | ||||
|     return; | ||||
|   if (old_action.sa_handler != SIG_DFL) { | ||||
|     errno = ENOTRECOVERABLE; | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   new_action.sa_sigaction = hakurei_shim_sigaction; | ||||
|   if (sigemptyset(&new_action.sa_mask) != 0) | ||||
|     return; | ||||
|   new_action.sa_flags = SA_ONSTACK | SA_SIGINFO; | ||||
| 
 | ||||
|   if (sigaction(SIGCONT, &new_action, NULL) != 0) | ||||
|     return; | ||||
| 
 | ||||
|   errno = 0; | ||||
|   hakurei_shim_param_ppid = ppid; | ||||
| } | ||||
							
								
								
									
										3
									
								
								internal/app/shim-signal.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								internal/app/shim-signal.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| #include <signal.h> | ||||
| 
 | ||||
| void hakurei_shim_setup_cont_signal(pid_t ppid); | ||||
| @ -16,55 +16,7 @@ import ( | ||||
| 	"hakurei.app/internal/hlog" | ||||
| ) | ||||
| 
 | ||||
| /* | ||||
| #include <stdlib.h> | ||||
| #include <unistd.h> | ||||
| #include <stdio.h> | ||||
| #include <errno.h> | ||||
| #include <signal.h> | ||||
| 
 | ||||
| static pid_t hakurei_shim_param_ppid = -1; | ||||
| 
 | ||||
| // this cannot unblock hlog since Go code is not async-signal-safe | ||||
| static void hakurei_shim_sigaction(int sig, siginfo_t *si, void *ucontext) { | ||||
|   if (sig != SIGCONT || si == NULL) { | ||||
|     // unreachable | ||||
|     fprintf(stderr, "sigaction: sa_sigaction got invalid siginfo\n"); | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   // monitor requests shim exit | ||||
|   if (si->si_pid == hakurei_shim_param_ppid) | ||||
|     exit(254); | ||||
| 
 | ||||
|   fprintf(stderr, "sigaction: got SIGCONT from process %d\n", si->si_pid); | ||||
| 
 | ||||
|   // shim orphaned before monitor delivers a signal | ||||
|   if (getppid() != hakurei_shim_param_ppid) | ||||
|     exit(3); | ||||
| } | ||||
| 
 | ||||
| void hakurei_shim_setup_cont_signal(pid_t ppid) { | ||||
|   struct sigaction new_action = {0}, old_action = {0}; | ||||
|   if (sigaction(SIGCONT, NULL, &old_action) != 0) | ||||
|     return; | ||||
|   if (old_action.sa_handler != SIG_DFL) { | ||||
|     errno = ENOTRECOVERABLE; | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   new_action.sa_sigaction = hakurei_shim_sigaction; | ||||
|   if (sigemptyset(&new_action.sa_mask) != 0) | ||||
|     return; | ||||
|   new_action.sa_flags = SA_ONSTACK | SA_SIGINFO; | ||||
| 
 | ||||
|   if (sigaction(SIGCONT, &new_action, NULL) != 0) | ||||
|     return; | ||||
| 
 | ||||
|   errno = 0; | ||||
|   hakurei_shim_param_ppid = ppid; | ||||
| } | ||||
| */ | ||||
| //#include "shim-signal.h" | ||||
| import "C" | ||||
| 
 | ||||
| const shimEnv = "HAKUREI_SHIM" | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user