diff options
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | wgt-config-xml.c | 37 | ||||
-rw-r--r-- | wgt-locales.c | 20 | ||||
-rw-r--r-- | wgt-rootdir.c | 55 | ||||
-rw-r--r-- | wgt-strings.c | 17 | ||||
-rw-r--r-- | wgt.h | 7 |
6 files changed, 127 insertions, 10 deletions
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 <unistd.h> #include <string.h> #include <syslog.h> #include <assert.h> @@ -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 <string.h> @@ -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 <unistd.h> +#include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> + +#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"; @@ -46,6 +46,13 @@ 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 */ extern const char _config_xml_[]; |