/*
Copyright 2015 IoT.bzh
+ author: José Bollo <jose.bollo@iot.bzh>
+
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
#define _GNU_SOURCE
#include <errno.h>
-#include <syslog.h>
#include <string.h>
+#include <stdlib.h>
-#include "wgtpkg.h"
+#include "verbose.h"
+#include "wgtpkg-permissions.h"
struct permission {
char *name;
unsigned level: 3;
};
-static const char prefix_of_permissions[] = PREFIXPERMISSION;
+static const char prefix_of_permissions[] = FWK_PREFIX_PERMISSION;
-static int nrpermissions = 0;
+static unsigned int nrpermissions = 0;
static struct permission *permissions = NULL;
+static unsigned int indexiter = 0;
/* check is the name has the correct prefix for permissions */
int is_standard_permission(const char *name)
/* 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))
{
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;
p->name = strdup(name);
if (!p->name)
p = NULL;
+ else
+ nrpermissions++;
}
}
return p;
/* remove any granting */
void reset_permissions()
{
- int i;
+ unsigned int i;
for (i = 0 ; i < nrpermissions ; i++)
permissions[i].granted = 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;
{
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) {
- syslog(LOG_ERR, "Can't allocate permission");
+ ERROR("Can't allocate permission");
exit(1);
}
p->granted = 1;
return 0;
}
+/* iteration over granted and requested permissions */
+const char *first_usable_permission()
+{
+ indexiter = 0;
+ return next_usable_permission();
+}
+
+const char *next_usable_permission()
+{
+ while(indexiter < nrpermissions) {
+ struct permission *p = &permissions[indexiter++];
+ if (p->granted && p->requested)
+ return p->name;
+ }
+ return NULL;
+}
+