iterator_internal.h File Reference


Detailed Description

Declaration of the internal interface for qpol_iterator, an arbitrary valued policy component iterator used to return lists of components.

Author:
Kevin Carr kcarr@tresys.com

Jeremy A. Mowery jmowery@tresys.com

Jason Tang jtang@tresys.com

Copyright (C) 2006-2007 Tresys Technology, LLC

This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

Definition in file iterator_internal.h.

#include <sepol/policydb/policydb.h>
#include <sepol/policydb/avtab.h>
#include <qpol/iterator.h>
#include <qpol/policy.h>
#include <stddef.h>

Go to the source code of this file.


Classes

struct  hash_state
struct  ebitmap_state
struct  ocon_state
struct  perm_state
struct  avtab_state

Defines

#define QPOL_AVTAB_STATE_AV   0
#define QPOL_AVTAB_STATE_COND   1

Typedefs

typedef hash_state hash_state_t
typedef ebitmap_state ebitmap_state_t
typedef ocon_state ocon_state_t
typedef perm_state perm_state_t
typedef avtab_state avtab_state_t

Functions

int qpol_iterator_create (const qpol_policy_t *policy, void *state, void *(*get_cur)(const qpol_iterator_t *iter), int(*next)(qpol_iterator_t *iter), int(*end)(const qpol_iterator_t *iter), size_t(*size)(const qpol_iterator_t *iter), void(*free_fn)(void *x), qpol_iterator_t **iter)
void * qpol_iterator_state (const qpol_iterator_t *iter)
const policydb_t * qpol_iterator_policy (const qpol_iterator_t *iter)
void * hash_state_get_cur (const qpol_iterator_t *iter)
void * hash_state_get_cur_key (const qpol_iterator_t *iter)
void * ebitmap_state_get_cur_type (const qpol_iterator_t *iter)
void * ebitmap_state_get_cur_role (const qpol_iterator_t *iter)
void * ebitmap_state_get_cur_cat (const qpol_iterator_t *iter)
void * ocon_state_get_cur (const qpol_iterator_t *iter)
void * perm_state_get_cur (const qpol_iterator_t *iter)
void * avtab_state_get_cur (const qpol_iterator_t *iter)
int hash_state_next (qpol_iterator_t *iter)
int ebitmap_state_next (qpol_iterator_t *iter)
int ocon_state_next (qpol_iterator_t *iter)
int perm_state_next (qpol_iterator_t *iter)
int avtab_state_next (qpol_iterator_t *iter)
int hash_state_end (const qpol_iterator_t *iter)
int ebitmap_state_end (const qpol_iterator_t *iter)
int ocon_state_end (const qpol_iterator_t *iter)
int perm_state_end (const qpol_iterator_t *iter)
int avtab_state_end (const qpol_iterator_t *iter)
size_t hash_state_size (const qpol_iterator_t *iter)
size_t ebitmap_state_size (const qpol_iterator_t *iter)
size_t ocon_state_size (const qpol_iterator_t *iter)
size_t perm_state_size (const qpol_iterator_t *iter)
size_t avtab_state_size (const qpol_iterator_t *iter)
void ebitmap_state_destroy (void *es)

Define Documentation

#define QPOL_AVTAB_STATE_AV   0
 

Definition at line 75 of file iterator_internal.h.

Referenced by avtab_state_end(), and avtab_state_next().

#define QPOL_AVTAB_STATE_COND   1
 

Definition at line 76 of file iterator_internal.h.


Typedef Documentation

typedef struct hash_state hash_state_t
 

Referenced by hash_state_end(), hash_state_get_cur(), hash_state_get_cur_key(), hash_state_next(), hash_state_size(), qpol_class_get_perm_iter(), qpol_common_get_perm_iter(), qpol_policy_get_bool_iter(), qpol_policy_get_cat_iter(), qpol_policy_get_class_iter(), qpol_policy_get_common_iter(), qpol_policy_get_level_iter(), qpol_policy_get_role_iter(), qpol_policy_get_type_iter(), and qpol_policy_get_user_iter().

typedef struct ebitmap_state ebitmap_state_t
 

Referenced by ebitmap_state_destroy(), ebitmap_state_end(), ebitmap_state_get_cur_cat(), ebitmap_state_get_cur_role(), ebitmap_state_get_cur_type(), ebitmap_state_next(), ebitmap_state_size(), qpol_level_get_cat_iter(), qpol_mls_level_get_cat_iter(), qpol_role_get_dominate_iter(), qpol_role_get_type_iter(), qpol_type_get_attr_iter(), qpol_type_get_type_iter(), qpol_type_set_get_included_types_iter(), qpol_type_set_get_subtracted_types_iter(), and qpol_user_get_role_iter().

typedef struct ocon_state ocon_state_t
 

Referenced by ocon_state_end(), ocon_state_get_cur(), ocon_state_next(), ocon_state_size(), qpol_policy_get_fs_use_iter(), qpol_policy_get_isid_iter(), qpol_policy_get_netifcon_iter(), qpol_policy_get_nodecon_iter(), and qpol_policy_get_portcon_iter().

typedef struct perm_state perm_state_t
 

Referenced by perm_state_end(), perm_state_get_cur(), perm_state_next(), perm_state_size(), qpol_avrule_get_perm_iter(), and qpol_constraint_get_perm_iter().

typedef struct avtab_state avtab_state_t
 

