init: add re-exec capability

This will allow the re-execution of the init process after upgrading
OpenRC.
This commit is contained in:
William Hubbs
2017-04-12 17:56:30 -05:00
parent 6f88ee4ec6
commit 05738bfce1
3 changed files with 37 additions and 6 deletions

View File

@ -20,6 +20,7 @@
#include <errno.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -79,6 +80,12 @@ static void init(const char *default_runlevel)
waitpid(pid, NULL, 0);
}
static void handle_reexec(char *my_name)
{
execl(my_name, my_name, "reexec", NULL);
return;
}
static void handle_shutdown(const char *runlevel, int cmd)
{
pid_t pid;
@ -123,10 +130,11 @@ static void signal_handler(int sig)
int main(int argc, char **argv)
{
char *default_runlevel = NULL;
char *default_runlevel;
char buf[2048];
int count;
FILE *fifo;
bool reexec = false;
struct sigaction sa;
if (getpid() != 1)
@ -134,16 +142,22 @@ int main(int argc, char **argv)
if (argc > 1)
default_runlevel = argv[1];
else
default_runlevel = NULL;
if (default_runlevel && strcmp(default_runlevel, "reexec") == 0)
reexec = true;
printf("OpenRC init version %s starting\n", VERSION);
init(default_runlevel);
if (! reexec)
init(default_runlevel);
memset(&sa, 0, sizeof(sa));
sa.sa_handler = signal_handler;
sigaction(SIGCHLD, &sa, NULL);
sigaction(SIGINT, &sa, NULL);
reboot(RB_DISABLE_CAD);
if (mkfifo(RC_INIT_FIFO, 0600) == -1)
if (mkfifo(RC_INIT_FIFO, 0600) == -1 && errno != EEXIST)
perror("mkfifo");
for (;;) {
@ -166,6 +180,8 @@ int main(int argc, char **argv)
handle_shutdown("shutdown", RB_POWER_OFF);
else if (strcmp(buf, "reboot") == 0)
handle_shutdown("reboot", RB_AUTOBOOT);
else if (strcmp(buf, "reexec") == 0)
handle_reexec(argv[0]);
}
return 0;
}