X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fwgtpkg-install.c;h=79cb7fb9907b1fc542ae273039798169a86cfdde;hb=1da38273874da7d17a946348278cd849fb8516e7;hp=cec3b751feb1e1cfae8ebb82cec79c3461121747;hpb=9039c0be54353ac3a519da2006824847061f0539;p=src%2Fapp-framework-main.git diff --git a/src/wgtpkg-install.c b/src/wgtpkg-install.c index cec3b75..79cb7fb 100644 --- a/src/wgtpkg-install.c +++ b/src/wgtpkg-install.c @@ -188,12 +188,13 @@ static int check_temporary_constraints(const struct wgt_desc *desc) result = check_valid_string(desc->id, "id"); result |= check_valid_string(desc->version, "version"); result |= check_valid_string(desc->ver, "ver"); - result |= check_defined(desc->icons, "icon"); result |= check_defined(desc->content_src, "content"); + if (desc->icons) + result |= check_defined(desc->icons->src, "icon.src"); if (result) return result; - if (desc->icons->next) { + if (desc->icons && desc->icons->next) { ERROR("widget has more than one icon defined (temporary constraints)"); errno = EINVAL; result = -1; @@ -357,6 +358,9 @@ static int install_icon(const struct wgt_desc *desc) char target[PATH_MAX]; int rc; + if (!desc->icons) + return 0; + create_directory(FWK_ICON_DIR, 0755, 1); rc = snprintf(link, sizeof link, "%s/%s", FWK_ICON_DIR, desc->idaver); if (rc >= (int)sizeof link) { @@ -384,6 +388,37 @@ static int install_exec_flag(const struct wgt_desc *desc) return for_all_content(desc, set_exec_flag); } +static int install_file_properties(const struct wgt_desc *desc) +{ + int rc, rc2; + struct wgt_desc_feature *feat; + struct wgt_desc_param *param; + + rc = 0; + feat = desc->features; + while (feat) { + if (!strcmp(feat->name, "urn:AGL:widget:file-properties")) { + param = feat->params; + while (param) { + if (!strcmp(param->value, "executable")) { + rc2 = fchmodat(workdirfd, param->name, 0755, 0); + if (rc2 < 0) + ERROR("can't make executable the file %s: %m", param->name); + } else { + ERROR("unknown file property %s for %s", param->value, param->name); + errno = EINVAL; + rc2 = -1; + } + if (rc2 < 0 && !rc) + rc = rc2; + param = param->next; + } + } + feat = feat->next; + } + return rc; +} + static int install_security(const struct wgt_desc *desc) { char path[PATH_MAX], *head; @@ -411,7 +446,7 @@ static int install_security(const struct wgt_desc *desc) } len--; *head++ = '/'; - icon = desc->icons->src; + icon = desc->icons ? desc->icons->src : NULL; lic = (unsigned)strlen(icon); n = file_count(); i = 0; @@ -424,7 +459,7 @@ static int install_security(const struct wgt_desc *desc) goto error2; } strcpy(head, f->name); - if (lf <= lic && !memcmp(f->name, icon, lf) && (!f->name[lf] || f->name[lf] == '/')) + if (lf <= lic && icon && !memcmp(f->name, icon, lf) && (!f->name[lf] || f->name[lf] == '/')) rc = secmgr_path_public_read_only(path); else rc = secmgr_path_read_only(path); @@ -498,6 +533,9 @@ struct wgt_info *install_widget(const char *wgtfile, const char *root, int force if (install_exec_flag(desc)) goto error4; + if (install_file_properties(desc)) + goto error4; + port = get_port(); if (port < 0) goto error4;