aboutsummaryrefslogtreecommitdiff
path: root/src/userdb.c
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2016-01-08 22:27:43 -0500
committerFranklin Wei <git@fwei.tk>2016-01-08 22:27:43 -0500
commit50134c46dc337c35b8ecf78b3c5b4308cf8fb791 (patch)
tree89d73bca1951129ec7e15b642e2fa6c85567f872 /src/userdb.c
parent2819d11ceeb1ac739ed5f17ccb0abab63f494299 (diff)
downloadnetcosm-50134c46dc337c35b8ecf78b3c5b4308cf8fb791.zip
netcosm-50134c46dc337c35b8ecf78b3c5b4308cf8fb791.tar.gz
netcosm-50134c46dc337c35b8ecf78b3c5b4308cf8fb791.tar.bz2
netcosm-50134c46dc337c35b8ecf78b3c5b4308cf8fb791.tar.xz
some stuff
Diffstat (limited to 'src/userdb.c')
-rw-r--r--src/userdb.c68
1 files changed, 53 insertions, 15 deletions
diff --git a/src/userdb.c b/src/userdb.c
index 4315da4..c58771f 100644
--- a/src/userdb.c
+++ b/src/userdb.c
@@ -4,8 +4,6 @@ static void *map = NULL;
static char *db_file = NULL;
static size_t entries = 0;
-#define DELIM ":"
-
/*
* the user DB is stored on disk as an ASCII database
*
@@ -20,12 +18,11 @@ void userdb_init(const char *file)
/* FILE* for getline() */
FILE *f = fopen(file, "r");
map = hash_init(256, hash_djb, compare_strings);
- hash_setfreekey_cb(map, free);
hash_setfreedata_cb(map, free);
char *format;
- asprintf(&format, "%%ms:%%%d%%s:%%%d%%s:%%d\n",
- SALT_LEN, AUTH_HASHLEN * 2);
+ asprintf(&format, "%%%d[a-z0-9]:%%%d[A-Z]:%%%ds:%%d\n",
+ MAX_NAME_LEN, SALT_LEN, AUTH_HASHLEN * 2);
if(f)
{
@@ -33,11 +30,13 @@ void userdb_init(const char *file)
{
struct userdata_t *data = calloc(1, sizeof(*data));
- if(fscanf(f, format,
- &data->username,
- data->salt,
- data->passhash,
- &data->priv) != 6)
+ int ret = fscanf(f, format,
+ &data->username,
+ data->salt,
+ data->passhash,
+ &data->priv);
+
+ if(ret != 4)
break;
hash_insert(map, data->username, data);
@@ -60,7 +59,8 @@ void userdb_write(const char *file)
ptr = NULL;
if(!user)
break;
- dprintf(fd, "%s:%*s:%*s:%d\n", user->username,
+ dprintf(fd, "%*s:%*s:%*s:%d\n",
+ MAX_NAME_LEN, user->username,
SALT_LEN, user->salt,
AUTH_HASHLEN*2, user->passhash,
user->priv);
@@ -73,18 +73,25 @@ struct userdata_t *userdb_lookup(const char *key)
return hash_lookup(map, key);
}
-void userdb_remove(const char *key)
+bool userdb_remove(const char *key)
{
if(hash_remove(map, key))
+ {
--entries;
+ userdb_write(db_file);
+ return true;
+ }
+ return false;
}
struct userdata_t *userdb_add(struct userdata_t *data)
{
struct userdata_t *new = calloc(1, sizeof(*new)); /* only in C! */
memcpy(new, data, sizeof(*new));
- new->username = strdup(data->username);
+ strncpy(new->username, data->username, sizeof(new->username));
+
struct userdata_t *ret;
+
if((ret = hash_insert(map, new->username, new))) /* failure */
{
hash_remove(map, new->username);
@@ -93,19 +100,50 @@ struct userdata_t *userdb_add(struct userdata_t *data)
userdb_write(db_file);
if(!ret)
- --entries;
+ ++entries;
return ret;
}
void userdb_shutdown(void)
{
- hash_free(map);
+ debugf("shutting down userdb with %d entries\n", entries);
+ if(map)
+ {
+ hash_free(map);
+ map = NULL;
+ }
if(db_file)
+ {
free(db_file);
+ db_file = NULL;
+ }
}
size_t userdb_size(void)
{
return entries;
}
+
+/* child request wrappers */
+
+/* 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;
+}
+
+bool userdb_request_add(struct userdata_t *data)
+{
+ send_master(REQ_ADDUSERDATA, data, sizeof(*data));
+ return returned_reqdata.boolean;
+}
+
+bool userdb_request_remove(const char *name)
+{
+ send_master(REQ_DELUSERDATA, name, strlen(name) + 1);
+ return returned_reqdata.boolean;
+}