enum connman_device_mode mode;
connman_bool_t secondary;
connman_bool_t powered;
+ connman_bool_t powered_persistent;
connman_bool_t carrier;
connman_bool_t scanning;
connman_bool_t disconnected;
dbus_message_iter_get_basic(&value, &powered);
+ device->powered_persistent = powered;
+
+ __connman_storage_save_device(device);
+
if (device->powered == powered)
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
if (device->scan_interval != interval) {
device->scan_interval = interval;
+ __connman_storage_save_device(device);
+
reset_scan_trigger(device);
}
} else if (g_str_has_prefix(name, "IPv4.") == TRUE) {
} else
return __connman_error_invalid_property(msg);
- __connman_storage_save_device(device);
-
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
}
CONNMAN_DEVICE_INTERFACE);
}
-static void device_enable(struct connman_device *device)
-{
- DBG("device %p", device);
-
- if (device->powered == TRUE)
- return;
-
- if (device->driver->enable) {
- if (device->driver->enable(device) == 0) {
- enum connman_service_type type;
-
- device->powered = TRUE;
-
- type = __connman_device_get_service_type(device);
- __connman_notifier_enable(type);
- }
- }
-}
-
-static void device_disable(struct connman_device *device)
-{
- DBG("device %p", device);
-
- if (device->powered == FALSE)
- return;
-
- g_hash_table_remove_all(device->networks);
-
- if (device->driver->disable) {
- if (device->driver->disable(device) == 0) {
- enum connman_service_type type;
-
- device->powered = FALSE;
-
- type = __connman_device_get_service_type(device);
- __connman_notifier_disable(type);
- }
- }
-}
-
static int setup_device(struct connman_device *device)
{
int err;
break;
}
- device_enable(device);
+ if (device->powered_persistent == TRUE)
+ __connman_device_enable(device);
return 0;
}
{
DBG("device %p", device);
- device_disable(device);
+ __connman_device_disable(device);
switch (device->mode) {
case CONNMAN_DEVICE_MODE_UNKNOWN:
device->mode = CONNMAN_DEVICE_MODE_UNKNOWN;
device->secondary = FALSE;
+ device->powered_persistent = TRUE;
+
switch (type) {
case CONNMAN_DEVICE_TYPE_UNKNOWN:
case CONNMAN_DEVICE_TYPE_VENDOR:
int __connman_device_enable(struct connman_device *device)
{
+ enum connman_service_type type;
+ int err;
+
+ DBG("device %p", device);
+
if (!device->driver || !device->driver->enable)
return -EOPNOTSUPP;
if (device->powered == TRUE)
return -EALREADY;
- device_enable(device);
+ err = device->driver->enable(device);
+ if (err < 0)
+ return err;
+
+ device->powered = TRUE;
+
+ type = __connman_device_get_service_type(device);
+ __connman_notifier_enable(type);
return 0;
}
+int __connman_device_enable_persistent(struct connman_device *device)
+{
+ DBG("device %p", device);
+
+ device->powered_persistent = TRUE;
+
+ __connman_storage_save_device(device);
+
+ return __connman_device_enable(device);
+}
+
int __connman_device_disable(struct connman_device *device)
{
+ enum connman_service_type type;
+ int err;
+
+ DBG("device %p", device);
+
if (!device->driver || !device->driver->disable)
return -EOPNOTSUPP;
if (device->powered == FALSE)
return -ENOLINK;
- device_disable(device);
+ g_hash_table_remove_all(device->networks);
+
+ err = device->driver->disable(device);
+ if (err < 0)
+ return err;
+
+ device->powered = FALSE;
+
+ type = __connman_device_get_service_type(device);
+ __connman_notifier_disable(type);
return 0;
}
+int __connman_device_disable_persistent(struct connman_device *device)
+{
+ DBG("device %p", device);
+
+ device->powered_persistent = FALSE;
+
+ __connman_storage_save_device(device);
+
+ return __connman_device_disable(device);
+}
+
int __connman_device_connect(struct connman_device *device)
{
DBG("device %p", device);
static int device_load(struct connman_device *device)
{
GKeyFile *keyfile;
+ GError *error = NULL;
gchar *pathname, *identifier, *data = NULL;
gsize length;
+ connman_bool_t powered;
int val;
DBG("device %p", device);
if (identifier == NULL)
goto done;
+ powered = g_key_file_get_boolean(keyfile, identifier,
+ "Powered", &error);
+ if (error == NULL)
+ device->powered_persistent = powered;
+ g_clear_error(&error);
+
switch (device->mode) {
case CONNMAN_DEVICE_MODE_UNKNOWN:
case CONNMAN_DEVICE_MODE_TRANSPORT_IP:
case CONNMAN_DEVICE_MODE_NETWORK_SINGLE:
case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE:
val = g_key_file_get_integer(keyfile, identifier,
- "ScanInterval", NULL);
- if (val > 0)
+ "ScanInterval", &error);
+ if (error == NULL && val > 0)
device->scan_interval = val;
+ g_clear_error(&error);
break;
}
if (identifier == NULL)
goto done;
+ g_key_file_set_boolean(keyfile, identifier,
+ "Powered", device->powered_persistent);
+
switch (device->mode) {
case CONNMAN_DEVICE_MODE_UNKNOWN:
case CONNMAN_DEVICE_MODE_TRANSPORT_IP: