summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile.am1
-rw-r--r--wgt-config-xml.c37
-rw-r--r--wgt-locales.c20
-rw-r--r--wgt-rootdir.c55
-rw-r--r--wgt-strings.c17
-rw-r--r--wgt.h7
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";
diff --git a/wgt.h b/wgt.h
index 63c4bcd..d95e65b 100644
--- a/wgt.h
+++ b/wgt.h
@@ -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_[];