summaryrefslogtreecommitdiff
path: root/lib/src/rdsrv.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/src/rdsrv.c')
-rw-r--r--lib/src/rdsrv.c251
1 files changed, 0 insertions, 251 deletions
diff --git a/lib/src/rdsrv.c b/lib/src/rdsrv.c
deleted file mode 100644
index 88d41e8..0000000
--- a/lib/src/rdsrv.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/* SPDX-License-Identifier: GPL-3.0-or-later */
-/*
- * Copyright (C) 2018 - David Oberhollenzer
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- */
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <fcntl.h>
-
-#include "service.h"
-#include "util.h"
-
-static int srv_name(service_t *srv, char *arg,
- const char *filename, size_t lineno)
-{
- (void)filename; (void)lineno;
- srv->name = arg;
- return 0;
-}
-
-static int srv_desc(service_t *srv, char *arg,
- const char *filename, size_t lineno)
-{
- (void)filename; (void)lineno;
- srv->desc = arg;
- return 0;
-}
-
-static int srv_tty(service_t *srv, char *arg,
- const char *filename, size_t lineno)
-{
- (void)filename; (void)lineno;
- srv->ctty = arg;
- return 0;
-}
-
-static int srv_exec(service_t *srv, char *arg,
- const char *filename, size_t lineno)
-{
- char **new = realloc(srv->exec, sizeof(char*) * (srv->num_exec + 1));
-
- if (new == NULL) {
- fprintf(stderr, "%s: %zu: out of memory\n", filename, lineno);
- free(arg);
- return -1;
- }
-
- srv->exec = new;
- srv->exec[srv->num_exec++] = arg;
- return 0;
-}
-
-static int srv_before(service_t *srv, char *arg,
- const char *filename, size_t lineno)
-{
- char **new = realloc(srv->before,
- sizeof(char*) * (srv->num_before + 1));
-
- if (new == NULL) {
- fprintf(stderr, "%s: %zu: out of memory\n", filename, lineno);
- free(arg);
- return -1;
- }
-
- srv->before = new;
- srv->before[srv->num_before++] = arg;
- return 0;
-}
-
-static int srv_after(service_t *srv, char *arg,
- const char *filename, size_t lineno)
-{
- char **new = realloc(srv->after, sizeof(char*) * (srv->num_after + 1));
-
- if (new == NULL) {
- fprintf(stderr, "%s: %zu: out of memory\n", filename, lineno);
- free(arg);
- return -1;
- }
-
- srv->after = new;
- srv->after[srv->num_after++] = arg;
- return 0;
-}
-
-static int srv_type(service_t *srv, char *arg,
- const char *filename, size_t lineno)
-{
- int type = svc_type_from_string(arg);
-
- if (type == -1) {
- fprintf(stderr, "%s: %zu: unknown service type '%s'\n",
- filename, lineno, arg);
- return -1;
- }
-
- srv->type = type;
- free(arg);
- return 0;
-}
-
-static int srv_target(service_t *srv, char *arg,
- const char *filename, size_t lineno)
-{
- int target = svc_target_from_string(arg);
-
- if (target == -1) {
- fprintf(stderr, "%s: %zu: unknown service target '%s'\n",
- filename, lineno, arg);
- return -1;
- }
-
- srv->target = target;
- free(arg);
- return 0;
-}
-
-
-static const struct {
- const char *key;
-
- int (*handle)(service_t *srv, char *arg,
- const char *filename, size_t lineno);
-} srv_params[] = {
- { "name", srv_name },
- { "description", srv_desc },
- { "exec", srv_exec },
- { "type", srv_type },
- { "target", srv_target },
- { "tty", srv_tty },
- { "before", srv_before },
- { "after", srv_after },
-};
-
-
-service_t *rdsrv(int dirfd, const char *filename)
-{
- const char *arg, *args[1];
- char *line, *key, *value;
- size_t i, argc, lineno;
- service_t *srv;
- int fd;
-
- fd = openat(dirfd, filename, O_RDONLY);
- if (fd < 0) {
- perror(filename);
- return NULL;
- }
-
- arg = strchr(filename, '@');
- if (arg != NULL) {
- args[0] = arg + 1;
- argc = 1;
- } else {
- argc = 0;
- }
-
- srv = calloc(1, sizeof(*srv));
- if (srv == NULL) {
- fputs("out of memory\n", stderr);
- close(fd);
- return NULL;
- }
-
- for (lineno = 1; ; ++lineno) {
- errno = 0;
- line = rdline(fd);
-
- if (line == NULL) {
- if (errno != 0) {
- fprintf(stderr, "read: %s: %zu: %s\n",
- filename, lineno, strerror(errno));
- goto fail;
- }
- break;
- }
-
- if (splitkv(line, &key, &value)) {
- if (key == NULL) {
- fprintf(stderr,
- "%s: %zu: expected <key> = <value>\n",
- filename, lineno);
- } else if (value == NULL) {
- fprintf(stderr,
- "%s: %zu: expected value after %s\n",
- filename, lineno, key);
- } else {
- fprintf(stderr,
- "%s: %zu: unexpected arguments "
- "after key-value pair\n",
- filename, lineno);
- }
- goto fail;
- }
-
- if (key == NULL) {
- free(line);
- continue;
- }
-
- for (i = 0; i < ARRAY_SIZE(srv_params); ++i) {
- if (!strcmp(srv_params[i].key, key))
- break;
- }
-
- if (i >= ARRAY_SIZE(srv_params)) {
- fprintf(stderr, "%s: %zu: unknown parameter '%s'\n",
- filename, lineno, key);
- goto fail_line;
- }
-
- value = strexpand(value, argc, args);
- if (value == NULL) {
- fputs("out of memory", stderr);
- goto fail_line;
- }
-
- if (srv_params[i].handle(srv, value, filename, lineno)) {
- free(value);
- goto fail_line;
- }
-
- free(line);
- }
-
- close(fd);
- return srv;
-fail_line:
- free(line);
-fail:
- close(fd);
- delsrv(srv);
- return NULL;
-}