chiark / gitweb /
support chrooting/setting of ioprio when spawning
[elogind.git] / service.c
index 1cbfb3dcebdc2db9db6204573a0bae4db2d76e41..2943da6e80405be1c5157fb173c487404430382f 100644 (file)
--- a/service.c
+++ b/service.c
@@ -100,18 +100,21 @@ static int service_init(Unit *u) {
 
         s->state = SERVICE_DEAD;
 
-        /* Load a .service file */
-        r = unit_load_fragment(u);
-
-        /* Load a classic init script as a fallback */
-        if (r == -ENOENT)
-                r = service_load_sysv(s);
+        RATELIMIT_INIT(s->ratelimit, 10*USEC_PER_SEC, 5);
 
-        if (r < 0) {
+        /* Load a .service file */
+        if ((r = unit_load_fragment(u)) < 0) {
                 service_done(u);
                 return r;
         }
 
+        /* Load a classic init script as a fallback, if we couldn*t find anything */
+        if (r == 0)
+                if ((r = service_load_sysv(s)) <= 0) {
+                        service_done(u);
+                        return r < 0 ? r : -ENOENT;
+                }
+
         /* Load dropin directory data */
         if ((r = unit_load_dropin(u)) < 0) {
                 service_done(u);
@@ -733,6 +736,12 @@ static int service_start(Unit *u) {
 
         assert(s->state == SERVICE_DEAD || s->state == SERVICE_MAINTAINANCE || s->state == SERVICE_AUTO_RESTART);
 
+        /* Make sure we don't enter a busy loop of some kind. */
+        if (!ratelimit_test(&s->ratelimit)) {
+                log_warning("%s start request repeated too quickly, refusing to start.", unit_id(u));
+                return -EAGAIN;
+        }
+
         s->failure = false;
         s->main_pid_known = false;