X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fwgtpkg-install.c;h=e4c3bbcec1d7e59bd2c17917d9028a225797b163;hb=81f8b62bb2813d1cce388f10f39435d14042147d;hp=93c2bbc4f12443ebc6c2f813dce17af0fda000fe;hpb=6506c0c80b7542ca97149d9a53d88f5f0b7a0d2d;p=src%2Fapp-framework-main.git diff --git a/src/wgtpkg-install.c b/src/wgtpkg-install.c index 93c2bbc..e4c3bbc 100644 --- a/src/wgtpkg-install.c +++ b/src/wgtpkg-install.c @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include #include "verbose.h" @@ -39,12 +41,69 @@ #include "wgtpkg-install.h" #include "secmgr-wrap.h" #include "utils-dir.h" +#include "wgtpkg-unit.h" +#include "utils-systemd.h" +#include "utils-file.h" static const char* exec_type_strings[] = { "application/x-executable", "application/vnd.agl.native" }; +static const char key_http_port[] = "X-AFM--http-port"; + +static int get_port_cb(void *closure, const char *name, const char *path, int isuser) +{ + char *iter; + char *content; + size_t length; + int rc, p; + + /* reads the file */ + rc = getfile(path, &content, &length); + if (rc < 0) + return rc; + + /* process the file */ + iter = strstr(content, key_http_port); + while (iter) { + iter += sizeof key_http_port - 1; + while(*iter && *iter != '=' && *iter != '\n') + iter++; + if (*iter == '=') { + while(*++iter == ' '); + p = atoi(iter); + if (p >= 0 && p < 32768) + ((uint32_t*)closure)[p >> 5] |= (uint32_t)1 << (p & 31); + } + iter = strstr(iter, key_http_port); + } + free(content); + return 0; +} + +static int get_port() +{ + int rc; + uint32_t ports[1024]; /* 1024 * 32 = 32768 */ + + memset(ports, 0, sizeof ports); + rc = systemd_unit_list(0, get_port_cb, &ports); + if (rc >= 0) { + rc = systemd_unit_list(1, get_port_cb, ports); + if (rc >= 0) { + for (rc = 1024 ; rc < 32768 && !~ports[rc >> 5] ; rc += 32); + if (rc == 32768) { + errno = EADDRNOTAVAIL; + rc = -1; + } else { + while (1 & (ports[rc >> 5] >> (rc & 31))) rc++; + } + } + } + return rc; +} + static int check_defined(const void *data, const char *name) { if (data) @@ -104,25 +163,30 @@ static int set_required_permissions(struct wgt_desc_param *params, int required) int optional; while (params) { - /* check the value */ - if (!strcmp(params->value, string_required)) - optional = !required; - else if (!strcmp(params->value, string_optional)) - optional = 1; - else { - ERROR("unexpected parameter value: %s found for %s", params->value, params->name); - errno = EPERM; - return -1; - } - /* set the permission */ - if (request_permission(params->name)) { - DEBUG("granted permission: %s", params->name); - } else if (optional) { - INFO("optional permission ungranted: %s", params->name); + /* check if target */ + if (!strcmp(params->name, string_sharp_target)) { + /* do nothing when #target */ } else { - ERROR("ungranted permission required: %s", params->name); - errno = EPERM; - return -1; + /* check the value */ + if (!strcmp(params->value, string_required)) + optional = !required; + else if (!strcmp(params->value, string_optional)) + optional = 1; + else { + ERROR("unexpected parameter value: %s found for %s", params->value, params->name); + errno = EPERM; + return -1; + } + /* set the permission */ + if (request_permission(params->name)) { + DEBUG("granted permission: %s", params->name); + } else if (optional) { + INFO("optional permission ungranted: %s", params->name); + } else { + ERROR("ungranted permission required: %s", params->name); + errno = EPERM; + return -1; + } } params = params->next; } @@ -204,13 +268,17 @@ static int install_icon(const struct wgt_desc *desc) static int install_exec_flag(const struct wgt_desc *desc) { - int i; + int i, rc; if (desc->content_type) { i = sizeof exec_type_strings / sizeof *exec_type_strings; while (i) { - if (!strcasecmp(desc->content_type, exec_type_strings[--i])) - return fchmodat(workdirfd, desc->content_src, 0755, 0); + if (!strcasecmp(desc->content_type, exec_type_strings[--i])) { + rc = fchmodat(workdirfd, desc->content_src, 0755, 0); + if (rc < 0) + ERROR("can't make executable the file %s", desc->content_src); + return rc; + } } } return 0; @@ -288,6 +356,8 @@ struct wgt_info *install_widget(const char *wgtfile, const char *root, int force struct wgt_info *ifo; const struct wgt_desc *desc; char installdir[PATH_MAX]; + int port; + struct unitconf uconf; NOTICE("-- INSTALLING widget %s to %s --", wgtfile, root); @@ -322,15 +392,28 @@ struct wgt_info *install_widget(const char *wgtfile, const char *root, int force if (install_icon(desc)) goto error3; + if (install_security(desc)) + goto error4; + if (install_exec_flag(desc)) - goto error3; + goto error4; - if (install_security(desc)) - goto error3; + port = get_port(); + if (port < 0) + goto error4; + + uconf.installdir = installdir; + uconf.icondir = FWK_ICON_DIR; + uconf.port = port; + if (unit_install(ifo, &uconf)) + goto error4; file_reset(); return ifo; +error4: + /* TODO: cleanup */ + error3: wgt_info_unref(ifo);