Every process now has an init process like it has a session, and each session belong to an init. Orphaned processes are reparented to its init process. All descendent processes are SIGKILL'd when an init process exits and creating additional processes/threads fails. Add setinit(2) for becoming the init process for your child processes and add getinit(2) for locating your init process. Add TIOCSCTTY force flag that releases a terminal from its current session and makes it the controlling terminal for the current session. This ioctl is essential to transferring the controlling terminal to a nested init, which has its own session. Add TIOCUCTTY that releases the terminal as the controlling terminal for its current session. Remove INIT_PID as it is replaced by getinit(2).
		
			
				
	
	
		
			47 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2021, 2022, 2024 Jonas 'Sortie' Termansen.
 | |
|  *
 | |
|  * Permission to use, copy, modify, and distribute this software for any
 | |
|  * purpose with or without fee is hereby granted, provided that the above
 | |
|  * copyright notice and this permission notice appear in all copies.
 | |
|  *
 | |
|  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 | |
|  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 | |
|  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 | |
|  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | |
|  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 | |
|  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 | |
|  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | |
|  *
 | |
|  * halt.c
 | |
|  * Halts the computer.
 | |
|  */
 | |
| 
 | |
| #include <sys/types.h>
 | |
| 
 | |
| #include <err.h>
 | |
| #include <getopt.h>
 | |
| #include <signal.h>
 | |
| #include <stdlib.h>
 | |
| #include <unistd.h>
 | |
| 
 | |
| int main(int argc, char* argv[])
 | |
| {
 | |
| 	int opt;
 | |
| 	while ( (opt = getopt(argc, argv, "")) != -1 )
 | |
| 	{
 | |
| 		switch ( opt )
 | |
| 		{
 | |
| 		default: return 1;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if ( optind < argc )
 | |
| 		errx(1, "extra operand: %s", argv[optind]);
 | |
| 
 | |
| 	pid_t init_pid = getinit(0);
 | |
| 	if ( kill(init_pid, SIGQUIT) < 0 )
 | |
| 		err(1, "kill: %" PRIdPID, init_pid);
 | |
| 
 | |
| 	return 0;
 | |
| }
 |