int fd;
uint64_t id;
char *pool;
+ int counter;
} g_conn[2];
struct udesc {
}
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:
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
*(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)