summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorPatrik Flykt <patrik.flykt@linux.intel.com>2013-04-24 13:24:16 +0300
committerPatrik Flykt <patrik.flykt@linux.intel.com>2013-05-03 17:10:10 +0300
commit26497cb23cf58a115ced964419b2d770411117d4 (patch)
treed0158d789acaccca9743b6dc6044391c764cbf13 /client
parentf8f4f7e80278d0e6d0711156a81581cc368f64f4 (diff)
downloadconnman-26497cb23cf58a115ced964419b2d770411117d4.tar.gz
connman-26497cb23cf58a115ced964419b2d770411117d4.tar.bz2
connman-26497cb23cf58a115ced964419b2d770411117d4.zip
client: Add command mode and agent mode helper functions
In command mode remember history and do command completion, in agent mode do neither. Enable saving and restoring of the readline prompt and add the GIOChannel watch also for non-interactive mode.
Diffstat (limited to 'client')
-rw-r--r--client/input.c53
-rw-r--r--client/input.h4
2 files changed, 38 insertions, 19 deletions
diff --git a/client/input.c b/client/input.c
index 6d9edf2d..2e9621f2 100644
--- a/client/input.c
+++ b/client/input.c
@@ -56,9 +56,6 @@ bool __connmanctl_is_interactive(void)
void __connmanctl_save_rl(void)
{
- if (interactive == false)
- return;
-
save_input = !RL_ISSTATE(RL_STATE_DONE);
if (save_input) {
@@ -72,9 +69,6 @@ void __connmanctl_save_rl(void)
void __connmanctl_redraw_rl(void)
{
- if (interactive == false)
- return;
-
if (save_input) {
rl_restore_prompt();
rl_replace_line(saved_line, 0);
@@ -134,6 +128,13 @@ static gboolean input_handler(GIOChannel *channel, GIOCondition condition,
return TRUE;
}
+static char **complete_agent(const char *text, int start, int end)
+{
+ rl_attempted_completion_over = 1;
+
+ return NULL;
+}
+
static char **complete_command(const char *text, int start, int end)
{
char **command = NULL;
@@ -147,6 +148,24 @@ static char **complete_command(const char *text, int start, int end)
return command;
}
+void __connmanctl_agent_mode(const char *prompt,
+ connmanctl_input_func_t input_handler)
+{
+ if (input_handler != NULL)
+ rl_callback_handler_install(prompt, input_handler);
+ else {
+ rl_set_prompt(prompt);
+ rl_callback_handler_remove();
+ }
+ rl_attempted_completion_function = complete_agent;
+}
+
+void __connmanctl_command_mode(void)
+{
+ rl_callback_handler_install("connmanctl> ", rl_handler);
+ rl_attempted_completion_function = complete_command;
+}
+
int __connmanctl_input_init(int argc, char *argv[])
{
char *help[] = {
@@ -156,6 +175,7 @@ int __connmanctl_input_init(int argc, char *argv[])
guint source = 0;
int err;
DBusError dbus_err;
+ GIOChannel *channel;
dbus_error_init(&dbus_err);
connection = g_dbus_setup_bus(DBUS_BUS_SYSTEM, NULL, &dbus_err);
@@ -166,19 +186,15 @@ int __connmanctl_input_init(int argc, char *argv[])
return 1;
}
- if (argc < 2) {
- GIOChannel *channel;
+ channel = g_io_channel_unix_new(fileno(stdin));
+ source = g_io_add_watch(channel, G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL,
+ input_handler, NULL);
+ g_io_channel_unref(channel);
+ if (argc < 2) {
interactive = true;
- channel = g_io_channel_unix_new(fileno(stdin));
- source = g_io_add_watch(channel,
- G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL,
- input_handler, NULL);
- g_io_channel_unref(channel);
-
- rl_callback_handler_install("connmanctl> ", rl_handler);
- rl_attempted_completion_function = complete_command;
+ __connmanctl_command_mode();
err = -EINPROGRESS;
} else {
@@ -196,12 +212,11 @@ int __connmanctl_input_init(int argc, char *argv[])
main_loop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(main_loop);
- if (source > 0)
- g_source_remove(source);
-
err = 0;
}
+ g_source_remove(source);
+
if (interactive == true) {
rl_callback_handler_remove();
rl_message("");
diff --git a/client/input.h b/client/input.h
index efab40f1..66943598 100644
--- a/client/input.h
+++ b/client/input.h
@@ -33,6 +33,10 @@ void __connmanctl_quit(void);
bool __connmanctl_is_interactive(void);
void __connmanctl_save_rl(void);
void __connmanctl_redraw_rl(void);
+typedef void connmanctl_input_func_t(char *input);
+void __connmanctl_agent_mode(const char *prompt,
+ connmanctl_input_func_t input_handler);
+void __connmanctl_command_mode(void);
int __connmanctl_input_init(int argc, char *argv[]);
#ifdef __cplusplus