bindings: adds ability to use data of applications
authorJosé Bollo <jose.bollo@iot.bzh>
Wed, 31 Aug 2016 12:13:54 +0000 (14:13 +0200)
committerJosé Bollo <jose.bollo@iot.bzh>
Wed, 31 Aug 2016 12:13:54 +0000 (14:13 +0200)
The two new verbs 'afb_daemon_rootdir_get_fd' and
'afb_daemon_rootdir_open_locale' allow the bindings to retrieve
its installed global data.

Change-Id: I369997d9e59402a413a929aa650c48613f034183
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
include/afb/afb-binding.h
src/afb-api-so.c
src/afb-common.c
src/afb-common.h
src/main.c

index 7058b6d..7d5da11 100644 (file)
@@ -147,6 +147,8 @@ struct afb_daemon_itf {
        struct sd_bus *(*get_system_bus)(void *closure);        /* gets the common systemd's system d-bus */
        void (*vverbose)(void*closure, int level, const char *file, int line, const char *fmt, va_list args);
        struct afb_event (*event_make)(void *closure, const char *name); /* creates an event of 'name' */
+       int (*rootdir_get_fd)(void *closure);
+       int (*rootdir_open_locale)(void *closure, const char *filename, int flags, const char *locale);
 };
 
 /*
@@ -259,3 +261,23 @@ static inline void afb_daemon_verbose(struct afb_daemon daemon, int level, const
 # endif
 #endif
 
+/*
+ * Get the root directory file descriptor. This file descriptor can
+ * be used with functions 'openat', 'fstatat', ...
+ */
+static inline int afb_daemon_rootdir_get_fd(struct afb_daemon daemon)
+{
+       return daemon.itf->rootdir_get_fd(daemon.closure);
+}
+
+/*
+ * Opens 'filename' within the root directory with 'flags' (see function openat)
+ * using the 'locale' definition (example: "jp,en-US") that can be NULL.
+ * Returns the file descriptor or -1 in case of error.
+ */
+static inline int afb_daemon_rootdir_open_locale(struct afb_daemon daemon, const char *filename, int flags, const char *locale)
+{
+       return daemon.itf->rootdir_open_locale(daemon.closure, filename, flags, locale);
+}
+
+
index d7609bb..ef1bbcc 100644 (file)
@@ -67,6 +67,8 @@ static int api_timeout = 15;
 static struct afb_event afb_api_so_event_make_cb(void *closure, const char *name);
 static int afb_api_so_event_broadcast_cb(void *closure, const char *name, struct json_object *object);
 static void afb_api_so_vverbose_cb(void *closure, int level, const char *file, int line, const char *fmt, va_list args);
+static int afb_api_so_rootdir_get_fd(void *closure);
+static int afb_api_so_rootdir_open_locale(void *closure, const char *filename, int flags, const char *locale);
 
 static const struct afb_daemon_itf daemon_itf = {
        .event_broadcast = afb_api_so_event_broadcast_cb,
@@ -74,7 +76,9 @@ static const struct afb_daemon_itf daemon_itf = {
        .get_user_bus = afb_common_get_user_bus,
        .get_system_bus = afb_common_get_system_bus,
        .vverbose = afb_api_so_vverbose_cb,
-       .event_make = afb_api_so_event_make_cb
+       .event_make = afb_api_so_event_make_cb,
+       .rootdir_get_fd = afb_api_so_rootdir_get_fd,
+       .rootdir_open_locale = afb_api_so_rootdir_open_locale
 };
 
 static struct afb_event afb_api_so_event_make_cb(void *closure, const char *name)
@@ -125,6 +129,16 @@ static void afb_api_so_vverbose_cb(void *closure, int level, const char *file, i
        }
 }
 
+static int afb_api_so_rootdir_get_fd(void *closure)
+{
+       return afb_common_rootdir_get_fd();
+}
+
+static int afb_api_so_rootdir_open_locale(void *closure, const char *filename, int flags, const char *locale)
+{
+       return afb_common_rootdir_open_locale(filename, flags, locale);
+}
+
 static void monitored_call(int signum, void *arg)
 {
        struct monitoring *data = arg;
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);
+}
 
 
index 4d6327c..676b3dd 100644 (file)
@@ -24,3 +24,10 @@ extern struct sd_event *afb_common_get_event_loop();
 extern struct sd_bus *afb_common_get_user_bus();
 extern struct sd_bus *afb_common_get_system_bus();
 
+extern void afb_common_default_locale_set(const char *locale);
+extern const char *afb_common_default_locale_get();
+
+extern int afb_common_rootdir_set(const char *rootdir);
+extern int afb_common_rootdir_get_fd();
+extern int afb_common_rootdir_open_locale(const char *filename, int flags, const char *locale);
+
index cb44bdf..ff7daaf 100644 (file)
@@ -640,6 +640,11 @@ int main(int argc, char *argv[])  {
      return 1;
   }
 
+  if (afb_common_rootdir_set(config->rootdir) < 0) {
+     ERROR("main fail to set common root directory");
+     return 1;
+  }
+
   // let's run this program with a low priority
   nice (20);
 
@@ -659,6 +664,7 @@ int main(int argc, char *argv[])  {
       INFO("entering foreground mode");
   }
 
+   /* start the HTTP server */
    hsrv = start_http_server(config);
    if (hsrv == NULL)
        exit(1);