The cmn file compiles with the previously added services, technology, data
manager, monitor, and interactive files to creat the CLI called cmn. This is
the program a user would run to use connman from the command line. It is able
to view and configure service, tehnology, and system properties from connman.
---
client/cmn.c | 380 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 380 insertions(+)
create mode 100644 client/cmn.c
diff --git a/client/cmn.c b/client/cmn.c
new file mode 100644
index 0000000..ba1c9de
--- /dev/null
+++ b/client/cmn.c
@@ -0,0 +1,380 @@
+/*
+ *
+ * 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 <unistd.h>
+#include <getopt.h>
+#include <string.h>
+
+#include <glib.h>
+
+#include <dbus/dbus.h>
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus-glib-lowlevel.h>
+
+#include "client/data_manager.h"
+#include "client/services.h"
+#include "client/technology.h"
+#include "client/interactive.h"
+#include "client/monitor.h"
+
+#define MANDATORY_ARGS 4
+
+static char *ipv4[] = {
+ "Method",
+ "Address",
+ "Netmask",
+ "Gateway",
+ NULL
+};
+
+static char *ipv6[] = {
+ "Method",
+ "Address",
+ "PrefixLength",
+ "Gateway",
+ "Privacy",
+ NULL
+};
+
+static char *proxy_simple[] = {
+ "Method",
+ "URL",
+ NULL
+};
+
+static GMainLoop *main_loop;
+
+static void show_help(void)
+{
+ fprintf(stdout, "Usage: cmn <command> [args]\n"
+ " enable Enables given technology\n"
+ " <technology>\n"
+ " --offlinemode Enables OfflineMode\n"
+ " disable Disables given technology\n"
+ " <technology>\n"
+ " --offlinemode Disables OfflineMode\n"
+ " state Shows if the system is online or
offline\n"
+ " services Display list of all services\n"
+ " --properties <service name> Show properties of service\n"
+ " tech Current technology on the
system\n"
+ " scan Scans for new services\n"
+ " connect <service> Connect to a given service\n"
+ " disconnect <service> Disconnect from service\n"
+ " config <service> [arg] Set certain config options\n"
+ " --autoconnect=y/n Set autoconnect to service\n"
+ " --nameservers <names> Set manual name servers\n"
+ " --timeservers <names> Set manual time servers\n"
+ " --domains <domains> Set manual domains\n"
+ " --ipv4 Set ipv4 configuration\n"
+ " [METHOD|DHCP|AUTO|MANUAL] [IP] [NETMASK] [GATEWAY]\n"
+ " --ipv6 Set ipv6 configuration\n"
+ " [METHOD|AUTO|MANUAL|OFF] [IP] [PREFIXLENGTH] [GATEWAY]\n"
+ " [PRIVACY|DISABLED|ENABLED|PREFERED]\n"
+ " --proxy Set proxy configuration\n"
+ " [METHOD|URL]\n"
+ " if METHOD = manual, cmn will prompt you to enter the
Servers/Excludes\n"
+ " monitor Monitor signals from all Connman
interfaces\n"
+ " --services Monitor signals from the Service
interface\n"
+ " --tech Monitor signals from the
Technology interface\n"
+ " --manager Monitor signals from the Manager
interface\n"
+ " help, --help, (no arguments) Show this dialogue\n"
+ " interactive Drop into the interactive
shell\n");
+}
+
+static int monitor_connman(DBusConnection *connection, char *interface,
+ char *signal_name)
+{
+ char *rule = g_strdup_printf("type='signal',interface='net.connman.%s',"
+ "member='%s'", interface, signal_name);
+ DBusError err;
+
+ dbus_error_init(&err);
+ dbus_connection_setup_with_g_main(connection, NULL);
+ dbus_bus_add_match(connection, rule, &err);
+
+ if (dbus_error_is_set(&err)) {
+ fprintf(stderr, "Match Error: %s\n", err.message);
+ return -1;
+ }
+ return 0;
+}
+
+static void switch_args(int argc, char *argv[], int c, DBusConnection *conn,
+ struct service_data *service)
+{
+ const char *name;
+ DBusMessage *message;
+ int num_args = argc - MANDATORY_ARGS;
+
+ message = get_message(conn, "GetServices");
+
+ switch (c) {
+ case 'p':
+ if (strncmp(argv[1], "services", 8) == 0 && argc > 3) {
+ fprintf(stdout, "Properties for %s:\n", argv[3]);
+ name = find_service(conn, message, argv[3], service);
+ if (name == NULL)
+ break;
+ list_properties(conn, "GetServices", (char *) name);
+ }
+ break;
+ /* Config options */
+ case 'a':
+ if (strncmp(argv[1], "config", 6) == 0 && (*optarg == 'y' ||
+ *optarg == 'n')) {
+ dbus_bool_t val;
+ if (*optarg == 'y')
+ val = TRUE;
+ else if (*optarg == 'n')
+ val = FALSE;
+ set_service_property(conn, message, argv[2],
+ "AutoConnect", NULL,
+ &val, 0);
+ }
+ break;
+ case 'i':
+ if (strncmp(argv[1], "config", 6) == 0 && argc > 4)
+ set_service_property(conn, message, argv[2],
+ "IPv4.Configuration", ipv4,
+ argv + MANDATORY_ARGS, num_args);
+ break;
+ case 'v':
+ if (strncmp(argv[1], "config", 6) == 0 && argc > 4)
+ set_service_property(conn, message, argv[2],
+ "IPv6.Configuration", ipv6,
+ argv + MANDATORY_ARGS, num_args);
+ break;
+ case 'h':
+ show_help();
+ break;
+ case 'o':
+ if (strncmp(argv[1], "enable", 6) == 0) {
+ set_manager(conn, "OfflineMode", TRUE);
+ fprintf(stdout, "OfflineMode is now enabled\n");
+ } else if (strncmp(argv[1], "disable", 7) == 0) {
+ set_manager(conn, "OfflineMode", FALSE);
+ fprintf(stdout, "OfflineMode is now disabled\n");
+ }
+ break;
+ case 'n':
+ if (strncmp(argv[1], "config", 6) == 0 && argc > 4)
+ set_service_property(conn, message, argv[2],
+ "Nameservers.Configuration", NULL,
+ argv + MANDATORY_ARGS, num_args);
+ break;
+ case 't':
+ if (strncmp(argv[1], "config", 6) == 0 && argc > 4)
+ set_service_property(conn, message, argv[2],
+ "Timeservers.Configuration", NULL,
+ argv + MANDATORY_ARGS, num_args);
+ break;
+ case 'd':
+ if (strncmp(argv[1], "config", 6) == 0 && argc > 4)
+ set_service_property(conn, message, argv[2],
+ "Domains.Configuration", NULL,
+ argv + MANDATORY_ARGS, num_args);
+ break;
+ case 'x':
+ if (strncmp(argv[1], "config", 6) == 0 && argc > 4) {
+ if ((strncmp(argv[4], "direct", 6) == 0 && argc < 6) ||
+ (strncmp(argv[4], "auto", 4) == 0 && argc < 7))
+ set_service_property(conn, message, argv[2],
+ "Proxy.Configuration", proxy_simple,
+ argv + MANDATORY_ARGS, num_args);
+ else if (strncmp(argv[4], "manual", 6) == 0
+ && argc < 6) {
+ struct proxy_input input = read_proxy_input();
+ store_proxy_input(conn, message, argv[2],
+ input);
+ } else {
+ fprintf(stderr, "Incorrect arguments\n");
+ }
+ }
+ break;
+ case 's':
+ if (strncmp(argv[1], "monitor", 7) == 0 && argc < 4) {
+ monitor_connman(conn, "Service", "PropertyChanged");
+ dbus_connection_add_filter(conn, signal_filter, NULL,
+ NULL);
+ }
+ break;
+ case 'c':
+ if (strncmp(argv[1], "monitor", 7) == 0 && argc < 4) {
+ monitor_connman(conn, "Technology", "PropertyChanged");
+ dbus_connection_add_filter(conn, signal_filter, NULL,
+ NULL);
+ }
+ break;
+ case 'm':
+ if (strncmp(argv[1], "monitor", 7) == 0 && argc < 4) {
+ monitor_connman(conn, "Manager", "PropertyChanged");
+ monitor_connman(conn, "Manager", "TechnologyAdded");
+ monitor_connman(conn, "Manager", "TechnologyRemoved");
+ dbus_connection_add_filter(conn, signal_filter, NULL,
+ NULL);
+ }
+ break;
+ default:
+ fprintf(stderr, "Command not recognized, please check help\n");
+ exit(EXIT_FAILURE);
+ break;
+ }
+}
+
+static gboolean timeout_wait(gpointer data)
+{
+ static int i;
+ i++;
+ /* Set to whatever number of retries is wanted/needed */
+ if (i == 1) {
+ g_main_loop_quit(data);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+int main(int argc, char *argv[])
+{
+ int c;
+ int option_index = 0;
+ struct service_data service;
+ DBusConnection *connection;
+ DBusMessage *message;
+ DBusError err;
+ static struct option long_options[] = {
+ {"properties", required_argument, 0, 'p'},
+ {"autoconnect", required_argument, 0, 'a'},
+ {"ipv4", required_argument, 0, 'i'},
+ {"help", no_argument, 0, 'h'},
+ {"offlinemode", no_argument, 0, 'o'},
+ {"nameservers", required_argument, 0, 'n'},
+ {"timeservers", required_argument, 0, 't'},
+ {"domains", required_argument, 0, 'd'},
+ {"ipv6", required_argument, 0, 'v'},
+ {"proxy", required_argument, 0, 'x'},
+ {"services", no_argument, 0, 's'},
+ {"tech", no_argument, 0, 'c'},
+ {"manager", no_argument, 0, 'm'},
+ {0, 0, 0, 0}
+ };
+
+ g_type_init();
+ main_loop = g_main_loop_new(NULL, TRUE);
+
+ dbus_error_init(&err);
+ connection = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
+
+ if (dbus_error_is_set(&err)) {
+ fprintf(stderr, "Connection Error: %s\n", err.message);
+ dbus_error_free(&err);
+ }
+
+ if (connection == NULL) {
+ fprintf(stderr, "Could not connect to system bus...exiting\n");
+ exit(EXIT_FAILURE);
+ }
+
+ if (argc < 2 || strncmp(argv[1], "--help", 6) == 0 ||
+ strncmp(argv[1], "help", 4) == 0) {
+ show_help();
+ g_main_loop_unref(main_loop);
+ exit(EXIT_SUCCESS);
+ }
+ if (strncmp(argv[1], "interactive", 11) == 0)
+ show_interactive(connection);
+ if (strncmp(argv[1], "state", 5) == 0)
+ list_properties(connection, "GetProperties", NULL);
+
+ /* Display if no options are given */
+ if (strncmp(argv[1], "services", 8) == 0) {
+ if (argc < 3) {
+ fprintf(stdout, "List of all services:\n");
+ list_properties(connection, "GetServices", NULL);
+ } else if (argc == 3)
+ fprintf(stdout, "Current %s services:\n", argv[2]);
+ }
+
+ /* Show current tech on system */
+ if (strncmp(argv[1], "tech", 4) == 0 && argc < 3) {
+ fprintf(stdout, "* All currently connected technology:\n");
+ list_properties(connection, "GetTechnologies", NULL);
+ }
+
+ if (strncmp(argv[1], "connect", 7) == 0 && argc > 2) {
+ fprintf(stdout, "Connecting to: %s\n",
+ strip_service_path(argv[2]));
+ connect_service(connection, strip_service_path(argv[2]));
+ }
+
+ if (strncmp(argv[1], "disconnect", 10) == 0 && argc > 2) {
+ fprintf(stdout, "Disconnecting from: %s\n",
+ strip_service_path(argv[2]));
+ disconnect_service(connection, strip_service_path(argv[2]));
+ }
+
+ if (strncmp(argv[1], "scan", 4) == 0 && argc < 3)
+ scan_technology(connection);
+
+ if (strncmp(argv[1], "enable", 6) == 0 && argc == 3) {
+ message = get_message(connection, "GetTechnologies");
+ if (set_technology(connection, message, "Powered", argv[2],
+ TRUE) == 0)
+ fprintf(stdout, "Enabled %s technology\n", argv[2]);
+ dbus_message_unref(message);
+ }
+
+ if (strncmp(argv[1], "disable", 7) == 0 && argc == 3) {
+ message = get_message(connection, "GetTechnologies");
+ if (set_technology(connection, message, "Powered", argv[2],
+ FALSE) == 0)
+ fprintf(stdout, "Disabled %s technology\n", argv[2]);
+ dbus_message_unref(message);
+ }
+
+ if (strncmp(argv[1], "monitor", 7) == 0 && argc == 2) {
+ monitor_connman(connection, "Service", "PropertyChanged");
+ monitor_connman(connection, "Technology", "PropertyChanged");
+ monitor_connman(connection, "Manager", "PropertyChanged");
+ monitor_connman(connection, "Manager", "TechnologyAdded");
+ monitor_connman(connection, "Manager", "TechnologyRemoved");
+ dbus_connection_add_filter(connection, signal_filter, NULL,
+ NULL);
+ }
+
+ if (strncmp(argv[1], "monitor", 7) != 0)
+ g_timeout_add_full(G_PRIORITY_DEFAULT, 100, timeout_wait,
+ main_loop, NULL);
+
+ /* Get options */
+ while ((c = getopt_long(argc-1, &argv[1], "",
+ long_options, &option_index))) {
+ if (c == -1)
+ break;
+ switch_args(argc, argv, c, connection, &service);
+ }
+ g_main_loop_run(main_loop);
+ g_main_loop_unref(main_loop);
+ return 0;
+}
+
--
1.7.9.5
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman