service: Add timeserver and pac setters
authorDaniel Wagner <daniel.wagner@bmw-carit.de>
Wed, 23 Feb 2011 17:53:05 +0000 (18:53 +0100)
committerSamuel Ortiz <sameo@linux.intel.com>
Wed, 23 Feb 2011 17:53:05 +0000 (18:53 +0100)
src/connman.h
src/service.c

index f6521eb..4e0d3fc 100644 (file)
@@ -517,7 +517,12 @@ int __connman_service_nameserver_remove(struct connman_service *service,
 void __connman_service_nameserver_add_routes(struct connman_service *service,
                                                const char *gw);
 void __connman_service_nameserver_del_routes(struct connman_service *service);
-
+int __connman_service_timeserver_append(struct connman_service *service,
+                                               const char *timeserver);
+int __connman_service_timeserver_remove(struct connman_service *service,
+                                               const char *timeserver);
+void __connman_service_set_pac(struct connman_service *service,
+                                       const char *pac);
 int __connman_service_get_index(struct connman_service *service);
 void __connman_service_set_domainname(struct connman_service *service,
                                                const char *domainname);
index c53b705..38111ee 100644 (file)
@@ -83,6 +83,7 @@ struct connman_service {
        char **nameservers_config;
        char **domains;
        char *domainname;
+       char **timeservers;
        /* 802.1x settings from the config files */
        char *eap;
        char *identity;
@@ -1838,6 +1839,124 @@ const char *connman_service_get_proxy_autoconfig(struct connman_service *service
        return NULL;
 }
 
+static void update_timeservers(struct connman_service *service)
+{
+       int i;
+
+       if (service->timeservers == NULL)
+               return;
+
+       switch (combine_state(service->state_ipv4, service->state_ipv6)) {
+       case CONNMAN_SERVICE_STATE_UNKNOWN:
+       case CONNMAN_SERVICE_STATE_IDLE:
+       case CONNMAN_SERVICE_STATE_ASSOCIATION:
+       case CONNMAN_SERVICE_STATE_CONFIGURATION:
+               return;
+       case CONNMAN_SERVICE_STATE_FAILURE:
+       case CONNMAN_SERVICE_STATE_DISCONNECT:
+               for (i = 0; service->timeservers[i] != NULL; i++)
+                       connman_timeserver_remove(service->timeservers[i]);
+               return;
+       case CONNMAN_SERVICE_STATE_READY:
+       case CONNMAN_SERVICE_STATE_ONLINE:
+               break;
+       }
+
+       for (i = 0; service->timeservers[i] != NULL; i++)
+               connman_timeserver_append(service->timeservers[i]);
+}
+
+int __connman_service_timeserver_append(struct connman_service *service,
+                                               const char *timeserver)
+{
+       int len;
+
+       DBG("service %p timeserver %s", service, timeserver);
+
+       if (timeserver == NULL)
+               return -EINVAL;
+
+       if (service->timeservers != NULL) {
+               int i;
+
+               for (i = 0; service->timeservers[i] != NULL; i++)
+                       if (g_strcmp0(service->timeservers[i], timeserver) == 0)
+                               return -EEXIST;
+
+               len = g_strv_length(service->timeservers);
+               service->timeservers = g_try_renew(char *, service->timeservers,
+                                                       len + 2);
+       } else {
+               len = 0;
+               service->timeservers = g_try_new0(char *, len + 2);
+       }
+
+       if (service->timeservers == NULL)
+               return -ENOMEM;
+
+       service->timeservers[len] = g_strdup(timeserver);
+       service->timeservers[len + 1] = NULL;
+
+       update_timeservers(service);
+
+       return 0;
+}
+
+int __connman_service_timeserver_remove(struct connman_service *service,
+                                               const char *timeserver)
+{
+       char **servers;
+       int len, i, j;
+
+       DBG("service %p timeserver %s", service, timeserver);
+
+       if (timeserver == NULL)
+               return -EINVAL;
+
+       if (service->timeservers == NULL)
+               return 0;
+
+       len = g_strv_length(service->timeservers);
+       if (len == 1) {
+               if (g_strcmp0(service->timeservers[0], timeserver) != 0)
+                       return 0;
+
+               g_strfreev(service->timeservers);
+               service->timeservers = NULL;
+
+               return 0;
+       }
+
+       servers = g_try_new0(char *, len - 1);
+       if (servers == NULL)
+               return -ENOMEM;
+
+       for (i = 0, j = 0; i < len; i++) {
+               if (g_strcmp0(service->timeservers[i], timeserver) != 0) {
+                       servers[j] = g_strdup(service->timeservers[i]);
+                       j++;
+               }
+       }
+       servers[len - 2] = NULL;
+
+       g_strfreev(service->timeservers);
+       service->timeservers = servers;
+
+       update_timeservers(service);
+
+       return 0;
+}
+
+void __connman_service_set_pac(struct connman_service *service,
+                                       const char *pac)
+{
+       if (pac == NULL)
+               return;
+
+       g_free(service->pac);
+       service->pac = g_strdup(pac);
+}
+
 void __connman_service_set_passphrase(struct connman_service *service,
                                        const char* passphrase)
 {