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