1
0
Fork 0
mirror of https://github.com/pygos/init.git synced 2024-11-18 09:19:47 +01:00
init/cmd/service/disable.c
David Oberhollenzer 028394b8a5 Add service configuration reloading
This commit add the ability to initd to reload the service configuration
while running. The new configuration is merged with the existing one as
follows:

For each target:
 - If the existing service list is not NULL, we have not started that
   target yet. Simply replace it with the new list.
 - If it is NULL, the services have already been started.
    - First, remove all entries for services in that target that no
      loner exist (except from the 'running' list).
    - Second, add new services that we don't have yet. Treat them as
      recently diseased and let the user start them manualy.

Signed-off-by: David Oberhollenzer <goliath@infraroot.at>
2019-03-29 21:00:53 +01:00

76 lines
1.5 KiB
C

/* SPDX-License-Identifier: ISC */
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <stdio.h>
#include <errno.h>
#include "servicecmd.h"
static int cmd_disable(int argc, char **argv)
{
int ret = EXIT_FAILURE;
char *linkname, *ptr;
struct stat sb;
if (check_arguments(argv[0], argc, 2, 3))
return EXIT_FAILURE;
for (ptr = argv[1]; isalnum(*ptr) || *ptr == '_'; ++ptr)
;
if (*ptr != '\0') {
fprintf(stderr, "Invalid service name '%s'\n", argv[1]);
tell_read_help(argv[0]);
return EXIT_FAILURE;
}
if (argc == 3) {
ret = asprintf(&linkname, "%s/%s@%s",
SVCDIR, argv[1], argv[2]);
} else {
ret = asprintf(&linkname, "%s/%s", SVCDIR, argv[1]);
}
if (ret < 0) {
perror("asprintf");
return EXIT_FAILURE;
}
if (lstat(linkname, &sb)) {
fprintf(stderr, "lstat %s: %s\n", linkname, strerror(errno));
goto out;
}
if ((sb.st_mode & S_IFMT) != S_IFLNK) {
fprintf(stderr, "error: '%s' is not a symlink!", linkname);
goto out;
}
if (unlink(linkname)) {
fprintf(stderr, "removing %s: %s\n",
linkname, strerror(errno));
goto out;
}
kill(1, SIGHUP);
ret = EXIT_SUCCESS;
out:
free(linkname);
return ret;
}
static command_t disable = {
.cmd = "disable",
.usage = "<name> [argument]",
.s_desc = "disable a service",
.l_desc = "This disables a service by removing the coresponding "
"symlink in " SVCDIR ".",
.run_cmd = cmd_disable,
};
REGISTER_COMMAND(disable)