static DBusMessage *connect_peer(DBusConnection *conn, DBusMessage *msg, void *user_data) { struct connman_peer *peer = user_data; GList *list, *start; int err; DBG("peer %p", peer); if (peer->pending) return __connman_error_in_progress(msg); list = g_hash_table_get_values(peers_table); start = list; for (; list; list = list->next) { struct connman_peer *temp = list->data; if (temp == peer || temp->device != peer->device) continue; if (is_connecting(temp) || is_connected(temp)) { if (peer_disconnect(temp) == -EINPROGRESS) { g_list_free(start); return __connman_error_in_progress(msg); } } } g_list_free(start); peer->pending = dbus_message_ref(msg); err = peer_connect(peer); if (err == -EINPROGRESS) return NULL; if (err < 0) { dbus_message_unref(peer->pending); peer->pending = NULL; return __connman_error_failed(msg, -err); } return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); }
static DBusMessage *set_property(DBusConnection *conn, DBusMessage *msg, void *data) { DBusMessageIter iter, value; const char *name; int type; DBG("conn %p", conn); if (dbus_message_iter_init(msg, &iter) == FALSE) return __connman_error_invalid_arguments(msg); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING) return __connman_error_invalid_arguments(msg); dbus_message_iter_get_basic(&iter, &name); dbus_message_iter_next(&iter); if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT) return __connman_error_invalid_arguments(msg); dbus_message_iter_recurse(&iter, &value); type = dbus_message_iter_get_arg_type(&value); if (g_str_equal(name, "OfflineMode") == TRUE) { connman_bool_t offlinemode; if (type != DBUS_TYPE_BOOLEAN) return __connman_error_invalid_arguments(msg); dbus_message_iter_get_basic(&value, &offlinemode); __connman_technology_set_offlinemode(offlinemode); } else if (g_str_equal(name, "SessionMode") == TRUE) { connman_bool_t sessionmode; if (type != DBUS_TYPE_BOOLEAN) return __connman_error_invalid_arguments(msg); dbus_message_iter_get_basic(&value, &sessionmode); if (session_mode_pending != NULL) return __connman_error_in_progress(msg); __connman_session_set_mode(sessionmode); if (sessionmode == TRUE && connman_state_idle == FALSE) { session_mode_pending = dbus_message_ref(msg); return NULL; } } else return __connman_error_invalid_property(msg); return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); }
DBusMessage *__connman_error_failed(DBusMessage *msg, int errnum) { const char *str = strerror(errnum); switch (errnum) { case ESRCH: return __connman_error_not_registered(msg); case ENXIO: return __connman_error_not_found(msg); case EACCES: return __connman_error_permission_denied(msg); case EEXIST: return __connman_error_already_exists(msg); case EINVAL: return __connman_error_invalid_arguments(msg); case ENOSYS: return __connman_error_not_implemented(msg); case ENOLINK: return __connman_error_no_carrier(msg); case ENOTUNIQ: return __connman_error_not_unique(msg); case EOPNOTSUPP: return __connman_error_not_supported(msg); case ECONNABORTED: return __connman_error_operation_aborted(msg); case EISCONN: return __connman_error_already_connected(msg); case ENOTCONN: return __connman_error_not_connected(msg); case ETIMEDOUT: return __connman_error_operation_timeout(msg); case EALREADY: case EINPROGRESS: return __connman_error_in_progress(msg); case ENOKEY: return __connman_error_passphrase_required(msg); } return g_dbus_create_error(msg, CONNMAN_ERROR_INTERFACE ".Failed", "%s", str); }
static DBusMessage *set_property(DBusConnection *conn, DBusMessage *msg, void *data) { struct connman_technology *technology = data; DBusMessageIter iter, value; const char *name; int type; DBG("conn %p", conn); if (dbus_message_iter_init(msg, &iter) == FALSE) return __connman_error_invalid_arguments(msg); dbus_message_iter_get_basic(&iter, &name); dbus_message_iter_next(&iter); dbus_message_iter_recurse(&iter, &value); type = dbus_message_iter_get_arg_type(&value); DBG("property %s", name); if (g_str_equal(name, "Tethering") == TRUE) { int err; connman_bool_t tethering; if (type != DBUS_TYPE_BOOLEAN) return __connman_error_invalid_arguments(msg); dbus_message_iter_get_basic(&value, &tethering); if (technology->tethering == tethering) return __connman_error_in_progress(msg); err = set_tethering(technology, tethering); if (err < 0) return __connman_error_failed(msg, -err); } else if (g_str_equal(name, "TetheringIdentifier") == TRUE) { const char *str; dbus_message_iter_get_basic(&value, &str); if (technology->type != CONNMAN_SERVICE_TYPE_WIFI) return __connman_error_not_supported(msg); technology->tethering_ident = g_strdup(str); } else if (g_str_equal(name, "TetheringPassphrase") == TRUE) { const char *str; dbus_message_iter_get_basic(&value, &str); if (technology->type != CONNMAN_SERVICE_TYPE_WIFI) return __connman_error_not_supported(msg); if (strlen(str) < 8) return __connman_error_invalid_arguments(msg); technology->tethering_passphrase = g_strdup(str); } else return __connman_error_invalid_property(msg); return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); }