aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2019-06-24 12:56:24 +0300
committerSergey Poznyakoff <gray@gnu.org>2019-06-24 12:56:24 +0300
commit006bfbc5235c181783445d321ce7a7e3c6d8bd8a (patch)
treef483e0d30c3e801add01b372b24a342281b70b86 /src
parentcb90ca582a46ef9f0779837dc4c6fb00656e70c9 (diff)
downloadpies-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.am10
-rw-r--r--src/cmdline.opt4
-rw-r--r--src/comp.c3
-rw-r--r--src/ctl.c176
-rw-r--r--src/diag.c2
-rw-r--r--src/pies.c91
-rw-r--r--src/pies.h13
-rw-r--r--src/progman.c15
-rw-r--r--src/sysvinit.c64
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
35if PIES_COND_SYSVINIT
36pies_SOURCES += \
37 sysvinit.c\
38 sysdep.c\
39 utmp.c
40endif
41
38noinst_HEADERS = \ 42noinst_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;
119END 119END
120 120
121CPP(#if PIES_SYSVINIT_ENABLED)
121OPTION(telinit,T,, 122OPTION(telinit,T,,
122 [<telinit command: run "pies -T --help" for help>]) 123 [<telinit command: run "pies -T --help" for help>])
123BEGIN 124BEGIN
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)));
126END 127END
128CPP(#endif)
127 129
128GROUP(Preprocessor) 130GROUP(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;
diff --git a/src/comp.c b/src/comp.c
index 6eeeeed..7b2b373 100644
--- a/src/comp.c
+++ b/src/comp.c
@@ -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 }
diff --git a/src/ctl.c b/src/ctl.c
index d9a8998..5609f19 100644
--- a/src/ctl.c
+++ b/src/ctl.c
@@ -918,14 +918,17 @@ static void res_instance (struct ctlio *, enum http_method, char const *,
918 struct json_value *); 918 struct json_value *);
919static void res_programs (struct ctlio *, enum http_method, char const *, 919static void res_programs (struct ctlio *, enum http_method, char const *,
920 struct json_value *); 920 struct json_value *);
921static void res_conf (struct ctlio *, enum http_method, char const *,
922 struct json_value *);
923
924#if PIES_SYSVINIT_ENABLED
921static void res_runlevel (struct ctlio *, enum http_method, char const *, 925static void res_runlevel (struct ctlio *, enum http_method, char const *,
922 struct json_value *); 926 struct json_value *);
923static void res_environ (struct ctlio *, enum http_method, char const *, 927static void res_environ (struct ctlio *, enum http_method, char const *,
924 struct json_value *); 928 struct json_value *);
925static void res_conf (struct ctlio *, enum http_method, char const *,
926 struct json_value *);
927
928static int pred_sysvinit (void); 929static int pred_sysvinit (void);
930#endif
931
929 932
930struct ctlio_resource 933struct 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
2120static int 2126static int
2121pred_sysvinit (void) 2127pred_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 */
2185static void
2186env_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
2205static void
2206res_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":"..." }