Diff between b01d6c2739ee49fd5051699a127d6757d01bab68 and 5d24fe74da58489962e391cd316476838f4ce641

Changed Files

File Additions Deletions Status
mesh/config-client.c +118 -53 modified
mesh/main.c +70 -33 modified
mesh/onoff-model.c +14 -5 modified

Full Patch

diff --git a/mesh/config-client.c b/mesh/config-client.c
index be089a0..5490de3 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 b5ec4bc..3a35fab 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 dbbe697..016a6ea 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 = {