source: libabac/abac_stack.c @ d0efdec

mei_rt2
Last change on this file since d0efdec was 2e9455f, checked in by Mei <mei@…>, 11 years ago

1) added namespace
2) tweak ?This,
3) allowing linking role/oset as constraining conditions
4) adding access_tests regression testing that uses GENI's access policy
5) added couple multi contexts regression tests
6) add compression/uncompression calls to abac_encode_string/abac_decode_string
(libstrongwan only allows 512 char for attribute rule storage)
7) add attribute_now option to creddy that takes a whole char string for attribute
rule

  • Property mode set to 100644
File size: 1.7 KB
Line 
1/**
2** abac_stack.c
3**/
4
5#include <stdlib.h>
6
7#include "abac_stack.h"
8#include "abac_util.h"
9
10struct _abac_stack_element_t {
11    void *ptr;
12    abac_stack_element_t *prev, *next;
13};
14
15struct _abac_stack_t {
16    abac_stack_element_t *elts;
17    int size;
18};
19
20/****************************************************************/
21abac_stack_t *abac_stack_new(void) {
22    abac_stack_t *ret = abac_xmalloc(sizeof(abac_stack_t));
23    ret->elts = NULL;
24    ret->size = 0;
25    return ret;
26}
27
28/* push only if it is not in there still */
29int abac_stack_unique_push(abac_stack_t *stack, void *elt) {
30    if(!stack) return 0; 
31
32    void *cur;
33    abac_stack_foreach(stack, cur,
34        if(cur == elt)
35            return 0;
36        );
37    abac_stack_push(stack,elt);
38    return 1;
39}
40
41void abac_stack_push(abac_stack_t *stack, void *elt) {
42    abac_stack_element_t *new_element = abac_xmalloc(sizeof(abac_stack_element_t));
43
44    new_element->ptr = elt;
45    DL_APPEND(stack->elts, new_element);
46    ++stack->size;
47}
48
49void *abac_stack_pop(abac_stack_t *stack) {
50    abac_stack_element_t *cur;
51    void *ret;
52   
53    if(!stack) return NULL;
54
55    if(stack->size>0) {
56        cur=stack->elts;
57        ret=cur->ptr;
58        DL_DELETE(stack->elts, cur);
59        free(cur);
60        --stack->size;
61        return ret;
62    }
63    // reutrn false if we don't
64    return NULL;
65}
66
67int abac_stack_size(abac_stack_t *stack) {
68    if(stack) return stack->size;
69    return 0;
70}
71
72void abac_stack_free(abac_stack_t *stack) {
73    abac_stack_element_t *elt, *tmp;
74
75    if(!stack) return; 
76
77    // free everthing in the stack
78    DL_FOREACH_SAFE(stack->elts, elt, tmp) {
79        DL_DELETE(stack->elts, elt);
80        free(elt);
81    }
82
83    // free the list
84    free(stack);
85}
Note: See TracBrowser for help on using the repository browser.