Referenced by avtab_state_end(), avtab_state_get_cur(), avtab_state_next(), avtab_state_size(), qpol_policy_get_avrule_iter(), and qpol_policy_get_terule_iter().


Function Documentation

int qpol_iterator_create const qpol_policy_t policy,
void *  state,
void *(*)(const qpol_iterator_t *iter)  get_cur,
int(*)(qpol_iterator_t *iter)  next,
int(*)(const qpol_iterator_t *iter)  end,
size_t(*)(const qpol_iterator_t *iter)  size,
void(*)(void *x)  free_fn,
qpol_iterator_t **  iter
 

Definition at line 75 of file iterator.c.

References ERR, qpol_policy::p, qpol_iterator::policy, qpol_iterator_t, and qpol_policy_t.

Referenced by qpol_avrule_get_perm_iter(), qpol_avrule_get_syn_avrule_iter(), qpol_cat_get_alias_iter(), qpol_class_get_constraint_iter(), qpol_class_get_perm_iter(), qpol_class_get_validatetrans_iter(), qpol_common_get_perm_iter(), qpol_cond_get_av_false_iter(), qpol_cond_get_av_true_iter(), qpol_cond_get_expr_node_iter(), qpol_cond_get_te_false_iter(), qpol_cond_get_te_true_iter(), qpol_constraint_expr_node_get_names_iter(), qpol_constraint_get_expr_iter(), qpol_constraint_get_perm_iter(), qpol_level_get_alias_iter(), qpol_level_get_cat_iter(), qpol_mls_level_get_cat_iter(), qpol_perm_get_class_iter(), qpol_perm_get_common_iter(), qpol_policy_get_avrule_iter(), qpol_policy_get_bool_iter(), qpol_policy_get_cat_iter(), qpol_policy_get_class_iter(), qpol_policy_get_common_iter(), qpol_policy_get_cond_iter(), qpol_policy_get_constraint_iter(), qpol_policy_get_fs_use_iter(), qpol_policy_get_genfscon_iter(), qpol_policy_get_isid_iter(), qpol_policy_get_level_iter(), qpol_policy_get_module_iter(), qpol_policy_get_netifcon_iter(), qpol_policy_get_nodecon_iter(), qpol_policy_get_portcon_iter(), qpol_policy_get_range_trans_iter(), qpol_policy_get_role_allow_iter(), qpol_policy_get_role_iter(), qpol_policy_get_role_trans_iter(), qpol_policy_get_terule_iter(), qpol_policy_get_type_iter(), qpol_policy_get_user_iter(), qpol_policy_get_validatetrans_iter(), qpol_role_get_dominate_iter(), qpol_role_get_type_iter(), qpol_syn_avrule_get_class_iter(), qpol_syn_avrule_get_perm_iter(), qpol_syn_terule_get_class_iter(), qpol_terule_get_syn_terule_iter(), qpol_type_get_alias_iter(), qpol_type_get_attr_iter(), qpol_type_get_type_iter(), qpol_type_set_get_included_types_iter(), qpol_type_set_get_subtracted_types_iter(), qpol_user_get_role_iter(), and qpol_validatetrans_get_expr_iter().

00080 {
00081         int error = 0;
00082 
00083         if (iter != NULL)
00084                 *iter = NULL;
00085 
00086         if (policy == NULL || state == NULL || iter == NULL || get_cur == NULL || next == NULL || end == NULL || size == NULL) {
00087                 ERR(policy, "%s", strerror(EINVAL));
00088                 errno = EINVAL;
00089                 return STATUS_ERR;
00090         }
00091 
00092         *iter = calloc(1, sizeof(struct qpol_iterator));
00093         if (*iter == NULL) {
00094                 error = errno;
00095                 ERR(policy, "%s", strerror(ENOMEM));
00096                 errno = error;
00097                 return STATUS_ERR;
00098         }
00099 
00100         (*iter)->policy = &policy->p->p;
00101         (*iter)->state = state;
00102         (*iter)->get_cur = get_cur;
00103         (*iter)->next = next;
00104         (*iter)->end = end;
00105         (*iter)->size = size;
00106         (*iter)->free_fn = free_fn;
00107 
00108         return STATUS_SUCCESS;
00109 }

void* qpol_iterator_state const qpol_iterator_t iter  ) 
 

Definition at line 111 of file iterator.c.

References qpol_iterator_t, and qpol_iterator::state.

