work relatively to a root directory
authorJosé Bollo <jose.bollo@iot.bzh>
Tue, 8 Dec 2015 13:44:38 +0000 (14:44 +0100)
committerJosé Bollo <jose.bollo@iot.bzh>
Tue, 8 Dec 2015 13:44:38 +0000 (14:44 +0100)
Change-Id: I7cbb96bd3f699092ddfded8cc8893ec780a97d8c

Makefile.am
wgt-config-xml.c
wgt-locales.c
wgt-rootdir.c [new file with mode: 0644]
wgt-strings.c
wgt.h

index d9ffed5..6c76395 100644 (file)
@@ -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
index 41c2085..f92ae3a 100644 (file)
@@ -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;
index d985b64..9b97cc4 100644 (file)
@@ -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 (file)
index 0000000..b7d9066
--- /dev/null
@@ -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);
+}
+
index b11bbaf..a2fff39 100644 (file)
@@ -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 (file)
--- 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 */