79
static int connman_provider_load(struct connman_provider *provider)
87
DBG("provider %p", provider);
89
keyfile = __connman_storage_load_provider(provider->identifier);
93
settings = g_key_file_get_keys(keyfile, provider->identifier, &length,
95
if (settings == NULL) {
96
g_key_file_free(keyfile);
100
while (idx < length) {
102
DBG("found key %s", key);
104
value = g_key_file_get_string(keyfile,
105
provider->identifier,
107
connman_provider_set_string(provider, key, value);
112
g_strfreev(settings);
114
g_key_file_free(keyfile);
118
static int connman_provider_save(struct connman_provider *provider)
122
DBG("provider %p", provider);
124
keyfile = g_key_file_new();
128
g_key_file_set_string(keyfile, provider->identifier,
129
"Name", provider->name);
130
g_key_file_set_string(keyfile, provider->identifier,
131
"Type", provider->type);
132
g_key_file_set_string(keyfile, provider->identifier,
133
"Host", provider->host);
134
g_key_file_set_string(keyfile, provider->identifier,
135
"VPN.Domain", provider->domain);
137
if (provider->driver != NULL && provider->driver->save != NULL)
138
provider->driver->save(provider, keyfile);
140
__connman_storage_save_provider(keyfile, provider->identifier);
141
g_key_file_free(keyfile);
76
146
static struct connman_provider *connman_provider_lookup(const char *identifier)
78
148
struct connman_provider *provider = NULL;
85
struct connman_provider *connman_provider_ref(struct connman_provider *provider)
87
DBG("provider %p", provider);
89
if (connman_element_ref(&provider->element) == NULL)
95
void connman_provider_unref(struct connman_provider *provider)
97
DBG("provider %p", provider);
99
connman_element_unref(&provider->element);
102
155
static gboolean match_driver(struct connman_provider *provider,
103
156
struct connman_provider_driver *driver)
193
static void provider_remove(struct connman_provider *provider)
195
if (provider->driver != NULL) {
196
provider->driver->remove(provider);
197
provider->driver = NULL;
201
static int provider_register(struct connman_provider *provider)
203
connman_provider_load(provider);
204
return provider_probe(provider);
207
static void provider_unregister(struct connman_provider *provider)
209
provider_remove(provider);
212
struct connman_provider *connman_provider_ref(struct connman_provider *provider)
214
DBG("provider %p refcount %d", provider, provider->refcount + 1);
216
__sync_fetch_and_add(&provider->refcount, 1);
221
static void provider_destruct(struct connman_provider *provider)
223
DBG("provider %p", provider);
225
g_free(provider->name);
226
g_free(provider->type);
227
g_free(provider->host);
228
g_free(provider->domain);
229
g_free(provider->identifier);
230
g_hash_table_destroy(provider->routes);
231
g_hash_table_destroy(provider->setting_strings);
234
void connman_provider_unref(struct connman_provider *provider)
236
DBG("provider %p refcount %d", provider, provider->refcount - 1);
238
if (__sync_fetch_and_sub(&provider->refcount, 1) != 1)
241
provider_remove(provider);
243
provider_destruct(provider);
140
246
static int provider_indicate_state(struct connman_provider *provider,
141
247
enum connman_service_state state)
143
249
DBG("state %d", state);
145
__connman_service_indicate_state(provider->vpn_service, state,
251
__connman_service_ipconfig_indicate_state(provider->vpn_service, state,
146
252
CONNMAN_IPCONFIG_TYPE_IPV4);
148
return __connman_service_indicate_state(provider->vpn_service, state,
149
CONNMAN_IPCONFIG_TYPE_IPV6);
254
return __connman_service_ipconfig_indicate_state(provider->vpn_service,
255
state, CONNMAN_IPCONFIG_TYPE_IPV6);
152
258
int __connman_provider_disconnect(struct connman_provider *provider)
219
325
if (g_strcmp0(srv_path, path) == 0) {
220
326
DBG("Removing VPN %s", provider->identifier);
328
provider_unregister(provider);
221
329
g_hash_table_remove(provider_hash,
222
330
provider->identifier);
233
341
struct connman_route *route = value;
234
342
struct connman_provider *provider = user_data;
235
int index = provider->element.index;
343
int index = provider->index;
237
345
if (route->family == AF_INET6) {
238
346
unsigned char prefix_len = atoi(route->netmask);
338
return __connman_service_indicate_error(provider->vpn_service,
448
ret = __connman_service_indicate_error(provider->vpn_service,
450
path = __connman_service_get_path(provider->vpn_service);
451
__connman_provider_remove(path);
342
456
static void unregister_provider(gpointer data)
349
463
provider->vpn_service = NULL;
350
464
__connman_service_put(service);
352
connman_element_unregister(&provider->element);
353
466
connman_provider_unref(provider);
356
static void provider_destruct(struct connman_element *element)
358
struct connman_provider *provider = element->private;
360
DBG("provider %p", provider);
362
g_free(provider->name);
363
g_free(provider->type);
364
g_free(provider->domain);
365
g_free(provider->identifier);
366
g_hash_table_destroy(provider->routes);
369
469
static void destroy_route(gpointer user_data)
371
471
struct connman_route *route = user_data;
381
481
DBG("provider %p", provider);
383
__connman_element_initialize(&provider->element);
385
provider->element.private = provider;
386
provider->element.destruct = provider_destruct;
388
484
provider->name = NULL;
389
485
provider->type = NULL;
390
486
provider->domain = NULL;
391
487
provider->identifier = NULL;
392
488
provider->routes = g_hash_table_new_full(g_direct_hash, g_direct_equal,
393
489
NULL, destroy_route);
490
provider->setting_strings = g_hash_table_new_full(g_str_hash, g_str_equal,
396
494
static struct connman_provider *connman_provider_new(void)
426
526
g_hash_table_insert(provider_hash, provider->identifier, provider);
428
provider->element.name = g_strdup(identifier);
429
connman_element_register(&provider->element, NULL);
528
provider->name = g_strdup(identifier);
451
550
struct connman_provider *provider;
452
551
DBusMessageIter iter, array;
453
const char *type = NULL, *name = NULL, *service_path = NULL;
552
const char *type = NULL, *name = NULL, *service_path;
454
553
const char *host = NULL, *domain = NULL;
456
gboolean created = FALSE;
459
557
dbus_message_iter_init(msg, &iter);
485
583
dbus_message_iter_next(&array);
488
if (host == NULL || domain == NULL) {
586
if (host == NULL || domain == NULL)
493
589
DBG("Type %s name %s", type, name);
495
if (type == NULL || name == NULL) {
591
if (type == NULL || name == NULL)
500
594
ident = g_strdup_printf("%s_%s", host, domain);
501
595
provider_dbus_ident(ident);
503
597
DBG("ident %s", ident);
505
599
provider = connman_provider_lookup(ident);
507
600
if (provider == NULL) {
509
601
provider = connman_provider_get(ident);
511
provider->host = g_strdup(host);
512
provider->domain = g_strdup(domain);
513
provider->name = g_strdup(name);
514
provider->type = g_strdup(type);
602
if (provider == NULL) {
603
DBG("can not create provider");
518
if (provider == NULL) {
519
DBG("can not create provider");
608
provider->host = g_strdup(host);
609
provider->domain = g_strdup(domain);
610
g_free(provider->name);
611
provider->name = g_strdup(name);
612
provider->type = g_strdup(type);
614
provider_register(provider);
523
617
dbus_message_iter_init(msg, &iter);
524
618
dbus_message_iter_recurse(&iter, &array);
548
if (provider == NULL) {
554
provider_probe(provider);
556
if (provider->vpn_service == NULL)
642
if (provider->vpn_service == NULL) {
557
643
provider->vpn_service =
558
644
__connman_service_create_from_provider(provider);
559
if (provider->vpn_service == NULL) {
564
err = __connman_service_connect(provider->vpn_service);
565
if (err < 0 && err != -EINPROGRESS)
645
if (provider->vpn_service == NULL) {
650
err = __connman_service_connect(provider->vpn_service);
651
if (err < 0 && err != -EINPROGRESS)
654
DBG("provider already connected");
656
connman_provider_save(provider);
568
657
service_path = __connman_service_get_path(provider->vpn_service);
569
658
g_dbus_send_reply(connection, msg,
570
659
DBUS_TYPE_OBJECT_PATH, &service_path,
575
if (provider != NULL && created == TRUE) {
576
DBG("can not connect delete provider");
577
connman_provider_unref(provider);
579
if (provider->vpn_service != NULL) {
580
__connman_service_put(provider->vpn_service);
581
provider->vpn_service = NULL;
664
__connman_service_put(provider->vpn_service);
665
provider->vpn_service = NULL;
668
DBG("can not connect, delete provider");
670
connman_provider_unref(provider);
604
691
} else if (g_str_equal(key, "Name") == TRUE) {
605
692
g_free(provider->name);
606
693
provider->name = g_strdup(value);
609
return connman_element_set_string(&provider->element, key, value);
694
} else if (g_str_equal(key, "Host") == TRUE) {
695
g_free(provider->host);
696
provider->host = g_strdup(value);
697
} else if (g_str_equal(key, "VPN.Domain") == TRUE) {
698
g_free(provider->domain);
699
provider->domain = g_strdup(value);
701
g_hash_table_replace(provider->setting_strings,
702
g_strdup(key), g_strdup(value));
612
706
const char *connman_provider_get_string(struct connman_provider *provider,
618
712
return provider->type;
619
713
else if (g_str_equal(key, "Name") == TRUE)
620
714
return provider->name;
715
else if (g_str_equal(key, "Host") == TRUE)
716
return provider->host;
717
else if (g_str_equal(key, "VPN.Domain") == TRUE)
718
return provider->domain;
622
return connman_element_get_string(&provider->element, key);
720
return g_hash_table_lookup(provider->setting_strings, key);
625
723
void *connman_provider_get_data(struct connman_provider *provider)
674
772
__connman_ipconfig_set_index(ipconfig, index);
677
provider->element.index = index;
775
provider->index = index;
680
778
int connman_provider_get_index(struct connman_provider *provider)
682
return provider->element.index;
780
return provider->index;
685
783
int connman_provider_set_ipaddress(struct connman_provider *provider,
737
835
__connman_service_nameserver_clear(provider->vpn_service);
739
if (nameservers != NULL)
740
nameservers_array = g_strsplit(nameservers, " ", 0);
837
if (nameservers == NULL)
840
nameservers_array = g_strsplit(nameservers, " ", 0);
742
842
for (i = 0; nameservers_array[i] != NULL; i++) {
743
843
__connman_service_nameserver_append(provider->vpn_service,
857
957
const char *connman_provider_get_driver_name(struct connman_provider *provider)
959
if (provider->driver == NULL)
859
962
return provider->driver->name;
965
const char *connman_provider_get_save_group(struct connman_provider *provider)
967
return provider->identifier;
862
970
static gint compare_priority(gconstpointer a, gconstpointer b)
888
996
driver_list = g_slist_remove(driver_list, driver);
891
static void provider_remove(gpointer key, gpointer value,
999
static void provider_remove_all(gpointer key, gpointer value,
892
1000
gpointer user_data)
894
1002
struct connman_provider *provider = value;
896
g_hash_table_remove(provider_hash, provider->identifier);
1004
__connman_provider_remove(provider->identifier);
899
1007
static void provider_offline_mode(connman_bool_t enabled)
901
1009
DBG("enabled %d", enabled);
903
1011
if (enabled == TRUE)
904
g_hash_table_foreach(provider_hash, provider_remove, NULL);
1012
g_hash_table_foreach(provider_hash, provider_remove_all, NULL);