Referenced by cexpr_name_state_end(), cexpr_name_state_get_cur_role(), cexpr_name_state_get_cur_type(), cexpr_name_state_get_cur_user(), cexpr_name_state_next(), cexpr_name_state_size(), class_constr_state_end(), class_constr_state_get_cur(), class_constr_state_next(), class_constr_state_size(), cond_expr_state_end(), cond_expr_state_get_cur(), cond_expr_state_next(), cond_expr_state_size(), cond_rule_state_end(), cond_rule_state_get_cur(), cond_rule_state_next(), cond_rule_state_size(), cond_state_end(), cond_state_get_cur(), cond_state_next(), cond_state_size(), constr_expr_state_end(), constr_expr_state_get_cur(), constr_expr_state_next(), constr_expr_state_size(), ebitmap_state_get_cur_cat(), ebitmap_state_get_cur_role(), ebitmap_state_get_cur_type(), genfs_state_end(), genfs_state_get_cur(), genfs_state_next(), genfs_state_size(), hash_alias_state_size(), hash_perm_state_size_class(), hash_perm_state_size_common(), hash_state_cat_alias_size(), hash_state_get_cur_alias(), hash_state_level_alias_size(), hash_state_next_cat_alias(), hash_state_next_class_w_perm(), hash_state_next_common_w_perm(), hash_state_next_level_alias(), hash_state_next_type_alias(), mod_state_end(), mod_state_get_cur(), mod_state_next(), mod_state_size(), node_state_end(), node_state_get_cur(), node_state_next(), node_state_size(), perm_state_end(), perm_state_get_cur(), perm_state_next(), perm_state_size(), policy_constr_state_end(), policy_constr_state_get_cur(), policy_constr_state_next(), policy_constr_state_next_vtrans(), policy_constr_state_size(), policy_constr_state_size_vtrans(), range_trans_state_end(), range_trans_state_get_cur(), range_trans_state_next(), range_trans_state_size(), role_allow_state_end(), role_allow_state_get_cur(), role_allow_state_next(), role_allow_state_size(), role_trans_state_end(), role_trans_state_get_cur(), role_trans_state_next(), role_trans_state_size(), syn_rule_class_state_end(), syn_rule_class_state_get_cur(), syn_rule_class_state_next(), syn_rule_class_state_size(), syn_rule_perm_state_end(), syn_rule_perm_state_get_cur(), syn_rule_perm_state_next(), syn_rule_perm_state_size(), syn_rule_state_end(), syn_rule_state_get_cur(), syn_rule_state_next(), and syn_rule_state_size().

00112 {
00113         if (iter == NULL || iter->state == NULL) {
00114                 errno = EINVAL;
00115                 return NULL;
00116         }
00117 
00118         return iter->state;
00119 }

const policydb_t* qpol_iterator_policy const qpol_iterator_t iter  ) 
 

Definition at line 121 of file iterator.c.

References qpol_iterator::policy, and qpol_iterator_t.

Referenced by cexpr_name_state_get_cur_role(), cexpr_name_state_get_cur_type(), cexpr_name_state_get_cur_user(), ebitmap_state_get_cur_cat(), ebitmap_state_get_cur_role(), ebitmap_state_get_cur_type(), hash_perm_state_size_class(), hash_perm_state_size_common(), hash_state_next_class_w_perm(), hash_state_next_common_w_perm(), perm_state_end(), perm_state_get_cur(), perm_state_next(), perm_state_size(), role_allow_state_get_cur(), role_allow_state_next(), role_allow_state_size(), role_trans_state_get_cur(), role_trans_state_next(), role_trans_state_size(), and syn_rule_class_state_get_cur().

00122 {
00123         if (iter == NULL || iter->policy == NULL) {
00124                 errno = EINVAL;
00125                 return NULL;
00126         }
00127 
00128         return iter->policy;
00129 }

void* hash_state_get_cur const qpol_iterator_t iter  ) 
 

Definition at line 131 of file iterator.c.

References hash_state_end(), hash_state_t, hash_state::node, qpol_iterator_t, and qpol_iterator::state.

Referenced by qpol_perm_get_class_iter(), qpol_perm_get_common_iter(), qpol_policy_get_bool_iter(), qpol_policy_get_cat_iter(), qpol_policy_get_class_iter(), qpol_policy_get_common_iter(), qpol_policy_get_level_iter(), qpol_policy_get_role_iter(), qpol_policy_get_type_iter(), and qpol_policy_get_user_iter().

00132 {
00133         hash_state_t *hs = NULL;
00134 
00135         if (iter == NULL || iter->state == NULL || hash_state_end(iter)) {
00136                 errno = EINVAL;
00137                 return NULL;
00138         }
00139 
00140         hs = (hash_state_t *) iter->state;
00141 
00142         return hs->node->datum;
00143 }

void* hash_state_get_cur_key const qpol_iterator_t iter  ) 
 

Definition at line 145 of file iterator.c.

References hash_state_end(), hash_state_t, hash_state::node, qpol_iterator_t, and qpol_iterator::state.

Referenced by qpol_class_get_perm_iter(), and qpol_common_get_perm_iter().

00146 {
00147         hash_state_t *hs = NULL;
00148 
00149         if (iter == NULL || iter->state == NULL || hash_state_end(iter)) {
00150                 errno = EINVAL;
00151                 return NULL;
00152         }
00153 
00154         hs = (hash_state_t *) iter->state;
00155 
00156         return hs->node->key;
00157 }

void* ebitmap_state_get_cur_type const qpol_iterator_t iter  ) 
 

Definition at line 527 of file iterator.c.

References ebitmap_state::cur, ebitmap_state_t, qpol_iterator_policy(), qpol_iterator_state(), and qpol_iterator_t.

Referenced by qpol_role_get_type_iter(), qpol_type_get_attr_iter(), qpol_type_get_type_iter(), qpol_type_set_get_included_types_iter(), and qpol_type_set_get_subtracted_types_iter().

00528 {
00529         ebitmap_state_t *es = NULL;
00530         const policydb_t *db = NULL;
00531 
00532         if (iter == NULL) {
00533                 errno = EINVAL;
00534                 return NULL;
00535         }
00536         es = qpol_iterator_state(iter);
00537         if (es == NULL) {
00538                 errno = EINVAL;
00539                 return NULL;
00540         }
00541         db = qpol_iterator_policy(iter);
00542         if (db == NULL) {
00543                 errno = EINVAL;
00544                 return NULL;
00545         }
00546 
00547         return db->type_val_to_struct[es->cur];
00548 }

