Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5d31618b authored by Ricardo Cerqueira's avatar Ricardo Cerqueira Committed by Ricardo Cerqueira
Browse files

init: Let a device's init.rc redefine service entries

In case of duplicate service definitions, init.rc's version always
wins. This is a less-than-ideal situation and the main reason for
some devices to override the default init.rc, which leads to out-of-sync
situations whenever we happen to insert something into the main copy.

So let services be overridden. To prevent accidental override of
system services, use a specific keyword for this, "service_redefine"

Change-Id: Ib1cab6bd3008956e9a2f61355781861ef8bcf8ca
parent ee0f94af
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
@@ -42,7 +42,7 @@ struct import {
    const char *filename;
};

static void *parse_service(struct parse_state *state, int nargs, char **args);
static void *parse_service(struct parse_state *state, int nargs, char **args, bool redefine);
static void parse_line_service(struct parse_state *state, int nargs, char **args);

static void *parse_action(struct parse_state *state, int nargs, char **args);
@@ -144,6 +144,7 @@ static int lookup_keyword(const char *s)
    case 's':
        if (!strcmp(s, "eclabel")) return K_seclabel;
        if (!strcmp(s, "ervice")) return K_service;
        if (!strcmp(s, "ervice_redefine")) return K_service_redefine;
        if (!strcmp(s, "etcon")) return K_setcon;
        if (!strcmp(s, "etenforce")) return K_setenforce;
        if (!strcmp(s, "etenv")) return K_setenv;
@@ -327,7 +328,8 @@ static void parse_new_section(struct parse_state *state, int kw,
           nargs > 1 ? args[1] : "");
    switch(kw) {
    case K_service:
        state->context = parse_service(state, nargs, args);
    case K_service_redefine:
        state->context = parse_service(state, nargs, args, (kw == K_service_redefine));
        if (state->context) {
            state->parse_line = parse_line_service;
            return;
@@ -673,7 +675,7 @@ int action_queue_empty()
    return list_empty(&action_queue);
}

static void *parse_service(struct parse_state *state, int nargs, char **args)
static void *parse_service(struct parse_state *state, int nargs, char **args, bool redefine)
{
    struct service *svc;
    if (nargs < 3) {
@@ -686,13 +688,18 @@ static void *parse_service(struct parse_state *state, int nargs, char **args)
    }

    svc = service_find_by_name(args[1]);
    if (svc) {
    if (svc && !redefine) {
        parse_error(state, "ignored duplicate definition of service '%s'\n", args[1]);
        return 0;
    }

    nargs -= 2;

    if (!svc) {
        svc = calloc(1, sizeof(*svc) + sizeof(char*) * nargs);
        redefine = false;
    }

    if (!svc) {
        parse_error(state, "out of memory\n");
        return 0;
@@ -704,6 +711,7 @@ static void *parse_service(struct parse_state *state, int nargs, char **args)
    svc->nargs = nargs;
    svc->onrestart.name = "onrestart";
    list_init(&svc->onrestart.commands);
    if (!redefine)
        list_add_tail(&service_list, &svc->slist);
    return svc;
}
+1 −0
Original line number Diff line number Diff line
@@ -82,6 +82,7 @@ enum {
    KEYWORD(rmdir,       COMMAND, 1, do_rmdir)
    KEYWORD(seclabel,    OPTION,  0, 0)
    KEYWORD(service,     SECTION, 0, 0)
    KEYWORD(service_redefine,     SECTION, 0, 0)
    KEYWORD(setcon,      COMMAND, 1, do_setcon)
    KEYWORD(setenforce,  COMMAND, 1, do_setenforce)
    KEYWORD(setenv,      OPTION,  2, 0)