diff --git a/src/device.c b/src/device.c index 7560be29..a9ed3d92 100644 --- a/src/device.c +++ b/src/device.c @@ -526,27 +526,11 @@ static struct l_dbus_message *device_dbus_disconnect(struct l_dbus *dbus, { struct device *device = user_data; struct station *station = device->station; - int result; - l_debug(""); + if (!device->powered || !device->station) + return dbus_error_not_available(message); - /* - * Disconnect was triggered by the user, don't autoconnect. Wait for - * the user's explicit instructions to scan and connect to the network - */ - station_set_autoconnect(station, false); - - if (station->state == STATION_STATE_AUTOCONNECT || - station->state == STATION_STATE_DISCONNECTED) - return l_dbus_message_new_method_return(message); - - result = station_disconnect(station); - if (result < 0) - return dbus_error_from_errno(result, message); - - station->disconnect_pending = l_dbus_message_ref(message); - - return NULL; + return station_dbus_disconnect(dbus, message, station); } static struct l_dbus_message *device_get_networks(struct l_dbus *dbus, diff --git a/src/station.c b/src/station.c index f03bbfb8..a699beff 100644 --- a/src/station.c +++ b/src/station.c @@ -1436,6 +1436,34 @@ int station_disconnect(struct station *station) return 0; } +struct l_dbus_message *station_dbus_disconnect(struct l_dbus *dbus, + struct l_dbus_message *message, + void *user_data) +{ + struct station *station = user_data; + int result; + + l_debug(""); + + /* + * Disconnect was triggered by the user, don't autoconnect. Wait for + * the user's explicit instructions to scan and connect to the network + */ + station_set_autoconnect(station, false); + + if (station->state == STATION_STATE_AUTOCONNECT || + station->state == STATION_STATE_DISCONNECTED) + return l_dbus_message_new_method_return(message); + + result = station_disconnect(station); + if (result < 0) + return dbus_error_from_errno(result, message); + + station->disconnect_pending = l_dbus_message_ref(message); + + return NULL; +} + static void station_dbus_scan_triggered(int err, void *user_data) { struct station *station = user_data; diff --git a/src/station.h b/src/station.h index a5e5804a..6ef078e5 100644 --- a/src/station.h +++ b/src/station.h @@ -114,6 +114,9 @@ struct l_dbus_message *station_dbus_connect_hidden_network( struct l_dbus *dbus, struct l_dbus_message *message, void *user_data); +struct l_dbus_message *station_dbus_disconnect(struct l_dbus *dbus, + struct l_dbus_message *message, + void *user_data); struct l_dbus_message *station_dbus_scan(struct l_dbus *dbus, struct l_dbus_message *message, void *user_data);