void* ebitmap_state_get_cur_role const qpol_iterator_t iter  ) 
 

Definition at line 550 of file iterator.c.

References ebitmap_state::cur, ebitmap_state_t, qpol_iterator_policy(), qpol_iterator_state(), and qpol_iterator_t.

Referenced by qpol_role_get_dominate_iter(), and qpol_user_get_role_iter().

00551 {
00552         ebitmap_state_t *es = NULL;
00553         const policydb_t *db = NULL;
00554 
00555         if (iter == NULL) {
00556                 errno = EINVAL;
00557                 return NULL;
00558         }
00559         es = qpol_iterator_state(iter);
00560         if (es == NULL) {
00561                 errno = EINVAL;
00562                 return NULL;
00563         }
00564         db = qpol_iterator_policy(iter);
00565         if (db == NULL) {
00566                 errno = EINVAL;
00567                 return NULL;
00568         }
00569 
00570         return db->role_val_to_struct[es->cur];
00571 }

void* ebitmap_state_get_cur_cat const qpol_iterator_t iter  ) 
 

Definition at line 573 of file iterator.c.

References ebitmap_state::cur, ebitmap_state_t, qpol_policy::fn, qpol_policy::p, qpol_cat_t, qpol_iterator_policy(), qpol_iterator_state(), qpol_iterator_t, qpol_policy_get_cat_by_name(), and qpol_policy_t.

Referenced by qpol_level_get_cat_iter(), and qpol_mls_level_get_cat_iter().

00574 {
00575         ebitmap_state_t *es = NULL;
00576         const policydb_t *db = NULL;
00577         const qpol_cat_t *cat = NULL;
00578         sepol_policydb_t sp;
00579         qpol_policy_t qp;
00580 
00581         if (iter == NULL) {
00582                 errno = EINVAL;
00583                 return NULL;
00584         }
00585         es = qpol_iterator_state(iter);
00586         if (es == NULL) {
00587                 errno = EINVAL;
00588                 return NULL;
00589         }
00590         db = qpol_iterator_policy(iter);
00591         if (db == NULL) {
00592                 errno = EINVAL;
00593                 return NULL;
00594         }
00595 
00596         /* shallow copy is safe here */
00597         sp.p = *db;
00598         qp.p = &sp;
00599         qp.fn = NULL;
00600 
00601         qpol_policy_get_cat_by_name(&qp, db->p_cat_val_to_name[es->cur], &cat);
00602 
00603         /* There is no val_to_struct for categories; this requires that qpol
00604          * search for the struct, but it can't be returned as const here so
00605          * cast it to void* explicitly. */
00606         return (void *)cat;
00607 }

void* ocon_state_get_cur const qpol_iterator_t iter  ) 
 

Definition at line 159 of file iterator.c.

References ocon_state::cur, ocon_state_end(), ocon_state_t, qpol_iterator_t, and qpol_iterator::state.

Referenced by qpol_policy_get_fs_use_iter(), qpol_policy_get_isid_iter(), qpol_policy_get_netifcon_iter(), and qpol_policy_get_portcon_iter().

00160 {
00161         ocon_state_t *os = NULL;
00162 
00163         if (iter == NULL || iter->state == NULL || ocon_state_end(iter)) {
00164                 errno = EINVAL;
00165                 return NULL;
00166         }
00167 
00168         os = (ocon_state_t *) iter->state;
00169 
00170         return os->cur;
00171 }

void* perm_state_get_cur const qpol_iterator_t iter  ) 
 

Definition at line 646 of file iterator.c.

References perm_state::cur, perm_state::obj_class_val, perm_state::perm_set, perm_state_end(), perm_state_t, qpol_iterator_policy(), qpol_iterator_state(), and qpol_iterator_t.

Referenced by qpol_avrule_get_perm_iter(), and qpol_constraint_get_perm_iter().

00647 {
00648         const policydb_t *db = NULL;
00649         class_datum_t *obj_class = NULL;
00650         common_datum_t *comm = NULL;
00651         perm_state_t *ps = NULL;
00652         unsigned int perm_max = 0;
00653         char *tmp = NULL;
00654 
00655         if (iter == NULL || (db = qpol_iterator_policy(iter)) == NULL ||
00656             (ps = (perm_state_t *) qpol_iterator_state(iter)) == NULL || perm_state_end(iter)) {
00657                 errno = EINVAL;
00658                 return NULL;
00659         }
00660 
00661         obj_class = db->class_val_to_struct[ps->obj_class_val - 1];
00662         comm = obj_class->comdatum;
00663 
00664         /* permission max is number of permissions in the class which includes
00665          * the number of permissions in its common if it inherits one */
00666         perm_max = obj_class->permissions.nprim;
00667         if (perm_max > 32) {
00668                 errno = EDOM;          /* perms set mask is a uint32_t cannot use more than 32 bits */
00669                 return NULL;
00670         }
00671         if (ps->cur >= perm_max) {
00672                 errno = ERANGE;
00673                 return NULL;
00674         }
00675         if (!(ps->perm_set & 1 << (ps->cur))) { /* perm bit not set? */
00676                 errno = EINVAL;
00677                 return NULL;
00678         }
00679 
00680         /* explicit const_cast for sepol */
00681         tmp = sepol_av_to_string((policydb_t *) db, ps->obj_class_val, (sepol_access_vector_t) 1 << (ps->cur));
00682         if (tmp) {
00683                 tmp++;                 /*sepol_av_to_string prepends a ' ' to the name */
00684                 return strdup(tmp);
00685         } else {
00686                 errno = EINVAL;
00687                 return NULL;
00688         }
00689 }

