bus-proxy: implement org.freedesktop.DBus.ReloadConfig()
Make sure to reload our xml policy configuration if requested via the bus.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user