diff options
Diffstat (limited to 'src/lib/keytab.c')
-rw-r--r-- | src/lib/keytab.c | 44 |
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 |