aboutsummaryrefslogtreecommitdiff
path: root/src/userdb.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/userdb.c')
-rw-r--r--src/userdb.c58
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);
}