mirror of
https://github.com/SELinuxProject/selinux
synced 2025-05-02 23:58:03 +00:00
libsepol: use constant keys in hashtab functions
Even though "hashtab_key_t" is an alias for "char *", "const hashtab_key_t" is not an alias for "(const char) *" but means "(char *) const". Introduce const_hashtab_key_t to map "(const char) *" and use it in hashtab_search() and hashtab key comparison functions. Signed-off-by: Nicolas Iooss <nicolas.iooss@m4x.org>
This commit is contained in:
parent
dcd135cc06
commit
fd9e5ef7b7
@ -4027,53 +4027,53 @@ exit:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int filename_trans_hash(hashtab_t h, hashtab_key_t key)
|
static unsigned int filename_trans_hash(hashtab_t h, const_hashtab_key_t key)
|
||||||
{
|
{
|
||||||
filename_trans_t *k = (filename_trans_t *)key;
|
const filename_trans_t *k = (const filename_trans_t *)key;
|
||||||
return ((k->tclass + (k->ttype << 2) +
|
return ((k->tclass + (k->ttype << 2) +
|
||||||
(k->stype << 9)) & (h->size - 1));
|
(k->stype << 9)) & (h->size - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int filename_trans_compare(hashtab_t h
|
static int filename_trans_compare(hashtab_t h
|
||||||
__attribute__ ((unused)), hashtab_key_t key1,
|
__attribute__ ((unused)), const_hashtab_key_t key1,
|
||||||
hashtab_key_t key2)
|
const_hashtab_key_t key2)
|
||||||
{
|
{
|
||||||
filename_trans_t *a = (filename_trans_t *)key1;
|
const filename_trans_t *a = (const filename_trans_t *)key1;
|
||||||
filename_trans_t *b = (filename_trans_t *)key2;
|
const filename_trans_t *b = (const filename_trans_t *)key2;
|
||||||
|
|
||||||
return a->stype != b->stype || a->ttype != b->ttype || a->tclass != b->tclass || strcmp(a->name, b->name);
|
return a->stype != b->stype || a->ttype != b->ttype || a->tclass != b->tclass || strcmp(a->name, b->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int range_trans_hash(hashtab_t h, hashtab_key_t key)
|
static unsigned int range_trans_hash(hashtab_t h, const_hashtab_key_t key)
|
||||||
{
|
{
|
||||||
range_trans_t *k = (range_trans_t *)key;
|
const range_trans_t *k = (const range_trans_t *)key;
|
||||||
return ((k->target_class + (k->target_type << 2) +
|
return ((k->target_class + (k->target_type << 2) +
|
||||||
(k->source_type << 5)) & (h->size - 1));
|
(k->source_type << 5)) & (h->size - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int range_trans_compare(hashtab_t h
|
static int range_trans_compare(hashtab_t h
|
||||||
__attribute__ ((unused)), hashtab_key_t key1,
|
__attribute__ ((unused)), const_hashtab_key_t key1,
|
||||||
hashtab_key_t key2)
|
const_hashtab_key_t key2)
|
||||||
{
|
{
|
||||||
range_trans_t *a = (range_trans_t *)key1;
|
const range_trans_t *a = (const range_trans_t *)key1;
|
||||||
range_trans_t *b = (range_trans_t *)key2;
|
const range_trans_t *b = (const range_trans_t *)key2;
|
||||||
|
|
||||||
return a->source_type != b->source_type || a->target_type != b->target_type || a->target_class != b->target_class;
|
return a->source_type != b->source_type || a->target_type != b->target_type || a->target_class != b->target_class;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int role_trans_hash(hashtab_t h, hashtab_key_t key)
|
static unsigned int role_trans_hash(hashtab_t h, const_hashtab_key_t key)
|
||||||
{
|
{
|
||||||
role_trans_t *k = (role_trans_t *)key;
|
const role_trans_t *k = (const role_trans_t *)key;
|
||||||
return ((k->role + (k->type << 2) +
|
return ((k->role + (k->type << 2) +
|
||||||
(k->tclass << 5)) & (h->size - 1));
|
(k->tclass << 5)) & (h->size - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int role_trans_compare(hashtab_t h
|
static int role_trans_compare(hashtab_t h
|
||||||
__attribute__ ((unused)), hashtab_key_t key1,
|
__attribute__ ((unused)), const_hashtab_key_t key1,
|
||||||
hashtab_key_t key2)
|
const_hashtab_key_t key2)
|
||||||
{
|
{
|
||||||
role_trans_t *a = (role_trans_t *)key1;
|
const role_trans_t *a = (const role_trans_t *)key1;
|
||||||
role_trans_t *b = (role_trans_t *)key2;
|
const role_trans_t *b = (const role_trans_t *)key2;
|
||||||
|
|
||||||
return a->role != b->role || a->type != b->type || a->tclass != b->tclass;
|
return a->role != b->role || a->type != b->type || a->tclass != b->tclass;
|
||||||
}
|
}
|
||||||
@ -4081,9 +4081,9 @@ static int role_trans_compare(hashtab_t h
|
|||||||
/* Based on MurmurHash3, written by Austin Appleby and placed in the
|
/* Based on MurmurHash3, written by Austin Appleby and placed in the
|
||||||
* public domain.
|
* public domain.
|
||||||
*/
|
*/
|
||||||
static unsigned int avrulex_hash(__attribute__((unused)) hashtab_t h, hashtab_key_t key)
|
static unsigned int avrulex_hash(__attribute__((unused)) hashtab_t h, const_hashtab_key_t key)
|
||||||
{
|
{
|
||||||
avtab_key_t *k = (avtab_key_t *)key;
|
const avtab_key_t *k = (const avtab_key_t *)key;
|
||||||
|
|
||||||
static const uint32_t c1 = 0xcc9e2d51;
|
static const uint32_t c1 = 0xcc9e2d51;
|
||||||
static const uint32_t c2 = 0x1b873593;
|
static const uint32_t c2 = 0x1b873593;
|
||||||
@ -4121,11 +4121,11 @@ static unsigned int avrulex_hash(__attribute__((unused)) hashtab_t h, hashtab_ke
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int avrulex_compare(hashtab_t h
|
static int avrulex_compare(hashtab_t h
|
||||||
__attribute__ ((unused)), hashtab_key_t key1,
|
__attribute__ ((unused)), const_hashtab_key_t key1,
|
||||||
hashtab_key_t key2)
|
const_hashtab_key_t key2)
|
||||||
{
|
{
|
||||||
avtab_key_t *a = (avtab_key_t *)key1;
|
const avtab_key_t *a = (const avtab_key_t *)key1;
|
||||||
avtab_key_t *b = (avtab_key_t *)key2;
|
const avtab_key_t *b = (const avtab_key_t *)key2;
|
||||||
|
|
||||||
return a->source_type != b->source_type || a->target_type != b->target_type || a->target_class != b->target_class || a->specified != b->specified;
|
return a->source_type != b->source_type || a->target_type != b->target_type || a->target_class != b->target_class || a->specified != b->specified;
|
||||||
}
|
}
|
||||||
|
@ -45,14 +45,14 @@ static pthread_mutex_t cil_strpool_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|||||||
static unsigned int cil_strpool_readers = 0;
|
static unsigned int cil_strpool_readers = 0;
|
||||||
static hashtab_t cil_strpool_tab = NULL;
|
static hashtab_t cil_strpool_tab = NULL;
|
||||||
|
|
||||||
static unsigned int cil_strpool_hash(hashtab_t h, hashtab_key_t key)
|
static unsigned int cil_strpool_hash(hashtab_t h, const_hashtab_key_t key)
|
||||||
{
|
{
|
||||||
char *p, *keyp;
|
const char *p, *keyp;
|
||||||
size_t size;
|
size_t size;
|
||||||
unsigned int val;
|
unsigned int val;
|
||||||
|
|
||||||
val = 0;
|
val = 0;
|
||||||
keyp = (char*)key;
|
keyp = (const char*)key;
|
||||||
size = strlen(keyp);
|
size = strlen(keyp);
|
||||||
for (p = keyp; ((size_t) (p - keyp)) < size; p++)
|
for (p = keyp; ((size_t) (p - keyp)) < size; p++)
|
||||||
val =
|
val =
|
||||||
@ -60,10 +60,10 @@ static unsigned int cil_strpool_hash(hashtab_t h, hashtab_key_t key)
|
|||||||
return val & (h->size - 1);
|
return val & (h->size - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cil_strpool_compare(hashtab_t h __attribute__ ((unused)), hashtab_key_t key1, hashtab_key_t key2)
|
static int cil_strpool_compare(hashtab_t h __attribute__ ((unused)), const_hashtab_key_t key1, const_hashtab_key_t key2)
|
||||||
{
|
{
|
||||||
char *keyp1 = (char*)key1;
|
const char *keyp1 = (const char*)key1;
|
||||||
char *keyp2 = (char*)key2;
|
const char *keyp2 = (const char*)key2;
|
||||||
return strcmp(keyp1, keyp2);
|
return strcmp(keyp1, keyp2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef char *hashtab_key_t; /* generic key type */
|
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 void *hashtab_datum_t; /* generic datum type */
|
||||||
|
|
||||||
typedef struct hashtab_node *hashtab_ptr_t;
|
typedef struct hashtab_node *hashtab_ptr_t;
|
||||||
@ -37,8 +38,8 @@ typedef struct hashtab_val {
|
|||||||
hashtab_ptr_t *htable; /* hash table */
|
hashtab_ptr_t *htable; /* hash table */
|
||||||
unsigned int size; /* number of slots in hash table */
|
unsigned int size; /* number of slots in hash table */
|
||||||
uint32_t nel; /* number of elements in hash table */
|
uint32_t nel; /* number of elements in hash table */
|
||||||
unsigned int (*hash_value) (struct hashtab_val * h, hashtab_key_t key); /* hash function */
|
unsigned int (*hash_value) (struct hashtab_val * h, const_hashtab_key_t key); /* hash function */
|
||||||
int (*keycmp) (struct hashtab_val * h, hashtab_key_t key1, hashtab_key_t key2); /* key comparison function */
|
int (*keycmp) (struct hashtab_val * h, const_hashtab_key_t key1, const_hashtab_key_t key2); /* key comparison function */
|
||||||
} hashtab_val_t;
|
} hashtab_val_t;
|
||||||
|
|
||||||
typedef hashtab_val_t *hashtab_t;
|
typedef hashtab_val_t *hashtab_t;
|
||||||
@ -50,11 +51,11 @@ typedef hashtab_val_t *hashtab_t;
|
|||||||
the new hash table otherwise.
|
the new hash table otherwise.
|
||||||
*/
|
*/
|
||||||
extern hashtab_t hashtab_create(unsigned int (*hash_value) (hashtab_t h,
|
extern hashtab_t hashtab_create(unsigned int (*hash_value) (hashtab_t h,
|
||||||
const hashtab_key_t
|
const_hashtab_key_t
|
||||||
key),
|
key),
|
||||||
int (*keycmp) (hashtab_t h,
|
int (*keycmp) (hashtab_t h,
|
||||||
const hashtab_key_t key1,
|
const_hashtab_key_t key1,
|
||||||
const hashtab_key_t key2),
|
const_hashtab_key_t key2),
|
||||||
unsigned int size);
|
unsigned int size);
|
||||||
/*
|
/*
|
||||||
Inserts the specified (key, datum) pair into the specified hash table.
|
Inserts the specified (key, datum) pair into the specified hash table.
|
||||||
@ -98,7 +99,7 @@ extern int hashtab_replace(hashtab_t h, hashtab_key_t k, hashtab_datum_t d,
|
|||||||
Returns NULL if no entry has the specified key or
|
Returns NULL if no entry has the specified key or
|
||||||
the datum of the entry otherwise.
|
the datum of the entry otherwise.
|
||||||
*/
|
*/
|
||||||
extern hashtab_datum_t hashtab_search(hashtab_t h, const hashtab_key_t k);
|
extern hashtab_datum_t hashtab_search(hashtab_t h, const_hashtab_key_t k);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Destroys the specified hash table.
|
Destroys the specified hash table.
|
||||||
|
@ -33,10 +33,10 @@
|
|||||||
#include <sepol/policydb/hashtab.h>
|
#include <sepol/policydb/hashtab.h>
|
||||||
|
|
||||||
hashtab_t hashtab_create(unsigned int (*hash_value) (hashtab_t h,
|
hashtab_t hashtab_create(unsigned int (*hash_value) (hashtab_t h,
|
||||||
const hashtab_key_t key),
|
const_hashtab_key_t key),
|
||||||
int (*keycmp) (hashtab_t h,
|
int (*keycmp) (hashtab_t h,
|
||||||
const hashtab_key_t key1,
|
const_hashtab_key_t key1,
|
||||||
const hashtab_key_t key2),
|
const_hashtab_key_t key2),
|
||||||
unsigned int size)
|
unsigned int size)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -175,7 +175,7 @@ int hashtab_replace(hashtab_t h, hashtab_key_t key, hashtab_datum_t datum,
|
|||||||
return SEPOL_OK;
|
return SEPOL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
hashtab_datum_t hashtab_search(hashtab_t h, const hashtab_key_t key)
|
hashtab_datum_t hashtab_search(hashtab_t h, const_hashtab_key_t key)
|
||||||
{
|
{
|
||||||
|
|
||||||
int hvalue;
|
int hvalue;
|
||||||
|
@ -727,7 +727,7 @@ partial_name_hash(unsigned long c, unsigned long prevhash)
|
|||||||
return (prevhash + (c << 4) + (c >> 4)) * 11;
|
return (prevhash + (c << 4) + (c >> 4)) * 11;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int filenametr_hash(hashtab_t h, hashtab_key_t k)
|
static unsigned int filenametr_hash(hashtab_t h, const_hashtab_key_t k)
|
||||||
{
|
{
|
||||||
const struct filename_trans *ft = (const struct filename_trans *)k;
|
const struct filename_trans *ft = (const struct filename_trans *)k;
|
||||||
unsigned long hash;
|
unsigned long hash;
|
||||||
@ -743,7 +743,7 @@ static unsigned int filenametr_hash(hashtab_t h, hashtab_key_t k)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int filenametr_cmp(hashtab_t h __attribute__ ((unused)),
|
static int filenametr_cmp(hashtab_t h __attribute__ ((unused)),
|
||||||
hashtab_key_t k1, hashtab_key_t k2)
|
const_hashtab_key_t k1, const_hashtab_key_t k2)
|
||||||
{
|
{
|
||||||
const struct filename_trans *ft1 = (const struct filename_trans *)k1;
|
const struct filename_trans *ft1 = (const struct filename_trans *)k1;
|
||||||
const struct filename_trans *ft2 = (const struct filename_trans *)k2;
|
const struct filename_trans *ft2 = (const struct filename_trans *)k2;
|
||||||
@ -765,7 +765,7 @@ static int filenametr_cmp(hashtab_t h __attribute__ ((unused)),
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int rangetr_hash(hashtab_t h, hashtab_key_t k)
|
static unsigned int rangetr_hash(hashtab_t h, const_hashtab_key_t k)
|
||||||
{
|
{
|
||||||
const struct range_trans *key = (const struct range_trans *)k;
|
const struct range_trans *key = (const struct range_trans *)k;
|
||||||
return (key->source_type + (key->target_type << 3) +
|
return (key->source_type + (key->target_type << 3) +
|
||||||
@ -773,7 +773,7 @@ static unsigned int rangetr_hash(hashtab_t h, hashtab_key_t k)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int rangetr_cmp(hashtab_t h __attribute__ ((unused)),
|
static int rangetr_cmp(hashtab_t h __attribute__ ((unused)),
|
||||||
hashtab_key_t k1, hashtab_key_t k2)
|
const_hashtab_key_t k1, const_hashtab_key_t k2)
|
||||||
{
|
{
|
||||||
const struct range_trans *key1 = (const struct range_trans *)k1;
|
const struct range_trans *key1 = (const struct range_trans *)k1;
|
||||||
const struct range_trans *key2 = (const struct range_trans *)k2;
|
const struct range_trans *key2 = (const struct range_trans *)k2;
|
||||||
|
@ -13,8 +13,7 @@ int sepol_role_exists(sepol_handle_t * handle __attribute__ ((unused)),
|
|||||||
{
|
{
|
||||||
|
|
||||||
policydb_t *policydb = &p->p;
|
policydb_t *policydb = &p->p;
|
||||||
*response = (hashtab_search(policydb->p_roles.table,
|
*response = (hashtab_search(policydb->p_roles.table, role) != NULL);
|
||||||
(const hashtab_key_t)role) != NULL);
|
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -11,14 +11,14 @@
|
|||||||
#include <sepol/policydb/hashtab.h>
|
#include <sepol/policydb/hashtab.h>
|
||||||
#include <sepol/policydb/symtab.h>
|
#include <sepol/policydb/symtab.h>
|
||||||
|
|
||||||
static unsigned int symhash(hashtab_t h, hashtab_key_t key)
|
static unsigned int symhash(hashtab_t h, const_hashtab_key_t key)
|
||||||
{
|
{
|
||||||
char *p, *keyp;
|
const char *p, *keyp;
|
||||||
size_t size;
|
size_t size;
|
||||||
unsigned int val;
|
unsigned int val;
|
||||||
|
|
||||||
val = 0;
|
val = 0;
|
||||||
keyp = (char *)key;
|
keyp = (const char *)key;
|
||||||
size = strlen(keyp);
|
size = strlen(keyp);
|
||||||
for (p = keyp; ((size_t) (p - keyp)) < size; p++)
|
for (p = keyp; ((size_t) (p - keyp)) < size; p++)
|
||||||
val =
|
val =
|
||||||
@ -27,14 +27,10 @@ static unsigned int symhash(hashtab_t h, hashtab_key_t key)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int symcmp(hashtab_t h
|
static int symcmp(hashtab_t h
|
||||||
__attribute__ ((unused)), hashtab_key_t key1,
|
__attribute__ ((unused)), const_hashtab_key_t key1,
|
||||||
hashtab_key_t key2)
|
const_hashtab_key_t key2)
|
||||||
{
|
{
|
||||||
char *keyp1, *keyp2;
|
return strcmp(key1, key2);
|
||||||
|
|
||||||
keyp1 = (char *)key1;
|
|
||||||
keyp2 = (char *)key2;
|
|
||||||
return strcmp(keyp1, keyp2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int symtab_init(symtab_t * s, unsigned int size)
|
int symtab_init(symtab_t * s, unsigned int size)
|
||||||
|
@ -139,8 +139,7 @@ int sepol_user_modify(sepol_handle_t * handle,
|
|||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
/* Now, see if a user exists */
|
/* Now, see if a user exists */
|
||||||
usrdatum = hashtab_search(policydb->p_users.table,
|
usrdatum = hashtab_search(policydb->p_users.table, cname);
|
||||||
(const hashtab_key_t)cname);
|
|
||||||
|
|
||||||
/* If it does, we will modify it */
|
/* If it does, we will modify it */
|
||||||
if (usrdatum) {
|
if (usrdatum) {
|
||||||
@ -163,8 +162,7 @@ int sepol_user_modify(sepol_handle_t * handle,
|
|||||||
for (i = 0; i < num_roles; i++) {
|
for (i = 0; i < num_roles; i++) {
|
||||||
|
|
||||||
/* Search for the role */
|
/* Search for the role */
|
||||||
roldatum = hashtab_search(policydb->p_roles.table,
|
roldatum = hashtab_search(policydb->p_roles.table, roles[i]);
|
||||||
(const hashtab_key_t)roles[i]);
|
|
||||||
if (!roldatum) {
|
if (!roldatum) {
|
||||||
ERR(handle, "undefined role %s for user %s",
|
ERR(handle, "undefined role %s for user %s",
|
||||||
roles[i], cname);
|
roles[i], cname);
|
||||||
@ -301,8 +299,7 @@ int sepol_user_exists(sepol_handle_t * handle __attribute__ ((unused)),
|
|||||||
const char *cname;
|
const char *cname;
|
||||||
sepol_user_key_unpack(key, &cname);
|
sepol_user_key_unpack(key, &cname);
|
||||||
|
|
||||||
*response = (hashtab_search(policydb->p_users.table,
|
*response = (hashtab_search(policydb->p_users.table, cname) != NULL);
|
||||||
(const hashtab_key_t)cname) != NULL);
|
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -328,8 +325,7 @@ int sepol_user_query(sepol_handle_t * handle,
|
|||||||
const char *cname;
|
const char *cname;
|
||||||
sepol_user_key_unpack(key, &cname);
|
sepol_user_key_unpack(key, &cname);
|
||||||
|
|
||||||
usrdatum = hashtab_search(policydb->p_users.table,
|
usrdatum = hashtab_search(policydb->p_users.table, cname);
|
||||||
(const hashtab_key_t)cname);
|
|
||||||
|
|
||||||
if (!usrdatum) {
|
if (!usrdatum) {
|
||||||
*response = NULL;
|
*response = NULL;
|
||||||
|
@ -12,10 +12,10 @@
|
|||||||
#include "hashtab.h"
|
#include "hashtab.h"
|
||||||
|
|
||||||
hashtab_t hashtab_create(unsigned int (*hash_value) (hashtab_t h,
|
hashtab_t hashtab_create(unsigned int (*hash_value) (hashtab_t h,
|
||||||
const hashtab_key_t key),
|
const_hashtab_key_t key),
|
||||||
int (*keycmp) (hashtab_t h,
|
int (*keycmp) (hashtab_t h,
|
||||||
const hashtab_key_t key1,
|
const_hashtab_key_t key1,
|
||||||
const hashtab_key_t key2),
|
const_hashtab_key_t key2),
|
||||||
unsigned int size)
|
unsigned int size)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -154,7 +154,7 @@ int hashtab_replace(hashtab_t h, hashtab_key_t key, hashtab_datum_t datum,
|
|||||||
return HASHTAB_SUCCESS;
|
return HASHTAB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
hashtab_datum_t hashtab_search(hashtab_t h, const hashtab_key_t key)
|
hashtab_datum_t hashtab_search(hashtab_t h, const_hashtab_key_t key)
|
||||||
{
|
{
|
||||||
|
|
||||||
int hvalue;
|
int hvalue;
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
typedef char *hashtab_key_t; /* generic key type */
|
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 void *hashtab_datum_t; /* generic datum type */
|
||||||
|
|
||||||
typedef struct hashtab_node *hashtab_ptr_t;
|
typedef struct hashtab_node *hashtab_ptr_t;
|
||||||
@ -33,8 +34,8 @@ typedef struct hashtab_val {
|
|||||||
hashtab_ptr_t *htable; /* hash table */
|
hashtab_ptr_t *htable; /* hash table */
|
||||||
unsigned int size; /* number of slots in hash table */
|
unsigned int size; /* number of slots in hash table */
|
||||||
uint32_t nel; /* number of elements in hash table */
|
uint32_t nel; /* number of elements in hash table */
|
||||||
unsigned int (*hash_value) (struct hashtab_val * h, hashtab_key_t key); /* hash function */
|
unsigned int (*hash_value) (struct hashtab_val * h, const_hashtab_key_t key); /* hash function */
|
||||||
int (*keycmp) (struct hashtab_val * h, hashtab_key_t key1, hashtab_key_t key2); /* key comparison function */
|
int (*keycmp) (struct hashtab_val * h, const_hashtab_key_t key1, const_hashtab_key_t key2); /* key comparison function */
|
||||||
} hashtab_val_t;
|
} hashtab_val_t;
|
||||||
|
|
||||||
typedef hashtab_val_t *hashtab_t;
|
typedef hashtab_val_t *hashtab_t;
|
||||||
@ -52,11 +53,11 @@ typedef hashtab_val_t *hashtab_t;
|
|||||||
the new hash table otherwise.
|
the new hash table otherwise.
|
||||||
*/
|
*/
|
||||||
extern hashtab_t hashtab_create(unsigned int (*hash_value) (hashtab_t h,
|
extern hashtab_t hashtab_create(unsigned int (*hash_value) (hashtab_t h,
|
||||||
const hashtab_key_t
|
const_hashtab_key_t
|
||||||
key),
|
key),
|
||||||
int (*keycmp) (hashtab_t h,
|
int (*keycmp) (hashtab_t h,
|
||||||
const hashtab_key_t key1,
|
const_hashtab_key_t key1,
|
||||||
const hashtab_key_t key2),
|
const_hashtab_key_t key2),
|
||||||
unsigned int size);
|
unsigned int size);
|
||||||
/*
|
/*
|
||||||
Inserts the specified (key, datum) pair into the specified hash table.
|
Inserts the specified (key, datum) pair into the specified hash table.
|
||||||
@ -100,7 +101,7 @@ extern int hashtab_replace(hashtab_t h, hashtab_key_t k, hashtab_datum_t d,
|
|||||||
Returns NULL if no entry has the specified key or
|
Returns NULL if no entry has the specified key or
|
||||||
the datum of the entry otherwise.
|
the datum of the entry otherwise.
|
||||||
*/
|
*/
|
||||||
extern hashtab_datum_t hashtab_search(hashtab_t h, const hashtab_key_t k);
|
extern hashtab_datum_t hashtab_search(hashtab_t h, const_hashtab_key_t k);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Destroys the specified hash table.
|
Destroys the specified hash table.
|
||||||
|
@ -228,7 +228,7 @@ static int free_hashtab_entry(hashtab_key_t key, hashtab_datum_t d,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int reqsymhash(hashtab_t h, hashtab_key_t key)
|
static unsigned int reqsymhash(hashtab_t h, const_hashtab_key_t key)
|
||||||
{
|
{
|
||||||
char *p, *keyp;
|
char *p, *keyp;
|
||||||
size_t size;
|
size_t size;
|
||||||
@ -244,14 +244,10 @@ static unsigned int reqsymhash(hashtab_t h, hashtab_key_t key)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int reqsymcmp(hashtab_t h
|
static int reqsymcmp(hashtab_t h
|
||||||
__attribute__ ((unused)), hashtab_key_t key1,
|
__attribute__ ((unused)), const_hashtab_key_t key1,
|
||||||
hashtab_key_t key2)
|
const_hashtab_key_t key2)
|
||||||
{
|
{
|
||||||
char *keyp1, *keyp2;
|
return strcmp(key1, key2);
|
||||||
|
|
||||||
keyp1 = (char *)key1;
|
|
||||||
keyp2 = (char *)key2;
|
|
||||||
return strcmp(keyp1, keyp2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static hashtab_t app_service_names = NULL;
|
static hashtab_t app_service_names = NULL;
|
||||||
|
@ -52,14 +52,14 @@ static void usage(char *program_name)
|
|||||||
/* Basic string hash and compare for the hashtables used in
|
/* Basic string hash and compare for the hashtables used in
|
||||||
* generate_requires. Copied from symtab.c.
|
* generate_requires. Copied from symtab.c.
|
||||||
*/
|
*/
|
||||||
static unsigned int reqsymhash(hashtab_t h, hashtab_key_t key)
|
static unsigned int reqsymhash(hashtab_t h, const_hashtab_key_t key)
|
||||||
{
|
{
|
||||||
char *p, *keyp;
|
const char *p, *keyp;
|
||||||
size_t size;
|
size_t size;
|
||||||
unsigned int val;
|
unsigned int val;
|
||||||
|
|
||||||
val = 0;
|
val = 0;
|
||||||
keyp = (char *)key;
|
keyp = (const char *)key;
|
||||||
size = strlen(keyp);
|
size = strlen(keyp);
|
||||||
for (p = keyp; ((size_t) (p - keyp)) < size; p++)
|
for (p = keyp; ((size_t) (p - keyp)) < size; p++)
|
||||||
val =
|
val =
|
||||||
@ -68,14 +68,10 @@ static unsigned int reqsymhash(hashtab_t h, hashtab_key_t key)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int reqsymcmp(hashtab_t h
|
static int reqsymcmp(hashtab_t h
|
||||||
__attribute__ ((unused)), hashtab_key_t key1,
|
__attribute__ ((unused)), const_hashtab_key_t key1,
|
||||||
hashtab_key_t key2)
|
const_hashtab_key_t key2)
|
||||||
{
|
{
|
||||||
char *keyp1, *keyp2;
|
return strcmp(key1, key2);
|
||||||
|
|
||||||
keyp1 = (char *)key1;
|
|
||||||
keyp2 = (char *)key2;
|
|
||||||
return strcmp(keyp1, keyp2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load a policy package from the given filename. Progname is used for
|
/* Load a policy package from the given filename. Progname is used for
|
||||||
|
Loading…
Reference in New Issue
Block a user