diff --git a/utils/init.cpp b/utils/init.cpp index ea5edeb1..1912dfd8 100644 --- a/utils/init.cpp +++ b/utils/init.cpp @@ -28,13 +28,6 @@ #include #include -int parent(pid_t childid) -{ - int status; - waitpid(childid, &status, 0); - return status; -} - int child() { const char* programname = "sh"; @@ -46,6 +39,27 @@ int child() return 2; } +int runsystem() +{ + pid_t childpid = fork(); + if ( childpid < 0 ) { perror("fork"); return 2; } + + if ( childpid ) + { + int status; + waitpid(childpid, &status, 0); + // TODO: Use the proper macro! + if ( 128 <= status ) + { + printf("Looks like the system crashed, trying to bring it back up.\n"); + return runsystem(); + } + return status; + } + + return child(); +} + int main(int argc, char* argv[]) { if ( open("/dev/tty", O_RDONLY) != 0 ) { return 2; } @@ -56,9 +70,6 @@ int main(int argc, char* argv[]) printf("\r\e[m\e[J"); fflush(stdout); - pid_t childpid = fork(); - if ( childpid < 0 ) { perror("fork"); return 2; } - - return ( childpid == 0 ) ? child() : parent(childpid); + return runsystem(); }