From 5d24fe74da58489962e391cd316476838f4ce641 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 28 Feb 2018 14:03:57 +0200 Subject: [PATCH] mesh/meshctl: Quit when done with command This ensures that the commands don't stay hanging since bt_shell no longer quits immediatelly after executing a command. --- mesh/config-client.c | 171 +++++++++++++++++++++++++++++-------------- mesh/main.c | 103 +++++++++++++++++--------- mesh/onoff-model.c | 19 +++-- 3 files changed, 202 insertions(+), 91 deletions(-) diff --git a/mesh/config-client.c b/mesh/config-client.c index be089a0a2..5490de304 100644 --- a/mesh/config-client.c +++ b/mesh/config-client.c @@ -385,10 +385,12 @@ static void cmd_node_set(int argc, char *argv[]) bt_shell_printf("Bad unicast address %s: " "expected format 4 digit hex\n", argv[1]); target = UNASSIGNED_ADDRESS; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } else { bt_shell_printf("Configuring node %4.4x\n", dst); target = dst; set_menu_prompt("config", argv[1]); + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } } @@ -419,14 +421,18 @@ static void cmd_default(uint32_t opcode) if (IS_UNASSIGNED(target)) { bt_shell_printf("Destination not set\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } n = mesh_opcode_set(opcode, msg); - if (!config_send(msg, n)) + if (!config_send(msg, n)) { bt_shell_printf("Failed to send command (opcode 0x%x)\n", opcode); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_composition_get(int argc, char *argv[]) @@ -437,21 +443,25 @@ static void cmd_composition_get(int argc, char *argv[]) if (IS_UNASSIGNED(target)) { bt_shell_printf("Destination not set\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } node = node_find_by_addr(target); if (!node) - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); n = mesh_opcode_set(OP_DEV_COMP_GET, msg); /* By default, use page 0 */ msg[n++] = (read_input_parameters(argc, argv) == 1) ? parms[0] : 0; - if (!config_send(msg, n)) + if (!config_send(msg, n)) { bt_shell_printf("Failed to send \"GET NODE COMPOSITION\"\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_net_key(int argc, char *argv[], uint32_t opcode) @@ -464,20 +474,20 @@ static void cmd_net_key(int argc, char *argv[], uint32_t opcode) if (IS_UNASSIGNED(target)) { bt_shell_printf("Destination not set\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } n = mesh_opcode_set(opcode, msg); if (read_input_parameters(argc, argv) != 1) { bt_shell_printf("Bad arguments %s\n", argv[1]); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } node = node_find_by_addr(target); if (!node) { bt_shell_printf("Node %4.4x\n not found", target); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } net_idx = parms[0]; @@ -488,7 +498,7 @@ static void cmd_net_key(int argc, char *argv[], uint32_t opcode) if (!key) { bt_shell_printf("NetKey with index %4.4x not found\n", net_idx); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } put_le16(net_idx, &msg[n]); @@ -501,7 +511,7 @@ static void cmd_net_key(int argc, char *argv[], uint32_t opcode) if (!config_send(msg, n)) { bt_shell_printf("Failed to send \"%s NET KEY\"\n", opcode == OP_NETKEY_ADD ? "ADD" : "DEL"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } if (opcode != OP_NETKEY_DELETE) { @@ -514,6 +524,7 @@ static void cmd_net_key(int argc, char *argv[], uint32_t opcode) "netKeys"); } + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_netkey_add(int argc, char *argv[]) @@ -537,18 +548,18 @@ static void cmd_app_key(int argc, char *argv[], uint32_t opcode) if (IS_UNASSIGNED(target)) { bt_shell_printf("Destination not set\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } if (read_input_parameters(argc, argv) != 1) { bt_shell_printf("Bad arguments %s\n", argv[1]); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } node = node_find_by_addr(target); if (!node) { bt_shell_printf("Node %4.4x\n not found", target); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } n = mesh_opcode_set(opcode, msg); @@ -557,7 +568,7 @@ static void cmd_app_key(int argc, char *argv[], uint32_t opcode) net_idx = keys_app_key_get_bound(app_idx); if (net_idx == NET_IDX_INVALID) { bt_shell_printf("AppKey with index %4.4x not found\n", app_idx); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } msg[n++] = net_idx & 0xf; @@ -579,7 +590,7 @@ static void cmd_app_key(int argc, char *argv[], uint32_t opcode) if (!config_send(msg, n)) { bt_shell_printf("Failed to send \"ADD %s KEY\"\n", opcode == OP_APPKEY_ADD ? "ADD" : "DEL"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } if (opcode != OP_APPKEY_DELETE) { @@ -591,6 +602,8 @@ static void cmd_app_key(int argc, char *argv[], uint32_t opcode) prov_db_node_keys(node, node_get_app_keys(node), "appKeys"); } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_appkey_add(int argc, char *argv[]) @@ -633,12 +646,12 @@ static void cmd_bind(int argc, char *argv[]) int parm_cnt; if (!verify_config_target(target)) - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); parm_cnt = read_input_parameters(argc, argv); if (parm_cnt != 3 && parm_cnt != 4) { bt_shell_printf("Bad arguments\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } n = mesh_opcode_set(OP_MODEL_APP_BIND, msg); @@ -656,8 +669,12 @@ static void cmd_bind(int argc, char *argv[]) n += 2; } - if (!config_send(msg, n)) + if (!config_send(msg, n)) { bt_shell_printf("Failed to send \"MODEL APP BIND\"\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_ident_set(int argc, char *argv[]) @@ -667,22 +684,26 @@ static void cmd_ident_set(int argc, char *argv[]) int parm_cnt; if (!verify_config_target(target)) - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); n = mesh_opcode_set(OP_NODE_IDENTITY_SET, msg); parm_cnt = read_input_parameters(argc, argv); if (parm_cnt != 2) { bt_shell_printf("bad arguments\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } put_le16(parms[0], msg + n); n += 2; msg[n++] = parms[1]; - if (!config_send(msg, n)) + if (!config_send(msg, n)) { bt_shell_printf("Failed to send \"SET IDENTITY\"\n"); + return; + } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_ident_get(int argc, char *argv[]) @@ -692,21 +713,25 @@ static void cmd_ident_get(int argc, char *argv[]) int parm_cnt; if (!verify_config_target(target)) - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); n = mesh_opcode_set(OP_NODE_IDENTITY_GET, msg); parm_cnt = read_input_parameters(argc, argv); if (parm_cnt != 1) { bt_shell_printf("bad arguments\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } put_le16(parms[0], msg + n); n += 2; - if (!config_send(msg, n)) + if (!config_send(msg, n)) { bt_shell_printf("Failed to send \"GET IDENTITY\"\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_proxy_set(int argc, char *argv[]) @@ -716,21 +741,25 @@ static void cmd_proxy_set(int argc, char *argv[]) int parm_cnt; if (!verify_config_target(target)) - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); n = mesh_opcode_set(OP_CONFIG_PROXY_SET, msg); parm_cnt = read_input_parameters(argc, argv); if (parm_cnt != 1) { bt_shell_printf("bad arguments"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } msg[n++] = parms[0]; msg[n++] = parms[1]; - if (!config_send(msg, n)) + if (!config_send(msg, n)) { bt_shell_printf("Failed to send \"SET PROXY\"\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_proxy_get(int argc, char *argv[]) @@ -745,21 +774,25 @@ static void cmd_relay_set(int argc, char *argv[]) int parm_cnt; if (!verify_config_target(target)) - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); n = mesh_opcode_set(OP_CONFIG_RELAY_SET, msg); parm_cnt = read_input_parameters(argc, argv); if (parm_cnt != 3) { bt_shell_printf("bad arguments\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } msg[n++] = parms[0]; msg[n++] = (parms[1] << 5) | parms[2]; - if (!config_send(msg, n)) + if (!config_send(msg, n)) { bt_shell_printf("Failed to send \"SET RELAY\"\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_relay_get(int argc, char *argv[]) @@ -776,7 +809,7 @@ static void cmd_ttl_set(int argc, char *argv[]) if (IS_UNASSIGNED(target)) { bt_shell_printf("Destination not set\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } n = mesh_opcode_set(OP_CONFIG_DEFAULT_TTL_SET, msg); @@ -789,8 +822,12 @@ static void cmd_ttl_set(int argc, char *argv[]) msg[n++] = ttl; - if (!config_send(msg, n)) + if (!config_send(msg, n)) { bt_shell_printf("Failed to send \"SET_DEFAULT TTL\"\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_pub_set(int argc, char *argv[]) @@ -800,14 +837,14 @@ static void cmd_pub_set(int argc, char *argv[]) int parm_cnt; if (!verify_config_target(target)) - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); n = mesh_opcode_set(OP_CONFIG_MODEL_PUB_SET, msg); parm_cnt = read_input_parameters(argc, argv); if (parm_cnt != 6 && parm_cnt != 7) { bt_shell_printf("Bad arguments\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } put_le16(parms[0], msg + n); @@ -834,8 +871,12 @@ static void cmd_pub_set(int argc, char *argv[]) n += 2; } - if (!config_send(msg, n)) + if (!config_send(msg, n)) { bt_shell_printf("Failed to send \"SET MODEL PUBLICATION\"\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_pub_get(int argc, char *argv[]) @@ -846,7 +887,7 @@ static void cmd_pub_get(int argc, char *argv[]) if (IS_UNASSIGNED(target)) { bt_shell_printf("Destination not set\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } n = mesh_opcode_set(OP_CONFIG_MODEL_PUB_GET, msg); @@ -854,7 +895,7 @@ static void cmd_pub_get(int argc, char *argv[]) parm_cnt = read_input_parameters(argc, argv); if (parm_cnt != 2 && parm_cnt != 3) { bt_shell_printf("Bad arguments: %s\n", argv[1]); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } /* Element Address */ @@ -870,8 +911,12 @@ static void cmd_pub_get(int argc, char *argv[]) n += 2; } - if (!config_send(msg, n)) + if (!config_send(msg, n)) { bt_shell_printf("Failed to send \"GET MODEL PUBLICATION\"\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_sub_add(int argc, char *argv[]) @@ -882,7 +927,7 @@ static void cmd_sub_add(int argc, char *argv[]) if (IS_UNASSIGNED(target)) { bt_shell_printf("Destination not set\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } n = mesh_opcode_set(OP_CONFIG_MODEL_SUB_ADD, msg); @@ -890,7 +935,7 @@ static void cmd_sub_add(int argc, char *argv[]) parm_cnt = read_input_parameters(argc, argv); if (parm_cnt != 3) { bt_shell_printf("Bad arguments: %s\n", argv[1]); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } /* Per Mesh Profile 4.3.2.19 */ @@ -904,8 +949,12 @@ static void cmd_sub_add(int argc, char *argv[]) put_le16(parms[2], msg + n); n += 2; - if (!config_send(msg, n)) + if (!config_send(msg, n)) { bt_shell_printf("Failed to send \"ADD SUBSCRIPTION\"\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_sub_get(int argc, char *argv[]) @@ -916,7 +965,7 @@ static void cmd_sub_get(int argc, char *argv[]) if (IS_UNASSIGNED(target)) { bt_shell_printf("Destination not set\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } n = mesh_opcode_set(OP_CONFIG_MODEL_SUB_GET, msg); @@ -924,7 +973,7 @@ static void cmd_sub_get(int argc, char *argv[]) parm_cnt = read_input_parameters(argc, argv); if (parm_cnt != 2) { bt_shell_printf("Bad arguments: %s\n", argv[1]); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } /* Per Mesh Profile 4.3.2.27 */ @@ -935,8 +984,12 @@ static void cmd_sub_get(int argc, char *argv[]) put_le16(parms[1], msg + n); n += 2; - if (!config_send(msg, n)) + if (!config_send(msg, n)) { bt_shell_printf("Failed to send \"GET SUB GET\"\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_mod_appidx_get(int argc, char *argv[]) @@ -947,7 +1000,7 @@ static void cmd_mod_appidx_get(int argc, char *argv[]) if (IS_UNASSIGNED(target)) { bt_shell_printf("Destination not set\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } n = mesh_opcode_set(OP_MODEL_APP_GET, msg); @@ -955,7 +1008,7 @@ static void cmd_mod_appidx_get(int argc, char *argv[]) parm_cnt = read_input_parameters(argc, argv); if (parm_cnt != 2) { bt_shell_printf("Bad arguments: %s\n", argv[1]); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } /* Per Mesh Profile 4.3.2.49 */ @@ -966,8 +1019,12 @@ static void cmd_mod_appidx_get(int argc, char *argv[]) put_le16(parms[1], msg + n); n += 2; - if (!config_send(msg, n)) + if (!config_send(msg, n)) { bt_shell_printf("Failed to send \"GET APP GET\"\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_hb_pub_set(int argc, char *argv[]) @@ -978,7 +1035,7 @@ static void cmd_hb_pub_set(int argc, char *argv[]) if (IS_UNASSIGNED(target)) { bt_shell_printf("Destination not set\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } n = mesh_opcode_set(OP_CONFIG_HEARTBEAT_PUB_SET, msg); @@ -986,7 +1043,7 @@ static void cmd_hb_pub_set(int argc, char *argv[]) parm_cnt = read_input_parameters(argc, argv); if (parm_cnt != 5) { bt_shell_printf("Bad arguments: %s\n", argv[1]); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } /* Per Mesh Profile 4.3.2.62 */ @@ -1006,8 +1063,12 @@ static void cmd_hb_pub_set(int argc, char *argv[]) put_le16(parms[4], msg + n); n += 2; - if (!config_send(msg, n)) + if (!config_send(msg, n)) { bt_shell_printf("Failed to send \"SET HEARTBEAT PUBLISH\"\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_hb_pub_get(int argc, char *argv[]) @@ -1023,7 +1084,7 @@ static void cmd_hb_sub_set(int argc, char *argv[]) if (IS_UNASSIGNED(target)) { bt_shell_printf("Destination not set\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } n = mesh_opcode_set(OP_CONFIG_HEARTBEAT_SUB_SET, msg); @@ -1031,7 +1092,7 @@ static void cmd_hb_sub_set(int argc, char *argv[]) parm_cnt = read_input_parameters(argc, argv); if (parm_cnt != 3) { bt_shell_printf("Bad arguments: %s\n", argv[1]); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } /* Per Mesh Profile 4.3.2.65 */ @@ -1044,8 +1105,12 @@ static void cmd_hb_sub_set(int argc, char *argv[]) /* Period log */ msg[n++] = parms[2]; - if (!config_send(msg, n)) + if (!config_send(msg, n)) { bt_shell_printf("Failed to send \"SET HEARTBEAT SUBSCRIBE\"\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_hb_sub_get(int argc, char *argv[]) diff --git a/mesh/main.c b/mesh/main.c index b5ec4bcd5..3a35fab8a 100644 --- a/mesh/main.c +++ b/mesh/main.c @@ -637,12 +637,14 @@ static void connect_reply(DBusMessage *message, void *user_data) bt_shell_printf("Failed to connect: %s\n", error.name); dbus_error_free(&error); set_connected_device(NULL); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } bt_shell_printf("Connection successful\n"); set_connected_device(proxy); + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void update_device_info(GDBusProxy *proxy) @@ -1005,10 +1007,12 @@ static void start_discovery_reply(DBusMessage *message, void *user_data) bt_shell_printf("Failed to %s discovery: %s\n", enable == TRUE ? "start" : "stop", error.name); dbus_error_free(&error); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } bt_shell_printf("Discovery %s\n", enable == TRUE ? "started" : "stopped"); + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static struct mesh_device *find_device_by_proxy(GList *source, @@ -1306,6 +1310,8 @@ static void cmd_list(int argc, char *argv[]) struct adapter *adapter = list->data; print_adapter(adapter->proxy, NULL); } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_show(int argc, char *argv[]) @@ -1318,7 +1324,7 @@ static void cmd_show(int argc, char *argv[]) if (argc < 2 || !strlen(argv[1])) { if (check_default_ctrl() == FALSE) - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); proxy = default_ctrl->proxy; } else { @@ -1326,13 +1332,13 @@ static void cmd_show(int argc, char *argv[]) if (!adapter) { bt_shell_printf("Controller %s not available\n", argv[1]); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } proxy = adapter->proxy; } if (g_dbus_proxy_get_property(proxy, "Address", &iter) == FALSE) - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); dbus_message_iter_get_basic(&iter, &address); bt_shell_printf("Controller %s\n", address); @@ -1345,6 +1351,8 @@ static void cmd_show(int argc, char *argv[]) print_uuids(proxy); print_property(proxy, "Modalias"); print_property(proxy, "Discovering"); + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_select(int argc, char *argv[]) @@ -1354,26 +1362,31 @@ static void cmd_select(int argc, char *argv[]) adapter = find_ctrl_by_address(ctrl_list, argv[1]); if (!adapter) { bt_shell_printf("Controller %s not available\n", argv[1]); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } if (default_ctrl && default_ctrl->proxy == adapter->proxy) - return; + return bt_shell_noninteractive_quit(EXIT_SUCCESS); forget_mesh_devices(); default_ctrl = adapter; print_adapter(adapter->proxy, NULL); + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void generic_callback(const DBusError *error, void *user_data) { char *str = user_data; - if (dbus_error_is_set(error)) + if (dbus_error_is_set(error)) { bt_shell_printf("Failed to set %s: %s\n", str, error->name); - else + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } else { bt_shell_printf("Changing %s succeeded\n", str); + return bt_shell_noninteractive_quit(EXIT_SUCCESS); + } } static void cmd_power(int argc, char *argv[]) @@ -1382,10 +1395,10 @@ static void cmd_power(int argc, char *argv[]) char *str; if (parse_argument_on_off(argc, argv, &powered) == FALSE) - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); if (check_default_ctrl() == FALSE) - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); str = g_strdup_printf("power %s", powered == TRUE ? "on" : "off"); @@ -1395,6 +1408,8 @@ static void cmd_power(int argc, char *argv[]) return; g_free(str); + + return bt_shell_noninteractive_quit(EXIT_FAILURE); } static void append_variant(DBusMessageIter *iter, int type, void *val) @@ -1535,10 +1550,12 @@ static void set_discovery_filter_reply(DBusMessage *message, void *user_data) if (dbus_set_error_from_message(&error, message) == TRUE) { bt_shell_printf("SetDiscoveryFilter failed: %s\n", error.name); dbus_error_free(&error); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } bt_shell_printf("SetDiscoveryFilter success\n"); + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static gint filtered_scan_rssi = DISTANCE_VAL_INVALID; @@ -1559,13 +1576,13 @@ static void set_scan_filter_commit(void) args.duplicate = TRUE; if (check_default_ctrl() == FALSE) - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); if (g_dbus_proxy_method_call(default_ctrl->proxy, "SetDiscoveryFilter", set_discovery_filter_setup, set_discovery_filter_reply, &args, NULL) == FALSE) { bt_shell_printf("Failed to set discovery filter\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } } @@ -1581,7 +1598,7 @@ static void set_scan_filter_uuids(char *filters[]) filtered_scan_uuids = g_strdupv(filters); if (!filtered_scan_uuids) { bt_shell_printf("Failed to parse input\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } filtered_scan_uuids_len = g_strv_length(filtered_scan_uuids); @@ -1597,10 +1614,10 @@ static void cmd_scan_unprovisioned(int argc, char *argv[]) const char *method; if (parse_argument_on_off(argc, argv, &enable) == FALSE) - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); if (check_default_ctrl() == FALSE) - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); if (enable == TRUE) { discover_mesh = false; @@ -1615,6 +1632,7 @@ static void cmd_scan_unprovisioned(int argc, char *argv[]) GUINT_TO_POINTER(enable), NULL) == FALSE) { bt_shell_printf("Failed to %s discovery\n", enable == TRUE ? "start" : "stop"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); } } @@ -1626,10 +1644,10 @@ static void cmd_info(int argc, char *argv[]) proxy = connection.device; if (!proxy) - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); if (g_dbus_proxy_get_property(proxy, "Address", &iter) == FALSE) - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); dbus_message_iter_get_basic(&iter, &address); bt_shell_printf("Device %s\n", address); @@ -1648,6 +1666,8 @@ static void cmd_info(int argc, char *argv[]) print_property(proxy, "ServiceData"); print_property(proxy, "RSSI"); print_property(proxy, "TxPower"); + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static const char *security2str(uint8_t level) @@ -1675,13 +1695,15 @@ static void cmd_security(int argc, char *argv[]) level = strtol(argv[1], &end, 10); if (end == argv[1] || !prov_set_sec_level(level)) { bt_shell_printf("Invalid security level %s\n", argv[1]); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } done: bt_shell_printf("Provision Security Level set to %u (%s)\n", prov_get_sec_level(), security2str(prov_get_sec_level())); + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_connect(int argc, char *argv[]) @@ -1689,7 +1711,7 @@ static void cmd_connect(int argc, char *argv[]) char *filters[] = { MESH_PROXY_SVC_UUID, NULL }; if (check_default_ctrl() == FALSE) - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); memset(&connection, 0, sizeof(connection)); @@ -1701,7 +1723,7 @@ static void cmd_connect(int argc, char *argv[]) if (end == argv[1]) { connection.net_idx = NET_IDX_INVALID; bt_shell_printf("Invalid network index %s\n", argv[1]); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } if (argc > 2) @@ -1728,8 +1750,10 @@ static void cmd_connect(int argc, char *argv[]) if (g_dbus_proxy_method_call(default_ctrl->proxy, "StartDiscovery", NULL, start_discovery_reply, - GUINT_TO_POINTER(TRUE), NULL) == FALSE) + GUINT_TO_POINTER(TRUE), NULL) == FALSE) { bt_shell_printf("Failed to start mesh proxy discovery\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } g_dbus_proxy_method_call(default_ctrl->proxy, "StartDiscovery", NULL, NULL, NULL, NULL); @@ -1747,7 +1771,7 @@ static void prov_disconn_reply(DBusMessage *message, void *user_data) if (dbus_set_error_from_message(&error, message) == TRUE) { bt_shell_printf("Failed to disconnect: %s\n", error.name); dbus_error_free(&error); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } set_connected_device(NULL); @@ -1762,8 +1786,10 @@ static void prov_disconn_reply(DBusMessage *message, void *user_data) if (g_dbus_proxy_method_call(default_ctrl->proxy, "StartDiscovery", NULL, start_discovery_reply, - GUINT_TO_POINTER(TRUE), NULL) == FALSE) + GUINT_TO_POINTER(TRUE), NULL) == FALSE) { bt_shell_printf("Failed to start mesh proxy discovery\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } } @@ -1777,15 +1803,17 @@ static void disconn_reply(DBusMessage *message, void *user_data) if (dbus_set_error_from_message(&error, message) == TRUE) { bt_shell_printf("Failed to disconnect: %s\n", error.name); dbus_error_free(&error); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } bt_shell_printf("Successfully disconnected\n"); if (proxy != connection.device) - return; + return bt_shell_noninteractive_quit(EXIT_SUCCESS); set_connected_device(NULL); + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_disconn(int argc, char *argv[]) @@ -1797,6 +1825,8 @@ static void cmd_disconn(int argc, char *argv[]) } disconnect_device(disconn_reply, connection.device); + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void mesh_prov_done(void *user_data, int status) @@ -1841,14 +1871,14 @@ static void cmd_start_prov(int argc, char *argv[]) bt_shell_printf("Device with UUID %s not found.\n", argv[1]); bt_shell_printf("Stale services? Remove device and " "re-discover\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } /* TODO: add command to remove a node from mesh, i.e., "unprovision" */ if (node_is_provisioned(node)) { bt_shell_printf("Already provisioned with unicast %4.4x\n", node_get_primary(node)); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } dev = find_device_by_uuid(default_ctrl->mesh_devices, @@ -1856,7 +1886,7 @@ static void cmd_start_prov(int argc, char *argv[]) if (!dev || !dev->proxy) { bt_shell_printf("Could not find device proxy\n"); memset(connection.dev_uuid, 0, 16); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } proxy = dev->proxy; @@ -1871,7 +1901,7 @@ static void cmd_start_prov(int argc, char *argv[]) proxy, NULL) == FALSE) { bt_shell_printf("Failed to connect "); print_device(proxy, NULL); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } else { bt_shell_printf("Trying to connect "); print_device(proxy, NULL); @@ -1881,15 +1911,22 @@ static void cmd_start_prov(int argc, char *argv[]) static void cmd_print_mesh(int argc, char *argv[]) { - if (!prov_db_show(mesh_prov_db_filename)) + if (!prov_db_show(mesh_prov_db_filename)) { bt_shell_printf("Unavailable\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_print_local(int argc, char *argv[]) { - if (!prov_db_show(mesh_local_config_filename)) + if (!prov_db_show(mesh_local_config_filename)) { bt_shell_printf("Unavailable\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static const struct bt_shell_menu main_menu = { diff --git a/mesh/onoff-model.c b/mesh/onoff-model.c index dbbe69706..016a6ea28 100644 --- a/mesh/onoff-model.c +++ b/mesh/onoff-model.c @@ -183,10 +183,12 @@ static void cmd_set_node(int argc, char *argv[]) bt_shell_printf("Bad unicast address %s: " "expected format 4 digit hex\n", argv[1]); target = UNASSIGNED_ADDRESS; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } else { bt_shell_printf("Controlling ON/OFF for node %4.4x\n", dst); target = dst; set_menu_prompt("on/off", argv[1]); + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } } @@ -212,7 +214,7 @@ static void cmd_get_status(int argc, char *argv[]) if (IS_UNASSIGNED(target)) { bt_shell_printf("Destination not set\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } node = node_find_by_addr(target); @@ -222,8 +224,12 @@ static void cmd_get_status(int argc, char *argv[]) n = mesh_opcode_set(OP_GENERIC_ONOFF_GET, msg); - if (!send_cmd(msg, n)) + if (!send_cmd(msg, n)) { bt_shell_printf("Failed to send \"GENERIC ON/OFF GET\"\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static void cmd_set(int argc, char *argv[]) @@ -234,7 +240,7 @@ static void cmd_set(int argc, char *argv[]) if (IS_UNASSIGNED(target)) { bt_shell_printf("Destination not set\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } node = node_find_by_addr(target); @@ -245,16 +251,19 @@ static void cmd_set(int argc, char *argv[]) if ((read_input_parameters(argc, argv) != 1) && parms[0] != 0 && parms[0] != 1) { bt_shell_printf("Bad arguments: Expecting \"0\" or \"1\"\n"); - return; + return bt_shell_noninteractive_quit(EXIT_FAILURE); } n = mesh_opcode_set(OP_GENERIC_ONOFF_SET, msg); msg[n++] = parms[0]; msg[n++] = trans_id++; - if (!send_cmd(msg, n)) + if (!send_cmd(msg, n)) { bt_shell_printf("Failed to send \"GENERIC ON/OFF SET\"\n"); + return bt_shell_noninteractive_quit(EXIT_FAILURE); + } + return bt_shell_noninteractive_quit(EXIT_SUCCESS); } static const struct bt_shell_menu onoff_menu = { -- 2.47.3