static gboolean call_disconnect(gpointer user_data) { struct service_entry *entry = user_data; struct connman_service *service = entry->service; /* * TODO: We should mark this entry as pending work. In case * disconnect fails we just unassign this session from the * service and can't do anything later on it */ DBG("disconnect service %p", service); __connman_service_disconnect(service); return FALSE; }
static void cleanup_session(gpointer user_data) { struct connman_session *session = user_data; struct session_info *info = session->info; DBG("remove %s", session->session_path); g_slist_free(session->user_allowed_bearers); g_hash_table_destroy(session->service_hash); g_sequence_free(session->service_list); if (info->entry != NULL && info->entry->reason == CONNMAN_SESSION_REASON_CONNECT) { __connman_service_disconnect(info->entry->service); } free_session(session); }
int connman_device_disconnect_service(struct connman_device *device) { DBG("device %p", device); device->reconnect = false; if (device->network) { struct connman_service *service = connman_service_lookup_from_network(device->network); if (service) __connman_service_disconnect(service); else connman_network_set_connected(device->network, false); } return 0; }
int __connman_device_disable(struct connman_device *device) { int err; DBG("device %p", device); if (!device->driver || !device->driver->disable) return -EOPNOTSUPP; /* Ongoing power enable request */ if (device->powered_pending == PENDING_ENABLE) return -EBUSY; if (device->powered_pending == PENDING_DISABLE) return -EALREADY; if (device->powered_pending == PENDING_NONE && device->powered == FALSE) return -EALREADY; device->powered_pending = PENDING_DISABLE; device->reconnect = FALSE; if (device->network) { struct connman_service *service = connman_service_lookup_from_network(device->network); if (service != NULL) __connman_service_disconnect(service); else connman_network_set_connected(device->network, FALSE); } err = device->driver->disable(device); if (err == 0 || err == -EALREADY) { connman_device_set_powered(device, FALSE); goto done; } if (err == -EINPROGRESS) device->pending_timeout = g_timeout_add_seconds(4, device_pending_reset, device); done: return err; }
int connman_session_disconnect(struct connman_service *service) { DBG("service %p", service); return __connman_service_disconnect(service); }