5 * Copyright (C) 2012-2013 Intel Corporation. All rights reserved.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
36 #include "dbus_helpers.h"
41 #include "vpnconnections.h"
43 static DBusConnection *connection;
45 struct connman_option {
51 static char *ipv4[] = {
59 static char *ipv6[] = {
67 static int cmd_help(char *args[], int num, struct connman_option *options);
69 static bool check_dbus_name(const char *name)
72 * Valid dbus chars should be [A-Z][a-z][0-9]_
73 * and should not start with number.
77 if (name == NULL || name[0] == '\0')
80 for (i = 0; name[i] != '\0'; i++)
81 if (!((name[i] >= 'A' && name[i] <= 'Z') ||
82 (name[i] >= 'a' && name[i] <= 'z') ||
83 (name[i] >= '0' && name[i] <= '9') ||
90 static int parse_boolean(char *arg)
95 if (strcasecmp(arg, "no") == 0 ||
96 strcasecmp(arg, "false") == 0 ||
97 strcasecmp(arg, "off" ) == 0 ||
98 strcasecmp(arg, "disable" ) == 0 ||
99 strcasecmp(arg, "n") == 0 ||
100 strcasecmp(arg, "f") == 0 ||
101 strcasecmp(arg, "0") == 0)
104 if (strcasecmp(arg, "yes") == 0 ||
105 strcasecmp(arg, "true") == 0 ||
106 strcasecmp(arg, "on") == 0 ||
107 strcasecmp(arg, "enable" ) == 0 ||
108 strcasecmp(arg, "y") == 0 ||
109 strcasecmp(arg, "t") == 0 ||
110 strcasecmp(arg, "1") == 0)
116 static int parse_args(char *arg, struct connman_option *options)
123 for (i = 0; options[i].name != NULL; i++) {
124 if (strcmp(options[i].name, arg) == 0 ||
125 (strncmp(arg, "--", 2) == 0 &&
126 strcmp(&arg[2], options[i].name) == 0))
127 return options[i].val;
133 static int enable_return(DBusMessageIter *iter, const char *error,
136 char *tech = user_data;
139 str = strrchr(tech, '/');
146 fprintf(stdout, "Enabled %s\n", str);
148 fprintf(stderr, "Error %s: %s\n", str, error);
155 static int cmd_enable(char *args[], int num, struct connman_option *options)
158 dbus_bool_t b = TRUE;
166 if (check_dbus_name(args[1]) == false)
169 if (strcmp(args[1], "offlinemode") == 0) {
170 tech = g_strdup(args[1]);
171 return __connmanctl_dbus_set_property(connection, "/",
172 "net.connman.Manager", enable_return, tech,
173 "OfflineMode", DBUS_TYPE_BOOLEAN, &b);
176 tech = g_strdup_printf("/net/connman/technology/%s", args[1]);
177 return __connmanctl_dbus_set_property(connection, tech,
178 "net.connman.Technology", enable_return, tech,
179 "Powered", DBUS_TYPE_BOOLEAN, &b);
182 static int disable_return(DBusMessageIter *iter, const char *error,
185 char *tech = user_data;
188 str = strrchr(tech, '/');
195 fprintf(stdout, "Disabled %s\n", str);
197 fprintf(stderr, "Error %s: %s\n", str, error);
204 static int cmd_disable(char *args[], int num, struct connman_option *options)
207 dbus_bool_t b = FALSE;
215 if (check_dbus_name(args[1]) == false)
218 if (strcmp(args[1], "offlinemode") == 0) {
219 tech = g_strdup(args[1]);
220 return __connmanctl_dbus_set_property(connection, "/",
221 "net.connman.Manager", disable_return, tech,
222 "OfflineMode", DBUS_TYPE_BOOLEAN, &b);
225 tech = g_strdup_printf("/net/connman/technology/%s", args[1]);
226 return __connmanctl_dbus_set_property(connection, tech,
227 "net.connman.Technology", disable_return, tech,
228 "Powered", DBUS_TYPE_BOOLEAN, &b);
231 static int state_print(DBusMessageIter *iter, const char *error,
234 DBusMessageIter entry;
237 fprintf(stderr, "Error: %s", error);
241 dbus_message_iter_recurse(iter, &entry);
242 __connmanctl_dbus_print(&entry, " ", " = ", "\n");
243 fprintf(stdout, "\n");
248 static int cmd_state(char *args[], int num, struct connman_option *options)
253 return __connmanctl_dbus_method_call(connection, CONNMAN_SERVICE,
254 CONNMAN_PATH, "net.connman.Manager", "GetProperties",
255 state_print, NULL, DBUS_TYPE_INVALID);
258 static int services_list(DBusMessageIter *iter, const char *error,
262 __connmanctl_services_list(iter);
263 fprintf(stdout, "\n");
265 fprintf(stderr, "Error: %s\n", error);
271 static int services_properties(DBusMessageIter *iter, const char *error,
274 char *path = user_data;
276 DBusMessageIter dict;
279 fprintf(stdout, "%s\n", path);
281 dbus_message_iter_recurse(iter, &dict);
282 __connmanctl_dbus_print(&dict, " ", " = ", "\n");
284 fprintf(stdout, "\n");
287 str = strrchr(path, '/');
293 fprintf(stderr, "Error %s: %s\n", str, error);
301 static int cmd_services(char *args[], int num, struct connman_option *options)
303 char *service_name = NULL;
310 c = parse_args(args[1], options);
317 service_name = args[2];
322 service_name = args[1];
326 if (service_name == NULL) {
327 return __connmanctl_dbus_method_call(connection,
328 CONNMAN_SERVICE, CONNMAN_PATH,
329 "net.connman.Manager", "GetServices",
330 services_list, NULL, DBUS_TYPE_INVALID);
333 if (check_dbus_name(service_name) == false)
336 path = g_strdup_printf("/net/connman/service/%s", service_name);
337 return __connmanctl_dbus_method_call(connection, CONNMAN_SERVICE, path,
338 "net.connman.Service", "GetProperties",
339 services_properties, path, DBUS_TYPE_INVALID);
342 static int technology_print(DBusMessageIter *iter, const char *error,
345 DBusMessageIter array;
348 fprintf(stderr, "Error: %s\n", error);
352 dbus_message_iter_recurse(iter, &array);
353 while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_STRUCT) {
354 DBusMessageIter entry, dict;
357 dbus_message_iter_recurse(&array, &entry);
358 dbus_message_iter_get_basic(&entry, &path);
359 fprintf(stdout, "%s\n", path);
361 dbus_message_iter_next(&entry);
363 dbus_message_iter_recurse(&entry, &dict);
364 __connmanctl_dbus_print(&dict, " ", " = ", "\n");
365 fprintf(stdout, "\n");
367 dbus_message_iter_next(&array);
373 static int cmd_technologies(char *args[], int num,
374 struct connman_option *options)
379 return __connmanctl_dbus_method_call(connection, CONNMAN_SERVICE,
380 CONNMAN_PATH, "net.connman.Manager", "GetTechnologies",
381 technology_print, NULL, DBUS_TYPE_INVALID);
384 struct tether_enable {
389 static int tether_set_return(DBusMessageIter *iter, const char *error,
392 struct tether_enable *tether = user_data;
395 str = strrchr(tether->path, '/');
402 fprintf(stdout, "%s tethering for %s\n",
403 tether->enable == TRUE ? "Enabled": "Disabled",
406 fprintf(stderr, "Error %s %s tethering: %s\n",
407 tether->enable == TRUE ?
408 "enabling": "disabling", str, error);
410 g_free(tether->path);
416 static int tether_set(char *technology, int set_tethering)
418 struct tether_enable *tether = g_new(struct tether_enable, 1);
420 switch(set_tethering) {
422 tether->enable = TRUE;
425 tether->enable = FALSE;
432 tether->path = g_strdup_printf("/net/connman/technology/%s",
435 return __connmanctl_dbus_set_property(connection, tether->path,
436 "net.connman.Technology", tether_set_return,
437 tether, "Tethering", DBUS_TYPE_BOOLEAN,
441 struct tether_properties {
443 int passphrase_result;
447 static int tether_update(struct tether_properties *tether)
449 printf("%d %d %d\n", tether->ssid_result, tether->passphrase_result,
450 tether->set_tethering);
452 if (tether->ssid_result == 0 && tether->passphrase_result == 0)
453 return tether_set("wifi", tether->set_tethering);
455 if (tether->ssid_result != -EINPROGRESS &&
456 tether->passphrase_result != -EINPROGRESS) {
464 static int tether_set_ssid_return(DBusMessageIter *iter, const char *error,
467 struct tether_properties *tether = user_data;
470 fprintf(stdout, "Wifi SSID set\n");
471 tether->ssid_result = 0;
473 fprintf(stderr, "Error setting wifi SSID: %s\n", error);
474 tether->ssid_result = -EINVAL;
477 return tether_update(tether);
480 static int tether_set_passphrase_return(DBusMessageIter *iter,
481 const char *error, void *user_data)
483 struct tether_properties *tether = user_data;
486 fprintf(stdout, "Wifi passphrase set\n");
487 tether->passphrase_result = 0;
489 fprintf(stderr, "Error setting wifi passphrase: %s\n", error);
490 tether->passphrase_result = -EINVAL;
493 return tether_update(tether);
496 static int tether_set_ssid(char *ssid, char *passphrase, int set_tethering)
498 struct tether_properties *tether = g_new(struct tether_properties, 1);
500 tether->set_tethering = set_tethering;
502 tether->ssid_result = __connmanctl_dbus_set_property(connection,
503 "/net/connman/technology/wifi",
504 "net.connman.Technology",
505 tether_set_ssid_return, tether,
506 "TetheringIdentifier", DBUS_TYPE_STRING, &ssid);
508 tether->passphrase_result =__connmanctl_dbus_set_property(connection,
509 "/net/connman/technology/wifi",
510 "net.connman.Technology",
511 tether_set_passphrase_return, tether,
512 "TetheringPassphrase", DBUS_TYPE_STRING, &passphrase);
514 if (tether->ssid_result != -EINPROGRESS &&
515 tether->passphrase_result != -EINPROGRESS) {
523 static int cmd_tether(char *args[], int num, struct connman_option *options)
525 char *ssid, *passphrase;
531 passphrase = args[num - 1];
532 ssid = args[num - 2];
534 set_tethering = parse_boolean(args[2]);
536 if (strcmp(args[1], "wifi") == 0) {
541 if (num == 5 && set_tethering == -1)
548 return tether_set_ssid(ssid, passphrase, set_tethering);
554 if (set_tethering == -1)
557 if (check_dbus_name(args[1]) == false)
560 return tether_set(args[1], set_tethering);
563 static int scan_return(DBusMessageIter *iter, const char *error,
566 char *path = user_data;
569 char *str = strrchr(path, '/');
571 fprintf(stdout, "Scan completed for %s\n", str);
573 fprintf(stderr, "Error %s: %s\n", path, error);
580 static int cmd_scan(char *args[], int num, struct connman_option *options)
590 if (check_dbus_name(args[1]) == false)
593 path = g_strdup_printf("/net/connman/technology/%s", args[1]);
594 return __connmanctl_dbus_method_call(connection, CONNMAN_SERVICE, path,
595 "net.connman.Technology", "Scan",
596 scan_return, path, DBUS_TYPE_INVALID);
599 static int connect_return(DBusMessageIter *iter, const char *error,
602 char *path = user_data;
605 char *str = strrchr(path, '/');
607 fprintf(stdout, "Connected %s\n", str);
609 fprintf(stderr, "Error %s: %s\n", path, error);
616 static int cmd_connect(char *args[], int num, struct connman_option *options)
626 if (check_dbus_name(args[1]) == false)
629 path = g_strdup_printf("/net/connman/service/%s", args[1]);
630 return __connmanctl_dbus_method_call(connection, CONNMAN_SERVICE, path,
631 "net.connman.Service", "Connect",
632 connect_return, path, DBUS_TYPE_INVALID);
635 static int disconnect_return(DBusMessageIter *iter, const char *error,
638 char *path = user_data;
641 char *str = strrchr(path, '/');
643 fprintf(stdout, "Disconnected %s\n", str);
645 fprintf(stderr, "Error %s: %s\n", path, error);
652 static int cmd_disconnect(char *args[], int num, struct connman_option *options)
662 if (check_dbus_name(args[1]) == false)
665 path = g_strdup_printf("/net/connman/service/%s", args[1]);
666 return __connmanctl_dbus_method_call(connection, CONNMAN_SERVICE, path,
667 "net.connman.Service", "Disconnect",
668 disconnect_return, path, DBUS_TYPE_INVALID);
671 static int config_return(DBusMessageIter *iter, const char *error,
674 char *service_name = user_data;
677 fprintf(stderr, "Error %s: %s\n", service_name, error);
684 struct config_append {
689 static void config_append_ipv4(DBusMessageIter *iter,
692 struct config_append *append = user_data;
693 char **opts = append->opts;
699 while (opts[i] != NULL && ipv4[i] != NULL) {
700 __connmanctl_dbus_append_dict_entry(iter, ipv4[i],
701 DBUS_TYPE_STRING, &opts[i]);
708 static void config_append_ipv6(DBusMessageIter *iter, void *user_data)
710 struct config_append *append = user_data;
711 char **opts = append->opts;
718 if (g_strcmp0(opts[0], "auto") == 0) {
721 switch (parse_boolean(opts[1])) {
726 __connmanctl_dbus_append_dict_entry(iter, "Privacy",
727 DBUS_TYPE_STRING, &str);
734 __connmanctl_dbus_append_dict_entry(iter, "Privacy",
735 DBUS_TYPE_STRING, &str);
739 if (opts[1] != NULL) {
742 if (g_strcmp0(opts[1], "prefered") != 0 &&
745 fprintf(stderr, "Error %s: %s\n",
752 __connmanctl_dbus_append_dict_entry(iter,
753 "Privacy", DBUS_TYPE_STRING,
758 } else if (g_strcmp0(opts[0], "manual") == 0) {
761 while (opts[i] != NULL && ipv6[i] != NULL) {
763 int value = atoi(opts[i]);
764 __connmanctl_dbus_append_dict_entry(iter,
765 ipv6[i], DBUS_TYPE_BYTE,
768 __connmanctl_dbus_append_dict_entry(iter,
769 ipv6[i], DBUS_TYPE_STRING,
777 } else if (g_strcmp0(opts[0], "off") != 0) {
778 fprintf(stderr, "Error %s: %s\n", opts[0], strerror(-EINVAL));
783 __connmanctl_dbus_append_dict_entry(iter, "Method", DBUS_TYPE_STRING,
787 static void config_append_str(DBusMessageIter *iter, void *user_data)
789 struct config_append *append = user_data;
790 char **opts = append->opts;
796 while (opts[i] != NULL) {
797 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
805 static void append_servers(DBusMessageIter *iter, void *user_data)
807 struct config_append *append = user_data;
808 char **opts = append->opts;
814 while (opts[i] != NULL && g_strcmp0(opts[i], "--excludes") != 0) {
815 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
823 static void append_excludes(DBusMessageIter *iter, void *user_data)
825 struct config_append *append = user_data;
826 char **opts = append->opts;
827 int i = append->values;
829 if (opts == NULL || opts[i] == NULL ||
830 g_strcmp0(opts[i], "--excludes") != 0)
834 while (opts[i] != NULL) {
835 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING,
843 static void config_append_proxy(DBusMessageIter *iter, void *user_data)
845 struct config_append *append = user_data;
846 char **opts = append->opts;
851 if (g_strcmp0(opts[0], "manual") == 0) {
852 __connmanctl_dbus_append_dict_string_array(iter, "Servers",
853 append_servers, append);
855 __connmanctl_dbus_append_dict_string_array(iter, "Excludes",
856 append_excludes, append);
858 } else if (g_strcmp0(opts[0], "auto") == 0) {
859 if (opts[1] != NULL) {
860 __connmanctl_dbus_append_dict_entry(iter, "URL",
861 DBUS_TYPE_STRING, &opts[1]);
865 } else if (g_strcmp0(opts[0], "direct") != 0)
868 __connmanctl_dbus_append_dict_entry(iter, "Method",DBUS_TYPE_STRING,
874 static int cmd_config(char *args[], int num, struct connman_option *options)
876 int result = 0, res = 0, index = 2, oldindex = 0;
878 char *service_name, *path;
881 struct config_append append;
883 service_name = args[1];
884 if (service_name == NULL)
887 if (check_dbus_name(service_name) == false)
890 while (index < num && args[index] != NULL) {
891 c = parse_args(args[index], options);
892 opt_start = &args[index + 1];
893 append.opts = opt_start;
899 path = g_strdup_printf("/net/connman/service/%s", service_name);
903 switch (parse_boolean(*opt_start)) {
918 res = __connmanctl_dbus_set_property(connection,
919 path, "net.connman.Service",
921 g_strdup(service_name),
923 DBUS_TYPE_BOOLEAN, &val);
927 res = __connmanctl_dbus_set_property_dict(connection,
928 path, "net.connman.Service",
929 config_return, g_strdup(service_name),
930 "IPv4.Configuration", DBUS_TYPE_STRING,
931 config_append_ipv4, &append);
932 index += append.values;
936 res = __connmanctl_dbus_set_property_dict(connection,
937 path, "net.connman.Service",
938 config_return, g_strdup(service_name),
939 "IPv6.Configuration", DBUS_TYPE_STRING,
940 config_append_ipv6, &append);
941 index += append.values;
945 res = __connmanctl_dbus_set_property_array(connection,
946 path, "net.connman.Service",
947 config_return, g_strdup(service_name),
948 "Nameservers.Configuration",
949 DBUS_TYPE_STRING, config_append_str,
951 index += append.values;
955 res = __connmanctl_dbus_set_property_array(connection,
956 path, "net.connman.Service",
957 config_return, g_strdup(service_name),
958 "Timeservers.Configuration",
959 DBUS_TYPE_STRING, config_append_str,
961 index += append.values;
965 res = __connmanctl_dbus_set_property_array(connection,
966 path, "net.connman.Service",
967 config_return, g_strdup(service_name),
968 "Domains.Configuration",
969 DBUS_TYPE_STRING, config_append_str,
971 index += append.values;
975 res = __connmanctl_dbus_set_property_dict(connection,
976 path, "net.connman.Service",
977 config_return, g_strdup(service_name),
978 "Proxy.Configuration",
979 DBUS_TYPE_STRING, config_append_proxy,
981 index += append.values;
984 res = __connmanctl_dbus_method_call(connection,
985 CONNMAN_SERVICE, path,
986 "net.connman.Service", "Remove",
987 config_return, g_strdup(service_name),
998 if (res == -EINPROGRESS)
999 result = -EINPROGRESS;
1001 printf("Error '%s': %s\n", args[oldindex],
1012 static DBusHandlerResult monitor_changed(DBusConnection *connection,
1013 DBusMessage *message, void *user_data)
1015 DBusMessageIter iter;
1016 const char *interface, *path;
1018 interface = dbus_message_get_interface(message);
1019 if (strncmp(interface, "net.connman.", 12) != 0)
1020 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1022 if (strncmp(interface, "net.connman.Agent", 17) == 0 ||
1023 strncmp(interface, "net.connman.vpn.Agent", 21) == 0)
1024 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1026 interface = strrchr(interface, '.');
1027 if (interface != NULL && *interface != '\0')
1030 path = strrchr(dbus_message_get_path(message), '/');
1031 if (path != NULL && *path != '\0')
1034 __connmanctl_save_rl();
1036 if (dbus_message_is_signal(message, "net.connman.Manager",
1037 "ServicesChanged") == TRUE) {
1039 fprintf(stdout, "%-12s %-20s = {\n", interface,
1041 dbus_message_iter_init(message, &iter);
1042 __connmanctl_services_list(&iter);
1043 fprintf(stdout, "\n}\n");
1045 __connmanctl_redraw_rl();
1047 return DBUS_HANDLER_RESULT_HANDLED;
1051 if (dbus_message_is_signal(message, "net.connman.vpn.Manager",
1052 "ConnectionAdded") == TRUE ||
1053 dbus_message_is_signal(message,
1054 "net.connman.vpn.Manager",
1055 "ConnectionRemoved") == TRUE) {
1056 interface = "vpn.Manager";
1057 path = dbus_message_get_member(message);
1059 } else if (dbus_message_is_signal(message, "net.connman.Manager",
1060 "TechnologyAdded") == TRUE ||
1061 dbus_message_is_signal(message, "net.connman.Manager",
1062 "TechnologyRemoved") == TRUE)
1063 path = dbus_message_get_member(message);
1065 fprintf(stdout, "%-12s %-20s ", interface, path);
1066 dbus_message_iter_init(message, &iter);
1068 __connmanctl_dbus_print(&iter, "", " = ", " = ");
1069 fprintf(stdout, "\n");
1071 __connmanctl_redraw_rl();
1073 return DBUS_HANDLER_RESULT_HANDLED;
1080 { "Service", false },
1081 { "Technology", false },
1082 { "Manager", false },
1083 { "vpn.Manager", false },
1084 { "vpn.Connection", false },
1088 static void monitor_add(char *interface)
1090 bool add_filter = true, found = false;
1095 for (i = 0; monitor[i].interface != NULL; i++) {
1096 if (monitor[i].enabled == true)
1099 if (g_strcmp0(interface, monitor[i].interface) == 0) {
1100 if (monitor[i].enabled == true)
1103 monitor[i].enabled = true;
1111 if (add_filter == true)
1112 dbus_connection_add_filter(connection, monitor_changed,
1115 dbus_error_init(&err);
1116 rule = g_strdup_printf("type='signal',interface='net.connman.%s'",
1118 dbus_bus_add_match(connection, rule, &err);
1121 if (dbus_error_is_set(&err))
1122 fprintf(stderr, "Error: %s\n", err.message);
1125 static void monitor_del(char *interface)
1127 bool del_filter = true, found = false;
1132 for (i = 0; monitor[i].interface != NULL; i++) {
1133 if (g_strcmp0(interface, monitor[i].interface) == 0) {
1134 if (monitor[i].enabled == false)
1137 monitor[i].enabled = false;
1141 if (monitor[i].enabled == true)
1148 rule = g_strdup_printf("type='signal',interface='net.connman.%s'",
1150 dbus_bus_remove_match(connection, rule, NULL);
1153 if (del_filter == true)
1154 dbus_connection_remove_filter(connection, monitor_changed,
1158 static int cmd_monitor(char *args[], int num, struct connman_option *options)
1167 switch (parse_boolean(args[2])) {
1177 c = parse_args(args[1], options);
1180 monitor_add("Service");
1181 monitor_add("Technology");
1182 monitor_add("Manager");
1183 monitor_add("vpn.Manager");
1184 monitor_add("vpn.Connection");
1189 monitor_add("Service");
1191 monitor_del("Service");
1196 monitor_add("Technology");
1198 monitor_del("Technology");
1203 monitor_add("Manager");
1205 monitor_del("Manager");
1210 monitor_add("vpn.Manager");
1212 monitor_del("vpn.Manager");
1217 monitor_add("vpn.Connection");
1219 monitor_del("vpn.Connection");
1223 switch(parse_boolean(args[1])) {
1225 monitor_del("Service");
1226 monitor_del("Technology");
1227 monitor_del("Manager");
1228 monitor_del("vpn.Manager");
1229 monitor_del("vpn.Connection");
1233 monitor_add("Service");
1234 monitor_add("Technology");
1235 monitor_add("Manager");
1236 monitor_add("vpn.Manager");
1237 monitor_add("vpn.Connection");
1246 return -EINPROGRESS;
1251 static int cmd_agent(char *args[], int num, struct connman_option *options)
1259 switch(parse_boolean(args[1])) {
1261 __connmanctl_agent_unregister(connection);
1265 if (__connmanctl_agent_register(connection) == -EINPROGRESS)
1266 return -EINPROGRESS;
1278 static int vpnconnections_properties(DBusMessageIter *iter, const char *error,
1281 char *path = user_data;
1283 DBusMessageIter dict;
1285 if (error == NULL) {
1286 fprintf(stdout, "%s\n", path);
1288 dbus_message_iter_recurse(iter, &dict);
1289 __connmanctl_dbus_print(&dict, " ", " = ", "\n");
1291 fprintf(stdout, "\n");
1294 str = strrchr(path, '/');
1300 fprintf(stderr, "Error %s: %s\n", str, error);
1308 static int vpnconnections_list(DBusMessageIter *iter, const char *error,
1312 __connmanctl_vpnconnections_list(iter);
1314 fprintf(stderr, "Error: %s\n", error);
1319 static int cmd_vpnconnections(char *args[], int num,
1320 struct connman_option *options)
1322 char *vpnconnection_name, *path;
1327 vpnconnection_name = args[1];
1329 if (vpnconnection_name == NULL)
1330 return __connmanctl_dbus_method_call(connection,
1331 VPN_SERVICE, VPN_PATH,
1332 "net.connman.vpn.Manager", "GetConnections",
1333 vpnconnections_list, NULL,
1336 if (check_dbus_name(vpnconnection_name) == false)
1339 path = g_strdup_printf("/net/connman/vpn/connection/%s",
1340 vpnconnection_name);
1341 return __connmanctl_dbus_method_call(connection, VPN_SERVICE, path,
1342 "net.connman.vpn.Connection", "GetProperties",
1343 vpnconnections_properties, path, DBUS_TYPE_INVALID);
1347 static int cmd_vpnagent(char *args[], int num, struct connman_option *options)
1355 switch(parse_boolean(args[1])) {
1357 __connmanctl_vpn_agent_unregister(connection);
1361 if (__connmanctl_vpn_agent_register(connection) ==
1363 return -EINPROGRESS;
1375 static int cmd_exit(char *args[], int num, struct connman_option *options)
1380 static struct connman_option service_options[] = {
1381 {"properties", 'p', "[<service>] (obsolete)"},
1385 static struct connman_option config_options[] = {
1386 {"nameservers", 'n', "<dns1> [<dns2>] [<dns3>]"},
1387 {"timeservers", 't', "<ntp1> [<ntp2>] [...]"},
1388 {"domains", 'd', "<domain1> [<domain2>] [...]"},
1389 {"ipv6", 'v', "off|auto [enable|disable|prefered]|\n"
1390 "\t\t\tmanual <address> <prefixlength> <gateway>"},
1391 {"proxy", 'x', "direct|auto <URL>|manual <URL1> [<URL2>] [...]\n"
1392 "\t\t\t[exclude <exclude1> [<exclude2>] [...]]"},
1393 {"autoconnect", 'a', "yes|no"},
1394 {"ipv4", 'i', "off|dhcp|manual <address> <netmask> <gateway>"},
1395 {"remove", 'r', " Remove service"},
1399 static struct connman_option monitor_options[] = {
1400 {"services", 's', "[off] Monitor only services"},
1401 {"tech", 'c', "[off] Monitor only technologies"},
1402 {"manager", 'm', "[off] Monitor only manager interface"},
1403 {"vpnmanager", 'M', "[off] Monitor only VPN manager "
1405 {"vpnconnection", 'C', "[off] Monitor only VPN "
1410 static const struct {
1412 const char *argument;
1413 struct connman_option *options;
1414 int (*func) (char *args[], int num, struct connman_option *options);
1417 { "state", NULL, NULL, cmd_state,
1418 "Shows if the system is online or offline" },
1419 { "technologies", NULL, NULL, cmd_technologies,
1420 "Display technologies" },
1421 { "enable", "<technology>|offline", NULL, cmd_enable,
1422 "Enables given technology or offline mode" },
1423 { "disable", "<technology>|offline", NULL, cmd_disable,
1424 "Disables given technology or offline mode"},
1425 { "tether", "<technology> on|off\n"
1426 " wifi [on|off] <ssid> <passphrase> ",
1428 "Enable, disable tethering, set SSID and passphrase for wifi" },
1429 { "services", "[<service>]", service_options, cmd_services,
1430 "Display services" },
1431 { "scan", "<technology>", NULL, cmd_scan,
1432 "Scans for new services for given technology" },
1433 { "connect", "<service>", NULL, cmd_connect,
1434 "Connect a given service" },
1435 { "disconnect", "<service>", NULL, cmd_disconnect,
1436 "Disconnect a given service" },
1437 { "config", "<service>", config_options, cmd_config,
1438 "Set service configuration options" },
1439 { "monitor", "[off]", monitor_options, cmd_monitor,
1440 "Monitor signals from interfaces" },
1441 { "agent", "on|off", NULL, cmd_agent,
1443 {"vpnconnections", "[<connection>]", NULL, cmd_vpnconnections,
1444 "Display VPN connections" },
1445 { "vpnagent", "on|off", NULL, cmd_vpnagent,
1447 { "help", NULL, NULL, cmd_help,
1449 { "exit", NULL, NULL, cmd_exit,
1451 { "quit", NULL, NULL, cmd_exit,
1456 static int cmd_help(char *args[], int num, struct connman_option *options)
1458 bool interactive = __connmanctl_is_interactive();
1461 if (interactive == false)
1462 fprintf(stdout, "Usage: connmanctl [[command] [args]]\n");
1464 for (i = 0; cmd_table[i].cmd != NULL; i++) {
1465 const char *cmd = cmd_table[i].cmd;
1466 const char *argument = cmd_table[i].argument;
1467 const char *desc = cmd_table[i].desc;
1469 printf("%-16s%-22s%s\n", cmd != NULL? cmd: "",
1470 argument != NULL? argument: "",
1471 desc != NULL? desc: "");
1473 if (cmd_table[i].options != NULL) {
1474 for (j = 0; cmd_table[i].options[j].name != NULL;
1476 const char *options_desc =
1477 cmd_table[i].options[j].desc != NULL ?
1478 cmd_table[i].options[j].desc: "";
1480 printf(" --%-16s%s\n",
1481 cmd_table[i].options[j].name,
1487 if (interactive == false)
1488 fprintf(stdout, "\nNote: arguments and output are considered "
1489 "EXPERIMENTAL for now.\n");
1494 int __connmanctl_commands(DBusConnection *dbus_conn, char *argv[], int argc)
1498 connection = dbus_conn;
1500 for (i = 0; cmd_table[i].cmd != NULL; i++) {
1501 if (g_strcmp0(cmd_table[i].cmd, argv[0]) == 0 &&
1502 cmd_table[i].func != NULL) {
1503 result = cmd_table[i].func(argv, argc,
1504 cmd_table[i].options);
1505 if (result < 0 && result != -EINPROGRESS)
1506 fprintf(stderr, "Error '%s': %s\n", argv[0],
1512 fprintf(stderr, "Error '%s': Unknown command\n", argv[0]);
1516 char *__connmanctl_lookup_command(const char *text, int state)
1526 while (cmd_table[i].cmd != NULL) {
1527 const char *command = cmd_table[i].cmd;
1531 if (strncmp(text, command, len) == 0)
1532 return strdup(command);