client: Quit when done with command 21/204921/1
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Fri, 23 Feb 2018 14:34:58 +0000 (16:34 +0200)
committerAmit Purwar <amit.purwar@samsung.com>
Fri, 26 Apr 2019 10:26:36 +0000 (15:56 +0530)
This ensures that the commands don't stay hanging since bt_shell no
longer quits immediatelly after executing a command.

Change-Id: I69dd2faa6c1c55039d7d19d2e4effcf2cd4919d7
Signed-off-by: Amit Purwar <amit.purwar@samsung.com>
client/advertising.c
client/agent.c
client/gatt.c
client/main.c

index 08cd468..77a541d 100644 (file)
@@ -190,6 +190,7 @@ static void register_reply(DBusMessage *message, void *user_data)
                ad.registered = true;
                bt_shell_printf("Advertising object registered\n");
                print_ad();
+               /* Leave advertise running even on noninteractive mode */
        } else {
                bt_shell_printf("Failed to register advertisement: %s\n", error.name);
                dbus_error_free(&error);
@@ -197,6 +198,7 @@ static void register_reply(DBusMessage *message, void *user_data)
                if (g_dbus_unregister_interface(conn, AD_PATH,
                                                AD_IFACE) == FALSE)
                        bt_shell_printf("Failed to unregister advertising object\n");
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 }
 
