summaryrefslogtreecommitdiff
path: root/src/keytab.c
diff options
context:
space:
mode:
authorbpc2003 <wpesfriendnva@gmail.com>2025-03-09 18:21:45 -0400
committerbpc2003 <wpesfriendnva@gmail.com>2025-03-09 18:21:45 -0400
commit58a32dad0be010556b39f8ce4b55aa012c2762d0 (patch)
tree053b8512d635427eafb98ec526373b45fe1e1a03 /src/keytab.c
parent3895150d7636f906fa261df5c439e10851a3b54c (diff)
Added delkey command
Diffstat (limited to 'src/keytab.c')
-rw-r--r--src/keytab.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/src/keytab.c b/src/keytab.c
index 8d929dc..6186c9d 100644
--- a/src/keytab.c
+++ b/src/keytab.c
@@ -37,20 +37,15 @@ struct keytab getkey(struct keytab *tab, char *key)
void setkey(struct keytab *tab, char *pair)
{
- char *tmp = calloc(strlen(pair) + 1, sizeof(char));
- strcpy(tmp, pair);
char *tok = strtok(pair, ":");
- if (!strcmp(tmp, tok)) {
- fprintf(stderr, "Invalid key-value pair: %s\n", tmp);
- free(tmp);
- return;
- }
- free(tmp);
-
char *key = calloc(strlen(tok) + 1, sizeof(char));
strcpy(key, tok);
tok = strtok(NULL, ":");
+ if (tok == NULL) {
+ fprintf(stderr, "Invalid key-value pair\n");
+ return;
+ }
union value v;
int flag;
if (isdigit(*tok)) {
@@ -80,7 +75,25 @@ void setkey(struct keytab *tab, char *pair)
tab[idx].flag = flag;
}
-int hash(char *key)
+void delkey(struct keytab *tab, char *key)
+{
+ int idx = hash(key);
+ while (strcmp(tab[idx].key, key) && idx < TABLEN)
+ idx++;
+ if (idx >= TABLEN) {
+ fprintf(stderr, "Invalid key: %s\n", key);
+ return;
+ }
+ free(tab[idx].key);
+ tab[idx].key = NULL;
+ if (tab[idx].flag == 3) {
+ free(tab[idx].v.str);
+ tab[idx].v.str = NULL;
+ }
+ tab[idx].flag = 0;
+}
+
+static int hash(char *key)
{
unsigned long h = 5381;
for (int i = 0; i < strlen(key); ++i)