+static void __netconfig_cleanup_eapol()
+{
+ g_free(eapol.eap_type);
+ g_free(eapol.identity);
+ g_free(eapol.anonymous_identity);
+ g_free(eapol.ca_cert_file);
+ g_free(eapol.client_cert_file);
+ g_free(eapol.private_key_file);
+ g_free(eapol.private_key_password);
+ g_free(eapol.pac_file);
+ g_free(eapol.phase2);
+ eapol.phase1 = -1;
+}
+
+static int __netconfig_set_eapol_property(const gchar *service, gboolean use_eapol)
+{
+ GVariant *params = NULL;
+ GVariant *message = NULL;
+ GVariantBuilder *builder;
+
+ const char *prop_eap_on_ethernet = "EapOverEthernet";
+
+ builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+
+ g_variant_builder_add(builder, "{sv}", "UseEapol", g_variant_new_boolean(use_eapol));
+
+ if (use_eapol) {
+ if (eapol.eap_type)
+ g_variant_builder_add(builder, "{sv}", "EAP",
+ g_variant_new_string(eapol.eap_type));
+ if (eapol.identity)
+ g_variant_builder_add(builder, "{sv}", "Identity",
+ g_variant_new_string(eapol.identity));
+ if (eapol.anonymous_identity)
+ g_variant_builder_add(builder, "{sv}", "AnonymousIdentity",
+ g_variant_new_string(eapol.anonymous_identity));
+ if (eapol.ca_cert_file)
+ g_variant_builder_add(builder, "{sv}", "CACertFile",
+ g_variant_new_string(eapol.ca_cert_file));
+ if (eapol.client_cert_file)
+ g_variant_builder_add(builder, "{sv}", "ClientCertFile",
+ g_variant_new_string(eapol.client_cert_file));
+ if (eapol.private_key_file)
+ g_variant_builder_add(builder, "{sv}", "PrivateKeyFile",
+ g_variant_new_string(eapol.private_key_file));
+ if (eapol.private_key_password)
+ g_variant_builder_add(builder, "{sv}", "PrivateKeyPassphrase",
+ g_variant_new_string(eapol.private_key_password));
+ if (eapol.phase2)
+ g_variant_builder_add(builder, "{sv}", "Phase2",
+ g_variant_new_string(eapol.phase2));
+
+ if (eapol.phase1 >= 0)
+ g_variant_builder_add(builder, "{sv}", "Phase1",
+ g_variant_new_int32(eapol.phase1));
+
+ if (eapol.pac_file)
+ g_variant_builder_add(builder, "{sv}", "PacFile",
+ g_variant_new_string(eapol.pac_file));
+
+ __netconfig_cleanup_eapol();
+ }
+
+ params = g_variant_new("(sv)", prop_eap_on_ethernet, g_variant_builder_end(builder));
+ g_variant_builder_unref(builder);
+
+ message = netconfig_invoke_dbus_method(CONNMAN_SERVICE, service,
+ CONNMAN_SERVICE_INTERFACE, "SetProperty", params);
+ if (message == NULL) {
+ g_variant_unref(message);
+ return -1;
+ }
+
+ g_variant_unref(message);
+
+ return 0;
+}
+