@@ -441,7 +443,7 @@ void ad_register(DBusConnection *conn, GDBusProxy *manager, const char *type)
 {
        if (ad.registered) {
                bt_shell_printf("Advertisement is already registered\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        g_free(ad.type);
@@ -450,14 +452,14 @@ void ad_register(DBusConnection *conn, GDBusProxy *manager, const char *type)
        if (g_dbus_register_interface(conn, AD_PATH, AD_IFACE, ad_methods,
                                        NULL, ad_props, NULL, NULL) == FALSE) {
                bt_shell_printf("Failed to register advertising object\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        if (g_dbus_proxy_method_call(manager, "RegisterAdvertisement",
                                        register_setup, register_reply,
                                        conn, NULL) == FALSE) {
                bt_shell_printf("Failed to register advertising\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 }
 
@@ -481,10 +483,12 @@ static void unregister_reply(DBusMessage *message, void *user_data)
                if (g_dbus_unregister_interface(conn, AD_PATH,
                                                        AD_IFACE) == FALSE)
                        bt_shell_printf("Failed to unregister advertising object\n");
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
        } else {
                bt_shell_printf("Failed to unregister advertisement: %s\n",
                                                                error.name);
                dbus_error_free(&error);
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 }
 
@@ -494,7 +498,7 @@ void ad_unregister(DBusConnection *conn, GDBusProxy *manager)
                ad_release(conn);
 
        if (!ad.registered)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 
        g_free(ad.type);
        ad.type = NULL;
@@ -503,7 +507,7 @@ void ad_unregister(DBusConnection *conn, GDBusProxy *manager)
                                        unregister_setup, unregister_reply,
                                        conn, NULL) == FALSE) {
                bt_shell_printf("Failed to unregister advertisement method\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 }
 
@@ -517,41 +521,42 @@ static void ad_clear_uuids(void)
 void ad_advertise_uuids(DBusConnection *conn, int argc, char *argv[])
 {
        if (argc < 2 || !strlen(argv[1])) {
-               char **uuid;
-               
-               for (uuid = ad.uuids; uuid && *uuid; uuid++)
-                       print_uuid(*uuid);
-
                print_ad_uuids();
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
        }
-
+       
        ad_clear_uuids();
 
        ad.uuids = g_strdupv(&argv[1]);
        if (!ad.uuids) {
                bt_shell_printf("Failed to parse input\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        ad.uuids_len = g_strv_length(ad.uuids);
 
        g_dbus_emit_property_changed(conn, AD_PATH, AD_IFACE, "ServiceUUIDs");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 void ad_disable_uuids(DBusConnection *conn)
 {
        if (!ad.uuids)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 
        ad_clear_uuids();
        g_dbus_emit_property_changed(conn, AD_PATH, AD_IFACE, "ServiceUUIDs");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void ad_clear_service(void)
 {
        g_free(ad.service.uuid);
        memset(&ad.service, 0, sizeof(ad.service));
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 void ad_advertise_service(DBusConnection *conn, int argc, char *argv[])
@@ -565,7 +570,7 @@ void ad_advertise_service(DBusConnection *conn, int argc, char *argv[])
                        bt_shell_hexdump(ad.service.data.data,
                                                ad.service.data.len);
                }
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
        }
 
        ad_clear_service();
@@ -595,20 +600,26 @@ void ad_advertise_service(DBusConnection *conn, int argc, char *argv[])
        }
 
        g_dbus_emit_property_changed(conn, AD_PATH, AD_IFACE, "ServiceData");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 void ad_disable_service(DBusConnection *conn)
 {
        if (!ad.service.uuid)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 
        ad_clear_service();
        g_dbus_emit_property_changed(conn, AD_PATH, AD_IFACE, "ServiceData");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void ad_clear_manufacturer(void)
 {
        memset(&ad.manufacturer, 0, sizeof(ad.manufacturer));
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 void ad_advertise_manufacturer(DBusConnection *conn, int argc, char *argv[])
@@ -626,7 +637,7 @@ void ad_advertise_manufacturer(DBusConnection *conn, int argc, char *argv[])
                                                ad.manufacturer.data.len);
                }
 
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
        }
 
        ad_clear_manufacturer();
@@ -634,7 +645,7 @@ void ad_advertise_manufacturer(DBusConnection *conn, int argc, char *argv[])
        val = strtol(argv[1], &endptr, 0);
        if (!endptr || *endptr != '\0' || val > UINT16_MAX) {
                bt_shell_printf("Invalid manufacture id\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        ad.manufacturer.id = val;
@@ -644,14 +655,14 @@ void ad_advertise_manufacturer(DBusConnection *conn, int argc, char *argv[])
                if (i >= G_N_ELEMENTS(data->data)) {
                        bt_shell_printf("Too much data\n");
                        ad_clear_manufacturer();
-                       return;
+                       return bt_shell_noninteractive_quit(EXIT_FAILURE);
                }
 
                val = strtol(argv[i], &endptr, 0);
                if (!endptr || *endptr != '\0' || val > UINT8_MAX) {
                        bt_shell_printf("Invalid value at index %d\n", i);
                        ad_clear_manufacturer();
-                       return;
+                       return bt_shell_noninteractive_quit(EXIT_FAILURE);
                }
 
                data->data[data->len] = val;
@@ -660,23 +671,27 @@ void ad_advertise_manufacturer(DBusConnection *conn, int argc, char *argv[])
 
        g_dbus_emit_property_changed(conn, AD_PATH, AD_IFACE,
                                                        "ManufacturerData");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 void ad_disable_manufacturer(DBusConnection *conn)
 {
        if (!ad.manufacturer.id && !ad.manufacturer.data.len)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 
        ad_clear_manufacturer();
        g_dbus_emit_property_changed(conn, AD_PATH, AD_IFACE,
                                                        "ManufacturerData");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 void ad_advertise_tx_power(DBusConnection *conn, dbus_bool_t *value)
 {
        if (!value) {
                bt_shell_printf("Tx Power: %s\n", ad.tx_power ? "on" : "off");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
        }
 
        if (ad.tx_power == *value)
@@ -685,12 +700,14 @@ void ad_advertise_tx_power(DBusConnection *conn, dbus_bool_t *value)
        ad.tx_power = *value;
 
        g_dbus_emit_property_changed(conn, AD_PATH, AD_IFACE, "Includes");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 void ad_advertise_name(DBusConnection *conn, bool value)
 {
        if (ad.name == value)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 
        ad.name = value;
 
@@ -700,6 +717,8 @@ void ad_advertise_name(DBusConnection *conn, bool value)
        }
 
        g_dbus_emit_property_changed(conn, AD_PATH, AD_IFACE, "Includes");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 void ad_advertise_local_name(DBusConnection *conn, const char *name)
@@ -710,7 +729,7 @@ void ad_advertise_local_name(DBusConnection *conn, const char *name)
                else
                        bt_shell_printf("Name: %s\n", ad.name ? "on" : "off");
 
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
        }
 
        if (ad.local_name && !strcmp(name, ad.local_name))
@@ -720,12 +739,14 @@ void ad_advertise_local_name(DBusConnection *conn, const char *name)
        ad.local_name = g_strdup(name);
 
        g_dbus_emit_property_changed(conn, AD_PATH, AD_IFACE, "LocalName");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 void ad_advertise_appearance(DBusConnection *conn, bool value)
 {
        if (ad.appearance == value)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 
        ad.appearance = value;
 
@@ -733,6 +754,8 @@ void ad_advertise_appearance(DBusConnection *conn, bool value)
                ad.local_appearance = UINT16_MAX;
 
        g_dbus_emit_property_changed(conn, AD_PATH, AD_IFACE, "Includes");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 void ad_advertise_local_appearance(DBusConnection *conn, long int *value)
@@ -746,15 +769,17 @@ void ad_advertise_local_appearance(DBusConnection *conn, long int *value)
                        bt_shell_printf("Apperance: %s\n",
                                        ad.appearance ? "on" : "off");
 
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
        }
 
        if (ad.local_appearance == *value)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 
        ad.local_appearance = *value;
 
        g_dbus_emit_property_changed(conn, AD_PATH, AD_IFACE, "Appearance");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 void ad_advertise_duration(DBusConnection *conn, long int *value)
@@ -762,15 +787,17 @@ void ad_advertise_duration(DBusConnection *conn, long int *value)
        if (!value) {
                if (ad.duration)
                        bt_shell_printf("Duration: %u sec\n", ad.duration);
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
        }
 
        if (ad.duration == *value)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 
        ad.duration = *value;
 
        g_dbus_emit_property_changed(conn, AD_PATH, AD_IFACE, "Duration");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 void ad_advertise_timeout(DBusConnection *conn, long int *value)
@@ -778,13 +805,15 @@ void ad_advertise_timeout(DBusConnection *conn, long int *value)
        if (!value) {
                if (ad.timeout)
                        bt_shell_printf("Timeout: %u sec\n", ad.timeout);
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
        }
 
        if (ad.timeout == *value)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 
        ad.timeout = *value;
 
        g_dbus_emit_property_changed(conn, AD_PATH, AD_IFACE, "Timeout");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
index 70c3248..4def1b4 100755 (executable)
@@ -419,17 +419,19 @@ static void request_default_reply(DBusMessage *message, void *user_data)
                bt_shell_printf("Failed to request default agent: %s\n",
                                                        error.name);
                dbus_error_free(&error);
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        bt_shell_printf("Default agent request successful\n");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 void agent_default(DBusConnection *conn, GDBusProxy *manager)
 {
        if (agent_registered == FALSE) {
                bt_shell_printf("No agent is registered\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        if (g_dbus_proxy_method_call(manager, "RequestDefaultAgent",
@@ -437,6 +439,6 @@ void agent_default(DBusConnection *conn, GDBusProxy *manager)
                                                request_default_reply,
                                                NULL, NULL) == FALSE) {
                bt_shell_printf("Failed to call RequestDefaultAgent method\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 }
index b640b6e..91cfb01 100755 (executable)
@@ -367,6 +367,7 @@ static void list_attributes(const char *path, GList *source)
 void gatt_list_attributes(const char *path)
 {
        list_attributes(path, services);
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static GDBusProxy *select_attribute(const char *path)
@@ -488,14 +489,14 @@ static void read_reply(DBusMessage *message, void *user_data)
        if (dbus_set_error_from_message(&error, message) == TRUE) {
                bt_shell_printf("Failed to read: %s\n", error.name);
                dbus_error_free(&error);
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        dbus_message_iter_init(message, &iter);
 
        if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) {
                bt_shell_printf("Invalid response to read\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        dbus_message_iter_recurse(&iter, &array);
@@ -503,10 +504,12 @@ static void read_reply(DBusMessage *message, void *user_data)
 
        if (len < 0) {
                bt_shell_printf("Unable to parse value\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        bt_shell_hexdump(value, len);
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void read_setup(DBusMessageIter *iter, void *user_data)
@@ -528,7 +531,7 @@ static void read_attribute(GDBusProxy *proxy)
        if (g_dbus_proxy_method_call(proxy, "ReadValue", read_setup, read_reply,
                                                        NULL, NULL) == FALSE) {
                bt_shell_printf("Failed to read\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        bt_shell_printf("Attempting to read %s\n", g_dbus_proxy_get_path(proxy));
@@ -547,6 +550,7 @@ void gatt_read_attribute(GDBusProxy *proxy)
 
        bt_shell_printf("Unable to read attribute %s\n",
                                                g_dbus_proxy_get_path(proxy));
+       return bt_shell_noninteractive_quit(EXIT_FAILURE);
 }
 
 static void write_reply(DBusMessage *message, void *user_data)
@@ -558,8 +562,10 @@ static void write_reply(DBusMessage *message, void *user_data)
        if (dbus_set_error_from_message(&error, message) == TRUE) {
                bt_shell_printf("Failed to write: %s\n", error.name);
                dbus_error_free(&error);
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void write_setup(DBusMessageIter *iter, void *user_data)
@@ -598,13 +604,13 @@ static void write_attribute(GDBusProxy *proxy, char *arg)
 
                if (i >= G_N_ELEMENTS(value)) {
                        bt_shell_printf("Too much data\n");
-                       return;
+                       return bt_shell_noninteractive_quit(EXIT_FAILURE);
                }
 
                val = strtol(entry, &endptr, 0);
                if (!endptr || *endptr != '\0' || val > UINT8_MAX) {
                        bt_shell_printf("Invalid value at index %d\n", i);
-                       return;
+                       return bt_shell_noninteractive_quit(EXIT_FAILURE);
                }
 
                value[i] = val;
@@ -619,7 +625,7 @@ static void write_attribute(GDBusProxy *proxy, char *arg)
                                                io_get_fd(write_io.io));
                if (io_send(write_io.io, &iov, 1) < 0) {
                        bt_shell_printf("Failed to write: %s", strerror(errno));
-                       return;
+                       return bt_shell_noninteractive_quit(EXIT_FAILURE);
                }
                return;
        }
@@ -627,7 +633,7 @@ static void write_attribute(GDBusProxy *proxy, char *arg)
        if (g_dbus_proxy_method_call(proxy, "WriteValue", write_setup,
                                        write_reply, &iov, NULL) == FALSE) {
                bt_shell_printf("Failed to write\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        bt_shell_printf("Attempting to write %s\n", g_dbus_proxy_get_path(proxy));
@@ -646,6 +652,8 @@ void gatt_write_attribute(GDBusProxy *proxy, const char *arg)
 
        bt_shell_printf("Unable to write attribute %s\n",
                                                g_dbus_proxy_get_path(proxy));
+
+       return bt_shell_noninteractive_quit(EXIT_FAILURE);
 }
 
 static bool pipe_read(struct io *io, void *user_data)
@@ -729,7 +737,7 @@ static void acquire_write_reply(DBusMessage *message, void *user_data)
                bt_shell_printf("Failed to acquire write: %s\n", error.name);
                dbus_error_free(&error);
                write_io.proxy = NULL;
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        if (write_io.io)
@@ -739,12 +747,13 @@ static void acquire_write_reply(DBusMessage *message, void *user_data)
                                        DBUS_TYPE_UINT16, &write_io.mtu,
                                        DBUS_TYPE_INVALID) == false)) {
                bt_shell_printf("Invalid AcquireWrite response\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        bt_shell_printf("AcquireWrite success: fd %d MTU %u\n", fd, write_io.mtu);
 
        write_io.io = pipe_io_new(fd, NULL);
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void acquire_setup(DBusMessageIter *iter, void *user_data)
@@ -769,13 +778,13 @@ void gatt_acquire_write(GDBusProxy *proxy, const char *arg)
        if (strcmp(iface, "org.bluez.GattCharacteristic1")) {
                bt_shell_printf("Unable to acquire write: %s not a characteristic\n",
                                                g_dbus_proxy_get_path(proxy));
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        if (g_dbus_proxy_method_call(proxy, "AcquireWrite", acquire_setup,
                                acquire_write_reply, NULL, NULL) == FALSE) {
                bt_shell_printf("Failed to AcquireWrite\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        write_io.proxy = proxy;
@@ -785,10 +794,12 @@ void gatt_release_write(GDBusProxy *proxy, const char *arg)
 {
        if (proxy != write_io.proxy || !write_io.io) {
                bt_shell_printf("Write not acquired\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        write_io_destroy();
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void acquire_notify_reply(DBusMessage *message, void *user_data)
@@ -802,7 +813,7 @@ static void acquire_notify_reply(DBusMessage *message, void *user_data)
                bt_shell_printf("Failed to acquire notify: %s\n", error.name);
                dbus_error_free(&error);
                write_io.proxy = NULL;
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        if (notify_io.io) {
@@ -816,12 +827,14 @@ static void acquire_notify_reply(DBusMessage *message, void *user_data)
                                        DBUS_TYPE_UINT16, &notify_io.mtu,
                                        DBUS_TYPE_INVALID) == false)) {
                bt_shell_printf("Invalid AcquireNotify response\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        bt_shell_printf("AcquireNotify success: fd %d MTU %u\n", fd, notify_io.mtu);
 
        notify_io.io = pipe_io_new(fd, NULL);
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 void gatt_acquire_notify(GDBusProxy *proxy, const char *arg)
@@ -832,13 +845,13 @@ void gatt_acquire_notify(GDBusProxy *proxy, const char *arg)
        if (strcmp(iface, "org.bluez.GattCharacteristic1")) {
                bt_shell_printf("Unable to acquire notify: %s not a characteristic\n",
                                                g_dbus_proxy_get_path(proxy));
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        if (g_dbus_proxy_method_call(proxy, "AcquireNotify", acquire_setup,
                                acquire_notify_reply, NULL, NULL) == FALSE) {
                bt_shell_printf("Failed to AcquireNotify\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        notify_io.proxy = proxy;
@@ -848,10 +861,12 @@ void gatt_release_notify(GDBusProxy *proxy, const char *arg)
 {
        if (proxy != notify_io.proxy || !notify_io.io) {
                bt_shell_printf("Notify not acquired\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        notify_io_destroy();
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void notify_reply(DBusMessage *message, void *user_data)
@@ -865,10 +880,12 @@ static void notify_reply(DBusMessage *message, void *user_data)
                bt_shell_printf("Failed to %s notify: %s\n",
                                enable ? "start" : "stop", error.name);
                dbus_error_free(&error);
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        bt_shell_printf("Notify %s\n", enable == TRUE ? "started" : "stopped");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void notify_attribute(GDBusProxy *proxy, bool enable)
@@ -883,8 +900,10 @@ static void notify_attribute(GDBusProxy *proxy, bool enable)
        if (g_dbus_proxy_method_call(proxy, method, NULL, notify_reply,
                                GUINT_TO_POINTER(enable), NULL) == FALSE) {
                bt_shell_printf("Failed to %s notify\n", enable ? "start" : "stop");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 void gatt_notify_attribute(GDBusProxy *proxy, bool enable)
@@ -899,6 +918,8 @@ void gatt_notify_attribute(GDBusProxy *proxy, bool enable)
 
        bt_shell_printf("Unable to notify attribute %s\n",
                                                g_dbus_proxy_get_path(proxy));
+
+       return bt_shell_noninteractive_quit(EXIT_FAILURE);
 }
 
 static void register_app_setup(DBusMessageIter *iter, void *user_data)
@@ -927,10 +948,12 @@ static void register_app_reply(DBusMessage *message, void *user_data)
        if (dbus_set_error_from_message(&error, message) == TRUE) {
                bt_shell_printf("Failed to register application: %s\n", error.name);
                dbus_error_free(&error);
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        bt_shell_printf("Application registered\n");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 void gatt_add_manager(GDBusProxy *proxy)
@@ -997,7 +1020,7 @@ void gatt_register_app(DBusConnection *conn, GDBusProxy *proxy,
        l = g_list_find_custom(managers, proxy, match_proxy);
        if (!l) {
                bt_shell_printf("Unable to find GattManager proxy\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        for (i = 0; i < argc; i++)
@@ -1009,7 +1032,7 @@ void gatt_register_app(DBusConnection *conn, GDBusProxy *proxy,
                                                NULL, properties, NULL,
                                                NULL) == FALSE) {
                        bt_shell_printf("Failed to register application object\n");
-                       return;
+                       return bt_shell_noninteractive_quit(EXIT_FAILURE);
                }
        }
 
@@ -1019,7 +1042,7 @@ void gatt_register_app(DBusConnection *conn, GDBusProxy *proxy,
                                                NULL) == FALSE) {
                bt_shell_printf("Failed register application\n");
                g_dbus_unregister_interface(conn, APP_PATH, PROFILE_INTERFACE);
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 }
 
@@ -1033,18 +1056,20 @@ static void unregister_app_reply(DBusMessage *message, void *user_data)
        if (dbus_set_error_from_message(&error, message) == TRUE) {
                bt_shell_printf("Failed to unregister application: %s\n", error.name);
                dbus_error_free(&error);
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        bt_shell_printf("Application unregistered\n");
 
        if (!uuids)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 
        g_list_free_full(uuids, g_free);
        uuids = NULL;
 
        g_dbus_unregister_interface(conn, APP_PATH, PROFILE_INTERFACE);
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void unregister_app_setup(DBusMessageIter *iter, void *user_data)
@@ -1061,7 +1086,7 @@ void gatt_unregister_app(DBusConnection *conn, GDBusProxy *proxy)
        l = g_list_find_custom(managers, proxy, match_proxy);
        if (!l) {
                bt_shell_printf("Unable to find GattManager proxy\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        if (g_dbus_proxy_method_call(l->data, "UnregisterApplication",
@@ -1069,7 +1094,7 @@ void gatt_unregister_app(DBusConnection *conn, GDBusProxy *proxy)
                                                unregister_app_reply, conn,
                                                NULL) == FALSE) {
                bt_shell_printf("Failed unregister profile\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 }
 
@@ -1190,7 +1215,7 @@ void gatt_register_service(DBusConnection *conn, GDBusProxy *proxy,
                                        service_free) == FALSE) {
                bt_shell_printf("Failed to register service object\n");
                service_free(service);
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        print_service(service, COLORED_NEW);
@@ -1199,6 +1224,8 @@ void gatt_register_service(DBusConnection *conn, GDBusProxy *proxy,
 
        bt_shell_prompt_input(service->path, "Primary (yes/no):", service_set_primary,
                        service);
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static struct service *service_find(const char *pattern)
@@ -1228,7 +1255,7 @@ void gatt_unregister_service(DBusConnection *conn, GDBusProxy *proxy,
        service = service_find(argv[1]);
        if (!service) {
                bt_shell_printf("Failed to unregister service object\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        local_services = g_list_remove(local_services, service);
@@ -1237,6 +1264,8 @@ void gatt_unregister_service(DBusConnection *conn, GDBusProxy *proxy,
 
        g_dbus_unregister_interface(service->conn, service->path,
                                                SERVICE_INTERFACE);
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static gboolean chrc_get_uuid(const GDBusPropertyTable *property,
@@ -1672,7 +1701,7 @@ void gatt_register_chrc(DBusConnection *conn, GDBusProxy *proxy,
 
        if (!local_services) {
                bt_shell_printf("No service registered\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        service = g_list_last(local_services)->data;
@@ -1688,7 +1717,7 @@ void gatt_register_chrc(DBusConnection *conn, GDBusProxy *proxy,
                                        chrc, chrc_free) == FALSE) {
                bt_shell_printf("Failed to register characteristic object\n");
                chrc_free(chrc);
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        service->chrcs = g_list_append(service->chrcs, chrc);
@@ -1696,6 +1725,8 @@ void gatt_register_chrc(DBusConnection *conn, GDBusProxy *proxy,
        print_chrc(chrc, COLORED_NEW);
 
        bt_shell_prompt_input(chrc->path, "Enter value:", chrc_set_value, chrc);
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static struct chrc *chrc_find(const char *pattern)
@@ -1731,12 +1762,14 @@ void gatt_unregister_chrc(DBusConnection *conn, GDBusProxy *proxy,
        chrc = chrc_find(argv[1]);
        if (!chrc) {
                bt_shell_printf("Failed to unregister characteristic object\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        chrc->service->chrcs = g_list_remove(chrc->service->chrcs, chrc);
 
        chrc_unregister(chrc);
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static DBusMessage *desc_read_value(DBusConnection *conn, DBusMessage *msg,
@@ -1859,14 +1892,14 @@ void gatt_register_desc(DBusConnection *conn, GDBusProxy *proxy,
 
        if (!local_services) {
                bt_shell_printf("No service registered\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        service = g_list_last(local_services)->data;
 
        if (!service->chrcs) {
                bt_shell_printf("No characteristic registered\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        desc = g_new0(struct desc, 1);
@@ -1880,7 +1913,7 @@ void gatt_register_desc(DBusConnection *conn, GDBusProxy *proxy,
                                        desc, desc_free) == FALSE) {
                bt_shell_printf("Failed to register descriptor object\n");
                desc_free(desc);
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        desc->chrc->descs = g_list_append(desc->chrc->descs, desc);
@@ -1888,6 +1921,8 @@ void gatt_register_desc(DBusConnection *conn, GDBusProxy *proxy,
        print_desc(desc, COLORED_NEW);
 
        bt_shell_prompt_input(desc->path, "Enter value:", desc_set_value, desc);
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static struct desc *desc_find(const char *pattern)
@@ -1928,10 +1963,12 @@ void gatt_unregister_desc(DBusConnection *conn, GDBusProxy *proxy,
        desc = desc_find(argv[1]);
        if (!desc) {
                bt_shell_printf("Failed to unregister descriptor object\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        desc->chrc->descs = g_list_remove(desc->chrc->descs, desc);
 
        desc_unregister(desc);
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
index 19e1a60..49dda5f 100644 (file)
@@ -827,6 +827,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[])
@@ -852,7 +854,7 @@ static void cmd_show(int argc, char *argv[])
        }
 
        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);
 
@@ -878,6 +880,8 @@ static void cmd_show(int argc, char *argv[])
 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
        print_property(proxy, "Advertising");
 #endif
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void cmd_select(int argc, char *argv[])
@@ -887,14 +891,16 @@ 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);
 
        default_ctrl = adapter;
        print_adapter(adapter->proxy, NULL);
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void cmd_devices(int argc, char *argv[])
@@ -902,13 +908,15 @@ static void cmd_devices(int argc, char *argv[])
        GList *ll;
 
        if (check_default_ctrl() == FALSE)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 
        for (ll = g_list_first(default_ctrl->devices);
                        ll; ll = g_list_next(ll)) {
                GDBusProxy *proxy = ll->data;
                print_device(proxy, NULL);
        }
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void cmd_paired_devices(int argc, char *argv[])
@@ -916,7 +924,7 @@ static void cmd_paired_devices(int argc, char *argv[])
        GList *ll;
 
        if (check_default_ctrl() == FALSE)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 
        for (ll = g_list_first(default_ctrl->devices);
                        ll; ll = g_list_next(ll)) {
@@ -933,16 +941,21 @@ static void cmd_paired_devices(int argc, char *argv[])
 
                print_device(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_system_alias(int argc, char *argv[])
@@ -1019,6 +1032,8 @@ static void cmd_pairable(int argc, char *argv[])
                return;
 
        g_free(str);
+
+       return bt_shell_noninteractive_quit(EXIT_FAILURE);
 }
 
 static void cmd_discoverable(int argc, char *argv[])
@@ -1041,6 +1056,8 @@ static void cmd_discoverable(int argc, char *argv[])
                return;
 
        g_free(str);
+
+       return bt_shell_noninteractive_quit(EXIT_FAILURE);
 }
 
 static void cmd_agent(int argc, char *argv[])
@@ -1050,7 +1067,7 @@ static void cmd_agent(int argc, char *argv[])
 
        if (!parse_argument(argc, argv, agent_arguments, "capability",
                                                &enable, &capability))
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        if (enable == TRUE) {
                g_free(auto_register_agent);
@@ -1070,6 +1087,8 @@ static void cmd_agent(int argc, char *argv[])
                else
                        bt_shell_printf("Agent registration disabled\n");
        }
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void cmd_default_agent(int argc, char *argv[])
@@ -1088,10 +1107,11 @@ 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");
+       bt_shell_printf("Discovery %s\n", enable ? "started" : "stopped");
+       /* Leave the discovery running even on noninteractive mode */
 }
 
 static void append_variant(DBusMessageIter *iter, int type, void *val)
@@ -1238,12 +1258,14 @@ 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);
        }
 
        filter.set = true;
 
        bt_shell_printf("SetDiscoveryFilter success\n");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void set_discovery_filter(void)
@@ -1255,7 +1277,7 @@ static void set_discovery_filter(void)
                set_discovery_filter_setup, set_discovery_filter_reply,
                &filter, NULL) == FALSE) {
                bt_shell_printf("Failed to set discovery filter\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        filter.set = true;
@@ -1283,7 +1305,7 @@ static void cmd_scan(int argc, char *argv[])
                                GUINT_TO_POINTER(enable), NULL) == FALSE) {
                bt_shell_printf("Failed to %s discovery\n",
                                        enable == TRUE ? "start" : "stop");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 }
 
@@ -1308,7 +1330,7 @@ static void cmd_scan_filter_uuids(int argc, char *argv[])
        filter.uuids = g_strdupv(&argv[1]);
        if (!filter.uuids) {
                bt_shell_printf("Failed to parse input\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        filter.uuids_len = g_strv_length(filter.uuids);
@@ -1518,10 +1540,10 @@ static void cmd_info(int argc, char *argv[])
 
        proxy = find_device(argc, argv);
        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);
 
@@ -1554,6 +1576,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 void pair_reply(DBusMessage *message, void *user_data)
@@ -1565,10 +1589,12 @@ static void pair_reply(DBusMessage *message, void *user_data)
        if (dbus_set_error_from_message(&error, message) == TRUE) {
                bt_shell_printf("Failed to pair: %s\n", error.name);
                dbus_error_free(&error);
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        bt_shell_printf("Pairing successful\n");
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void cmd_pair(int argc, char *argv[])
@@ -1577,12 +1603,12 @@ static void cmd_pair(int argc, char *argv[])
 
        proxy = find_device(argc, argv);
        if (!proxy)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        if (g_dbus_proxy_method_call(proxy, "Pair", NULL, pair_reply,
                                                        NULL, NULL) == FALSE) {
                bt_shell_printf("Failed to pair\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        bt_shell_printf("Attempting to pair with %s\n", argv[1]);
@@ -1596,7 +1622,7 @@ static void cmd_trust(int argc, char *argv[])
 
        proxy = find_device(argc, argv);
        if (!proxy)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        trusted = TRUE;
 
@@ -1608,6 +1634,8 @@ static void cmd_trust(int argc, char *argv[])
                return;
 
        g_free(str);
+
+       return bt_shell_noninteractive_quit(EXIT_FAILURE);
 }
 
 static void cmd_untrust(int argc, char *argv[])
@@ -1618,7 +1646,7 @@ static void cmd_untrust(int argc, char *argv[])
 
        proxy = find_device(argc, argv);
        if (!proxy)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        trusted = FALSE;
 
@@ -1630,6 +1658,8 @@ static void cmd_untrust(int argc, char *argv[])
                return;
 
        g_free(str);
+
+       return bt_shell_noninteractive_quit(EXIT_FAILURE);
 }
 
 static void cmd_block(int argc, char *argv[])
@@ -1640,7 +1670,7 @@ static void cmd_block(int argc, char *argv[])
 
        proxy = find_device(argc, argv);
        if (!proxy)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        blocked = TRUE;
 
@@ -1652,6 +1682,8 @@ static void cmd_block(int argc, char *argv[])
                return;
 
        g_free(str);
+
+       return bt_shell_noninteractive_quit(EXIT_FAILURE);
 }
 
 static void cmd_unblock(int argc, char *argv[])
@@ -1662,7 +1694,7 @@ static void cmd_unblock(int argc, char *argv[])
 
        proxy = find_device(argc, argv);
        if (!proxy)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        blocked = FALSE;
 
@@ -1674,6 +1706,8 @@ static void cmd_unblock(int argc, char *argv[])
                return;
 
        g_free(str);
+
+       return bt_shell_noninteractive_quit(EXIT_FAILURE);
 }
 
 static void remove_device_reply(DBusMessage *message, void *user_data)
@@ -1685,10 +1719,11 @@ static void remove_device_reply(DBusMessage *message, void *user_data)
        if (dbus_set_error_from_message(&error, message) == TRUE) {
                bt_shell_printf("Failed to remove device: %s\n", error.name);
                dbus_error_free(&error);
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        bt_shell_printf("Device has been removed\n");
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void remove_device_setup(DBusMessageIter *iter, void *user_data)
@@ -1713,6 +1748,7 @@ static void remove_device(GDBusProxy *proxy)
                                                path, g_free) == FALSE) {
                bt_shell_printf("Failed to remove device\n");
                g_free(path);
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 }
 
@@ -1754,12 +1790,13 @@ static void connect_reply(DBusMessage *message, void *user_data)
        if (dbus_set_error_from_message(&error, message) == TRUE) {
                bt_shell_printf("Failed to connect: %s\n", error.name);
                dbus_error_free(&error);
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        bt_shell_printf("Connection successful\n");
 
        set_default_device(proxy, NULL);
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void cmd_connect(int argc, char *argv[])
@@ -1767,18 +1804,18 @@ static void cmd_connect(int argc, char *argv[])
        GDBusProxy *proxy;
 
        if (check_default_ctrl() == FALSE)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        proxy = find_proxy_by_address(default_ctrl->devices, argv[1]);
        if (!proxy) {
                bt_shell_printf("Device %s not available\n", argv[1]);
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        if (g_dbus_proxy_method_call(proxy, "Connect", NULL, connect_reply,
                                                        proxy, NULL) == FALSE) {
                bt_shell_printf("Failed to connect\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        bt_shell_printf("Attempting to connect to %s\n", argv[1]);
@@ -1794,7 +1831,7 @@ 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("Successful disconnected\n");
@@ -1803,6 +1840,8 @@ static void disconn_reply(DBusMessage *message, void *user_data)
                return;
 
        set_default_device(NULL, NULL);
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void cmd_disconn(int argc, char *argv[])
@@ -1811,12 +1850,12 @@ static void cmd_disconn(int argc, char *argv[])
 
        proxy = find_device(argc, argv);
        if (!proxy)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        if (g_dbus_proxy_method_call(proxy, "Disconnect", NULL, disconn_reply,
                                                        proxy, NULL) == FALSE) {
                bt_shell_printf("Failed to disconnect\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        if (argc < 2 || strlen(argv[1]) == 0) {
@@ -1837,9 +1876,11 @@ static void cmd_list_attributes(int argc, char *argv[])
 
        proxy = find_device(argc, argv);
        if (!proxy)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        gatt_list_attributes(g_dbus_proxy_get_path(proxy));
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void cmd_set_alias(int argc, char *argv[])
@@ -1859,6 +1900,8 @@ static void cmd_set_alias(int argc, char *argv[])
                return;
 
        g_free(name);
+
+       return bt_shell_noninteractive_quit(EXIT_FAILURE);
 }
 
 static void cmd_select_attribute(int argc, char *argv[])
@@ -1871,8 +1914,12 @@ static void cmd_select_attribute(int argc, char *argv[])
        }
 
        proxy = gatt_select_attribute(default_attr, argv[1]);
-       if (proxy)
+       if (proxy) {
                set_default_attribute(proxy);
+               return bt_shell_noninteractive_quit(EXIT_SUCCESS);
+       }
+
+       return bt_shell_noninteractive_quit(EXIT_FAILURE);
 }
 
 static struct GDBusProxy *find_attribute(int argc, char *argv[])
@@ -1903,10 +1950,10 @@ static void cmd_attribute_info(int argc, char *argv[])
 
        proxy = find_attribute(argc, argv);
        if (!proxy)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        if (g_dbus_proxy_get_property(proxy, "UUID", &iter) == FALSE)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        dbus_message_iter_get_basic(&iter, &uuid);
 
@@ -1938,13 +1985,15 @@ static void cmd_attribute_info(int argc, char *argv[])
                print_property(proxy, "Characteristic");
                print_property(proxy, "Value");
        }
+
+       return bt_shell_noninteractive_quit(EXIT_SUCCESS);
 }
 
 static void cmd_read(int argc, char *argv[])
 {
        if (!default_attr) {
                bt_shell_printf("No attribute selected\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        gatt_read_attribute(default_attr);
@@ -1954,7 +2003,7 @@ static void cmd_write(int argc, char *argv[])
 {
        if (!default_attr) {
                bt_shell_printf("No attribute selected\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        gatt_write_attribute(default_attr, argv[1]);
@@ -1964,7 +2013,7 @@ static void cmd_acquire_write(int argc, char *argv[])
 {
        if (!default_attr) {
                bt_shell_printf("No attribute selected\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        gatt_acquire_write(default_attr, argv[1]);
@@ -1974,7 +2023,7 @@ static void cmd_release_write(int argc, char *argv[])
 {
        if (!default_attr) {
                bt_shell_printf("No attribute selected\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        gatt_release_write(default_attr, argv[1]);
@@ -1984,7 +2033,7 @@ static void cmd_acquire_notify(int argc, char *argv[])
 {
        if (!default_attr) {
                bt_shell_printf("No attribute selected\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        gatt_acquire_notify(default_attr, argv[1]);
@@ -1994,7 +2043,7 @@ static void cmd_release_notify(int argc, char *argv[])
 {
        if (!default_attr) {
                bt_shell_printf("No attribute selected\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        gatt_release_notify(default_attr, argv[1]);
@@ -2009,7 +2058,7 @@ static void cmd_notify(int argc, char *argv[])
 
        if (!default_attr) {
                bt_shell_printf("No attribute selected\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        gatt_notify_attribute(default_attr, enable ? true : false);
@@ -2018,7 +2067,7 @@ static void cmd_notify(int argc, char *argv[])
 static void cmd_register_app(int argc, char *argv[])
 {
        if (check_default_ctrl() == FALSE)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        gatt_register_app(dbus_conn, default_ctrl->proxy, argc, argv);
 }
@@ -2026,7 +2075,7 @@ static void cmd_register_app(int argc, char *argv[])
 static void cmd_unregister_app(int argc, char *argv[])
 {
        if (check_default_ctrl() == FALSE)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        gatt_unregister_app(dbus_conn, default_ctrl->proxy);
 }
@@ -2034,7 +2083,7 @@ static void cmd_unregister_app(int argc, char *argv[])
 static void cmd_register_service(int argc, char *argv[])
 {
        if (check_default_ctrl() == FALSE)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        gatt_register_service(dbus_conn, default_ctrl->proxy, argc, argv);
 }
@@ -2042,7 +2091,7 @@ static void cmd_register_service(int argc, char *argv[])
 static void cmd_unregister_service(int argc, char *argv[])
 {
        if (check_default_ctrl() == FALSE)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        gatt_unregister_service(dbus_conn, default_ctrl->proxy, argc, argv);
 }
@@ -2050,7 +2099,7 @@ static void cmd_unregister_service(int argc, char *argv[])
 static void cmd_register_characteristic(int argc, char *argv[])
 {
        if (check_default_ctrl() == FALSE)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        gatt_register_chrc(dbus_conn, default_ctrl->proxy, argc, argv);
 }
@@ -2058,7 +2107,7 @@ static void cmd_register_characteristic(int argc, char *argv[])
 static void cmd_unregister_characteristic(int argc, char *argv[])
 {
        if (check_default_ctrl() == FALSE)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        gatt_unregister_chrc(dbus_conn, default_ctrl->proxy, argc, argv);
 }
@@ -2066,7 +2115,7 @@ static void cmd_unregister_characteristic(int argc, char *argv[])
 static void cmd_register_descriptor(int argc, char *argv[])
 {
        if (check_default_ctrl() == FALSE)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        gatt_register_desc(dbus_conn, default_ctrl->proxy, argc, argv);
 }
@@ -2074,7 +2123,7 @@ static void cmd_register_descriptor(int argc, char *argv[])
 static void cmd_unregister_descriptor(int argc, char *argv[])
 {
        if (check_default_ctrl() == FALSE)
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
 
        gatt_unregister_desc(dbus_conn, default_ctrl->proxy, argc, argv);
 }
@@ -2190,7 +2239,7 @@ static void cmd_advertise(int argc, char *argv[])
 
        if (!default_ctrl || !default_ctrl->ad_proxy) {
                bt_shell_printf("LEAdvertisingManager not found\n");
-               return;
+               bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        if (enable == TRUE)
@@ -2277,7 +2326,7 @@ static void cmd_advertise_appearance(int argc, char *argv[])
        value = strtol(argv[1], &endptr, 0);
        if (!endptr || *endptr != '\0' || value > UINT16_MAX) {
                bt_shell_printf("Invalid argument\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        ad_advertise_local_appearance(dbus_conn, &value);
@@ -2296,7 +2345,7 @@ static void cmd_advertise_duration(int argc, char *argv[])
        value = strtol(argv[1], &endptr, 0);
        if (!endptr || *endptr != '\0' || value > UINT16_MAX) {
                bt_shell_printf("Invalid argument\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        ad_advertise_duration(dbus_conn, &value);
@@ -2315,7 +2364,7 @@ static void cmd_advertise_timeout(int argc, char *argv[])
        value = strtol(argv[1], &endptr, 0);
        if (!endptr || *endptr != '\0' || value > UINT16_MAX) {
                bt_shell_printf("Invalid argument\n");
-               return;
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
        }
 
        ad_advertise_timeout(dbus_conn, &value);