summaryrefslogtreecommitdiff
path: root/src/lib/keytab.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/keytab.c')
-rw-r--r--src/lib/keytab.c44
1 files changed, 23 insertions, 21 deletions
diff --git a/src/lib/keytab.c b/src/lib/keytab.c
index 425b0e1..146937c 100644
--- a/src/lib/keytab.c
+++ b/src/lib/keytab.c
@@ -8,33 +8,35 @@ static int hash(char *key);
static char **getkv(char *pair);
// getkeys - gets every single key in a key table
-tabidx_t *getkeys(tablist_t *list, int id, char **keys, int klen)
+tablist_t *getkeys(tablist_t *list, int id, char **keys, int klen)
{
- int len = 1;
- if (id >= list[0].len)
+ if (id >= list[0].len || id < -1)
return NULL;
- tabidx_t *indexes = calloc(len, sizeof(tabidx_t));
- if (klen == 0) {
- for (int i = 0, j = 0; i < TABLEN; ++i) {
- if (j >= len) {
- indexes = realloc(indexes, ++len * sizeof(tabidx_t));
- indexes[len - 1] = (tabidx_t) { NULL, 0, { 0 } };
+ int rc = 0;
+ int len = id == -1 ? list[0].len : 1;
+ tablist_t *indexes = calloc(len, sizeof(tablist_t));
+ indexes[0].len = len;
+ if (id >= 0) {
+ if (klen == 0) {
+ for (int i = 0, j = 0; i < TABLEN; ++i) {
+ if (list[id].tab[i].flag)
+ indexes[0].tab[j++] = list[id].tab[i];
}
- if (list[id].tab[i].flag)
- indexes[j++] = list[id].tab[i];
- }
- } else {
- for (int i = 0, j = 0; i < klen; ++i) {
- tabidx_t idx = getkey(list, id, keys[i]);
- if (idx.flag == 0)
- return NULL;
- if (j >= len) {
- indexes = realloc(indexes, ++len * sizeof(tabidx_t));
+ } else {
+ for (int i = 0, j = 0; i < klen; ++i) {
+ tabidx_t idx = getkey(list, id, keys[i]);
+ if (idx.flag == 0)
+ rc = 1;
+ indexes[0].tab[j++] = idx;
}
- indexes[j++] = idx;
}
}
- return indexes;
+ if (!rc) {
+ return indexes;
+ } else {
+ free(indexes);
+ return NULL;
+ }
}
// getkey - gets a single key from a keytable