xref: /kvmtool/guest/init.c (revision 1819403689976b0cefbee99db0c455f00c1ab496)
1282113fdSPekka Enberg /*
2282113fdSPekka Enberg  * This is a simple init for shared rootfs guests. It brings up critical
3282113fdSPekka Enberg  * mountpoints and then launches /bin/sh.
4282113fdSPekka Enberg  */
5282113fdSPekka Enberg #include <sys/mount.h>
6282113fdSPekka Enberg #include <string.h>
7282113fdSPekka Enberg #include <unistd.h>
8282113fdSPekka Enberg #include <stdio.h>
9282113fdSPekka Enberg #include <errno.h>
10282113fdSPekka Enberg 
11282113fdSPekka Enberg static int run_process(char *filename)
12282113fdSPekka Enberg {
13282113fdSPekka Enberg 	char *new_argv[] = { filename, NULL };
14*18194036SPekka Enberg 	char *new_env[] = { "TERM=linux", NULL };
15282113fdSPekka Enberg 
16282113fdSPekka Enberg 	return execve(filename, new_argv, new_env);
17282113fdSPekka Enberg }
18282113fdSPekka Enberg 
19282113fdSPekka Enberg static void do_mounts(void)
20282113fdSPekka Enberg {
21282113fdSPekka Enberg 	mount("hostfs", "/host", "9p", MS_RDONLY, "trans=virtio,version=9p2000.L");
22282113fdSPekka Enberg 	mount("", "/sys", "sysfs", 0, NULL);
23282113fdSPekka Enberg 	mount("proc", "/proc", "proc", 0, NULL);
24282113fdSPekka Enberg 	mount("devtmpfs", "/dev", "devtmpfs", 0, NULL);
25282113fdSPekka Enberg }
26282113fdSPekka Enberg 
27282113fdSPekka Enberg int main(int argc, char *argv[])
28282113fdSPekka Enberg {
29282113fdSPekka Enberg 	puts("Mounting...");
30282113fdSPekka Enberg 
31282113fdSPekka Enberg 	do_mounts();
32282113fdSPekka Enberg 
33c8de9b2aSSasha Levin         /* get session leader */
34c8de9b2aSSasha Levin         setsid();
35c8de9b2aSSasha Levin 
36c8de9b2aSSasha Levin         /* set controlling terminal */
37c8de9b2aSSasha Levin         ioctl (0, TIOCSCTTY, 1);
38c8de9b2aSSasha Levin 
39282113fdSPekka Enberg 	puts("Starting '/bin/sh'...");
40282113fdSPekka Enberg 
41282113fdSPekka Enberg 	run_process("/bin/sh");
42282113fdSPekka Enberg 
43282113fdSPekka Enberg 	printf("Init failed: %s\n", strerror(errno));
44282113fdSPekka Enberg 
45282113fdSPekka Enberg 	return 0;
46282113fdSPekka Enberg }
47