void* avtab_state_get_cur const qpol_iterator_t iter  ) 
 

Definition at line 173 of file iterator.c.

References avtab_state_end(), avtab_state_t, avtab_state::node, qpol_iterator_t, and qpol_iterator::state.

00174 {
00175         avtab_state_t *state;
00176 
00177         if (iter == NULL || iter->state == NULL || avtab_state_end(iter)) {
00178                 errno = EINVAL;
00179                 return NULL;
00180         }
00181         state = (avtab_state_t *) iter->state;
00182         return state->node;
00183 }

int hash_state_next qpol_iterator_t iter  ) 
 

Definition at line 185 of file iterator.c.

References hash_state::bucket, hash_state_t, hash_state::node, qpol_iterator_t, qpol_iterator::state, and hash_state::table.

Referenced by hash_state_next_cat_alias(), hash_state_next_class_w_perm(), hash_state_next_common_w_perm(), hash_state_next_level_alias(), hash_state_next_type_alias(), qpol_class_get_perm_iter(), qpol_common_get_perm_iter(), qpol_policy_get_bool_iter(), qpol_policy_get_cat_iter(), qpol_policy_get_class_iter(), qpol_policy_get_common_iter(), qpol_policy_get_level_iter(), qpol_policy_get_role_iter(), qpol_policy_get_type_iter(), and qpol_policy_get_user_iter().

00186 {
00187         hash_state_t *hs = NULL;
00188 
00189         if (iter == NULL || iter->state == NULL) {
00190                 errno = EINVAL;
00191                 return STATUS_ERR;
00192         }
00193 
00194         hs = (hash_state_t *) iter->state;
00195 
00196         if (hs->table == NULL || *(hs->table) == NULL || hs->bucket >= (*(hs->table))->size) {
00197                 errno = ERANGE;
00198                 return STATUS_ERR;
00199         }
00200 
00201         if (hs->node != NULL && hs->node->next != NULL) {
00202                 hs->node = hs->node->next;
00203         } else {
00204                 do {
00205                         hs->bucket++;
00206                         if (hs->bucket < (*(hs->table))->size) {
00207                                 hs->node = (*(hs->table))->htable[hs->bucket];
00208                         } else {
00209                                 hs->node = NULL;
00210                         }
00211                 } while (hs->bucket < (*(hs->table))->size && hs->node == NULL);
00212         }
00213 
00214         return STATUS_SUCCESS;
00215 }

int ebitmap_state_next qpol_iterator_t iter  ) 
 

Definition at line 217 of file iterator.c.

References ebitmap_state::bmap, ebitmap_state::cur, ebitmap_state_t, qpol_iterator_t, and qpol_iterator::state.

Referenced by qpol_level_get_cat_iter(), qpol_mls_level_get_cat_iter(), qpol_role_get_dominate_iter(), qpol_role_get_type_iter(), qpol_type_get_attr_iter(), qpol_type_get_type_iter(), qpol_type_set_get_included_types_iter(), qpol_type_set_get_subtracted_types_iter(), and qpol_user_get_role_iter().

00218 {
00219         ebitmap_state_t *es = NULL;
00220 
00221         if (iter == NULL || iter->state == NULL) {
00222                 errno = EINVAL;
00223                 return STATUS_ERR;
00224         }
00225 
00226         es = (ebitmap_state_t *) iter->state;
00227 
00228         if (es->cur >= es->bmap->highbit) {
00229                 errno = ERANGE;
00230                 return STATUS_ERR;
00231         }
00232 
00233         do {
00234                 es->cur++;
00235         } while (es->cur < es->bmap->highbit && !ebitmap_get_bit(es->bmap, es->cur));
00236 
00237         return STATUS_SUCCESS;
00238 }

int ocon_state_next qpol_iterator_t iter  ) 
 

Definition at line 240 of file iterator.c.

References ocon_state::cur, ocon_state_t, qpol_iterator_t, and qpol_iterator::state.

Referenced by qpol_policy_get_fs_use_iter(), qpol_policy_get_isid_iter(), qpol_policy_get_netifcon_iter(), and qpol_policy_get_portcon_iter().

00241 {
00242         ocon_state_t *os = NULL;
00243 
00244         if (iter == NULL || iter->state == NULL) {
00245                 errno = EINVAL;
00246                 return STATUS_ERR;
00247         }
00248 
00249         os = (ocon_state_t *) iter->state;
00250 
00251         if (os->cur == NULL) {
00252                 errno = ERANGE;
00253                 return STATUS_ERR;
00254         }
00255 
00256         os->cur = os->cur->next;
00257 
00258         return STATUS_SUCCESS;
00259 }

int perm_state_next qpol_iterator_t iter  ) 
 

Definition at line 691 of file iterator.c.

References perm_state::cur, perm_state::obj_class_val, perm_state::perm_set, perm_state_end(), perm_state_t, qpol_iterator_policy(), qpol_iterator_state(), and qpol_iterator_t.

Referenced by qpol_avrule_get_perm_iter(), and qpol_constraint_get_perm_iter().

00692 {
00693         perm_state_t *ps = NULL;
00694         const policydb_t *db = NULL;
00695         unsigned int perm_max = 0;
00696 
00697         if (iter == NULL || (ps = qpol_iterator_state(iter)) == NULL ||
00698             (db = qpol_iterator_policy(iter)) == NULL || perm_state_end(iter)) {
00699                 errno = EINVAL;
00700                 return STATUS_ERR;
00701         }
00702 
00703         /* permission max is number of permissions in the class which includes
00704          * the number of permissions in its common if it inherits one */
00705         perm_max = db->class_val_to_struct[ps->obj_class_val - 1]->permissions.nprim;
00706         if (perm_max > 32) {
00707                 errno = EDOM;          /* perms set mask is a uint32_t cannot use more than 32 bits */
00708                 return STATUS_ERR;
00709         }
00710 
00711         if (ps->cur >= perm_max) {
00712                 errno = ERANGE;
00713                 return STATUS_ERR;
00714         }
00715 
00716         do {
00717                 ps->cur++;
00718         } while (ps->cur < perm_max && !(ps->perm_set & 1 << (ps->cur)));
00719 
00720         return STATUS_SUCCESS;
00721 }

int avtab_state_next qpol_iterator_t iter  ) 
 

Definition at line 261 of file iterator.c.

References avtab_state_t, avtab_state::bucket, avtab_state::cond_tab, iterator_get_avtab_size(), avtab_state::node, QPOL_AVTAB_STATE_AV, qpol_iterator_t, avtab_state::rule_type_mask, qpol_iterator::state, avtab_state::ucond_tab, and avtab_state::which.

Referenced by qpol_policy_get_avrule_iter(), and qpol_policy_get_terule_iter().

00262 {
00263         avtab_t *avtab;
00264         avtab_state_t *state;
00265 
00266         if (iter == NULL || iter->state == NULL) {
00267                 errno = EINVAL;
00268                 return STATUS_ERR;
00269         }
00270 
00271         state = iter->state;
00272         avtab = (state->which == QPOL_AVTAB_STATE_AV ? state->ucond_tab : state->cond_tab);
00273 
00274         if ((!avtab->htable || state->bucket >= iterator_get_avtab_size(avtab)) && state->which == QPOL_AVTAB_STATE_COND) {
00275                 errno = ERANGE;
00276                 return STATUS_ERR;
00277         }
00278 
00279         do {
00280                 if (state->node != NULL && state->node->next != NULL) {
00281                         state->node = state->node->next;
00282                 } else {
00283                         /* find the next bucket */
00284                         do {
00285                                 state->bucket++;
00286                                 if (!avtab->htable || state->bucket >= iterator_get_avtab_size(avtab)) {
00287                                         if (state->which == QPOL_AVTAB_STATE_AV) {
00288                                                 state->bucket = 0;
00289                                                 avtab = state->cond_tab;
00290                                                 state->which = QPOL_AVTAB_STATE_COND;
00291                                         } else {
00292                                                 state->node = NULL;
00293                                                 break;
00294                                         }
00295                                 }
00296                                 if (avtab->htable && avtab->htable[state->bucket] != NULL) {
00297                                         state->node = avtab->htable[state->bucket];
00298                                         break;
00299                                 }
00300                         } while (avtab->htable && state->bucket < iterator_get_avtab_size(avtab));
00301                 }
00302         } while (avtab->htable && state->bucket < iterator_get_avtab_size(avtab) &&
00303                  state->node ? !(state->rule_type_mask & state->node->key.specified) : 0);
00304 
00305         return STATUS_SUCCESS;
00306 }

int hash_state_end const qpol_iterator_t iter  ) 
 

Definition at line 308 of file iterator.c.

References hash_state::bucket, hash_state_t, qpol_iterator_t, qpol_iterator::state, and hash_state::table.

Referenced by hash_state_get_cur(), hash_state_get_cur_key(), hash_state_next_class_w_perm(), hash_state_next_common_w_perm(), qpol_cat_get_alias_iter(), qpol_class_get_perm_iter(), qpol_common_get_perm_iter(), qpol_level_get_alias_iter(), qpol_perm_get_class_iter(), qpol_perm_get_common_iter(), qpol_policy_get_bool_iter(), qpol_policy_get_cat_iter(), qpol_policy_get_class_iter(), qpol_policy_get_common_iter(), qpol_policy_get_level_iter(), qpol_policy_get_role_iter(), qpol_policy_get_type_iter(), qpol_policy_get_user_iter(), and qpol_type_get_alias_iter().

00309 {
00310         hash_state_t *hs = NULL;
00311 
00312         if (iter == NULL || iter->state == NULL) {
00313                 errno = EINVAL;
00314                 return STATUS_ERR;
00315         }
00316 
00317         hs = (hash_state_t *) iter->state;
00318 
00319         if (hs->table == NULL || *(hs->table) == NULL || (*(hs->table))->nel == 0 || hs->bucket >= (*(hs->table))->size)
00320                 return 1;
00321 
00322         return 0;
00323 }

int ebitmap_state_end const qpol_iterator_t iter  ) 
 

Definition at line 325 of file iterator.c.

References ebitmap_state::bmap, ebitmap_state::cur, ebitmap_state_t, qpol_iterator_t, and qpol_iterator::state.

Referenced by qpol_level_get_cat_iter(), qpol_mls_level_get_cat_iter(), qpol_role_get_dominate_iter(), qpol_role_get_type_iter(), qpol_type_get_attr_iter(), qpol_type_get_type_iter(), qpol_type_set_get_included_types_iter(), qpol_type_set_get_subtracted_types_iter(), and qpol_user_get_role_iter().

00326 {
00327         ebitmap_state_t *es = NULL;
00328 
00329         if (iter == NULL || iter->state == NULL) {
00330                 errno = EINVAL;
00331                 return STATUS_ERR;
00332         }
00333 
00334         es = (ebitmap_state_t *) iter->state;
00335 
00336         if (es->cur >= es->bmap->highbit)
00337                 return 1;
00338 
00339         return 0;
00340 }

int ocon_state_end const qpol_iterator_t iter  ) 
 

Definition at line 342 of file iterator.c.

References ocon_state::cur, ocon_state_t, qpol_iterator_t, and qpol_iterator::state.

Referenced by ocon_state_get_cur(), qpol_policy_get_fs_use_iter(), qpol_policy_get_isid_iter(), qpol_policy_get_netifcon_iter(), and qpol_policy_get_portcon_iter().

00343 {
00344         ocon_state_t *os = NULL;
00345 
00346         if (iter == NULL || iter->state == NULL) {
00347                 errno = EINVAL;
00348                 return STATUS_ERR;
00349         }
00350 
00351         os = (ocon_state_t *) iter->state;
00352 
00353         if (os->cur == NULL)
00354                 return 1;
00355 
00356         return 0;
00357 }

int perm_state_end const qpol_iterator_t iter  ) 
 

Definition at line 621 of file iterator.c.

References perm_state::cur, perm_state::obj_class_val, perm_state::perm_set, perm_state_t, qpol_iterator_policy(), qpol_iterator_state(), and qpol_iterator_t.

Referenced by perm_state_get_cur(), perm_state_next(), perm_state_size(), qpol_avrule_get_perm_iter(), and qpol_constraint_get_perm_iter().

00622 {
00623         perm_state_t *ps = NULL;
00624         const policydb_t *db = NULL;
00625         unsigned int perm_max = 0;
00626 
00627         if (iter == NULL || (ps = qpol_iterator_state(iter)) == NULL || (db = qpol_iterator_policy(iter)) == NULL) {
00628                 errno = EINVAL;
00629                 return STATUS_ERR;
00630         }
00631 
00632         /* permission max is number of permissions in the class which includes
00633          * the number of permissions in its common if it inherits one */
00634         perm_max = db->class_val_to_struct[ps->obj_class_val - 1]->permissions.nprim;
00635         if (perm_max > 32) {
00636                 errno = EDOM;          /* perms set mask is a uint32_t cannot use more than 32 bits */
00637                 return STATUS_ERR;
00638         }
00639 
00640         if (!(ps->perm_set) || ps->cur >= perm_max)
00641                 return 1;
00642 
00643         return 0;
00644 }

int avtab_state_end const qpol_iterator_t iter  ) 
 

Definition at line 359 of file iterator.c.

References avtab_state_t, avtab_state::bucket, avtab_state::cond_tab, iterator_get_avtab_size(), QPOL_AVTAB_STATE_AV, qpol_iterator_t, qpol_iterator::state, avtab_state::ucond_tab, and avtab_state::which.

Referenced by avtab_state_get_cur().

00360 {
00361         avtab_state_t *state;
00362         avtab_t *avtab;
00363 
00364         if (iter == NULL || iter->state == NULL) {
00365                 errno = EINVAL;
00366                 return STATUS_ERR;
00367         }
00368         state = iter->state;
00369         avtab = (state->which == QPOL_AVTAB_STATE_AV ? state->ucond_tab : state->cond_tab);
00370         if ((!avtab->htable || state->bucket >= iterator_get_avtab_size(avtab)) && state->which == QPOL_AVTAB_STATE_COND)
00371                 return 1;
00372         return 0;
00373 }

size_t hash_state_size const qpol_iterator_t iter  ) 
 

Definition at line 375 of file iterator.c.

References hash_state_t, qpol_iterator_t, qpol_iterator::state, and hash_state::table.

Referenced by qpol_class_get_perm_iter(), qpol_common_get_perm_iter(), qpol_policy_get_bool_iter(), qpol_policy_get_cat_iter(), qpol_policy_get_class_iter(), qpol_policy_get_common_iter(), qpol_policy_get_level_iter(), qpol_policy_get_role_iter(), qpol_policy_get_type_iter(), and qpol_policy_get_user_iter().

00376 {
00377         hash_state_t *hs = NULL;
00378 
00379         if (iter == NULL || iter->state == NULL) {
00380                 errno = EINVAL;
00381                 return 0;
00382         }
00383 
00384         hs = (hash_state_t *) iter->state;
00385 
00386         return (*(hs->table))->nel;
00387 }

size_t ebitmap_state_size const qpol_iterator_t iter  ) 
 

Definition at line 389 of file iterator.c.

References ebitmap_state::bmap, ebitmap_state_t, qpol_iterator_t, and qpol_iterator::state.

Referenced by qpol_level_get_cat_iter(), qpol_mls_level_get_cat_iter(), qpol_role_get_dominate_iter(), qpol_role_get_type_iter(), qpol_type_get_attr_iter(), qpol_type_get_type_iter(), qpol_type_set_get_included_types_iter(), qpol_type_set_get_subtracted_types_iter(), and qpol_user_get_role_iter().

00390 {
00391         ebitmap_state_t *es = NULL;
00392         size_t count = 0, bit = 0;
00393         ebitmap_node_t *node = NULL;
00394 
00395         if (iter == NULL || iter->state == NULL) {
00396                 errno = EINVAL;
00397                 return 0;
00398         }
00399 
00400         es = (ebitmap_state_t *) iter->state;
00401 
00402         ebitmap_for_each_bit(es->bmap, node, bit) {
00403                 count += ebitmap_get_bit(es->bmap, bit);
00404         }
00405 
00406         return count;
00407 }

size_t ocon_state_size const qpol_iterator_t iter  ) 
 

Definition at line 409 of file iterator.c.

References ocon_state::head, ocon_state_t, qpol_iterator_t, and qpol_iterator::state.

Referenced by qpol_policy_get_fs_use_iter(), qpol_policy_get_isid_iter(), qpol_policy_get_netifcon_iter(), and qpol_policy_get_portcon_iter().

00410 {
00411         ocon_state_t *os = NULL;
00412         size_t count = 0;
00413         ocontext_t *ocon = NULL;
00414 
00415         if (iter == NULL || iter->state == NULL) {
00416                 errno = EINVAL;
00417                 return 0;
00418         }
00419 
00420         os = (ocon_state_t *) iter->state;
00421 
00422         for (ocon = os->head; ocon; ocon = ocon->next)
00423                 count++;
00424 
00425         return count;
00426 }

size_t perm_state_size const qpol_iterator_t iter  ) 
 

Definition at line 723 of file iterator.c.

References perm_state::obj_class_val, perm_state::perm_set, perm_state_end(), perm_state_t, qpol_iterator_policy(), qpol_iterator_state(), and qpol_iterator_t.

Referenced by qpol_avrule_get_perm_iter(), and qpol_constraint_get_perm_iter().

00724 {
00725         perm_state_t *ps = NULL;
00726         const policydb_t *db = NULL;
00727         unsigned int perm_max = 0;
00728         size_t i, count = 0;
00729 
00730         if (iter == NULL || (ps = qpol_iterator_state(iter)) == NULL ||
00731             (db = qpol_iterator_policy(iter)) == NULL || perm_state_end(iter)) {
00732                 errno = EINVAL;
00733                 return 0;              /* as a size_t 0 is error */
00734         }
00735 
00736         /* permission max is number of permissions in the class which includes
00737          * the number of permissions in its common if it inherits one */
00738         perm_max = db->class_val_to_struct[ps->obj_class_val - 1]->permissions.nprim;
00739         if (perm_max > 32) {
00740                 errno = EDOM;          /* perms set mask is a uint32_t cannot use more than 32 bits */
00741                 return 0;              /* as a size_t 0 is error */
00742         }
00743 
00744         for (i = 0; i < perm_max; i++) {
00745                 if (ps->perm_set & 1 << i)
00746                         count++;
00747         }
00748 
00749         return count;
00750 }

size_t avtab_state_size const qpol_iterator_t iter  ) 
 

Definition at line 428 of file iterator.c.

References avtab_state_t, avtab_state::cond_tab, iterator_get_avtab_size(), qpol_iterator::policy, qpol_iterator_t, avtab_state::rule_type_mask, qpol_iterator::state, and avtab_state::ucond_tab.

00429 {
00430         avtab_state_t *state;
00431         avtab_t *avtab;
00432         size_t count = 0;
00433         avtab_ptr_t node = NULL;
00434         uint32_t bucket = 0;
00435 
00436         if (iter == NULL || iter->state == NULL || iter->policy == NULL) {
00437                 errno = EINVAL;
00438                 return STATUS_ERR;
00439         }
00440 
00441         state = iter->state;
00442         avtab = state->ucond_tab;
00443 
00444         for (bucket = 0; avtab->htable && bucket < iterator_get_avtab_size(avtab); bucket++) {
00445                 for (node = avtab->htable[bucket]; node; node = node->next) {
00446                         if (node->key.specified & state->rule_type_mask)
00447                                 count++;
00448                 }
00449         }
00450 
00451         avtab = state->cond_tab;
00452 
00453         for (bucket = 0; avtab->htable && bucket < iterator_get_avtab_size(avtab); bucket++) {
00454                 for (node = avtab->htable[bucket]; node; node = node->next) {
00455                         if (node->key.specified & state->rule_type_mask)
00456                                 count++;
00457                 }
00458         }
00459 
00460         return count;
00461 }

void ebitmap_state_destroy void *  es  ) 
 

Definition at line 609 of file iterator.c.

References ebitmap_state::bmap, and ebitmap_state_t.

Referenced by qpol_role_get_type_iter().

00610 {
00611         ebitmap_state_t *ies = (ebitmap_state_t *) es;
00612 
00613         if (!es)
00614                 return;
00615 
00616         ebitmap_destroy(ies->bmap);
00617         free(ies->bmap);
00618         free(ies);
00619 }