diff options
Diffstat (limited to 'src/ctl.c')
-rw-r--r-- | src/ctl.c | 130 |
1 files changed, 78 insertions, 52 deletions
@@ -1492,6 +1492,7 @@ enum pcond_type pcond_component, pcond_type, pcond_mode, + pcond_active, pcond_status, pcond_not, pcond_and, @@ -1573,6 +1574,9 @@ pcond_eval (struct pcond_node *node, struct prog *p) case pcond_mode: return IS_COMPONENT (p) && p->v.p.comp->mode == node->v.mode; + + case pcond_active: + return p->active; case pcond_status: return IS_COMPONENT (p) && p->v.p.status == node->v.status; @@ -1709,11 +1713,10 @@ struct pcond_conv { }; static struct pcond_conv pcond_conv[] = { - [pcond_true] = { "true", NULL }, - [pcond_false] = { "false", NULL }, [pcond_component] = { "component", pcond_conv_component }, [pcond_type] = { "type", pcond_conv_type }, [pcond_mode] = { "mode", pcond_conv_mode }, + [pcond_active] = { "active", NULL }, [pcond_status] = { "status", pcond_conv_status }, [pcond_not] = { "not", pcond_conv_not }, [pcond_and] = { "and", pcond_conv_binary }, @@ -1728,7 +1731,7 @@ pcond_conv_find (char const *name) int i; for (i = 0; i < max_type; i++) { - if (strcmp (pcond_conv[i].term, name) == 0) + if (pcond_conv[i].term && strcmp (pcond_conv[i].term, name) == 0) return i; } return -1; @@ -1747,12 +1750,7 @@ object_to_cond (struct ctlio *io, struct json_value *obj, ctlio_reply (io, 400, "bad conditional: missing op"); return -1; } - if (json_object_get (obj, "arg", &arg)) - { - ctlio_reply (io, 400, "bad conditional: missing arg"); - return -1; - } - + if (op->type != json_string) { ctlio_reply (io, 400, "bad conditional: bad op type"); @@ -1766,6 +1764,12 @@ object_to_cond (struct ctlio *io, struct json_value *obj, return -1; } + if (json_object_get (obj, "arg", &arg) && pcond_conv[type].handler) + { + ctlio_reply (io, 400, "bad conditional: missing arg"); + return -1; + } + node = pcond_node_alloc (type); if (pcond_conv[type].handler && pcond_conv[type].handler (node, arg, io)) { @@ -1910,22 +1914,15 @@ fun_list (struct json_value *result, struct prog *prog) static int fun_stop (struct json_value *result, struct prog *prog) { - if (IS_COMPONENT (prog)) - { - if (!prog->active) - { - json_object_set_string (result, "status", "ER"); - json_object_set_string (result, "error_message", "already stopped"); - return 1; - } - - prog->active = 0; - progman_stop_component (&prog); - json_object_set_string (result, "status", "OK"); + if (!prog->active) + { + json_object_set_string (result, "status", "ER"); + json_object_set_string (result, "error_message", "already stopped"); } else { - //FIXME progman_stop_component (&prog); + prog->active = 0; + progman_stop_component (&prog); json_object_set_string (result, "status", "OK"); } return 0; @@ -1938,49 +1935,78 @@ fun_start (struct json_value *result, struct prog *prog) { json_object_set_string (result, "status", "ER"); json_object_set_string (result, "error_message", "not a component"); - return 1; } - switch (prog->v.p.status) + else { - case status_stopped: - prog->v.p.comp->flags &= ~CF_DISABLED; - json_object_set_string (result, "status", "OK"); - break; + switch (prog->v.p.status) + { + case status_stopped: + prog->v.p.comp->flags &= ~CF_DISABLED; + json_object_set_string (result, "status", "OK"); + break; - case status_sleeping: - case status_finished: - prog->v.p.status = status_stopped; - prog->v.p.failcount = 0; - prog->v.p.timestamp = 0; - json_object_set_string (result, "status", "OK"); - break; + case status_sleeping: + case status_finished: + prog->v.p.status = status_stopped; + prog->v.p.failcount = 0; + prog->v.p.timestamp = 0; + json_object_set_string (result, "status", "OK"); + break; - case status_listener: - if (prog_activate_listener (prog) == 0) - json_object_set_string (result, "status", "OK"); - else - { + case status_listener: + if (prog_activate_listener (prog) == 0) + json_object_set_string (result, "status", "OK"); + else + { + json_object_set_string (result, "status", "ER"); + /* FIXME: error message */ + json_object_set_string (result, "error_message", + "can't open socket"); + } + break; + + default: json_object_set_string (result, "status", "ER"); - /* FIXME: error message */ - json_object_set_string (result, "error_message", - "can't open socket"); + json_object_set_string (result, "error_message", "already running"); + return 0; } - break; - - default: - json_object_set_string (result, "status", "ER"); - json_object_set_string (result, "error_message", "already running"); - return 1; + prog->active = 1; } - prog->active = 1; return 0; } static int fun_restart (struct json_value *result, struct prog *prog) { - progman_stop_component (&prog); - json_object_set_string (result, "status", "OK"); + if (!IS_COMPONENT (prog)) + { + json_object_set_string (result, "status", "ER"); + json_object_set_string (result, "error_message", "not a component"); + } + else if (!prog->active) + { + json_object_set_string (result, "status", "ER"); + json_object_set_string (result, "error_message", "not active"); + } + else + { + switch (prog->v.p.status) + { + case status_running: + progman_stop_component (&prog); + json_object_set_string (result, "status", "OK"); + break; + + case status_listener: + json_object_set_string (result, "status", "ER"); + json_object_set_string (result, "error_message", "not applicable"); + break; + + default: + json_object_set_string (result, "status", "ER"); + json_object_set_string (result, "error_message", "not running"); + } + } return 0; } |