chiark / gitweb /
bus-proxy: implement org.freedesktop.DBus.ReloadConfig()
authorDavid Herrmann <dh.herrmann@gmail.com>
Sat, 17 Jan 2015 18:06:34 +0000 (19:06 +0100)
committerDavid Herrmann <dh.herrmann@gmail.com>
Sat, 17 Jan 2015 18:06:34 +0000 (19:06 +0100)
Make sure to reload our xml policy configuration if requested via the bus.

src/bus-proxyd/bus-xml-policy.c
src/bus-proxyd/bus-xml-policy.h
src/bus-proxyd/driver.c

index b3daad50177beb0820ace73f3e53502994f174f8..0c60b6b6eb0f8783918f0d5979f11d25b1db6419 100644 (file)
@@ -1145,6 +1145,7 @@ SharedPolicy *shared_policy_free(SharedPolicy *sp) {
         policy_free(sp->policy);
         pthread_rwlock_destroy(&sp->rwlock);
         pthread_mutex_destroy(&sp->lock);
+        strv_free(sp->configuration);
         free(sp);
 
         return NULL;
@@ -1161,6 +1162,7 @@ static int shared_policy_reload_unlocked(SharedPolicy *sp, char **configuration)
         if (r < 0)
                 return log_error_errno(r, "Failed to load policy: %m");
 
+        log_debug("Reloading configuration");
         /* policy_dump(&buffer); */
 
         pthread_rwlock_wrlock(&sp->rwlock);
@@ -1176,28 +1178,36 @@ static int shared_policy_reload_unlocked(SharedPolicy *sp, char **configuration)
         return 0;
 }
 
-int shared_policy_reload(SharedPolicy *sp, char **configuration) {
+int shared_policy_reload(SharedPolicy *sp) {
         int r;
 
         assert(sp);
 
         pthread_mutex_lock(&sp->lock);
-        r = shared_policy_reload_unlocked(sp, configuration);
+        r = shared_policy_reload_unlocked(sp, sp->configuration);
         pthread_mutex_unlock(&sp->lock);
 
         return r;
 }
 
 int shared_policy_preload(SharedPolicy *sp, char **configuration) {
-        int r;
+        _cleanup_strv_free_ char **conf = NULL;
+        int r = 0;
 
         assert(sp);
 
+        conf = strv_copy(configuration);
+        if (!conf)
+                return log_oom();
+
         pthread_mutex_lock(&sp->lock);
-        if (!sp->policy)
-                r = shared_policy_reload_unlocked(sp, configuration);
-        else
-                r = 0;
+        if (!sp->policy) {
+                r = shared_policy_reload_unlocked(sp, conf);
+                if (r >= 0) {
+                        sp->configuration = conf;
+                        conf = NULL;
+                }
+        }
         pthread_mutex_unlock(&sp->lock);
 
         return r;
index 762cb663a09891c6d07bcdf3372819bf131be856..9716772e68ac6bb4b71385f548b89b4aa6517363 100644 (file)
@@ -77,6 +77,7 @@ typedef struct Policy {
 } Policy;
 
 typedef struct SharedPolicy {
+        char **configuration;
         pthread_mutex_t lock;
         pthread_rwlock_t rwlock;
         Policy buffer;
@@ -122,7 +123,7 @@ PolicyItemClass policy_item_class_from_string(const char *s) _pure_;
 int shared_policy_new(SharedPolicy **out);
 SharedPolicy *shared_policy_free(SharedPolicy *sp);
 
-int shared_policy_reload(SharedPolicy *sp, char **configuration);
+int shared_policy_reload(SharedPolicy *sp);
 int shared_policy_preload(SharedPolicy *sp, char **configuration);
 Policy *shared_policy_acquire(SharedPolicy *sp);
 void shared_policy_release(SharedPolicy *sp, Policy *p);
index 37fb87c453851c7433016cfdd4faa4a2b28af028..361b14c1317d650de2083bc692bfeb9cd3fe5ae9 100644 (file)
@@ -439,9 +439,11 @@ int bus_proxy_process_driver(sd_bus *a, sd_bus *b, sd_bus_message *m, SharedPoli
                 if (!sd_bus_message_has_signature(m, ""))
                         return synthetic_reply_method_error(m, &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_INVALID_ARGS, "Invalid parameters"));
 
-                r = sd_bus_error_setf(&error, SD_BUS_ERROR_NOT_SUPPORTED, "%s() is not supported", sd_bus_message_get_member(m));
+                r = shared_policy_reload(sp);
+                if (r < 0)
+                        return synthetic_reply_method_errno(m, r, NULL);
 
-                return synthetic_reply_method_errno(m, r, &error);
+                return synthetic_reply_method_return(m, NULL);
 
         } else if (sd_bus_message_is_method_call(m, "org.freedesktop.DBus", "RequestName")) {
                 const char *name;