aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/service/status.c30
-rw-r--r--initd/supervisor.c15
-rw-r--r--lib/include/initsock.h3
3 files changed, 32 insertions, 16 deletions
diff --git a/cmd/service/status.c b/cmd/service/status.c
index c8e87c4..3be2f3e 100644
--- a/cmd/service/status.c
+++ b/cmd/service/status.c
@@ -53,31 +53,35 @@ static int cmd_status(int argc, char **argv)
switch (resp.state) {
case ESS_RUNNING:
if (!is_tty) {
- state = "Running";
+ state = "UP";
break;
}
- state = "\033[22;32mRunning\033[0m";
+ state = "\033[22;32m UP \033[0m";
break;
case ESS_ENQUEUED:
- state = " Queue ";
+ state = "SCHED";
break;
- case ESS_EXITED:
+ case ESS_FAILED:
if (!is_tty) {
- state = "Exited ";
+ state = "FAIL";
break;
}
- if (resp.exit_status == EXIT_SUCCESS) {
- state = "\033[22;33mExited \033[0m";
- } else {
- state = "\033[22;31mExited \033[0m";
+ state = "\033[22;31mFAIL\033[0m";
+ break;
+ case ESS_DONE:
+ if (!is_tty) {
+ state = "DONE";
+ break;
}
+
+ state = "\033[22;33mDONE\033[0m";
break;
default:
if (!is_tty) {
- state = "Unknown";
+ state = "UNKNOWN";
break;
}
- state = "\033[22;31mUnknown\033[0m";
+ state = "\033[22;31mUNKNOWN\033[0m";
break;
}
@@ -98,8 +102,8 @@ static command_t status = {
.usage = "",
.s_desc = "report the status of the currently enabled services",
.l_desc = "Gathers a list of all currently running services and the "
- "state that they are in (currently running, exited, wating "
- "to get scheduled).",
+ "state that they are in (currently running, done, failed, "
+ "wating to get scheduled).",
.run_cmd = cmd_status,
};
diff --git a/initd/supervisor.c b/initd/supervisor.c
index 3743ad6..cd38469 100644
--- a/initd/supervisor.c
+++ b/initd/supervisor.c
@@ -8,6 +8,7 @@ static service_t *running = NULL;
static service_t *terminated = NULL;
static service_t *queue = NULL;
static service_t *completed = NULL;
+static service_t *failed = NULL;
static int singleshot = 0;
static bool waiting = false;
@@ -38,7 +39,7 @@ static void handle_terminated_service(service_t *svc)
if (svc->rspwn_limit == 0) {
print_status(svc->desc, STATUS_FAIL, false);
- break;
+ goto out_failure;
}
}
@@ -51,6 +52,8 @@ static void handle_terminated_service(service_t *svc)
STATUS_OK : STATUS_FAIL, true);
if (singleshot == 0 && queue == NULL)
target_completed(target);
+ if (svc->status != EXIT_SUCCESS)
+ goto out_failure;
break;
case SVC_ONCE:
singleshot -= 1;
@@ -59,10 +62,16 @@ static void handle_terminated_service(service_t *svc)
STATUS_OK : STATUS_FAIL, false);
if (singleshot == 0 && queue == NULL && !waiting)
target_completed(target);
+ if (svc->status != EXIT_SUCCESS)
+ goto out_failure;
break;
}
svc->next = completed;
completed = svc;
+ return;
+out_failure:
+ svc->next = failed;
+ failed = svc;
}
void supervisor_handle_exited(pid_t pid, int status)
@@ -185,7 +194,9 @@ void supervisor_answer_status_request(int fd, const void *dst, size_t addrlen)
{
if (send_svc_list(fd, dst, addrlen, ESS_RUNNING, running))
return;
- if (send_svc_list(fd, dst, addrlen, ESS_EXITED, completed))
+ if (send_svc_list(fd, dst, addrlen, ESS_DONE, completed))
+ return;
+ if (send_svc_list(fd, dst, addrlen, ESS_FAILED, failed))
return;
if (send_svc_list(fd, dst, addrlen, ESS_ENQUEUED, queue))
return;
diff --git a/lib/include/initsock.h b/lib/include/initsock.h
index 9c84f3e..75d859c 100644
--- a/lib/include/initsock.h
+++ b/lib/include/initsock.h
@@ -15,7 +15,8 @@ typedef enum {
ESS_NONE = 0x00,
ESS_RUNNING = 0x01,
ESS_ENQUEUED = 0x02,
- ESS_EXITED = 0x03,
+ ESS_DONE = 0x03,
+ ESS_FAILED = 0x04
} E_SERVICE_STATE;
typedef struct {