summaryrefslogtreecommitdiffstats
path: root/bus
diff options
context:
space:
mode:
Diffstat (limited to 'bus')
-rw-r--r--bus/bus.c47
1 files changed, 46 insertions, 1 deletions
diff --git a/bus/bus.c b/bus/bus.c
index a1bc6622..4b5b23b5 100644
--- a/bus/bus.c
+++ b/bus/bus.c
@@ -27,16 +27,23 @@
#include "connection.h"
#include "services.h"
#include "utils.h"
+#include "policy.h"
+#include <dbus/dbus-list.h>
+#include <dbus/dbus-hash.h>
#include <dbus/dbus-internals.h>
struct BusContext
{
int refcount;
- char *address;
+ char *address;
DBusServer *server;
BusConnections *connections;
BusActivation *activation;
BusRegistry *registry;
+ DBusList *default_rules; /**< Default policy rules */
+ DBusList *override_rules; /**< Override policy rules */
+ DBusHashTable *rules_by_uid; /**< per-UID policy rules */
+ DBusHashTable *rules_by_gid; /**< per-GID policy rules */
};
static dbus_bool_t
@@ -109,6 +116,14 @@ new_connection_callback (DBusServer *server,
/* on OOM, we won't have ref'd the connection so it will die. */
}
+static void
+free_rule_func (void *data)
+{
+ BusPolicyRule *rule = data;
+
+ bus_policy_rule_unref (rule);
+}
+
BusContext*
bus_context_new (const char *address,
const char **service_dirs,
@@ -164,6 +179,24 @@ bus_context_new (const char *address,
goto failed;
}
+ context->rules_by_uid = _dbus_hash_table_new (DBUS_HASH_INT,
+ NULL,
+ free_rule_func);
+ if (context->rules_by_uid == NULL)
+ {
+ BUS_SET_OOM (error);
+ goto failed;
+ }
+
+ context->rules_by_gid = _dbus_hash_table_new (DBUS_HASH_INT,
+ NULL,
+ free_rule_func);
+ if (context->rules_by_gid == NULL)
+ {
+ BUS_SET_OOM (error);
+ goto failed;
+ }
+
dbus_server_set_new_connection_function (context->server,
new_connection_callback,
context, NULL);
@@ -260,6 +293,18 @@ bus_context_unref (BusContext *context)
dbus_server_unref (context->server);
context->server = NULL;
}
+
+ if (context->rules_by_uid)
+ {
+ _dbus_hash_table_unref (context->rules_by_uid);
+ context->rules_by_uid = NULL;
+ }
+
+ if (context->rules_by_gid)
+ {
+ _dbus_hash_table_unref (context->rules_by_gid);
+ context->rules_by_gid = NULL;
+ }
dbus_free (context->address);
dbus_free (context);