diff options
author | Daniel Wagner <daniel.wagner@bmw-carit.de> | 2012-11-14 17:16:39 +0100 |
---|---|---|
committer | Daniel Wagner <daniel.wagner@bmw-carit.de> | 2012-11-23 13:47:24 +0100 |
commit | 706aa60f3af94d3af96adb7a0c1481a9b1c83851 (patch) | |
tree | 50ba500a9f31404ed84a8412b9c939d86f6b05ac /plugins | |
parent | c428442146285cac169ea7a29b0fe7d928fda997 (diff) | |
download | connman-706aa60f3af94d3af96adb7a0c1481a9b1c83851.tar.gz connman-706aa60f3af94d3af96adb7a0c1481a9b1c83851.tar.bz2 connman-706aa60f3af94d3af96adb7a0c1481a9b1c83851.zip |
session_policy_ivi: Watch for changes on policy files
Monitor changes on the config files. Either create, modify or destroy
them according the events we get from the inotify interface.
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/session_policy_ivi.c | 96 |
1 files changed, 92 insertions, 4 deletions
diff --git a/plugins/session_policy_ivi.c b/plugins/session_policy_ivi.c index 039f3b4e..a5de717b 100644 --- a/plugins/session_policy_ivi.c +++ b/plugins/session_policy_ivi.c @@ -25,6 +25,7 @@ #include <errno.h> #include <string.h> +#include <sys/inotify.h> #include <glib.h> @@ -35,6 +36,7 @@ #include <connman/log.h> #include <connman/session.h> #include <connman/dbus.h> +#include <connman/inotify.h> #define POLICYDIR STORAGEDIR "/session_policy_ivi" @@ -174,10 +176,16 @@ static void selinux_context_reply(const unsigned char *context, void *user_data, goto done; } - policy = create_policy(ident); - if (policy == NULL) { - err = -ENOMEM; - goto done; + policy = g_hash_table_lookup(policy_hash, ident); + if (policy != NULL) { + policy_ref(policy); + policy->session = data->session; + } else { + policy = create_policy(ident); + if (policy == NULL) { + err = -ENOMEM; + goto done; + } } g_hash_table_replace(session_hash, data->session, policy); @@ -230,6 +238,7 @@ static void policy_ivi_destroy(struct connman_session *session) policy = g_hash_table_lookup(session_hash, session); g_hash_table_remove(session_hash, session); + policy->session = NULL; policy_unref(policy); } @@ -246,6 +255,77 @@ static int load_policy(struct policy_data *policy) return 0; } +static void update_session(struct connman_session *session) +{ + if (connman_session_config_update(session) < 0) + connman_session_destroy(session); +} + +static void remove_policy(struct policy_data *policy) +{ + connman_bool_t update = FALSE; + int err; + + if (policy->session != NULL) + update = TRUE; + + policy_unref(policy); + + if (update == FALSE) + return; + + err = connman_session_set_default_config(policy->config); + if (err < 0) { + connman_session_destroy(policy->session); + return; + } + + update_session(policy->session); +} + +static void notify_handler(struct inotify_event *event, + const char *ident) +{ + struct policy_data *policy; + int err; + + if (ident == NULL) + return; + + policy = g_hash_table_lookup(policy_hash, ident); + + if (event->mask & (IN_CREATE | IN_MOVED_TO)) { + connman_info("Policy added for '%s'", ident); + + if (policy != NULL) + policy_ref(policy); + else + policy = create_policy(ident); + } + + if (policy == NULL) + return; + + if (event->mask & IN_MODIFY) { + connman_info("Policy modifed for '%s'", ident); + + if (load_policy(policy) < 0) { + remove_policy(policy); + return; + } + } + + if (event->mask & (IN_DELETE | IN_MOVED_FROM)) { + connman_info("Policy deleted for '%s'", ident); + + remove_policy(policy); + return; + } + + if (policy->session != NULL) + update_session(policy->session); +} + static int read_policies(void) { GDir *dir; @@ -281,6 +361,10 @@ static int session_policy_ivi_init(void) { int err; + err = connman_inotify_register(POLICYDIR, notify_handler); + if (err < 0) + return err; + connection = connman_dbus_get_connection(); if (connection == NULL) return -EIO; @@ -321,6 +405,8 @@ err: dbus_connection_unref(connection); + connman_inotify_unregister(POLICYDIR, notify_handler); + return err; } @@ -332,6 +418,8 @@ static void session_policy_ivi_exit(void) connman_session_policy_unregister(&session_policy_ivi); dbus_connection_unref(connection); + + connman_inotify_unregister(POLICYDIR, notify_handler); } CONNMAN_PLUGIN_DEFINE(session_policy_ivi, |