diff --git a/cmd/Makemodule.am b/cmd/Makemodule.am index 83d6174..f92610c 100644 --- a/cmd/Makemodule.am +++ b/cmd/Makemodule.am @@ -14,7 +14,7 @@ runsvc_SOURCES = cmd/runsvc/runsvc.c cmd/runsvc/env.c cmd/runsvc/runsvc.h runsvc_CPPFLAGS = $(AM_CPPFLAGS) runsvc_CFLAGS = $(AM_CFLAGS) runsvc_LDFLAGS = $(AM_LDFLAGS) -runsvc_LDADD = libinit.a +runsvc_LDADD = libinit.a libcfg.a killall5_SOURCES = cmd/killall5.c killall5_CPPFLAGS = $(AM_CPPFLAGS) @@ -30,7 +30,7 @@ service_SOURCES += $(SRVHEADERS) service_CPPFLAGS = $(AM_CPPFLAGS) service_CFLAGS = $(AM_CFLAGS) service_LDFLAGS = $(AM_LDFLAGS) -service_LDADD = libinit.a +service_LDADD = libinit.a libcfg.a EXTRA_DIST += $(SRVHEADERS) diff --git a/cmd/runsvc/runsvc.h b/cmd/runsvc/runsvc.h index 15785d3..7061eca 100644 --- a/cmd/runsvc/runsvc.h +++ b/cmd/runsvc/runsvc.h @@ -27,6 +27,7 @@ #include #include "service.h" +#include "libcfg.h" #include "util.h" #define ENVFILE ETCPATH "/initd.env" diff --git a/initd/Makemodule.am b/initd/Makemodule.am index f188c80..661742a 100644 --- a/initd/Makemodule.am +++ b/initd/Makemodule.am @@ -3,6 +3,6 @@ init_SOURCES += initd/status.c initd/mksock.c initd/svclist.c init_CPPFLAGS = $(AM_CPPFLAGS) init_CFLAGS = $(AM_CFLAGS) init_LDFLAGS = $(AM_LDFLAGS) -init_LDADD = libinit.a +init_LDADD = libinit.a libcfg.a sbin_PROGRAMS += init diff --git a/lib/Makemodule.am b/lib/Makemodule.am index b410ccc..c29ad2b 100644 --- a/lib/Makemodule.am +++ b/lib/Makemodule.am @@ -1,13 +1,17 @@ HEADRS = lib/include/util.h lib/include/service.h lib/include/telinit.h -libinit_a_SOURCES = lib/src/delsvc.c lib/src/rdline.c lib/src/svcmap.c -libinit_a_SOURCES += lib/src/unescape.c lib/src/enum_by_name.c -libinit_a_SOURCES += lib/src/rdsvc.c lib/src/svcscan.c lib/src/split_argv.c -libinit_a_SOURCES += lib/src/del_svc_list.c lib/src/svc_tsort.c -libinit_a_SOURCES += lib/src/opensock.c lib/src/enum_to_name.c $(HEADRS) +libinit_a_SOURCES = lib/util/delsvc.c lib/util/svcmap.c lib/util/enum_by_name.c +libinit_a_SOURCES += lib/util/rdsvc.c lib/util/svcscan.c +libinit_a_SOURCES += lib/util/del_svc_list.c lib/util/svc_tsort.c +libinit_a_SOURCES += lib/util/opensock.c lib/util/enum_to_name.c $(HEADRS) libinit_a_CPPFLAGS = $(AM_CPPFLAGS) libinit_a_CFLAGS = $(AM_CFLAGS) -EXTRA_DIST += $(HEADRS) +libcfg_a_SOURCES = lib/libcfg/rdline.c lib/libcfg/unescape.c +libcfg_a_SOURCES += lib/libcfg/pack_argv.c lib/include/libcfg.h +libcfg_a_CPPFLAGS = $(AM_CPPFLAGS) +libcfg_a_CFLAGS = $(AM_CFLAGS) -noinst_LIBRARIES += libinit.a +EXTRA_DIST += $(HEADRS) lib/include/libcfg.h + +noinst_LIBRARIES += libinit.a libcfg.a diff --git a/lib/include/libcfg.h b/lib/include/libcfg.h new file mode 100644 index 0000000..5724bdc --- /dev/null +++ b/lib/include/libcfg.h @@ -0,0 +1,98 @@ +/* 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 . + */ +#ifndef LIBCONFIG_H +#define LIBCONFIG_H + +#include + +typedef struct { + int fd; /* input file descriptor */ + const char *argstr; /* if not NULL, read from this instead */ + + const char *filename; /* input file name */ + size_t lineno; /* current line number */ + + size_t i; /* buffer offset */ + char buffer[256]; /* current line, null-terminated */ + + int argc; + const char *const *argv; + + bool string; /* inside a string? */ + bool escape; /* reading an escape sequence? */ + bool comment; /* inside a comment */ +} rdline_t; + +/* + Initialize the config line scanner. + + The scanner reads from the provided fd. The filename is used for + error reporting. An argument count and vector can be set for argument + substitution in rdline. +*/ +void rdline_init(rdline_t *t, int fd, const char *filename, + int argc, const char *const *argv); + +/* + Read from file until end-of-file or a line feed is encountered. + + Returns -1 on failure, +1 if end of file was reached, + 0 if data was read successfully. + + The following transformations are applied: + - Space characters are replaced with regular white space characters. + - Sequences of space characters are truncated to a single space. + - A '#' sign is interpreted as the start of a comment and removed, + together with everything that follows. + - Padding spaces are removed from the line. + - If a '"' is encounterd, the above rules are disabled, until a + after the matching '"' is read. A '"' can be escaped by preceeding + it with a backslash. + - If a second, coresponding '"' is not found, processing fails. + - If a '%' character is encountered, the next character is expected + to be a single digit index into argv. If it is not a digit or + outside the bounds set by argc, processing fails. On success, + the argv value is inserted and processed as described above. + - A '%' character can be escaped by writing '%%' or, if inside + a double quite string, by writing \%. + - An attempt to use such an indexed argument inside an argument + expansion, results in failure. + - If the resulting line is empty, processing is restarted. +*/ +int rdline(rdline_t *t); + +/* + Remove double quotes ('"') from a string and substitute escape + sequences in between double quotes. +*/ +int unescape(char *src); + +/* + Replace spaces in 'str' with null bytes. Tread strings (started and + terminated with double-quotes which can be escaped) as a single block. + Such strings are run through unescap(). All elements are tightly + packed together and the function returns the number of consecutive + argument strings that are now inside 'str'. + + Returns a negative value if unescape() fails, a string is not + termianted or two such strings touch each other without a white + space in between. +*/ +int pack_argv(char *str); + +#endif /* LIBCONFIG_H */ diff --git a/lib/include/util.h b/lib/include/util.h index d6b68f1..f63a0d6 100644 --- a/lib/include/util.h +++ b/lib/include/util.h @@ -35,83 +35,6 @@ typedef struct { int value; } enum_map_t; - -typedef struct { - int fd; /* input file descriptor */ - const char *argstr; /* if not NULL, read from this instead */ - - const char *filename; /* input file name */ - size_t lineno; /* current line number */ - - size_t i; /* buffer offset */ - char buffer[256]; /* current line, null-terminated */ - - int argc; - const char *const *argv; - - bool string; /* inside a string? */ - bool escape; /* reading an escape sequence? */ - bool comment; /* inside a comment */ -} rdline_t; - - -/* - Initialize the config line scanner. - - The scanner reads from the provided fd. The filename is used for - error reporting. An argument count and vector can be set for argument - substitution in rdline. -*/ -void rdline_init(rdline_t *t, int fd, const char *filename, - int argc, const char *const *argv); - -/* - Read from file until end-of-file or a line feed is encountered. - - Returns -1 on failure, +1 if end of file was reached, - 0 if data was read successfully. - - The following transformations are applied: - - Space characters are replaced with regular white space characters. - - Sequences of space characters are truncated to a single space. - - A '#' sign is interpreted as the start of a comment and removed, - together with everything that follows. - - Padding spaces are removed from the line. - - If a '"' is encounterd, the above rules are disabled, until a - after the matching '"' is read. A '"' can be escaped by preceeding - it with a backslash. - - If a second, coresponding '"' is not found, processing fails. - - If a '%' character is encountered, the next character is expected - to be a single digit index into argv. If it is not a digit or - outside the bounds set by argc, processing fails. On success, - the argv value is inserted and processed as described above. - - A '%' character can be escaped by writing '%%' or, if inside - a double quite string, by writing \%. - - An attempt to use such an indexed argument inside an argument - expansion, results in failure. - - If the resulting line is empty, processing is restarted. -*/ -int rdline(rdline_t *t); - -/* - Remove double quotes ('"') from a string and substitute escape - sequences in between double quotes. -*/ -int unescape(char *src); - -/* - Replace spaces in 'str' with null bytes. Tread strings (started and - terminated with double-quotes which can be escaped) as a single block. - Such strings are run through unescap(). All elements are tightly - packed together and the function returns the number of consecutive - argument strings that are now inside 'str'. - - Returns a negative value if unescape() fails, a string is not - termianted or two such strings touch each other without a white - space in between. -*/ -int pack_argv(char *str); - /* Search through an array of enum_map_t entries to resolve a string to a numeric value. The end of the map is indicated by a sentinel entry diff --git a/lib/src/split_argv.c b/lib/libcfg/pack_argv.c similarity index 98% rename from lib/src/split_argv.c rename to lib/libcfg/pack_argv.c index 5930e2d..4d90171 100644 --- a/lib/src/split_argv.c +++ b/lib/libcfg/pack_argv.c @@ -21,7 +21,7 @@ #include #include -#include "util.h" +#include "libcfg.h" int pack_argv(char *str) { diff --git a/lib/src/rdline.c b/lib/libcfg/rdline.c similarity index 99% rename from lib/src/rdline.c rename to lib/libcfg/rdline.c index 47a9d2a..ffbfd89 100644 --- a/lib/src/rdline.c +++ b/lib/libcfg/rdline.c @@ -22,7 +22,7 @@ #include #include -#include "util.h" +#include "libcfg.h" static int rdline_getc(rdline_t *t) { diff --git a/lib/src/unescape.c b/lib/libcfg/unescape.c similarity index 99% rename from lib/src/unescape.c rename to lib/libcfg/unescape.c index 2d48c92..e2b450c 100644 --- a/lib/src/unescape.c +++ b/lib/libcfg/unescape.c @@ -19,7 +19,7 @@ #include #include -#include "util.h" +#include "libcfg.h" static int xdigit(int x) { diff --git a/lib/src/del_svc_list.c b/lib/util/del_svc_list.c similarity index 100% rename from lib/src/del_svc_list.c rename to lib/util/del_svc_list.c diff --git a/lib/src/delsvc.c b/lib/util/delsvc.c similarity index 100% rename from lib/src/delsvc.c rename to lib/util/delsvc.c diff --git a/lib/src/enum_by_name.c b/lib/util/enum_by_name.c similarity index 100% rename from lib/src/enum_by_name.c rename to lib/util/enum_by_name.c diff --git a/lib/src/enum_to_name.c b/lib/util/enum_to_name.c similarity index 100% rename from lib/src/enum_to_name.c rename to lib/util/enum_to_name.c diff --git a/lib/src/opensock.c b/lib/util/opensock.c similarity index 100% rename from lib/src/opensock.c rename to lib/util/opensock.c diff --git a/lib/src/rdsvc.c b/lib/util/rdsvc.c similarity index 99% rename from lib/src/rdsvc.c rename to lib/util/rdsvc.c index 546962d..6a964f7 100644 --- a/lib/src/rdsvc.c +++ b/lib/util/rdsvc.c @@ -26,6 +26,7 @@ #include #include "service.h" +#include "libcfg.h" #include "util.h" static int try_unescape(char *arg, rdline_t *rd) diff --git a/lib/src/svc_tsort.c b/lib/util/svc_tsort.c similarity index 100% rename from lib/src/svc_tsort.c rename to lib/util/svc_tsort.c diff --git a/lib/src/svcmap.c b/lib/util/svcmap.c similarity index 100% rename from lib/src/svcmap.c rename to lib/util/svcmap.c diff --git a/lib/src/svcscan.c b/lib/util/svcscan.c similarity index 100% rename from lib/src/svcscan.c rename to lib/util/svcscan.c