X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fwgtpkg-install.c;h=ee21d8fb57d533dacc54d137698dd116d6afbb5b;hb=9ab266df6642c6e930e03b3024d7c3d53ef88bbc;hp=b6237b313fa7d83b6608bc362fed18254c08ed22;hpb=26d75de504d808191dbadc9a735009a214a789b0;p=src%2Fapp-framework-main.git diff --git a/src/wgtpkg-install.c b/src/wgtpkg-install.c index b6237b3..ee21d8f 100644 --- a/src/wgtpkg-install.c +++ b/src/wgtpkg-install.c @@ -14,239 +14,101 @@ limitations under the License. */ -#define _BSD_SOURCE /* see readdir */ +#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include #include #include -#include +#include #include "verbose.h" #include "wgtpkg.h" #include "wgt.h" #include "wgt-info.h" -static const char appname[] = "wgtpkg-install"; -static const char *root; -static char **permissions = NULL; -static int force; - -static void install(const char *wgtfile); -static void add_permissions(const char *list); - -static void usage() -{ - printf( - "usage: %s [-f] [-q] [-v] [-p list] rootdir wgtfile...\n" - "\n" - " rootdir the root directory for installing\n" - " -p list a list of comma separated permissions to allow\n" - " -f force overwriting\n" - " -q quiet\n" - " -v verbose\n" - "\n", - appname - ); -} - -static struct option options[] = { - { "permissions", required_argument, NULL, 'p' }, - { "force", no_argument, NULL, 'f' }, - { "help", no_argument, NULL, 'h' }, - { "quiet", no_argument, NULL, 'q' }, - { "verbose", no_argument, NULL, 'v' }, - { NULL, 0, NULL, 0 } -}; - -/* install the widgets of the list */ -int main(int ac, char **av) +static int check_temporary_constraints(const struct wgt_desc *desc) { - int i; - char *wpath; - - openlog(appname, LOG_PERROR, LOG_AUTH); - - xmlsec_init(); - - force = 0; - for (;;) { - i = getopt_long(ac, av, "hfqvp:", options, NULL); - if (i < 0) - break; - switch (i) { - case 'f': - force = 1; - break; - case 'h': - usage(); - return 0; - case 'q': - if (verbosity) - verbosity--; - break; - case 'v': - verbosity++; - break; - case 'p': - add_permissions(optarg); - break; - case ':': - syslog(LOG_ERR, "missing argument value"); - return 1; - default: - syslog(LOG_ERR, "unrecognized option"); - return 1; - } + if (!desc->icons) { + syslog(LOG_ERR, "widget has not icon defined (temporary constraints)"); + errno = EINVAL; + return -1; } - - ac -= optind; - if (ac < 2) { - syslog(LOG_ERR, "arguments are missing"); - return 1; + if (desc->icons->next) { + syslog(LOG_ERR, "widget has more than one icon defined (temporary constraints)"); + errno = EINVAL; + return -1; } - - /* canonic names for files */ - av += optind; - for (i = 0 ; av[i] != NULL ; i++) { - wpath = realpath(av[i], NULL); - if (wpath == NULL) { - syslog(LOG_ERR, "error while getting realpath of %dth widget: %s", i+1, av[i]); - return 1; - } - av[i] = wpath; + if (!desc->content_src) { + syslog(LOG_ERR, "widget has not content defined (temporary constraints)"); + errno = EINVAL; + return -1; + } + if (!desc->content_type) { + syslog(LOG_ERR, "widget has not type for its content (temporary constraints)"); + errno = EINVAL; + return -1; } - root = *av++; - - /* install widgets */ - for ( ; *av ; av++) - install(*av); - return 0; } -/* checks if the permission 'name' is granted */ -static int has_permission(const char *name) +static int check_permissions(const char *name, int required) { - char **p = permissions; - if (p) { - while(*p) { - if (0 == strcmp(*p, name)) - return 1; - p++; + if (permission_exists(name)) { + if (request_permission(name)) { + debug("granted permission: %s", name); + } else if (required) { + syslog(LOG_ERR, "ungranted permission required: %s", name); + errno = EPERM; + return 0; + } else { + notice("ungranted permission optional: %s", name); } } - return 0; + return 1; } -/* add permissions granted for installation */ -static void add_permissions(const char *list) +static int check_widget(const struct wgt_desc *desc) { - char **ps, *p; - const char *iter; - int n, on; - static const char separators[] = " \t\n\r,"; - - n = 0; - iter = list + strspn(list, separators); - while(*iter) { - n++; - iter += strcspn(iter, separators); - iter += strspn(iter, separators); - } - if (n == 0) - return; - - on = 0; - ps = permissions; - if (ps) - while(*ps++) - on++; - - ps = realloc(permissions, (1 + on + n) * sizeof * ps); - if (!ps) { - syslog(LOG_ERR, "Can't allocate memory for permissions"); - exit(1); - } - - permissions = ps; - ps[on] = NULL; - - iter = list + strspn(list, separators); - while(*iter) { - n = strcspn(iter, separators); - p = strndup(iter, n); - if (!p) { - syslog(LOG_ERR, "Can't allocate permission"); - exit(1); + int result; + const struct wgt_desc_feature *feature; + const char *name; + + result = check_temporary_constraints(desc); + feature = desc->features; + while(feature) { + name = feature->name; + if (0 == strcmp(name, AGLWIDGET)) { + + } else { + if (!check_permissions(feature->name, feature->required)) + result = -1; } - if (has_permission(p)) - free(p); - else { - ps[on] = p; - ps[++on] = NULL; - } - iter += n; - iter += strspn(iter, separators); + feature = feature->next; } + return result; } - -static struct wgt *wgt_at_workdir() +static int place(const char *root, const char *appid, const char *version, int force) { - int rc, wfd; - struct wgt *wgt; + char newdir[PATH_MAX]; + int rc; - wfd = workdirfd(); - if (wfd < 0) - return NULL; - - wgt = wgt_create(); - if (!wgt) { - syslog(LOG_ERR, "failed to allocate wgt"); - close(wfd); - return NULL; - } - - rc = wgt_connectat(wgt, wfd, NULL); - if (rc) { - syslog(LOG_ERR, "failed to connect wgt to workdir"); - close(wfd); - wgt_unref(wgt); - return NULL; + rc = snprintf(newdir, sizeof newdir, "%s/%s/%s", root, appid, version); + if (rc >= sizeof newdir) { + syslog(LOG_ERR, "path to long: %s/%s/%s", root, appid, version); + errno = EINVAL; + return -1; } - return wgt; + rc = move_workdir(newdir, 1, force); + return rc; } - -static int check_and_place() +/* install the widget of the file */ +void install_widget(const char *wgtfile, const char *root, int force) { - struct wgt *wgt; struct wgt_info *ifo; + const struct wgt_desc *desc; - wgt = wgt_at_workdir(); - if (!wgt) - return -1; - - ifo = wgt_info_get(wgt, 1, 1, 1); - if (!ifo) { - wgt_unref(wgt); - return -1; - } - wgt_info_dump(ifo, 1, ""); - wgt_info_unref(ifo); - wgt_unref(wgt); - return 0; -} - -/* install the widget of the file */ -static void install(const char *wgtfile) -{ notice("-- INSTALLING widget %s --", wgtfile); /* workdir */ @@ -255,20 +117,29 @@ static void install(const char *wgtfile) goto error1; } - if (enter_workdir(0)) - goto error2; - if (zread(wgtfile, 0)) goto error2; if (check_all_signatures()) goto error2; + ifo = wgt_info_createat(workdirfd, NULL, 1, 1, 1); + if (!ifo) + goto error2; + + desc = wgt_info_desc(ifo); + if (check_widget(desc)) + goto error3; + +/* if (check_and_place()) goto error2; - +*/ return; +error3: + wgt_info_unref(ifo); + error2: remove_workdir(); @@ -276,4 +147,3 @@ error1: return; } -