X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fwgtpkg-install.c;h=c7de1f824263e1f4834b2cbdf35b531ef239c570;hb=7ea1070ee471141f58e9e4c03df5c95bbcef907d;hp=31ef7c4eb4547b96d61393f06112756438e85252;hpb=bceaf2cc403176fd808d4e00be893671be3f4bb0;p=src%2Fapp-framework-main.git diff --git a/src/wgtpkg-install.c b/src/wgtpkg-install.c index 31ef7c4..c7de1f8 100644 --- a/src/wgtpkg-install.c +++ b/src/wgtpkg-install.c @@ -1,5 +1,5 @@ /* - Copyright (C) 2015-2018 IoT.bzh + Copyright (C) 2015-2020 IoT.bzh author: José Bollo @@ -53,7 +53,25 @@ static const char* exec_type_strings[] = { }; static const char key_afm_prefix[] = "X-AFM-"; -static const char key_http_port[] = "http-port"; +static const char key_afid[] = "ID"; + +#define HTTP_PORT_BASE 30000 + +#define AFID_MIN 1 +#define AFID_MAX 1999 +#define AFID_IS_VALID(afid) (AFID_MIN <= (afid) && (afid) <= AFID_MAX) +#define AFID_COUNT (AFID_MAX - AFID_MIN + 1) +#define AFID_ACNT ((AFID_COUNT + 31) >> 5) +#define AFID_ASFT(afid) (((afid) - AFID_MIN) & 31) +#define AFID_AIDX(afid) (((afid) - AFID_MIN) >> 5) +#define AFID_TEST(array,afid) ((((array)[AFID_AIDX(afid)]) >> AFID_ASFT(afid)) & 1) +#define AFID_SET(array,afid) (((array)[AFID_AIDX(afid)]) |= (((uint32_t)1) << AFID_ASFT(afid))) + +static uint32_t *afids_array = NULL; + +static const char *default_permissions[] = { + "urn:AGL:token:valid" +}; /* * normalize unit files: remove comments, remove heading blanks, @@ -87,7 +105,7 @@ static void normalize_unit_file(char *content) *write = c; } -static int get_port_cb(void *closure, const char *name, const char *path, int isuser) +static int get_afid_cb(void *closure, const char *name, const char *path, int isuser) { char *iter; char *content; @@ -108,15 +126,15 @@ static int get_port_cb(void *closure, const char *name, const char *path, int is iter += sizeof key_afm_prefix - 1; if (*iter == '-') iter++; - if (!strncmp(iter, key_http_port, sizeof key_http_port - 1)) { - iter += sizeof key_http_port - 1; + if (!strncmp(iter, key_afid, sizeof key_afid - 1)) { + iter += sizeof key_afid - 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); + if (AFID_IS_VALID(p)) + AFID_SET((uint32_t*)closure, p); } } iter = strstr(iter, key_afm_prefix); @@ -125,29 +143,61 @@ static int get_port_cb(void *closure, const char *name, const char *path, int is return 0; } -static int get_port() +static int update_afids(uint32_t *afids) { 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) { - ERROR("Can't compute a valid port"); - errno = EADDRNOTAVAIL; - rc = -1; - } else { - while (1 & (ports[rc >> 5] >> (rc & 31))) rc++; - } - } - } + + memset(afids, 0, AFID_ACNT * sizeof(uint32_t)); + rc = systemd_unit_list(0, get_afid_cb, afids); + if (rc >= 0) + rc = systemd_unit_list(1, get_afid_cb, afids); + if (rc < 0) + ERROR("troubles while updating afids"); return rc; } +static int first_free_afid(uint32_t *afids) +{ + int afid; + + afid = AFID_MIN; + while (afid <= AFID_MAX && !~afids[AFID_AIDX(afid)]) + afid += 32; + while (afid <= AFID_MAX && AFID_TEST(afids, afid)) + afid++; + if (afid > AFID_MAX) { + ERROR("Can't compute a valid afid"); + errno = EADDRNOTAVAIL; + afid = -1; + } + return afid; +} + +static int get_new_afid() +{ + int afid; + + /* ensure existing afid bitmap */ + if (afids_array == NULL) { + afids_array = malloc(AFID_ACNT * sizeof(uint32_t)); + if (afids_array == NULL || update_afids(afids_array) < 0) + return -1; + } + + /* allocates the afid */ + afid = first_free_afid(afids_array); + if (afid < 0 && errno == EADDRNOTAVAIL) { + /* no more ids, try to rescan */ + memset(afids_array, 0, AFID_ACNT * sizeof(uint32_t)); + if (update_afids(afids_array) >= 0) + afid = first_free_afid(afids_array); + } + if (afid >= 0) + AFID_SET(afids_array, afid); + + return afid; +} + static int check_defined(const void *data, const char *name) { if (data) @@ -262,7 +312,7 @@ static int for_all_content(const struct wgt_desc *desc, int (*action)(const char rc = action(desc->content_src, desc->content_type); feat = desc->features; while (feat) { - if (!strcmp(feat->name, "urn:AGL:widget:provided-unit")) { + if (!strcmp(feat->name, FWK_PREFIX"widget:provided-unit")) { src = wgt_info_param(feat, "content.src"); type = wgt_info_param(feat, "content.type"); rc2 = action(src, type); @@ -348,7 +398,11 @@ static int get_target_directory(char target[PATH_MAX], const char *root, const s { int rc; +#if DISTINCT_VERSIONS rc = snprintf(target, PATH_MAX, "%s/%s/%s", root, desc->id, desc->ver); +#else + rc = snprintf(target, PATH_MAX, "%s/%s", root, desc->id); +#endif if (rc < PATH_MAX) rc = 0; else { @@ -409,7 +463,7 @@ static int install_file_properties(const struct wgt_desc *desc) rc = 0; feat = desc->features; while (feat) { - if (!strcmp(feat->name, "urn:AGL:widget:file-properties")) { + if (!strcmp(feat->name, FWK_PREFIX"widget:file-properties")) { param = feat->params; while (param) { if (!strcmp(param->value, "executable")) { @@ -489,6 +543,16 @@ static int install_security(const struct wgt_desc *desc) perm = next_usable_permission(); } + /* install default permissions */ + n = (unsigned int)(sizeof default_permissions / sizeof *default_permissions); + for (i = 0 ; i < n ; i++) { + perm = default_permissions[i]; + rc = secmgr_permit(perm); + INFO("permitting %s %s", perm, rc ? "FAILED!" : "success"); + if (rc) + goto error2; + } + rc = secmgr_install(); return rc; error2: @@ -503,7 +567,7 @@ 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, err; + int err, rc; struct unitconf uconf; NOTICE("-- INSTALLING widget %s to %s --", wgtfile, root); @@ -518,7 +582,12 @@ struct wgt_info *install_widget(const char *wgtfile, const char *root, int force if (zread(wgtfile, 0)) goto error2; - if (check_all_signatures(DEFAULT_ALLOW_NO_SIGNATURE)) +#if defined(ALLOW_NO_SIGNATURE) + rc = check_all_signatures(1); +#else + rc = check_all_signatures(0); +#endif + if (rc) goto error2; ifo = wgt_info_createat(workdirfd, NULL, 1, 1, 1); @@ -558,13 +627,10 @@ struct wgt_info *install_widget(const char *wgtfile, const char *root, int force if (install_file_properties(desc)) goto error4; - port = get_port(); - if (port < 0) - goto error4; - uconf.installdir = installdir; uconf.icondir = FWK_ICON_DIR; - uconf.port = port; + uconf.new_afid = get_new_afid; + uconf.base_http_ports = HTTP_PORT_BASE; if (unit_install(ifo, &uconf)) goto error4;