diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2019-06-24 12:56:24 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2019-06-24 12:56:24 +0300 |
commit | 006bfbc5235c181783445d321ce7a7e3c6d8bd8a (patch) | |
tree | f483e0d30c3e801add01b372b24a342281b70b86 /src | |
parent | cb90ca582a46ef9f0779837dc4c6fb00656e70c9 (diff) | |
download | pies-006bfbc5235c181783445d321ce7a7e3c6d8bd8a.tar.gz pies-006bfbc5235c181783445d321ce7a7e3c6d8bd8a.tar.bz2 |
Enable/disable SystemV init code at compile time
* configure.ac: New option --enable-sysvinit. Disable the init
code if RUN_LVL is not available.
(PIES_SYSVINIT_ENABLED): New configuration define.
(PIES_COND_SYSVINIT): New condition
Print configuration settings summary.
* src/pies.h (is_sysvinit): Check for PIES_SYSVINIT_ENABLED.
(SYSVINIT_ACTIVE): New macro.
* grecs: Upgrade.
* src/Makefile.am: Conditionally link sysvinit-related code.
* src/cmdline.opt: Disable the --telinit option if sysvinit support
is not available.
(parse_options): Use SYSVINIT_ACTIVE in the conditional.
* src/comp.c (component_verify): Check if component definition is
allowed by the current state of the sysvinit support.
* src/ctl.c: Disable the /runlevel entry point if sysvinit support
is not compiled.
* src/diag.c (stderr_open): Make sure sysvinit-related code is not
compiled if the sysvinit support is not available.
* src/pies.c (config_syntax_tab): Add entry for CONF_INITTAB only if
sysvinit support is available.
(_cb_initdefault,_cb_runlevels): Remove. Use cb_initdefault and cb_runlevels
instead.
(component_keywords): Disable runlevels without sysvinit support.
(pies_keywords): Same for initdefault.
Use SYSVINIT_ACTIVE to suppress compilation of sysvinit code without
sysvinit support.
* src/progman.c: Use SYSVINIT_ACTIVE to suppress compilation of
sysvinit code without sysvinit support.
* src/sysvinit.c (cb_initdefault,cb_runlevels): New functions.
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 10 | ||||
-rw-r--r-- | src/cmdline.opt | 4 | ||||
-rw-r--r-- | src/comp.c | 3 | ||||
-rw-r--r-- | src/ctl.c | 176 | ||||
-rw-r--r-- | src/diag.c | 2 | ||||
-rw-r--r-- | src/pies.c | 91 | ||||
-rw-r--r-- | src/pies.h | 13 | ||||
-rw-r--r-- | src/progman.c | 15 | ||||
-rw-r--r-- | src/sysvinit.c | 64 |
9 files changed, 208 insertions, 170 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 16f8a75..925da88 100644 --- a/src/Makefile.am +++ b/src/Makefile.am | |||
@@ -30,11 +30,15 @@ pies_SOURCES = \ | |||
30 | pies.c\ | 30 | pies.c\ |
31 | progman.c\ | 31 | progman.c\ |
32 | socket.c\ | 32 | socket.c\ |
33 | sysdep.c\ | ||
34 | sysvinit.c\ | ||
35 | utmp.c\ | ||
36 | userprivs.c | 33 | userprivs.c |
37 | 34 | ||
35 | if PIES_COND_SYSVINIT | ||
36 | pies_SOURCES += \ | ||
37 | sysvinit.c\ | ||
38 | sysdep.c\ | ||
39 | utmp.c | ||
40 | endif | ||
41 | |||
38 | noinst_HEADERS = \ | 42 | noinst_HEADERS = \ |
39 | acl.h\ | 43 | acl.h\ |
40 | cmdline.h\ | 44 | cmdline.h\ |
diff --git a/src/cmdline.opt b/src/cmdline.opt index d2aaf6d..d9d90e1 100644 --- a/src/cmdline.opt +++ b/src/cmdline.opt | |||
@@ -118,12 +118,14 @@ BEGIN | |||
118 | lint_mode = 1; | 118 | lint_mode = 1; |
119 | END | 119 | END |
120 | 120 | ||
121 | CPP(#if PIES_SYSVINIT_ENABLED) | ||
121 | OPTION(telinit,T,, | 122 | OPTION(telinit,T,, |
122 | [<telinit command: run "pies -T --help" for help>]) | 123 | [<telinit command: run "pies -T --help" for help>]) |
123 | BEGIN | 124 | BEGIN |
124 | log_to_stderr_only = 1; | 125 | log_to_stderr_only = 1; |
125 | exit (telinit (argc - (optind - 1), argv + (optind - 1))); | 126 | exit (telinit (argc - (optind - 1), argv + (optind - 1))); |
126 | END | 127 | END |
128 | CPP(#endif) | ||
127 | 129 | ||
128 | GROUP(Preprocessor) | 130 | GROUP(Preprocessor) |
129 | 131 | ||
@@ -220,7 +222,7 @@ parse_options (int *pargc, char ***pargv) | |||
220 | char **argv = *pargv; | 222 | char **argv = *pargv; |
221 | int index; | 223 | int index; |
222 | 224 | ||
223 | if (init_process) | 225 | if (SYSVINIT_ACTIVE) |
224 | { | 226 | { |
225 | sysvinit_parse_argv (argc, argv); | 227 | sysvinit_parse_argv (argc, argv); |
226 | index = argc; | 228 | index = argc; |
@@ -674,6 +674,9 @@ component_verify (struct component *comp, grecs_locus_t *locus) | |||
674 | return 1; | 674 | return 1; |
675 | } | 675 | } |
676 | default: | 676 | default: |
677 | if (PIES_SYSVINIT_ENABLED && comp->mode >= pies_mark_sysvinit) | ||
678 | COMPERR (grecs_error, | ||
679 | "%s", _("SystemV init support is not compiled in")); | ||
677 | /* FIXME: more checks perhaps */ | 680 | /* FIXME: more checks perhaps */ |
678 | break; | 681 | break; |
679 | } | 682 | } |
@@ -918,14 +918,17 @@ static void res_instance (struct ctlio *, enum http_method, char const *, | |||
918 | struct json_value *); | 918 | struct json_value *); |
919 | static void res_programs (struct ctlio *, enum http_method, char const *, | 919 | static void res_programs (struct ctlio *, enum http_method, char const *, |
920 | struct json_value *); | 920 | struct json_value *); |
921 | static void res_conf (struct ctlio *, enum http_method, char const *, | ||
922 | struct json_value *); | ||
923 | |||
924 | #if PIES_SYSVINIT_ENABLED | ||
921 | static void res_runlevel (struct ctlio *, enum http_method, char const *, | 925 | static void res_runlevel (struct ctlio *, enum http_method, char const *, |
922 | struct json_value *); | 926 | struct json_value *); |
923 | static void res_environ (struct ctlio *, enum http_method, char const *, | 927 | static void res_environ (struct ctlio *, enum http_method, char const *, |
924 | struct json_value *); | 928 | struct json_value *); |
925 | static void res_conf (struct ctlio *, enum http_method, char const *, | ||
926 | struct json_value *); | ||
927 | |||
928 | static int pred_sysvinit (void); | 929 | static int pred_sysvinit (void); |
930 | #endif | ||
931 | |||
929 | 932 | ||
930 | struct ctlio_resource | 933 | struct ctlio_resource |
931 | { | 934 | { |
@@ -943,8 +946,10 @@ static struct ctlio_resource restab[] = { | |||
943 | { S(/conf), CTL_ADMIN_STATE, NULL, res_conf }, | 946 | { S(/conf), CTL_ADMIN_STATE, NULL, res_conf }, |
944 | { S(/programs), CTL_ADMIN_STATE|CTL_USER_STATE, NULL, | 947 | { S(/programs), CTL_ADMIN_STATE|CTL_USER_STATE, NULL, |
945 | res_programs }, | 948 | res_programs }, |
949 | #if PIES_SYSVINIT_ENABLED | ||
946 | { S(/runlevel), CTL_ADMIN_STATE, pred_sysvinit, res_runlevel }, | 950 | { S(/runlevel), CTL_ADMIN_STATE, pred_sysvinit, res_runlevel }, |
947 | { S(/environ), CTL_ADMIN_STATE, pred_sysvinit, res_environ }, | 951 | { S(/environ), CTL_ADMIN_STATE, pred_sysvinit, res_environ }, |
952 | #endif | ||
948 | { NULL } | 953 | { NULL } |
949 | #undef S | 954 | #undef S |
950 | }; | 955 | }; |
@@ -2117,6 +2122,7 @@ res_programs (struct ctlio *io, enum http_method meth, | |||
2117 | res_programs_select (io, meth, uri, json); | 2122 | res_programs_select (io, meth, uri, json); |
2118 | } | 2123 | } |
2119 | 2124 | ||
2125 | #if PIES_SYSVINIT_ENABLED | ||
2120 | static int | 2126 | static int |
2121 | pred_sysvinit (void) | 2127 | pred_sysvinit (void) |
2122 | { | 2128 | { |
@@ -2163,6 +2169,89 @@ res_runlevel (struct ctlio *io, enum http_method meth, | |||
2163 | else | 2169 | else |
2164 | ctlio_reply (io, 405, NULL); | 2170 | ctlio_reply (io, 405, NULL); |
2165 | } | 2171 | } |
2172 | |||
2173 | /* GET /environ - List entire environment | ||
2174 | * ["RUNLEVEL=3", "CONSOLE=/dev/tty", ...] | ||
2175 | * GET /environ/NAME - Get value of variable NAME | ||
2176 | * { "status":"OK", "value":"..." } | ||
2177 | * { "status":"ER", "error_message":"..." } | ||
2178 | * DELETE /environ/NAME - Unset variable | ||
2179 | * { "status":"OK" } | ||
2180 | * { "status":"ER", "error_message":"..." } | ||
2181 | * PUT /environ/NAME=VALUE - Set variable | ||
2182 | * { "status":"OK" } | ||
2183 | * { "status":"ER", "error_message":"..." } | ||
2184 | */ | ||
2185 | static void | ||
2186 | env_reply (struct ctlio *io, int ok, int rc) | ||
2187 | { | ||
2188 | switch (rc) | ||
2189 | { | ||
2190 | case 0: | ||
2191 | io->code = ok; | ||
2192 | io->output.reply = json_reply_create (); | ||
2193 | json_object_set_string (io->output.reply, "status", "OK"); | ||
2194 | break; | ||
2195 | |||
2196 | case 1: | ||
2197 | ctlio_reply (io, 403, NULL); | ||
2198 | break; | ||
2199 | |||
2200 | case -1: | ||
2201 | ctlio_reply (io, 404, NULL); | ||
2202 | } | ||
2203 | } | ||
2204 | |||
2205 | static void | ||
2206 | res_environ (struct ctlio *io, enum http_method meth, | ||
2207 | char const *uri, struct json_value *json) | ||
2208 | { | ||
2209 | if (meth == METH_GET) | ||
2210 | { | ||
2211 | if (uri && uri[1]) | ||
2212 | { | ||
2213 | char *value; | ||
2214 | |||
2215 | if (sysvinit_envlocate (uri + 1, &value) == -1) | ||
2216 | ctlio_reply (io, 404, NULL); | ||
2217 | else | ||
2218 | { | ||
2219 | env_reply (io, 200, 0); | ||
2220 | json_object_set_string (io->output.reply, "value", "%s", value); | ||
2221 | } | ||
2222 | } | ||
2223 | else | ||
2224 | { | ||
2225 | size_t i; | ||
2226 | |||
2227 | io->output.reply = json_new_array (); | ||
2228 | io->code = 200; | ||
2229 | for (i = 0; sysvinit_environ_hint[i]; i++) | ||
2230 | { | ||
2231 | json_array_append (io->output.reply, | ||
2232 | json_new_string (sysvinit_environ_hint[i])); | ||
2233 | } | ||
2234 | } | ||
2235 | } | ||
2236 | else if (meth == METH_DELETE) | ||
2237 | { | ||
2238 | if (!(uri && uri[0])) | ||
2239 | ctlio_reply (io, 400, NULL); | ||
2240 | else | ||
2241 | env_reply (io, 200, sysvinit_envupdate (uri + 1)); | ||
2242 | } | ||
2243 | else if (meth == METH_PUT) | ||
2244 | { | ||
2245 | if (!(uri && uri[0])) | ||
2246 | ctlio_reply (io, 400, NULL); | ||
2247 | else | ||
2248 | env_reply (io, 201, sysvinit_envupdate (uri + 1)); | ||
2249 | } | ||
2250 | else | ||
2251 | ctlio_reply (io, 405, NULL); | ||
2252 | |||
2253 | } | ||
2254 | #endif | ||
2166 | 2255 | ||
2167 | /* GET /conf/runtime - List configuration | 2256 | /* GET /conf/runtime - List configuration |
2168 | * PUT /conf/runtime - Reload configuration | 2257 | * PUT /conf/runtime - Reload configuration |
@@ -2407,85 +2496,4 @@ res_conf (struct ctlio *io, enum http_method meth, | |||
2407 | else | 2496 | else |
2408 | ctlio_reply (io, 404, NULL); | 2497 | ctlio_reply (io, 404, NULL); |
2409 | } | 2498 | } |
2410 | |||
2411 | /* GET /environ - List entire environment | ||
2412 | * ["RUNLEVEL=3", "CONSOLE=/dev/tty", ...] | ||
2413 | * GET /environ/NAME - Get value of variable NAME | ||
2414 | * { "status":"OK", "value":"..." } | ||
2415 | * { "status":"ER", "error_message":"..." } | ||
2416 | * DELETE /environ/NAME - Unset variable | ||
2417 | * { "status":"OK" } | ||
2418 | * { "status":"ER", "error_message":"..." } | ||