summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-04-07 20:27:52 +0200
committerLennart Poettering <lennart@poettering.net>2010-04-07 20:27:52 +0200
commit8309400a17b041fb8b52b13b9125eb65d11f3669 (patch)
tree1e4b8551b11fc3418ce1f192d583360cc07d2395
parentdb12775d59ab709f8afc361eaa30c9d54a0a8d7c (diff)
service: parse default runlevels from init scripts
-rw-r--r--service.c52
-rw-r--r--service.h1
2 files changed, 46 insertions, 7 deletions
diff --git a/service.c b/service.c
index b7c3233183..c5e3bc13b4 100644
--- a/service.c
+++ b/service.c
@@ -74,6 +74,9 @@ static void service_done(Unit *u) {
free(s->sysv_path);
s->sysv_path = NULL;
+ free(s->sysv_runlevels);
+ s->sysv_runlevels = NULL;
+
exec_context_done(&s->exec_context);
exec_command_free_array(s->exec_command, _SERVICE_EXEC_MAX);
s->control_command = NULL;
@@ -344,22 +347,38 @@ static int service_load_sysv_path(Service *s, const char *path, UnitLoadState *n
if (startswith(t, "chkconfig:")) {
int start_priority;
+ char runlevels[16], *k;
state = NORMAL;
- if (sscanf(t+10, "%*15s %i %*i",
- &start_priority) != 1) {
+ if (sscanf(t+10, "%15s %i %*i",
+ runlevels,
+ &start_priority) != 2) {
log_warning("[%s:%u] Failed to parse chkconfig line. Ignoring.", path, line);
continue;
}
- if (start_priority < 0 || start_priority > 99) {
+ if (start_priority < 0 || start_priority > 99)
log_warning("[%s:%u] Start priority out of range. Ignoring.", path, line);
- continue;
+ else
+ s->sysv_start_priority = start_priority;
+
+ char_array_0(runlevels);
+ k = delete_chars(runlevels, WHITESPACE "-");
+
+ if (k[0]) {
+ char *d;
+
+ if (!(d = strdup(k))) {
+ r = -ENOMEM;
+ goto finish;
+ }
+
+ free(s->sysv_runlevels);
+ s->sysv_runlevels = d;
}
- s->sysv_start_priority = start_priority;
} else if (startswith(t, "description:")) {
@@ -490,6 +509,22 @@ static int service_load_sysv_path(Service *s, const char *path, UnitLoadState *n
if (r < 0)
goto finish;
}
+ } else if (startswith(t, "Default-Start:")) {
+ char *k, *d;
+
+ state = LSB;
+
+ k = delete_chars(t+14, WHITESPACE "-");
+
+ if (k[0] != 0) {
+ if (!(d = strdup(k))) {
+ r = -ENOMEM;
+ goto finish;
+ }
+
+ free(s->sysv_runlevels);
+ s->sysv_runlevels = d;
+ }
} else if (startswith(t, "Description:")) {
char *d;
@@ -504,7 +539,8 @@ static int service_load_sysv_path(Service *s, const char *path, UnitLoadState *n
free(u->meta.description);
u->meta.description = d;
- } else if (startswith(t, "Short-Description:") && !u->meta.description) {
+ } else if (startswith(t, "Short-Description:") &&
+ !u->meta.description) {
char *d;
/* We use the short description only
@@ -517,7 +553,6 @@ static int service_load_sysv_path(Service *s, const char *path, UnitLoadState *n
goto finish;
}
- free(u->meta.description);
u->meta.description = d;
} else if (state == LSB_DESCRIPTION) {
@@ -749,6 +784,9 @@ static void service_dump(Unit *u, FILE *f, const char *prefix) {
"%sSysVStartPriority: %i\n",
prefix, s->sysv_start_priority);
+ if (s->sysv_runlevels)
+ fprintf(f, "%sSysVRunLevels: %s\n",
+ prefix, s->sysv_runlevels);
free(p2);
}
diff --git a/service.h b/service.h
index 0a258a3774..1a170f526f 100644
--- a/service.h
+++ b/service.h
@@ -107,6 +107,7 @@ struct Service {
char *sysv_path;
int sysv_start_priority;
+ char *sysv_runlevels;
RateLimit ratelimit;
};