From 381842f4c264e5946ad964f43608f7e543fbcb19 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Bollo?= Date: Tue, 8 Dec 2015 14:44:38 +0100 Subject: [PATCH] work relatively to a root directory Change-Id: I7cbb96bd3f699092ddfded8cc8893ec780a97d8c --- Makefile.am | 1 + wgt-config-xml.c | 37 +++++++++++++++++++++++++++++-------- wgt-locales.c | 20 ++++++++++++++++++-- wgt-rootdir.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ wgt-strings.c | 17 +++++++++++++++++ wgt.h | 7 +++++++ 6 files changed, 127 insertions(+), 10 deletions(-) create mode 100644 wgt-rootdir.c diff --git a/Makefile.am b/Makefile.am index d9ffed5..6c76395 100644 --- a/Makefile.am +++ b/Makefile.am @@ -13,6 +13,7 @@ COMMONSRCS = \ WGTSRCS = \ wgt-config-xml.c \ wgt-locales.c \ + wgt-rootdir.c \ wgt-strings.c AM_CFLAGS = -Wall -Wno-pointer-sign diff --git a/wgt-config-xml.c b/wgt-config-xml.c index 41c2085..f92ae3a 100644 --- a/wgt-config-xml.c +++ b/wgt-config-xml.c @@ -14,6 +14,7 @@ limitations under the License. */ +#include #include #include #include @@ -46,18 +47,31 @@ static xmlNodePtr first(const char *type) return NULL; } +static int scorelang(xmlNodePtr node) +{ + char *lang = xmlNodeGetLang(node); + int score = locales_score(lang); + xmlFree(lang); + return score; +} + static xmlNodePtr element_based_localisation(const char *type) { - xmlNodePtr resu; - char *lang; + xmlNodePtr resu, elem; + int sr, s; resu = first(type); - while (resu) { - lang = xmlNodeGetLang(resu); - if (lang) { - xmlFree(lang); + if (resu) { + sr = scorelang(resu); + elem = next(resu->next, type); + while (resu) { + s = scorelang(elem); + if (s < sr) { + resu = elem; + sr = s; + } + elem = next(elem->next, type); } - resu = next(resu->next, type); } return resu; } @@ -72,8 +86,15 @@ void confixml_close() int confixml_open() { + int fd; assert(!configxml); - configxml = xmlReadFile(_config_xml_, NULL, 0); + fd = widget_open_read(_config_xml_); + if (fd < 0) { + syslog(LOG_ERR, "can't open config file %s", _config_xml_); + return fd; + } + configxml = xmlReadFd(fd, "_config_xml_", NULL, 0); + close(fd); if (configxml == NULL) { syslog(LOG_ERR, "xml parse of config file %s failed", _config_xml_); return -1; diff --git a/wgt-locales.c b/wgt-locales.c index d985b64..9b97cc4 100644 --- a/wgt-locales.c +++ b/wgt-locales.c @@ -1,3 +1,19 @@ +/* + Copyright 2015 IoT.bzh + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + #define _GNU_SOURCE #include @@ -86,14 +102,14 @@ char *locales_locate_file(const char *filename) errno = EINVAL; return NULL; } - if (!access(path, F_OK)) { + if (widget_has(path)) { result = strdup(path); if (!result) errno = ENOMEM; return result; } } - if (access(filename, F_OK)) { + if (widget_has(filename)) { result = strdup(filename); if (!result) errno = ENOMEM; diff --git a/wgt-rootdir.c b/wgt-rootdir.c new file mode 100644 index 0000000..b7d9066 --- /dev/null +++ b/wgt-rootdir.c @@ -0,0 +1,55 @@ +/* + Copyright 2015 IoT.bzh + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#define _GNU_SOURCE + +#include +#include +#include +#include + +#include "wgt.h" + + +static int rootfd = AT_FDCWD; + +int widget_set_rootdir(const char *pathname) +{ + int rfd; + + if (!pathname) + rfd = AT_FDCWD; + else { + rfd = openat(AT_FDCWD, pathname, O_PATH|O_DIRECTORY); + if (rfd < 0) + return rfd; + } + if (rootfd >= 0) + close(rootfd); + rootfd = AT_FDCWD; + return 0; +} + +int widget_has(const char *filename) +{ + return 0 == faccessat(rootfd, filename, F_OK, 0); +} + +int widget_open_read(const char *filename) +{ + return openat(rootfd, filename, O_RDONLY); +} + diff --git a/wgt-strings.c b/wgt-strings.c index b11bbaf..a2fff39 100644 --- a/wgt-strings.c +++ b/wgt-strings.c @@ -1,3 +1,20 @@ +/* + Copyright 2015 IoT.bzh + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include "wgt.h" const char _config_xml_[] = "config.xml"; const char _name_[] = "name"; diff --git a/wgt.h b/wgt.h index 63c4bcd..d95e65b 100644 --- a/wgt.h +++ b/wgt.h @@ -45,6 +45,13 @@ extern int locales_add(const char *locstr); extern int locales_score(const char *lang); extern char *locales_locate_file(const char *filename); +/**************************************************************/ +/* from wgt-rootdir */ + +extern int widget_set_rootdir(const char *pathname); +extern int widget_has(const char *filename); +extern int widget_open_read(const char *filename); + /**************************************************************/ /* from wgt-strings */ -- 2.16.6