diff -ru orig/sysvinit-2.85/src/init.c sysvinit-2.85/src/init.c --- orig/sysvinit-2.85/src/init.c 2003-10-19 20:25:32.000000000 +1000 +++ sysvinit-2.85/src/init.c 2003-10-20 01:00:47.000000000 +1000 @@ -2508,6 +2508,7 @@ char *p; int f; int isinit; + FILE *fp; /* Get my own name */ if ((p = strrchr(argv[0], '/')) != NULL) @@ -2551,6 +2552,55 @@ init_main(); } +#ifdef WITH_SELINUX + if(!access("/selinux/enforce", R_OK)) + goto finished; + + if(system("mount -n none /selinux -t selinuxfs")) + { + char buf[64]; + if(system("mount -n none /proc -t proc")) + { + fprintf(stderr, "Can't mount /selinux or /proc\n"); + goto finished; + } + fp = fopen("/proc/filesystems", "r"); + if(!fp) + { + fprintf(stderr, "Can't open /proc/filesystems"); + goto err; + } + while(fgets(buf, sizeof(buf), fp)) + { + if(strstr(buf, "selinuxfs")) + { + fprintf(stderr, "SE Linux is enabled but can't mount /selinux"); + goto err; + } + } + fclose(fp); /* non-SE kernel */ + goto finished; + } + if(system("/usr/sbin/load_policy /etc/security/selinux/policy.15")) + { + fprintf(stderr, "Can't load policy"); + goto err; + } + fp = fopen("/selinux/enforce", "w"); + if(!fp || 1 != fwrite("1", 1, 1, fp)) + { + fprintf(stderr, "Can't set enforcing mode.\n"); + goto err; + } + fclose(fp); + execv("/sbin/init", argv); + fprintf(stderr, "Can't re-exec init to get right context.\n"); +err: + sleep(60); + init_reboot(BMAGIC_HALT); +finished: +#endif + /* Check command line arguments */ maxproclen = strlen(argv[0]) + 1; for(f = 1; f < argc; f++) {