X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fwgtpkg-permissions.c;h=abb4596a76a48e2aa75e37f282680da9530eec67;hb=2a319cf90daa6e3b01e8139923f7073e1c9bcf28;hp=88bce0579feb8a4615dd826e77213f122403b0cb;hpb=189415eece11c543e1ccb95dff32695ddc383565;p=src%2Fapp-framework-main.git diff --git a/src/wgtpkg-permissions.c b/src/wgtpkg-permissions.c index 88bce05..abb4596 100644 --- a/src/wgtpkg-permissions.c +++ b/src/wgtpkg-permissions.c @@ -1,5 +1,5 @@ /* - Copyright 2015 IoT.bzh + Copyright (C) 2015-2019 IoT.bzh author: José Bollo @@ -32,22 +32,14 @@ struct permission { unsigned level: 3; }; -static const char prefix_of_permissions[] = FWK_PREFIX_PERMISSION; - -static int nrpermissions = 0; +static unsigned int nrpermissions = 0; static struct permission *permissions = NULL; -static int indexiter = 0; - -/* check is the name has the correct prefix for permissions */ -int is_standard_permission(const char *name) -{ - return 0 == memcmp(name, prefix_of_permissions, sizeof(prefix_of_permissions) - 1); -} +static unsigned int indexiter = 0; /* retrieves the permission of name */ static struct permission *get_permission(const char *name) { - int i; + unsigned int i; for (i = 0 ; i < nrpermissions ; i++) if (0 == strcmp(permissions[i].name, name)) @@ -60,7 +52,8 @@ static struct permission *add_permission(const char *name) { struct permission *p = get_permission(name); if (!p) { - p = realloc(permissions, ((nrpermissions + 8) & ~7) * sizeof(*p)); + p = realloc(permissions, + ((nrpermissions + 8) & ~(unsigned)7) * sizeof(*p)); if (p) { permissions = p; p = permissions + nrpermissions; @@ -68,6 +61,8 @@ static struct permission *add_permission(const char *name) p->name = strdup(name); if (!p->name) p = NULL; + else + nrpermissions++; } } return p; @@ -76,44 +71,53 @@ static struct permission *add_permission(const char *name) /* remove any granting */ void reset_permissions() { - int i; + unsigned int i; for (i = 0 ; i < nrpermissions ; i++) - permissions[i].granted = 0; + permissions[i].granted = permissions[i].requested = 0; +} + +/* remove any requested permission */ +void reset_requested_permissions() +{ + unsigned int i; + for (i = 0 ; i < nrpermissions ; i++) + permissions[i].requested = 0; } /* remove any granting */ void crop_permissions(unsigned level) { - int i; + unsigned int i; for (i = 0 ; i < nrpermissions ; i++) if (permissions[i].level < level) permissions[i].granted = 0; } /* add permissions granted for installation */ -void grant_permission_list(const char *list) +int grant_permission_list(const char *list) { struct permission *p; char *iter, c; - int n; + unsigned int n; static const char separators[] = " \t\n\r,"; iter = strdupa(list); iter += strspn(iter, separators); while(*iter) { - n = strcspn(iter, separators); + n = (unsigned)strcspn(iter, separators); c = iter[n]; iter[n] = 0; p = add_permission(iter); if (!p) { - ERROR("Can't allocate permission"); - exit(1); + errno = ENOMEM; + return -1; } p->granted = 1; iter += n; *iter =c; iter += strspn(iter, separators); } + return 0; } /* checks if the permission 'name' is recorded */ @@ -125,13 +129,25 @@ int permission_exists(const char *name) /* request the permission, returns 1 if granted or 0 otherwise */ int request_permission(const char *name) { +#define HACK_ALLOWING_REQUESTED_PERMISSIONS 1 + struct permission *p = get_permission(name); + +#if defined(HACK_ALLOWING_REQUESTED_PERMISSIONS) && HACK_ALLOWING_REQUESTED_PERMISSIONS + if (!p) + p = add_permission(name); +#endif if (p) { +#if defined(HACK_ALLOWING_REQUESTED_PERMISSIONS) && HACK_ALLOWING_REQUESTED_PERMISSIONS + p->granted = 1; +#endif p->requested = 1; if (p->granted) return 1; } return 0; + +#undef HACK_ALLOWING_REQUESTED_PERMISSIONS } /* iteration over granted and requested permissions */