#include <config.h>
#endif
+#include <stdio.h>
+#include <string.h>
#include <gdbus.h>
#include "connman.h"
switch (error) {
case CONNMAN_SERVICE_ERROR_UNKNOWN:
break;
- case CONNMAN_SERVICE_ERROR_DHCP_FAILED:
- return "dhcp-failed";
case CONNMAN_SERVICE_ERROR_PIN_MISSING:
return "pin-missing";
+ case CONNMAN_SERVICE_ERROR_DHCP_FAILED:
+ return "dhcp-failed";
+ case CONNMAN_SERVICE_ERROR_CONNECT_FAILED:
+ return "connect-failed";
}
return NULL;
return -EISCONN;
if (service->network != NULL) {
- if (service->hidden == TRUE)
- return -EINVAL;
+ unsigned int ssid_len;
+ if (connman_network_get_blob(service->network, "WiFi.SSID",
+ &ssid_len) == NULL)
+ return -EINVAL;
connman_network_set_string(service->network,
"WiFi.Passphrase", service->passphrase);
unsigned int __connman_service_get_order(struct connman_service *service)
{
+ GSequenceIter *iter;
+
if (service == NULL)
return 0;
+ if (service->favorite == FALSE)
+ return 0;
+
+ iter = g_hash_table_lookup(service_hash, service->identifier);
+ if (iter != NULL) {
+ if (g_sequence_iter_get_position(iter) == 0)
+ return 1;
+ }
+
return service->order;
}
case CONNMAN_NETWORK_TYPE_VENDOR:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_PAN:
case CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN:
- case CONNMAN_NETWORK_TYPE_HSO:
break;
+ case CONNMAN_NETWORK_TYPE_MBM:
+ case CONNMAN_NETWORK_TYPE_HSO:
+ return CONNMAN_SERVICE_TYPE_CELLULAR;
case CONNMAN_NETWORK_TYPE_WIFI:
return CONNMAN_SERVICE_TYPE_WIFI;
case CONNMAN_NETWORK_TYPE_WIMAX:
gchar *pathname, *data = NULL;
gsize length;
gchar *str;
+ unsigned int ssid_len;
+ int err = 0;
DBG("service %p", service);
case CONNMAN_SERVICE_TYPE_ETHERNET:
break;
case CONNMAN_SERVICE_TYPE_WIFI:
+ if (service->name == NULL) {
+ gchar *name;
+
+ name = g_key_file_get_string(keyfile,
+ service->identifier, "Name", NULL);
+ if (name != NULL) {
+ g_free(service->name);
+ service->name = name;
+ }
+
+ if (service->network != NULL)
+ connman_network_set_name(service->network,
+ name);
+ }
+
+ if (service->network &&
+ connman_network_get_blob(service->network,
+ "WiFi.SSID", &ssid_len) == NULL) {
+ gchar *hex_ssid;
+
+ hex_ssid = g_key_file_get_string(keyfile,
+ service->identifier,
+ "SSID", NULL);
+
+ if (hex_ssid != NULL) {
+ gchar *ssid;
+ unsigned int i, j = 0, hex;
+ size_t hex_ssid_len = strlen(hex_ssid);
+
+ ssid = g_try_malloc0(hex_ssid_len / 2);
+ if (ssid == NULL) {
+ g_free(hex_ssid);
+ err = -ENOMEM;
+ goto done;
+ }
+
+ for (i = 0; i < hex_ssid_len; i += 2) {
+ sscanf(hex_ssid + i, "%02x", &hex);
+ ssid[j++] = hex;
+ }
+
+ connman_network_set_blob(service->network,
+ "WiFi.SSID", ssid, hex_ssid_len / 2);
+ }
+
+ g_free(hex_ssid);
+ }
+ /* fall through */
+
case CONNMAN_SERVICE_TYPE_WIMAX:
case CONNMAN_SERVICE_TYPE_BLUETOOTH:
case CONNMAN_SERVICE_TYPE_CELLULAR:
__connman_ipconfig_load(service->ipconfig, keyfile,
service->identifier, "IPv4.");
+done:
g_key_file_free(keyfile);
- return 0;
+ return err;
}
static int service_save(struct connman_service *service)
gchar *pathname, *data = NULL;
gsize length;
gchar *str;
+ int err = 0;
DBG("service %p", service);
case CONNMAN_SERVICE_TYPE_ETHERNET:
break;
case CONNMAN_SERVICE_TYPE_WIFI:
+ if (service->network) {
+ const unsigned char *ssid;
+ unsigned int ssid_len = 0;
+
+ ssid = connman_network_get_blob(service->network,
+ "WiFi.SSID", &ssid_len);
+
+ if (ssid != NULL && ssid_len > 0 && ssid[0] != '\0') {
+ char *identifier = service->identifier;
+ GString *str;
+ unsigned int i;
+
+ str = g_string_sized_new(ssid_len * 2);
+ if (str == NULL) {
+ err = -ENOMEM;
+ goto done;
+ }
+
+ for (i = 0; i < ssid_len; i++)
+ g_string_append_printf(str,
+ "%02x", ssid[i]);
+
+ g_key_file_set_string(keyfile, identifier,
+ "SSID", str->str);
+
+ g_string_free(str, TRUE);
+ }
+ }
+ /* fall through */
+
case CONNMAN_SERVICE_TYPE_WIMAX:
case CONNMAN_SERVICE_TYPE_BLUETOOTH:
case CONNMAN_SERVICE_TYPE_CELLULAR:
g_free(pathname);
- return 0;
+ return err;
}
static struct connman_storage service_storage = {