diff options
Diffstat (limited to 'security/selinux/ss/symtab.c')
-rw-r--r-- | security/selinux/ss/symtab.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/security/selinux/ss/symtab.c b/security/selinux/ss/symtab.c new file mode 100644 index 000000000000..24a10d36d3b6 --- /dev/null +++ b/security/selinux/ss/symtab.c | |||
@@ -0,0 +1,44 @@ | |||
1 | /* | ||
2 | * Implementation of the symbol table type. | ||
3 | * | ||
4 | * Author : Stephen Smalley, <sds@epoch.ncsc.mil> | ||
5 | */ | ||
6 | #include <linux/kernel.h> | ||
7 | #include <linux/slab.h> | ||
8 | #include <linux/string.h> | ||
9 | #include <linux/errno.h> | ||
10 | #include "symtab.h" | ||
11 | |||
12 | static unsigned int symhash(struct hashtab *h, void *key) | ||
13 | { | ||
14 | char *p, *keyp; | ||
15 | unsigned int size; | ||
16 | unsigned int val; | ||
17 | |||
18 | val = 0; | ||
19 | keyp = key; | ||
20 | size = strlen(keyp); | ||
21 | for (p = keyp; (p - keyp) < size; p++) | ||
22 | val = (val << 4 | (val >> (8*sizeof(unsigned int)-4))) ^ (*p); | ||
23 | return val & (h->size - 1); | ||
24 | } | ||
25 | |||
26 | static int symcmp(struct hashtab *h, void *key1, void *key2) | ||
27 | { | ||
28 | char *keyp1, *keyp2; | ||
29 | |||
30 | keyp1 = key1; | ||
31 | keyp2 = key2; | ||
32 | return strcmp(keyp1, keyp2); | ||
33 | } | ||
34 | |||
35 | |||
36 | int symtab_init(struct symtab *s, unsigned int size) | ||
37 | { | ||
38 | s->table = hashtab_create(symhash, symcmp, size); | ||
39 | if (!s->table) | ||
40 | return -1; | ||
41 | s->nprim = 0; | ||
42 | return 0; | ||
43 | } | ||
44 | |||