From 7c7d610ccbd7e30204501622ebee6690aef5af0c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Bollo?= Date: Wed, 31 Aug 2016 14:13:54 +0200 Subject: [PATCH] bindings: adds ability to use data of applications MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 --- include/afb/afb-binding.h | 22 +++++++++++++++++ src/afb-api-so.c | 16 ++++++++++++- src/afb-common.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++ src/afb-common.h | 7 ++++++ src/main.c | 6 +++++ 5 files changed, 110 insertions(+), 1 deletion(-) diff --git a/include/afb/afb-binding.h b/include/afb/afb-binding.h index 7058b6d0..7d5da112 100644 --- a/include/afb/afb-binding.h +++ b/include/afb/afb-binding.h @@ -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); +} + + diff --git a/src/afb-api-so.c b/src/afb-api-so.c index d7609bba..ef1bbcc2 100644 --- a/src/afb-api-so.c +++ b/src/afb-api-so.c @@ -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; diff --git a/src/afb-common.c b/src/afb-common.c index 2b16e573..81bf5376 100644 --- a/src/afb-common.c +++ b/src/afb-common.c @@ -17,11 +17,19 @@ #define _GNU_SOURCE +#include +#include +#include +#include #include #include #include #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); +} diff --git a/src/afb-common.h b/src/afb-common.h index 4d6327c1..676b3ddc 100644 --- a/src/afb-common.h +++ b/src/afb-common.h @@ -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); + diff --git a/src/main.c b/src/main.c index cb44bdfa..ff7daaff 100644 --- a/src/main.c +++ b/src/main.c @@ -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); -- 2.16.6