aboutsummaryrefslogtreecommitdiff
path: root/src/piesctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/piesctl.c')
-rw-r--r--src/piesctl.c143
1 files changed, 136 insertions, 7 deletions
diff --git a/src/piesctl.c b/src/piesctl.c
index ad0981b..eecb6f6 100644
--- a/src/piesctl.c
+++ b/src/piesctl.c
@@ -890,7 +890,7 @@ shttp_fatal (struct shttp_connection *conn)
exit (status);
}
-
+
static void
echo_off (struct termios *stored_settings)
{
@@ -1037,7 +1037,7 @@ shttp_getval (struct shttp_connection *conn, char const *name,
break;
default:
- grecs_error (NULL, errno, _("can't get value of \"%s\""), name);
+ grecs_error (NULL, errno, _("can't get value of \"%s\""), name);
}
return p;
}
@@ -1768,7 +1768,9 @@ com_reboot (struct cmdline_parser_state *state)
/*
<telinit> ::= "telinit" <initcmd>
- <initcmd> ::= "runlevel" | "runlevel" <level>
+ <initcmd> ::= <runlevel> | <environ>
+ <runlevel> ::= "runlevel" | "runlevel" <level>
+ <environ> ::= "environ" "list" [<NAME>] | "environ" "set" <NAME>"="<VALUE>
*/
struct telinit_parser
{
@@ -1809,6 +1811,7 @@ telinit_parse_runlevel (struct telinit_parser *p)
{
char const *tok = next_token (p->state);
+ p->uri = "/runlevel";
if (!tok)
{
p->method = METH_GET;
@@ -1822,7 +1825,119 @@ telinit_parse_runlevel (struct telinit_parser *p)
p->format = NULL;
}
}
-
+
+static void
+telinit_format_environ (struct shttp_connection *conn)
+{
+ int err = 0;
+
+ switch (conn->result->type)
+ {
+ case json_arr:
+ {
+ size_t i, n;
+
+ n = json_array_size (conn->result);
+ for (i = 0; i < n; i++)
+ {
+ struct json_value *v;
+ json_array_get (conn->result, i, &v);
+ printf ("%s\n", v->v.s);
+ }
+ }
+ break;
+
+ case json_object:
+ {
+ struct json_value *val;
+
+ val = json_object_require_type (conn->result, "status", json_string);
+ if (strcmp (val->v.s, "OK") == 0)
+ {
+ if (json_object_get_type (conn->result, "value",
+ json_string, &val) == 0)
+ printf ("%s\n", val->v.s);
+ }
+ else if (strcmp (val->v.s, "ER") == 0)
+ {
+ if (json_object_get_type (conn->result, "error_message",
+ json_string, &val) == 0)
+ fputs (val->v.s, stderr);
+ else
+ {
+ grecs_error (NULL, 0, "%s", _("unknown error"));
+ err = 1;
+ }
+ }
+ else
+ {
+ grecs_error (NULL, 0, "%s", _("unrecognized response"));
+ err = 1;
+ }
+ }
+ break;
+
+ default:
+ grecs_error (NULL, 0, "unexpected response type");
+ err = 1;
+ }
+ if (err)
+ print_json (stderr, conn->result);
+}
+
+static void
+telinit_format_modenv (struct shttp_connection *conn)
+{
+ /* Nothing */
+}
+
+static void
+telinit_list_environ (struct telinit_parser *p)
+{
+ char const *tok = next_token (p->state);
+ assert_eol (p->state);
+ p->method = METH_GET;
+ p->format = telinit_format_environ;
+ if (tok)
+ {
+ size_t n = 0;
+ grecs_asprintf (&p->uri, &n, "/environ/%s", tok);
+ }
+ else
+ p->uri = "/environ";
+}
+
+static void
+telinit_mod_environ (struct telinit_parser *p, int set)
+{
+ char const *tok = next_token (p->state);
+ assert_eol (p->state);
+ p->method = set ? METH_PUT : METH_DELETE;
+ p->format = telinit_format_modenv;
+ if (tok)
+ {
+ size_t n = 0;
+ grecs_asprintf (&p->uri, &n, "/environ/%s", tok);
+ }
+ else
+ p->uri = "/environ";
+}
+
+static void
+telinit_parse_environ (struct telinit_parser *p)
+{
+ char const *tok = require_token (p->state);
+
+ if (strcmp (tok, "list") == 0)
+ telinit_list_environ (p);
+ else if (strcmp (tok, "set") == 0)
+ telinit_mod_environ (p, 1);
+ else if (strcmp (tok, "unset") == 0)
+ telinit_mod_environ (p, 0);
+ else
+ parse_error (_("expected \"list\" or \"set\", but found \"%s\""), tok);
+}
+
static void
telinit_parse (struct telinit_parser *parser)
{
@@ -1830,6 +1945,8 @@ telinit_parse (struct telinit_parser *parser)
if (strcmp (tok, "runlevel") == 0)
telinit_parse_runlevel (parser);
+ if (strcmp (tok, "environ") == 0)
+ telinit_parse_environ (parser);
else
parse_error (_("unrecognized subcommand: %s"), tok);
}
@@ -1843,12 +1960,14 @@ com_telinit (struct cmdline_parser_state *state)
parser.state = state;
parser.method = METH_INVALID;
parser.query = NULL;
+ parser.uri = NULL;
telinit_parse (&parser);
shttp_io_init (&conn->req);
switch (parser.method)
{
case METH_GET:
+ case METH_DELETE:
break;
case METH_PUT:
@@ -1875,8 +1994,8 @@ com_telinit (struct cmdline_parser_state *state)
json_value_free (parser.query);
- shttp_process (conn, parser.method, "/runlevel");
- if (conn->resp.code == 200 && !dump && parser.format)
+ shttp_process (conn, parser.method, parser.uri);
+ if (conn->resp.code / 100 == 2 && !dump && parser.format)
parser.format (conn);
}
@@ -2194,13 +2313,23 @@ static struct comtab comtab[] = {
/* TRANSLATORS: Translate only words in upper case */
{ NULL, N_("file add SYNTAX FILE"),
N_("add FILE of given SYNTAX to the list of configuration files"), NULL },
- { NULL, "file del[ete] NAME [NAME...]",
+ /* TRANSLATORS: Translate only words in upper case */
+ { NULL, N_("file del[ete] NAME [NAME...]"),
N_("remove listed names from the list of configuration files"), NULL },
{ NULL, "file list",
N_("list configuration files"), NULL },
{ "telinit", "runlevel [N]", N_("list or change the runlevel"),
com_telinit },
+ /* TRANSLATORS: Translate only words in upper case */
+ { NULL, N_("environ list [NAME]"),
+ N_("list init execution environment"), NULL },
+ /* TRANSLATORS: Translate only words in upper case */
+ { NULL, N_("environ set NAME=VALUE"),
+ N_("update execution environment"), NULL },
+ /* TRANSLATORS: Translate only words in upper case */
+ { NULL, N_("environ unset NAME"),
+ N_("update execution environment"), NULL },
{ NULL }
};

Return to:

Send suggestions and report system problems to the System administrator.