X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Finitctl.c;h=eaa717ad916bdb55115870696123397bb012759e;hb=64685e0cea62b4937f0804e47ce2cb7929f58223;hp=7096a824b0ecfc092d1e752710c1533224ba6577;hpb=4c12626c8e3491570b395d68380543e10c98ad33;p=elogind.git diff --git a/src/initctl.c b/src/initctl.c index 7096a824b..eaa717ad9 100644 --- a/src/initctl.c +++ b/src/initctl.c @@ -93,6 +93,8 @@ static const char *translate_runlevel(int runlevel, bool *isolate) { for (i = 0; i < ELEMENTSOF(table); i++) if (table[i].runlevel == runlevel) { *isolate = table[i].isolate; + if (runlevel == '6' && kexec_loaded()) + return SPECIAL_KEXEC_TARGET; return table[i].special; } @@ -165,7 +167,24 @@ static void request_process(Server *s, const struct init_request *req) { if (!isprint(req->runlevel)) log_error("Got invalid runlevel. Ignoring."); else - change_runlevel(s, req->runlevel); + switch (req->runlevel) { + + /* we are async anyway, so just use kill for reexec/reload */ + case 'u': + case 'U': + if (kill(1, SIGTERM) < 0) + log_error("kill() failed: %m"); + break; + + case 'q': + case 'Q': + if (kill(1, SIGHUP) < 0) + log_error("kill() failed: %m"); + break; + + default: + change_runlevel(s, req->runlevel); + } return; case INIT_CMD_POWERFAIL: