1*282113fdSPekka Enberg /* 2*282113fdSPekka Enberg * This is a simple init for shared rootfs guests. It brings up critical 3*282113fdSPekka Enberg * mountpoints and then launches /bin/sh. 4*282113fdSPekka Enberg */ 5*282113fdSPekka Enberg #include <sys/mount.h> 6*282113fdSPekka Enberg #include <string.h> 7*282113fdSPekka Enberg #include <unistd.h> 8*282113fdSPekka Enberg #include <stdio.h> 9*282113fdSPekka Enberg #include <errno.h> 10*282113fdSPekka Enberg 11*282113fdSPekka Enberg static int run_process(char *filename) 12*282113fdSPekka Enberg { 13*282113fdSPekka Enberg char *new_argv[] = { filename, NULL }; 14*282113fdSPekka Enberg char *new_env[] = { NULL }; 15*282113fdSPekka Enberg 16*282113fdSPekka Enberg return execve(filename, new_argv, new_env); 17*282113fdSPekka Enberg } 18*282113fdSPekka Enberg 19*282113fdSPekka Enberg static void do_mounts(void) 20*282113fdSPekka Enberg { 21*282113fdSPekka Enberg mount("hostfs", "/host", "9p", MS_RDONLY, "trans=virtio,version=9p2000.L"); 22*282113fdSPekka Enberg mount("", "/sys", "sysfs", 0, NULL); 23*282113fdSPekka Enberg mount("proc", "/proc", "proc", 0, NULL); 24*282113fdSPekka Enberg mount("devtmpfs", "/dev", "devtmpfs", 0, NULL); 25*282113fdSPekka Enberg } 26*282113fdSPekka Enberg 27*282113fdSPekka Enberg int main(int argc, char *argv[]) 28*282113fdSPekka Enberg { 29*282113fdSPekka Enberg puts("Mounting..."); 30*282113fdSPekka Enberg 31*282113fdSPekka Enberg do_mounts(); 32*282113fdSPekka Enberg 33*282113fdSPekka Enberg puts("Starting '/bin/sh'..."); 34*282113fdSPekka Enberg 35*282113fdSPekka Enberg run_process("/bin/sh"); 36*282113fdSPekka Enberg 37*282113fdSPekka Enberg printf("Init failed: %s\n", strerror(errno)); 38*282113fdSPekka Enberg 39*282113fdSPekka Enberg return 0; 40*282113fdSPekka Enberg } 41