Fix: enable libdbuspolicy for multiple init. 29/85329/2
authorKazimierz Krosman <k.krosman@samsung.com>
Wed, 24 Aug 2016 14:48:55 +0000 (16:48 +0200)
committerKazimierz Krosman <k.krosman@samsung.com>
Thu, 25 Aug 2016 13:22:24 +0000 (15:22 +0200)
Change-Id: I5ffea43051cb5bd51320333fde273815e12801ae

src/libdbuspolicy1.c

index 41df563..79b858b 100644 (file)
@@ -60,6 +60,7 @@ struct kconn {
        int fd;
        uint64_t id;
        char *pool;
+       int counter;
 } g_conn[2];
 
 struct udesc {
@@ -213,25 +214,27 @@ DBUSPOLICY1_EXPORT void* dbuspolicy1_init(const char *bus_path)
        }
        if (rb)
                goto err_close;
+       if (g_conn[bus_type].counter == 0) {
+               if ((g_conn[bus_type].fd = kdbus_open_bus(resolved_path)) < 0)
+                       goto err;
 
-       if ((g_conn[bus_type].fd = kdbus_open_bus(resolved_path)) < 0)
-               goto err;
+               if (kdbus_hello(bus_type, 0, _KDBUS_ATTACH_ALL, 0) < 0)
+                       goto err_close;
 
-       if (kdbus_hello(bus_type, 0, _KDBUS_ATTACH_ALL, 0) < 0)
-               goto err_close;
+               rp = __internal_init(bus_type, (bus_type == SYSTEM_BUS) ? SYSTEM_BUS_CONF_FILE_PRIMARY : SESSION_BUS_CONF_FILE_PRIMARY);
+               if (rp < 0)
+                       rs = __internal_init(bus_type, (bus_type == SYSTEM_BUS) ? SYSTEM_BUS_CONF_FILE_SECONDARY : SESSION_BUS_CONF_FILE_SECONDARY);
+               else
+                       rs = 1;
 
-       rp = __internal_init(bus_type, (bus_type == SYSTEM_BUS) ? SYSTEM_BUS_CONF_FILE_PRIMARY : SESSION_BUS_CONF_FILE_PRIMARY);
-       if (rp < 0)
-               rs = __internal_init(bus_type, (bus_type == SYSTEM_BUS) ? SYSTEM_BUS_CONF_FILE_SECONDARY : SESSION_BUS_CONF_FILE_SECONDARY);
-       else
-               rs = 1;
+               if (rp < 0 && rs < 0) /* when both negative */
+                       goto err_close;
+       }
 
+       g_conn[bus_type].counter++;
        pthread_mutex_unlock(&g_mutex);
        __internal_init_flush_logs();
 
-       if (rp < 0 && rs < 0) /* when both negative */
-               goto err_close;
-
        return &g_conn[bus_type];
 
 err_close:
@@ -243,8 +246,18 @@ err:
 
 DBUSPOLICY1_EXPORT void dbuspolicy1_free(void* configuration)
 {
-    if (configuration)
-               close(((typeof(&g_conn[0]))configuration)->fd);
+    if (configuration) {
+               struct kconn* k = (struct kconn*)configuration;
+               pthread_mutex_lock(&g_mutex);
+
+               --k->counter;
+               if (k->counter <= 0) {
+                       munmap(k->pool, KDBUS_POOL_SIZE);
+                       close(k->fd);
+               }
+
+               pthread_mutex_unlock(&g_mutex);
+       }
 }
 
 #ifdef LIBDBUSPOLICY_TESTS_API
@@ -313,7 +326,6 @@ DBUSPOLICY1_EXPORT int dbuspolicy1_check_out(void* configuration,
                        *(uint64_t*)ALIGNDN8((uintptr_t)cmd.cmd_info.items->str + l) = 0; /* trailing zero + padding */
                        memcpy(cmd.cmd_info.items->str, destination, l);
                }
-
                r = ioctl(g_conn[bus_type].fd, KDBUS_CMD_CONN_INFO, &cmd.cmd_info);
                if (r < 0) {
                        if (errno == ENXIO || errno == ESRCH)