diff options
Diffstat (limited to 'src/userdb.c')
| -rw-r--r-- | src/userdb.c | 58 |
1 files changed, 36 insertions, 22 deletions
diff --git a/src/userdb.c b/src/userdb.c index c58771f..749115c 100644 --- a/src/userdb.c +++ b/src/userdb.c @@ -2,18 +2,16 @@ static void *map = NULL; static char *db_file = NULL; -static size_t entries = 0; /* * the user DB is stored on disk as an ASCII database * - * this is then loaded into variable-sized hash map at init + * this is then loaded into fixed-sized hash map at init * TODO: implement with B-tree */ void userdb_init(const char *file) { db_file = strdup(file); - entries = 0; /* FILE* for getline() */ FILE *f = fopen(file, "r"); @@ -21,7 +19,7 @@ void userdb_init(const char *file) hash_setfreedata_cb(map, free); char *format; - asprintf(&format, "%%%d[a-z0-9]:%%%d[A-Z]:%%%ds:%%d\n", + asprintf(&format, "%%%d[a-z0-9 ]:%%%d[A-Z]:%%%ds:%%d\n", MAX_NAME_LEN, SALT_LEN, AUTH_HASHLEN * 2); if(f) @@ -31,16 +29,18 @@ void userdb_init(const char *file) struct userdata_t *data = calloc(1, sizeof(*data)); int ret = fscanf(f, format, - &data->username, + data->username, data->salt, data->passhash, &data->priv); if(ret != 4) + { + free(data); break; + } hash_insert(map, data->username, data); - ++entries; } fclose(f); @@ -59,8 +59,8 @@ void userdb_write(const char *file) ptr = NULL; if(!user) break; - dprintf(fd, "%*s:%*s:%*s:%d\n", - MAX_NAME_LEN, user->username, + dprintf(fd, "%s:%*s:%*s:%d\n", + user->username, SALT_LEN, user->salt, AUTH_HASHLEN*2, user->passhash, user->priv); @@ -77,13 +77,13 @@ bool userdb_remove(const char *key) { if(hash_remove(map, key)) { - --entries; userdb_write(db_file); return true; } return false; } +/* should never fail, but returns NULL if something weird happens */ struct userdata_t *userdb_add(struct userdata_t *data) { struct userdata_t *new = calloc(1, sizeof(*new)); /* only in C! */ @@ -99,17 +99,16 @@ struct userdata_t *userdb_add(struct userdata_t *data) } userdb_write(db_file); - if(!ret) - ++entries; return ret; } void userdb_shutdown(void) { - debugf("shutting down userdb with %d entries\n", entries); + debugf("shutting down userdb with %d entries\n", hash_size(map)); if(map) { + debugf("shutting down userdb\n"); hash_free(map); map = NULL; } @@ -122,28 +121,43 @@ void userdb_shutdown(void) size_t userdb_size(void) { - return entries; + return hash_size(map); } /* child request wrappers */ +/* NOTE: also works from the master, but it's better to use the userdb_* funcs instead */ -/* loop until we can return a user data structure */ struct userdata_t *userdb_request_lookup(const char *name) { - send_master(REQ_GETUSERDATA, name, strlen(name) + 1); - if(reqdata_type == TYPE_USERDATA) - return &returned_reqdata.userdata; - return NULL; + if(are_child) + { + send_master(REQ_GETUSERDATA, name, strlen(name) + 1); + if(reqdata_type == TYPE_USERDATA) + return &returned_reqdata.userdata; + return NULL; + } + else + return userdb_lookup(name); } bool userdb_request_add(struct userdata_t *data) { - send_master(REQ_ADDUSERDATA, data, sizeof(*data)); - return returned_reqdata.boolean; + if(are_child) + { + send_master(REQ_ADDUSERDATA, data, sizeof(*data)); + return returned_reqdata.boolean; + } + else + return userdb_add(data); } bool userdb_request_remove(const char *name) { - send_master(REQ_DELUSERDATA, name, strlen(name) + 1); - return returned_reqdata.boolean; + if(are_child) + { + send_master(REQ_DELUSERDATA, name, strlen(name) + 1); + return returned_reqdata.boolean; + } + else + return userdb_remove(name); } |