WGTSRCS = \
wgt-config-xml.c \
wgt-locales.c \
+ wgt-rootdir.c \
wgt-strings.c
AM_CFLAGS = -Wall -Wno-pointer-sign
limitations under the License.
*/
+#include <unistd.h>
#include <string.h>
#include <syslog.h>
#include <assert.h>
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;
}
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;
+/*
+ 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>
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;
--- /dev/null
+/*
+ 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);
+}
+
+/*
+ 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";
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 */