X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fservice.c;h=3da32a162172166ec3d64aac0985e81d734d283e;hp=cc61b546fc831c0d4913dc1c4a385c583a1b7865;hb=3f41e1e5955552a771748225334b3e8a7eb02b8a;hpb=19f6d710772305610b928bc2678b9d77fe11e770 diff --git a/src/core/service.c b/src/core/service.c index cc61b546f..3da32a162 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -124,9 +124,9 @@ static void service_init(Unit *u) { assert(u); assert(u->load_state == UNIT_STUB); - s->timeout_start_usec = DEFAULT_TIMEOUT_USEC; - s->timeout_stop_usec = DEFAULT_TIMEOUT_USEC; - s->restart_usec = DEFAULT_RESTART_USEC; + s->timeout_start_usec = u->manager->default_timeout_start_usec; + s->timeout_stop_usec = u->manager->default_timeout_stop_usec; + s->restart_usec = u->manager->default_restart_usec; s->type = _SERVICE_TYPE_INVALID; watch_init(&s->watchdog_watch); @@ -143,7 +143,9 @@ static void service_init(Unit *u) { kill_context_init(&s->kill_context); cgroup_context_init(&s->cgroup_context); - RATELIMIT_INIT(s->start_limit, 10*USEC_PER_SEC, 5); + RATELIMIT_INIT(s->start_limit, + u->manager->default_start_limit_interval, + u->manager->default_start_limit_burst); s->control_command_id = _SERVICE_EXEC_COMMAND_INVALID; } @@ -191,7 +193,13 @@ static int service_set_main_pid(Service *s, pid_t pid) { if (pid == getpid()) return -EINVAL; - service_unwatch_main_pid(s); + if (s->main_pid == pid && s->main_pid_known) + return 0; + + if (s->main_pid != pid) { + service_unwatch_main_pid(s); + exec_status_start(&s->main_exec_status, pid); + } s->main_pid = pid; s->main_pid_known = true; @@ -205,8 +213,6 @@ static int service_set_main_pid(Service *s, pid_t pid) { } else s->main_pid_alien = false; - exec_status_start(&s->main_exec_status, pid); - return 0; } @@ -1052,48 +1058,6 @@ static int service_load_sysv(Service *s) { } #endif -static int fsck_fix_order(Service *s) { - Unit *other; - int r; - - assert(s); - - if (s->fsck_passno <= 0) - return 0; - - /* For each pair of services where both have an fsck priority - * we order things based on it. */ - - LIST_FOREACH(units_by_type, other, UNIT(s)->manager->units_by_type[UNIT_SERVICE]) { - Service *t; - UnitDependency d; - - t = SERVICE(other); - - if (s == t) - continue; - - if (UNIT(t)->load_state != UNIT_LOADED) - continue; - - if (t->fsck_passno <= 0) - continue; - - if (t->fsck_passno < s->fsck_passno) - d = UNIT_AFTER; - else if (t->fsck_passno > s->fsck_passno) - d = UNIT_BEFORE; - else - continue; - - r = unit_add_dependency(UNIT(s), d, UNIT(t), true); - if (r < 0) - return r; - } - - return 0; -} - static int service_verify(Service *s) { assert(s); @@ -1250,10 +1214,6 @@ static int service_load(Unit *u) { return r; #endif - r = fsck_fix_order(s); - if (r < 0) - return r; - if (s->bus_name) if ((r = unit_watch_bus_name(u, s->bus_name)) < 0) return r; @@ -1377,11 +1337,6 @@ static void service_dump(Unit *u, FILE *f, const char *prefix) { prefix, s->sysv_runlevels); #endif - if (s->fsck_passno > 0) - fprintf(f, - "%sFsckPassNo: %i\n", - prefix, s->fsck_passno); - if (s->status_text) fprintf(f, "%sStatus Text: %s\n", prefix, s->status_text); @@ -1820,7 +1775,7 @@ static int service_spawn( apply_chroot, apply_tty_stdin, UNIT(s)->manager->confirm_spawn, - UNIT(s)->cgroup_mask, + UNIT(s)->manager->cgroup_supported, path, UNIT(s)->id, s->type == SERVICE_IDLE ? UNIT(s)->manager->idle_pipe : NULL, @@ -2647,6 +2602,9 @@ static int service_serialize(Unit *u, FILE *f, FDSet *fds) { if (s->exec_context.var_tmp_dir) unit_serialize_item(u, f, "var-tmp-dir", s->exec_context.var_tmp_dir); + if (s->forbid_restart) + unit_serialize_item(u, f, "forbid-restart", yes_no(s->forbid_restart)); + return 0; } @@ -2696,8 +2654,10 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value, if (parse_pid(value, &pid) < 0) log_debug_unit(u->id, "Failed to parse main-pid value %s", value); - else - service_set_main_pid(s, (pid_t) pid); + else { + service_set_main_pid(s, pid); + unit_watch_pid(UNIT(s), pid); + } } else if (streq(key, "main-pid-known")) { int b; @@ -2781,6 +2741,14 @@ static int service_deserialize_item(Unit *u, const char *key, const char *value, return log_oom(); s->exec_context.var_tmp_dir = t; + } else if (streq(key, "forbid-restart")) { + int b; + + b = parse_boolean(value); + if (b < 0) + log_debug_unit(u->id, "Failed to parse forbid-restart value %s", value); + else + s->forbid_restart = b; } else log_debug_unit(u->id, "Unknown serialization key '%s'", key); @@ -3389,6 +3357,7 @@ static void service_notify_message(Unit *u, pid_t pid, char **tags) { log_debug_unit(u->id, "%s: got %s", u->id, e); service_set_main_pid(s, pid); + unit_watch_pid(UNIT(s), pid); } } @@ -3685,8 +3654,10 @@ static void service_bus_query_pid_done( (s->state == SERVICE_START || s->state == SERVICE_START_POST || s->state == SERVICE_RUNNING || - s->state == SERVICE_RELOAD)) + s->state == SERVICE_RELOAD)){ service_set_main_pid(s, pid); + unit_watch_pid(UNIT(s), pid); + } } int service_set_socket_fd(Service *s, int fd, Socket *sock) {