Hi,
On Fri, 2012-09-07 at 17:26 -0700, Tudor Marcu wrote:
> When the client is started with the interactive option, it should drop into an
> interactive shell mode. These files handle all the interactive commands
> using readline, and provide quick functionality that is similar to plain
> synchronous command. Invalid input will be ignored, and the input is tokenized
> to allow for various input errors.
> ---
> client/interactive.c | 143
> ++++++++++++++++++++++++++++++++++++++++++++++++++
> client/interactive.h | 41 +++++++++++++++
> 2 files changed, 184 insertions(+)
> create mode 100644 client/interactive.c
> create mode 100644 client/interactive.h
>
> diff --git a/client/interactive.c b/client/interactive.c
> new file mode 100644
> index 0000000..e7f7754
> --- /dev/null
> +++ b/client/interactive.c
> @@ -0,0 +1,143 @@
> +/*
> + *
> + * Connection Manager
> + *
> + * Copyright (C) 2012 Intel Corporation. All rights reserved.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
> USA
> + *
> + */
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <errno.h>
> +#include <readline/readline.h>
> +#include <readline/history.h>
> +#include <getopt.h>
> +#include <unistd.h>
> +#include <sys/time.h>
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <fcntl.h>
> +
> +#include <glib.h>
> +#include <gdbus.h>
> +
> +#include "client/services.h"
> +#include "client/technology.h"
> +#include "client/data_manager.h"
> +#include "client/monitor.h"
> +#include "client/interactive.h"
> +
> +static DBusConnection *interactive_conn;
> +
> +static char **parse_long(char *input, int *num_args)
> +{
> + int i;
> + char **token = malloc(0);
token = NULL is the intention here, I guess.
> +
> + for (i = 0; input != NULL; i++) {
> + token = realloc(token, (i + 1) * sizeof(char *));
> + if (token == NULL)
> + return NULL;
> + token[i] = strdup(input);
> + input = strtok(NULL, " ");
> + }
> + *num_args = i;
> +
> + return token;
> +}
> +
> +static gboolean rl_handler(char *input)
> +{
> + char **long_args;
> + int num_args, i, error;
> + num_args = 0;
> +
> + if (input == NULL) {
> + rl_newline(1, '\n');
> + exit(EXIT_FAILURE);
> + }
> +
> + add_history(input);
> + input = strtok(input, " ");
> +
> + if (input == NULL)
> + return FALSE;
> + long_args = parse_long(input, &num_args);
> +
> + if (long_args == NULL) {
> + free(input);
> + exit(EXIT_FAILURE);
> + }
> +
> + error = commands_no_options(interactive_conn, long_args, num_args);
> + if (error != -1) {
> + if (error != 0)
> + return error;
> + } else if (commands_options(interactive_conn,
> + long_args, num_args) != -1) {
> + return error;
> + } else if ((strcmp(long_args[0], "quit") == 0) || (strcmp(long_args[0],
> + "exit") == 0) || (strcmp(long_args[0],
> + "q") == 0)) {
Nitpick: it probably looks nicer to cut the line after || here.
> + for (i = 0; i < num_args; i++)
> + free(long_args[i]);
> + free(long_args);
> + free(input);
> + exit(EXIT_SUCCESS);
One step less indentation here, please. Now it looks as the three last
lines are done inside the for loop.
> + } else {
> + fprintf(stderr, "%s is not a valid command, check help.\n",
> + long_args[0]);
> + }
> +
> + for (i = 0; i < num_args; i++)
> + free(long_args[i]);
> + free(long_args);
> + free(input);
> + optind = 0;
> +
> + return TRUE;
> +}
> +
> +static gboolean readmonitor(GIOChannel *channel, GIOCondition condition,
> + gpointer user_data){
> + if (condition & (G_IO_HUP | G_IO_ERR | G_IO_NVAL)) {
> + g_io_channel_unref(channel);
> + return FALSE;
> + }
> + rl_callback_read_char();
> + return TRUE;
> +}
> +
> +void show_interactive(DBusConnection *connection, GMainLoop *mainloop)
> +{
> + GIOChannel *gchan;
> + int events;
> + gchan = g_io_channel_unix_new(fileno(stdin));
> + events = G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL;
> + show_help();
> + interactive_conn = connection;
> +
> + while (TRUE) {
> + g_io_add_watch(gchan, events, readmonitor, NULL);
> + rl_callback_handler_install("connmanctl> ", (void *)rl_handler);
> + g_main_loop_run(mainloop);
> +
> + rl_callback_handler_remove();
> + g_io_channel_unref(gchan);
> + }
> +}
> +
Extra empty line end of file, please remove.
> diff --git a/client/interactive.h b/client/interactive.h
> new file mode 100644
> index 0000000..56cece4
> --- /dev/null
> +++ b/client/interactive.h
> @@ -0,0 +1,41 @@
> +/*
> + *
> + * Connection Manager
> + *
> + * Copyright (C) 2012 Intel Corporation. All rights reserved.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
> USA
> + *
> + */
> +
> +#ifndef __CLIENT_INTERACTIVE_H
> +#define __CLIENT_INTERACTIVE_H
> +
> +#include <dbus/dbus.h>
> +
> +void show_interactive(DBusConnection *connection, GMainLoop *mainloop);
> +int commands_no_options(DBusConnection *connection, char *argv[], int argc);
> +void show_help(void);
> +int monitor_switch(int argc, char *argv[], int c, DBusConnection *conn);
> +int config_switch(int argc, char *argv[], int c, DBusConnection *conn);
> +int service_switch(int argc, char *argv[], int c, DBusConnection *conn,
> +
> struct service_data *service);
> +int monitor_connman(DBusConnection *connection, char *interface,
> + char *signal_name);
> +int store_proxy_input(DBusConnection *connection, DBusMessage *message,
> + char *name, int num_args, char *argv[]);
These two are redefinitions of the ones in monitor.h and manager.h and
cause compilation to fail. Please remove them from this file.
> +int commands_options(DBusConnection *connection, char *argv[], int argc);
> +
> +#endif
> +
And remove the extra empty line end of file here also.
Cheers,
Patrik
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman