wgtpkg-install: set the exec flag
[src/app-framework-main.git] / src / wgtpkg-install.c
index b5f0a40..8035a30 100644 (file)
@@ -1,5 +1,5 @@
 /*
- Copyright 2015 IoT.bzh
+ Copyright 2015, 2016 IoT.bzh
 
  author: José Bollo <jose.bollo@iot.bzh>
 
@@ -25,6 +25,7 @@
 #include <assert.h>
 #include <unistd.h>
 #include <stdio.h>
+#include <sys/stat.h>
 
 #include "verbose.h"
 #include "wgt.h"
@@ -41,6 +42,7 @@
 static const char permission_required[] = "required";
 static const char permission_optional[] = "optional";
 static const char feature_required_permissions[] = FWK_PREFIX "required-permissions";
+static const char exec_type_string[] = "application/x-executable";
 
 static int check_defined(const void *data, const char *name)
 {
@@ -145,7 +147,7 @@ static int move_widget(const char *root, const struct wgt_desc *desc, int force)
 
        rc = snprintf(newdir, sizeof newdir, "%s/%s/%s", root, desc->id, desc->ver);
        if (rc >= (int)sizeof newdir) {
-               ERROR("path to long in move_widget");
+               ERROR("path too long in move_widget");
                errno = EINVAL;
                return -1;
        }
@@ -162,14 +164,14 @@ static int install_icon(const struct wgt_desc *desc)
        create_directory(FWK_ICON_DIR, 0755, 1);
        rc = snprintf(link, sizeof link, "%s/%s", FWK_ICON_DIR, desc->idaver);
        if (rc >= (int)sizeof link) {
-               ERROR("link to long in install_icon");
+               ERROR("link too long in install_icon");
                errno = EINVAL;
                return -1;
        }
 
        rc = snprintf(target, sizeof target, "%s/%s", workdir, desc->icons->src);
        if (rc >= (int)sizeof target) {
-               ERROR("target to long in install_icon");
+               ERROR("target too long in install_icon");
                errno = EINVAL;
                return -1;
        }
@@ -181,6 +183,12 @@ static int install_icon(const struct wgt_desc *desc)
        return rc;
 }
 
+static int install_exec_flag(const struct wgt_desc *desc)
+{
+       return desc->content_type != NULL && !strcmp(desc->content_type, exec_type_string)
+               ? fchmodat(workdirfd, desc->content_src, 0755, 0) : 0;
+}
+
 static int install_security(const struct wgt_desc *desc)
 {
        char path[PATH_MAX], *head;
@@ -282,9 +290,12 @@ struct wgt_info *install_widget(const char *wgtfile, const char *root, int force
        if (install_icon(desc))
                goto error3;
 
+       if (install_exec_flag(desc))
+               goto error3;
+
        if (install_security(desc))
                goto error3;
-       
+
        file_reset();
        return ifo;