source: libabac/abac_stack.c @ 2e9455f

mei_rt2
Last change on this file since 2e9455f 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
RevLine 
[2e9455f]1/**
2** abac_stack.c
3**/
4
[e95d652]5#include <stdlib.h>
6
7#include "abac_stack.h"
8#include "abac_util.h"
9
[2e9455f]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/****************************************************************/
[e95d652]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
[da5afdf]28/* push only if it is not in there still */
[7b548fa]29int abac_stack_unique_push(abac_stack_t *stack, void *elt) {
30    if(!stack) return 0; 
[da5afdf]31
32    void *cur;
33    abac_stack_foreach(stack, cur,
34        if(cur == elt)
[7b548fa]35            return 0;
[da5afdf]36        );
37    abac_stack_push(stack,elt);
[7b548fa]38    return 1;
[da5afdf]39}
40
[e95d652]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;
[da5afdf]52   
53    if(!stack) return NULL;
[e95d652]54
55    if(stack->size>0) {
56        cur=stack->elts;
57        ret=cur->ptr;
[202a7f9]58        DL_DELETE(stack->elts, cur);
[e95d652]59        free(cur);
[202a7f9]60        --stack->size;
[e95d652]61        return ret;
62    }
63    // reutrn false if we don't
64    return NULL;
65}
66
67int abac_stack_size(abac_stack_t *stack) {
[da5afdf]68    if(stack) return stack->size;
69    return 0;
[e95d652]70}
71
72void abac_stack_free(abac_stack_t *stack) {
73    abac_stack_element_t *elt, *tmp;
74
[da5afdf]75    if(!stack) return; 
76
[e95d652]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.