Fix installation of more than one widget
[src/app-framework-main.git] / src / wgtpkg-permissions.c
index 25758e4..c341054 100644 (file)
@@ -1,6 +1,8 @@
 /*
  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;
@@ -29,10 +32,11 @@ struct permission {
        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)
@@ -43,7 +47,7 @@ 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))
@@ -56,7 +60,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;
@@ -64,6 +69,8 @@ static struct permission *add_permission(const char *name)
                        p->name = strdup(name);
                        if (!p->name)
                                p = NULL;
+                       else
+                               nrpermissions++;
                }
        }
        return p;
@@ -72,44 +79,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) {
-                       syslog(LOG_ERR, "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 */
@@ -130,3 +146,20 @@ int request_permission(const char *name)
        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;
+}
+