mirror of
https://github.com/pygos/init.git
synced 2024-11-22 11:19:45 +01:00
Don't split dependencies into argument vector, keep list of strings
Signed-off-by: David Oberhollenzer <david.oberhollenzer@tele2.at>
This commit is contained in:
parent
4ee0ea9754
commit
71d98c150f
5 changed files with 44 additions and 38 deletions
|
@ -62,14 +62,11 @@ typedef struct service_t {
|
||||||
/* linked list of command lines to execute */
|
/* linked list of command lines to execute */
|
||||||
exec_t *exec;
|
exec_t *exec;
|
||||||
|
|
||||||
/* NULL terminated array of services that must be executed later */
|
char *before; /* services that must be executed later */
|
||||||
char **before;
|
char *after; /* services that must be executed first */
|
||||||
|
|
||||||
/* NULL terminated array of services that must be executed first */
|
int num_before;
|
||||||
char **after;
|
int num_after;
|
||||||
|
|
||||||
char *raw_before; /* backing store for 'before' contents */
|
|
||||||
char *raw_after; /* backing store for 'after' contents */
|
|
||||||
|
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int status; /* process exit status */
|
int status; /* process exit status */
|
||||||
|
|
|
@ -34,9 +34,6 @@ void delsvc(service_t *svc)
|
||||||
free(e);
|
free(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(svc->raw_before);
|
|
||||||
free(svc->raw_after);
|
|
||||||
|
|
||||||
free(svc->before);
|
free(svc->before);
|
||||||
free(svc->after);
|
free(svc->after);
|
||||||
free(svc->desc);
|
free(svc->desc);
|
||||||
|
|
|
@ -122,14 +122,17 @@ static int svc_before(service_t *svc, char *arg, rdline_t *rd)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
svc->raw_before = try_strdup(arg, rd);
|
svc->before = try_strdup(arg, rd);
|
||||||
if (svc->raw_before == NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
svc->before = try_split_argv(svc->raw_before, rd);
|
|
||||||
if (svc->before == NULL)
|
if (svc->before == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
svc->num_before = pack_argv(svc->before);
|
||||||
|
if (svc->num_before < 0) {
|
||||||
|
fprintf(stderr, "%s: %zu: malformed string constant\n",
|
||||||
|
rd->filename, rd->lineno);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,14 +144,17 @@ static int svc_after(service_t *svc, char *arg, rdline_t *rd)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
svc->raw_after = try_strdup(arg, rd);
|
svc->after = try_strdup(arg, rd);
|
||||||
if (svc->raw_after == NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
svc->after = try_split_argv(svc->raw_after, rd);
|
|
||||||
if (svc->after == NULL)
|
if (svc->after == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
svc->num_after = pack_argv(svc->after);
|
||||||
|
if (svc->num_after < 0) {
|
||||||
|
fprintf(stderr, "%s: %zu: malformed string constant\n",
|
||||||
|
rd->filename, rd->lineno);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,21 +24,20 @@
|
||||||
|
|
||||||
static bool has_dependencies(service_t *list, service_t *svc)
|
static bool has_dependencies(service_t *list, service_t *svc)
|
||||||
{
|
{
|
||||||
size_t i;
|
const char *ptr;
|
||||||
|
int i;
|
||||||
|
|
||||||
while (list != NULL) {
|
while (list != NULL) {
|
||||||
if (svc->after != NULL) {
|
for (ptr = svc->after, i = 0; i < svc->num_after; ++i) {
|
||||||
for (i = 0; svc->after[i] != NULL; ++i) {
|
if (!strcmp(ptr, list->name))
|
||||||
if (!strcmp(svc->after[i], list->name))
|
|
||||||
return true;
|
return true;
|
||||||
}
|
ptr += strlen(ptr) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (list->before != NULL) {
|
for (ptr = list->before, i = 0; i < list->num_before; ++i) {
|
||||||
for (i = 0; list->before[i] != NULL; ++i) {
|
if (!strcmp(ptr, svc->name))
|
||||||
if (!strcmp(list->before[i], svc->name))
|
|
||||||
return true;
|
return true;
|
||||||
}
|
ptr += strlen(ptr) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
list = list->next;
|
list = list->next;
|
||||||
|
|
|
@ -21,7 +21,8 @@
|
||||||
|
|
||||||
static void print_services(service_t *svc)
|
static void print_services(service_t *svc)
|
||||||
{
|
{
|
||||||
size_t i;
|
const char *ptr;
|
||||||
|
int i;
|
||||||
|
|
||||||
for (; svc != NULL; svc = svc->next) {
|
for (; svc != NULL; svc = svc->next) {
|
||||||
printf("Name: %s\n", svc->name);
|
printf("Name: %s\n", svc->name);
|
||||||
|
@ -32,18 +33,24 @@ static void print_services(service_t *svc)
|
||||||
if (svc->type == SVC_RESPAWN && svc->rspwn_limit > 0)
|
if (svc->type == SVC_RESPAWN && svc->rspwn_limit > 0)
|
||||||
printf("\tRespawn limit: %d\n", svc->rspwn_limit);
|
printf("\tRespawn limit: %d\n", svc->rspwn_limit);
|
||||||
|
|
||||||
if (svc->before != NULL) {
|
ptr = svc->before;
|
||||||
|
if (ptr != NULL && svc->num_before > 0) {
|
||||||
fputs("\tMust be run before:\n", stdout);
|
fputs("\tMust be run before:\n", stdout);
|
||||||
|
|
||||||
for (i = 0; svc->before[i] != NULL; ++i)
|
for (i = 0; i < svc->num_before; ++i) {
|
||||||
printf("\t\t%s\n", svc->before[i]);
|
printf("\t\t%s\n", ptr);
|
||||||
|
ptr += strlen(ptr) + 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (svc->after != NULL) {
|
ptr = svc->after;
|
||||||
|
if (ptr != NULL && svc->num_after > 0) {
|
||||||
fputs("\tMust be run after:\n", stdout);
|
fputs("\tMust be run after:\n", stdout);
|
||||||
|
|
||||||
for (i = 0; svc->after[i] != NULL; ++i)
|
for (i = 0; i < svc->num_after; ++i) {
|
||||||
printf("\t\t%s\n", svc->after[i]);
|
printf("\t\t%s\n", ptr);
|
||||||
|
ptr += strlen(ptr) + 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue