libselinux: remove unused hashtab code
Due to the selabel_file(5) rework this code is no longer used. Signed-off-by: Christian Göttsche <cgzones@googlemail.com> Acked-by: James Carter <jwcart2@gmail.com>
This commit is contained in:
parent
92306daf52
commit
daa3e6e9ba
|
@ -1,234 +0,0 @@
|
||||||
|
|
||||||
/* Author : Stephen Smalley, <stephen.smalley.work@gmail.com> */
|
|
||||||
|
|
||||||
/* FLASK */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Implementation of the hash table type.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "hashtab.h"
|
|
||||||
|
|
||||||
hashtab_t selinux_hashtab_create(unsigned int (*hash_value) (hashtab_t h,
|
|
||||||
const_hashtab_key_t key),
|
|
||||||
int (*keycmp) (hashtab_t h,
|
|
||||||
const_hashtab_key_t key1,
|
|
||||||
const_hashtab_key_t key2),
|
|
||||||
unsigned int size)
|
|
||||||
{
|
|
||||||
|
|
||||||
hashtab_t p;
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
p = (hashtab_t) malloc(sizeof(hashtab_val_t));
|
|
||||||
if (p == NULL)
|
|
||||||
return p;
|
|
||||||
|
|
||||||
memset(p, 0, sizeof(hashtab_val_t));
|
|
||||||
p->size = size;
|
|
||||||
p->nel = 0;
|
|
||||||
p->hash_value = hash_value;
|
|
||||||
p->keycmp = keycmp;
|
|
||||||
p->htable = (hashtab_ptr_t *) malloc(sizeof(hashtab_ptr_t) * size);
|
|
||||||
if (p->htable == NULL) {
|
|
||||||
free(p);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
for (i = 0; i < size; i++)
|
|
||||||
p->htable[i] = (hashtab_ptr_t) NULL;
|
|
||||||
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
int selinux_hashtab_insert(hashtab_t h, hashtab_key_t key, hashtab_datum_t datum)
|
|
||||||
{
|
|
||||||
unsigned int hvalue;
|
|
||||||
hashtab_ptr_t prev, cur, newnode;
|
|
||||||
|
|
||||||
if (!h)
|
|
||||||
return HASHTAB_OVERFLOW;
|
|
||||||
|
|
||||||
hvalue = h->hash_value(h, key);
|
|
||||||
prev = NULL;
|
|
||||||
cur = h->htable[hvalue];
|
|
||||||
while (cur && h->keycmp(h, key, cur->key) > 0) {
|
|
||||||
prev = cur;
|
|
||||||
cur = cur->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cur && (h->keycmp(h, key, cur->key) == 0))
|
|
||||||
return HASHTAB_PRESENT;
|
|
||||||
|
|
||||||
newnode = (hashtab_ptr_t) malloc(sizeof(hashtab_node_t));
|
|
||||||
if (newnode == NULL)
|
|
||||||
return HASHTAB_OVERFLOW;
|
|
||||||
memset(newnode, 0, sizeof(struct hashtab_node));
|
|
||||||
newnode->key = key;
|
|
||||||
newnode->datum = datum;
|
|
||||||
if (prev) {
|
|
||||||
newnode->next = prev->next;
|
|
||||||
prev->next = newnode;
|
|
||||||
} else {
|
|
||||||
newnode->next = h->htable[hvalue];
|
|
||||||
h->htable[hvalue] = newnode;
|
|
||||||
}
|
|
||||||
|
|
||||||
h->nel++;
|
|
||||||
return HASHTAB_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int selinux_hashtab_remove(hashtab_t h, hashtab_key_t key,
|
|
||||||
void (*destroy) (hashtab_key_t k,
|
|
||||||
hashtab_datum_t d, void *args), void *args)
|
|
||||||
{
|
|
||||||
unsigned int hvalue;
|
|
||||||
hashtab_ptr_t cur, last;
|
|
||||||
|
|
||||||
if (!h)
|
|
||||||
return HASHTAB_MISSING;
|
|
||||||
|
|
||||||
hvalue = h->hash_value(h, key);
|
|
||||||
last = NULL;
|
|
||||||
cur = h->htable[hvalue];
|
|
||||||
while (cur != NULL && h->keycmp(h, key, cur->key) > 0) {
|
|
||||||
last = cur;
|
|
||||||
cur = cur->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cur == NULL || (h->keycmp(h, key, cur->key) != 0))
|
|
||||||
return HASHTAB_MISSING;
|
|
||||||
|
|
||||||
if (last == NULL)
|
|
||||||
h->htable[hvalue] = cur->next;
|
|
||||||
else
|
|
||||||
last->next = cur->next;
|
|
||||||
|
|
||||||
if (destroy)
|
|
||||||
destroy(cur->key, cur->datum, args);
|
|
||||||
free(cur);
|
|
||||||
h->nel--;
|
|
||||||
return HASHTAB_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
hashtab_datum_t selinux_hashtab_search(hashtab_t h, const_hashtab_key_t key)
|
|
||||||
{
|
|
||||||
|
|
||||||
unsigned int hvalue;
|
|
||||||
hashtab_ptr_t cur;
|
|
||||||
|
|
||||||
if (!h)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
hvalue = h->hash_value(h, key);
|
|
||||||
cur = h->htable[hvalue];
|
|
||||||
while (cur != NULL && h->keycmp(h, key, cur->key) > 0)
|
|
||||||
cur = cur->next;
|
|
||||||
|
|
||||||
if (cur == NULL || (h->keycmp(h, key, cur->key) != 0))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return cur->datum;
|
|
||||||
}
|
|
||||||
|
|
||||||
void selinux_hashtab_destroy(hashtab_t h)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
hashtab_ptr_t cur, temp;
|
|
||||||
|
|
||||||
if (!h)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (i = 0; i < h->size; i++) {
|
|
||||||
cur = h->htable[i];
|
|
||||||
while (cur != NULL) {
|
|
||||||
temp = cur;
|
|
||||||
cur = cur->next;
|
|
||||||
free(temp);
|
|
||||||
}
|
|
||||||
h->htable[i] = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(h->htable);
|
|
||||||
h->htable = NULL;
|
|
||||||
|
|
||||||
free(h);
|
|
||||||
}
|
|
||||||
|
|
||||||
void selinux_hashtab_destroy_key(hashtab_t h,
|
|
||||||
int (*destroy_key) (hashtab_key_t k))
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
hashtab_ptr_t cur, temp;
|
|
||||||
|
|
||||||
if (!h)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (i = 0; i < h->size; i++) {
|
|
||||||
cur = h->htable[i];
|
|
||||||
while (cur != NULL) {
|
|
||||||
temp = cur;
|
|
||||||
cur = cur->next;
|
|
||||||
destroy_key(temp->key);
|
|
||||||
free(temp);
|
|
||||||
}
|
|
||||||
h->htable[i] = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(h->htable);
|
|
||||||
h->htable = NULL;
|
|
||||||
|
|
||||||
free(h);
|
|
||||||
}
|
|
||||||
|
|
||||||
int selinux_hashtab_map(hashtab_t h,
|
|
||||||
int (*apply) (hashtab_key_t k,
|
|
||||||
hashtab_datum_t d, void *args), void *args)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
hashtab_ptr_t cur;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!h)
|
|
||||||
return HASHTAB_SUCCESS;
|
|
||||||
|
|
||||||
for (i = 0; i < h->size; i++) {
|
|
||||||
cur = h->htable[i];
|
|
||||||
while (cur != NULL) {
|
|
||||||
ret = apply(cur->key, cur->datum, args);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
cur = cur->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return HASHTAB_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
void selinux_hashtab_hash_eval(hashtab_t h, char *tag)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
int chain_len, slots_used, max_chain_len;
|
|
||||||
hashtab_ptr_t cur;
|
|
||||||
|
|
||||||
slots_used = 0;
|
|
||||||
max_chain_len = 0;
|
|
||||||
for (i = 0; i < h->size; i++) {
|
|
||||||
cur = h->htable[i];
|
|
||||||
if (cur) {
|
|
||||||
slots_used++;
|
|
||||||
chain_len = 0;
|
|
||||||
while (cur) {
|
|
||||||
chain_len++;
|
|
||||||
cur = cur->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (chain_len > max_chain_len)
|
|
||||||
max_chain_len = chain_len;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
printf
|
|
||||||
("%s: %d entries and %d/%d buckets used, longest chain length %d\n",
|
|
||||||
tag, h->nel, slots_used, h->size, max_chain_len);
|
|
||||||
}
|
|
|
@ -1,117 +0,0 @@
|
||||||
|
|
||||||
/* Author : Stephen Smalley, <stephen.smalley.work@gmail.com> */
|
|
||||||
|
|
||||||
/* FLASK */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A hash table (hashtab) maintains associations between
|
|
||||||
* key values and datum values. The type of the key values
|
|
||||||
* and the type of the datum values is arbitrary. The
|
|
||||||
* functions for hash computation and key comparison are
|
|
||||||
* provided by the creator of the table.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _SELINUX_HASHTAB_H_
|
|
||||||
#define _SELINUX_HASHTAB_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
typedef char *hashtab_key_t; /* generic key type */
|
|
||||||
typedef const char *const_hashtab_key_t; /* constant generic key type */
|
|
||||||
typedef void *hashtab_datum_t; /* generic datum type */
|
|
||||||
|
|
||||||
typedef struct hashtab_node *hashtab_ptr_t;
|
|
||||||
|
|
||||||
typedef struct hashtab_node {
|
|
||||||
hashtab_key_t key;
|
|
||||||
hashtab_datum_t datum;
|
|
||||||
hashtab_ptr_t next;
|
|
||||||
} hashtab_node_t;
|
|
||||||
|
|
||||||
typedef struct hashtab_val {
|
|
||||||
hashtab_ptr_t *htable; /* hash table */
|
|
||||||
unsigned int size; /* number of slots in hash table */
|
|
||||||
uint32_t nel; /* number of elements in hash table */
|
|
||||||
unsigned int (*hash_value) (struct hashtab_val * h, const_hashtab_key_t key); /* hash function */
|
|
||||||
int (*keycmp) (struct hashtab_val * h, const_hashtab_key_t key1, const_hashtab_key_t key2); /* key comparison function */
|
|
||||||
} hashtab_val_t;
|
|
||||||
|
|
||||||
typedef hashtab_val_t *hashtab_t;
|
|
||||||
|
|
||||||
/* Define status codes for hash table functions */
|
|
||||||
#define HASHTAB_SUCCESS 0
|
|
||||||
#define HASHTAB_OVERFLOW -ENOMEM
|
|
||||||
#define HASHTAB_PRESENT -EEXIST
|
|
||||||
#define HASHTAB_MISSING -ENOENT
|
|
||||||
|
|
||||||
/*
|
|
||||||
Creates a new hash table with the specified characteristics.
|
|
||||||
|
|
||||||
Returns NULL if insufficient space is available or
|
|
||||||
the new hash table otherwise.
|
|
||||||
*/
|
|
||||||
extern hashtab_t selinux_hashtab_create(unsigned int (*hash_value) (hashtab_t h,
|
|
||||||
const_hashtab_key_t
|
|
||||||
key),
|
|
||||||
int (*keycmp) (hashtab_t h,
|
|
||||||
const_hashtab_key_t key1,
|
|
||||||
const_hashtab_key_t key2),
|
|
||||||
unsigned int size);
|
|
||||||
/*
|
|
||||||
Inserts the specified (key, datum) pair into the specified hash table.
|
|
||||||
|
|
||||||
Returns HASHTAB_OVERFLOW if insufficient space is available or
|
|
||||||
HASHTAB_PRESENT if there is already an entry with the same key or
|
|
||||||
HASHTAB_SUCCESS otherwise.
|
|
||||||
*/
|
|
||||||
extern int selinux_hashtab_insert(hashtab_t h, hashtab_key_t k, hashtab_datum_t d);
|
|
||||||
|
|
||||||
/*
|
|
||||||
Removes the entry with the specified key from the hash table.
|
|
||||||
Applies the specified destroy function to (key,datum,args) for
|
|
||||||
the entry.
|
|
||||||
|
|
||||||
Returns HASHTAB_MISSING if no entry has the specified key or
|
|
||||||
HASHTAB_SUCCESS otherwise.
|
|
||||||
*/
|
|
||||||
extern int selinux_hashtab_remove(hashtab_t h, hashtab_key_t k,
|
|
||||||
void (*destroy) (hashtab_key_t k,
|
|
||||||
hashtab_datum_t d,
|
|
||||||
void *args), void *args);
|
|
||||||
|
|
||||||
/*
|
|
||||||
Searches for the entry with the specified key in the hash table.
|
|
||||||
|
|
||||||
Returns NULL if no entry has the specified key or
|
|
||||||
the datum of the entry otherwise.
|
|
||||||
*/
|
|
||||||
extern hashtab_datum_t selinux_hashtab_search(hashtab_t h, const_hashtab_key_t k);
|
|
||||||
|
|
||||||
/*
|
|
||||||
Destroys the specified hash table.
|
|
||||||
*/
|
|
||||||
extern void selinux_hashtab_destroy(hashtab_t h);
|
|
||||||
extern void selinux_hashtab_destroy_key(hashtab_t h,
|
|
||||||
int (*destroy_key) (hashtab_key_t k));
|
|
||||||
|
|
||||||
/*
|
|
||||||
Applies the specified apply function to (key,datum,args)
|
|
||||||
for each entry in the specified hash table.
|
|
||||||
|
|
||||||
The order in which the function is applied to the entries
|
|
||||||
is dependent upon the internal structure of the hash table.
|
|
||||||
|
|
||||||
If apply returns a non-zero status, then hashtab_map will cease
|
|
||||||
iterating through the hash table and will propagate the error
|
|
||||||
return to its caller.
|
|
||||||
*/
|
|
||||||
extern int selinux_hashtab_map(hashtab_t h,
|
|
||||||
int (*apply) (hashtab_key_t k,
|
|
||||||
hashtab_datum_t d,
|
|
||||||
void *args), void *args);
|
|
||||||
|
|
||||||
extern void selinux_hashtab_hash_eval(hashtab_t h, char *tag);
|
|
||||||
|
|
||||||
#endif
|
|
Loading…
Reference in New Issue