X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fwgtpkg-uninstall.c;h=dba667c2777058a36f40a24feb1ba8252cf1ef91;hb=a855d14583b2ac2629dfac696fea788826bacc4d;hp=7516c3f0bf2a480b15d04bce722801e82aeefb6d;hpb=50dd441a11440201e1da9da81a7103677e2282ad;p=src%2Fapp-framework-main.git diff --git a/src/wgtpkg-uninstall.c b/src/wgtpkg-uninstall.c index 7516c3f..dba667c 100644 --- a/src/wgtpkg-uninstall.c +++ b/src/wgtpkg-uninstall.c @@ -1,5 +1,5 @@ /* - Copyright 2015 IoT.bzh + Copyright (C) 2015-2020 IoT.bzh author: José Bollo @@ -24,62 +24,89 @@ #include #include #include +#include #include "verbose.h" #include "utils-dir.h" #include "secmgr-wrap.h" +#include "wgtpkg-unit.h" +#include "wgt.h" +#include "wgt-info.h" /* uninstall the widget of idaver */ int uninstall_widget(const char *idaver, const char *root) { +#if DISTINCT_VERSIONS char *id; char *ver; - char path[PATH_MAX]; const char *at; +#endif + char path[PATH_MAX]; int rc, rc2; + struct unitconf uconf; + struct wgt_info *ifo; NOTICE("-- UNINSTALLING widget of id %s from %s --", idaver, root); /* find the last '@' of the id */ +#if DISTINCT_VERSIONS at = strrchr(idaver, '@'); if (at == NULL) { ERROR("bad widget id '%s', no @", idaver); errno = EINVAL; return -1; } - id = strndupa(idaver, at - idaver); + id = strndupa(idaver, (size_t)(at - idaver)); ver = strdupa(at + 1); /* compute the path */ rc = snprintf(path, sizeof path, "%s/%s/%s", root, id, ver); - if (rc >= sizeof path) { +#else + rc = snprintf(path, sizeof path, "%s/%s", root, idaver); +#endif + + if (rc >= (int)sizeof path) { ERROR("bad widget id '%s', too long", idaver); errno = EINVAL; return -1; } + /* removes the units */ + ifo = wgt_info_createat(AT_FDCWD, path, 1, 1, 1); + if (!ifo) { + ERROR("can't read widget config in directory '%s': %m", path); + return -1; + } + uconf.installdir = path; + uconf.icondir = FWK_ICON_DIR; + uconf.new_afid = 0; + uconf.base_http_ports = 0; + unit_uninstall(ifo, &uconf); + wgt_info_unref(ifo); + /* removes the directory of the application */ rc = remove_directory(path, 1); if (rc < 0) { - ERROR("error while removing directory '%s': %m", path); + ERROR("while removing directory '%s': %m", path); return -1; } /* removes the icon of the application */ rc = snprintf(path, sizeof path, "%s/%s", FWK_ICON_DIR, idaver); - assert(rc < sizeof path); + assert(rc < (int)sizeof path); rc = unlink(path); - if (rc < 0) - ERROR("can't removing '%s': %m", path); + if (rc < 0 && errno != ENOENT) + ERROR("can't remove '%s': %m", path); +#if DISTINCT_VERSIONS /* removes the parent directory if empty */ rc2 = snprintf(path, sizeof path, "%s/%s", root, id); - assert(rc2 < sizeof path); + assert(rc2 < (int)sizeof path); rc2 = rmdir(path); if (rc < 0 && errno == ENOTEMPTY) return rc; if (rc < 0) { - ERROR("error while removing directory '%s': %m", path); + ERROR("while removing directory '%s': %m", path); return -1; } @@ -88,6 +115,9 @@ int uninstall_widget(const char *idaver, const char *root) * uninstall it for the security-manager */ rc2 = secmgr_init(id); +#else + rc2 = secmgr_init(idaver); +#endif if (rc2) { ERROR("can't init security manager context"); return -1;