diff options
Diffstat (limited to 'src/ctl.c')
-rw-r--r-- | src/ctl.c | 176 |
1 files changed, 92 insertions, 84 deletions
@@ -915,20 +915,23 @@ method_decode (char const *method) } static void res_instance (struct ctlio *, enum http_method, char const *, struct json_value *); static void res_programs (struct ctlio *, enum http_method, char const *, struct json_value *); +static void res_conf (struct ctlio *, enum http_method, char const *, + struct json_value *); + +#if PIES_SYSVINIT_ENABLED static void res_runlevel (struct ctlio *, enum http_method, char const *, struct json_value *); static void res_environ (struct ctlio *, enum http_method, char const *, struct json_value *); -static void res_conf (struct ctlio *, enum http_method, char const *, - struct json_value *); - static int pred_sysvinit (void); +#endif + struct ctlio_resource { char const *uri; size_t uri_len; int states; @@ -940,14 +943,16 @@ struct ctlio_resource static struct ctlio_resource restab[] = { #define S(s) #s, (sizeof (#s)-1) { S(/instance), CTL_ADMIN_STATE, NULL, res_instance }, { S(/conf), CTL_ADMIN_STATE, NULL, res_conf }, { S(/programs), CTL_ADMIN_STATE|CTL_USER_STATE, NULL, res_programs }, +#if PIES_SYSVINIT_ENABLED { S(/runlevel), CTL_ADMIN_STATE, pred_sysvinit, res_runlevel }, { S(/environ), CTL_ADMIN_STATE, pred_sysvinit, res_environ }, +#endif { NULL } #undef S }; static struct ctlio_resource * find_resource (struct ctlio *io, const char *endpoint) @@ -2114,12 +2119,13 @@ res_programs (struct ctlio *io, enum http_method meth, if (uri) res_programs_component (io, meth, uri, json); else res_programs_select (io, meth, uri, json); } +#if PIES_SYSVINIT_ENABLED static int pred_sysvinit (void) { return init_process; } @@ -2161,12 +2167,95 @@ res_runlevel (struct ctlio *io, enum http_method meth, } } else ctlio_reply (io, 405, NULL); } +/* GET /environ - List entire environment + * ["RUNLEVEL=3", "CONSOLE=/dev/tty", ...] + * GET /environ/NAME - Get value of variable NAME + * { "status":"OK", "value":"..." } + * { "status":"ER", "error_message":"..." } + * DELETE /environ/NAME - Unset variable + * { "status":"OK" } + * { "status":"ER", "error_message":"..." } + * PUT /environ/NAME=VALUE - Set variable + * { "status":"OK" } + * { "status":"ER", "error_message":"..." } + */ +static void +env_reply (struct ctlio *io, int ok, int rc) +{ + switch (rc) + { + case 0: + io->code = ok; + io->output.reply = json_reply_create (); + json_object_set_string (io->output.reply, "status", "OK"); + break; + + case 1: + ctlio_reply (io, 403, NULL); + break; + + case -1: + ctlio_reply (io, 404, NULL); + } +} + +static void +res_environ (struct ctlio *io, enum http_method meth, + char const *uri, struct json_value *json) +{ + if (meth == METH_GET) + { + if (uri && uri[1]) + { + char *value; + + if (sysvinit_envlocate (uri + 1, &value) == -1) + ctlio_reply (io, 404, NULL); + else + { + env_reply (io, 200, 0); + json_object_set_string (io->output.reply, "value", "%s", value); + } + } + else + { + size_t i; + + io->output.reply = json_new_array (); + io->code = 200; + for (i = 0; sysvinit_environ_hint[i]; i++) + { + json_array_append (io->output.reply, + json_new_string (sysvinit_environ_hint[i])); + } + } + } + else if (meth == METH_DELETE) + { + if (!(uri && uri[0])) + ctlio_reply (io, 400, NULL); + else + env_reply (io, 200, sysvinit_envupdate (uri + 1)); + } + else if (meth == METH_PUT) + { + if (!(uri && uri[0])) + ctlio_reply (io, 400, NULL); + else + env_reply (io, 201, sysvinit_envupdate (uri + 1)); + } + else + ctlio_reply (io, 405, NULL); + +} +#endif + /* GET /conf/runtime - List configuration * PUT /conf/runtime - Reload configuration * POST /conf/runtime - Post new configuration * * GET /conf/files - List configuration files * DELETE /conf/files - Delete some or all configuration files @@ -2405,87 +2494,6 @@ res_conf (struct ctlio *io, enum http_method meth, } } else ctlio_reply (io, 404, NULL); } -/* GET /environ - List entire environment - * ["RUNLEVEL=3", "CONSOLE=/dev/tty", ...] - * GET /environ/NAME - Get value of variable NAME - * { "status":"OK", "value":"..." } - * { "status":"ER", "error_message":"..." } - * DELETE /environ/NAME - Unset variable - * { "status":"OK" } - * { "status":"ER", "error_message":"..." } - * PUT /environ/NAME=VALUE - Set variable - * { "status":"OK" } - * { "status":"ER", "error_message":"..." } - */ -static void -env_reply (struct ctlio *io, int ok, int rc) -{ - switch (rc) - { - case 0: - io->code = ok; - io->output.reply = json_reply_create (); - json_object_set_string (io->output.reply, "status", "OK"); - break; - - case 1: - ctlio_reply (io, 403, NULL); - break; - - case -1: - ctlio_reply (io, 404, NULL); - } -} - -static void -res_environ (struct ctlio *io, enum http_method meth, - char const *uri, struct json_value *json) -{ - if (meth == METH_GET) - { - if (uri && uri[1]) - { - char *value; - - if (sysvinit_envlocate (uri + 1, &value) == -1) - ctlio_reply (io, 404, NULL); - else - { - env_reply (io, 200, 0); - json_object_set_string (io->output.reply, "value", "%s", value); - } - } - else - { - size_t i; - - io->output.reply = json_new_array (); - io->code = 200; - for (i = 0; sysvinit_environ_hint[i]; i++) - { - json_array_append (io->output.reply, - json_new_string (sysvinit_environ_hint[i])); - } - } - } - else if (meth == METH_DELETE) - { - if (!(uri && uri[0])) - ctlio_reply (io, 400, NULL); - else - env_reply (io, 200, sysvinit_envupdate (uri + 1)); - } - else if (meth == METH_PUT) - { - if (!(uri && uri[0])) - ctlio_reply (io, 400, NULL); - else - env_reply (io, 201, sysvinit_envupdate (uri + 1)); - } - else - ctlio_reply (io, 405, NULL); - -} |