bindings: adds ability to use data of applications
[src/app-framework-binder.git] / src / afb-common.c
index 2b16e57..81bf537 100644 (file)
 
 #define _GNU_SOURCE
 
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
 #include <errno.h>
 #include <systemd/sd-event.h>
 #include <systemd/sd-bus.h>
 
 #include "afb-common.h"
+#include "locale-root.h"
+
+static const char *default_locale = NULL;
+static struct locale_root *rootdir = NULL;
 
 /*
 struct sd_event *afb_common_get_thread_event_loop()
@@ -85,5 +93,57 @@ struct sd_bus *afb_common_get_system_bus()
        return sdbusopen((void*)&result, (void*)sd_bus_open_system);
 }
 
+void afb_common_default_locale_set(const char *locale)
+{
+       default_locale = locale;
+}
+
+const char *afb_common_default_locale_get()
+{
+       return default_locale;
+}
+
+int afb_common_rootdir_set(const char *dirname)
+{
+       int dirfd, rc;
+       struct locale_root *root;
+       struct locale_search *search;
+
+       rc = -1;
+       dirfd = openat(AT_FDCWD, dirname, O_PATH|O_DIRECTORY);
+       if (dirfd < 0) {
+               /* TODO message */
+       } else {
+               root = locale_root_create(dirfd);
+               if (root == NULL) {
+                       /* TODO message */
+                       close(dirfd);
+               } else {
+                       rc = 0;
+                       if (default_locale != NULL) {
+                               search = locale_root_search(root, default_locale, 0);
+                               if (search == NULL) {
+                                       /* TODO message */
+                               } else {
+                                       locale_root_set_default_search(root, search);
+                                       locale_search_unref(search);
+                               }
+                       }
+                       locale_root_unref(rootdir);
+                       rootdir = root;
+               }
+       }
+       return rc;
+}
+
+int afb_common_rootdir_get_fd()
+{
+       return locale_root_get_dirfd(rootdir);
+}
+
+int afb_common_rootdir_open_locale(const char *filename, int flags, const char *locale)
+{
+       return locale_root_open(rootdir, filename, flags, locale);
+}