aboutsummaryrefslogtreecommitdiff
path: root/src/userdb.c
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2016-02-20 20:37:06 -0500
committerFranklin Wei <git@fwei.tk>2016-02-28 16:30:21 -0500
commit2c687e77cd9ae3fd01010d7b36c8d0082bb76315 (patch)
treeb8cd58cea075a3c94cb2f1417e6eaea27865b827 /src/userdb.c
parent02de31c48c021742c6245b711790f6d853866c36 (diff)
downloadnetcosm-2c687e77cd9ae3fd01010d7b36c8d0082bb76315.zip
netcosm-2c687e77cd9ae3fd01010d7b36c8d0082bb76315.tar.gz
netcosm-2c687e77cd9ae3fd01010d7b36c8d0082bb76315.tar.bz2
netcosm-2c687e77cd9ae3fd01010d7b36c8d0082bb76315.tar.xz
implements aliases and other assorted features/enhancements
Diffstat (limited to 'src/userdb.c')
-rw-r--r--src/userdb.c37
1 files changed, 33 insertions, 4 deletions
diff --git a/src/userdb.c b/src/userdb.c
index 5fc98e0..dde2693 100644
--- a/src/userdb.c
+++ b/src/userdb.c
@@ -57,7 +57,8 @@ void userdb_init(const char *file)
if(fd >= 0)
{
if(read_uint32(fd) != USERDB_MAGIC)
- error("bad userdb magic value");
+ error("unknown user file format");
+
size_t n_users = read_size(fd);
for(size_t u = 0; u < n_users; ++u)
{
@@ -88,6 +89,13 @@ void userdb_init(const char *file)
{
struct object_t *obj = obj_read(fd);
multimap_insert(data->objects, obj->name, obj);
+
+ struct obj_alias_t *iter = obj->alias_list;
+ while(iter)
+ {
+ multimap_insert(data->objects, iter->alias, obj_dup(obj));
+ iter = iter->next;
+ }
}
hash_insert(map, data->username, data);
@@ -105,6 +113,7 @@ bool userdb_write(const char *file)
if(fd < 0)
return false;
write_uint32(fd, USERDB_MAGIC);
+
write_size(fd, hash_size(map));
void *save, *ptr = map;
while(1)
@@ -118,7 +127,7 @@ bool userdb_write(const char *file)
size_t n_objects;
if(user->objects)
- n_objects = multimap_size(user->objects);
+ n_objects = obj_count_noalias(user->objects);
else
n_objects = 0;
@@ -139,8 +148,12 @@ bool userdb_write(const char *file)
while(iter)
{
- debugf("Writing an object to disk...\n");
- obj_write(fd, iter->val);
+ struct object_t *obj = iter->val;
+ if(!strcmp(iter->key, obj->name))
+ {
+ debugf("Writing an object to disk...\n");
+ obj_write(fd, iter->val);
+ }
iter = iter->next;
}
}
@@ -254,6 +267,22 @@ struct userdata_t *userdb_iterate(void **save)
return hash_iterate(map, save, NULL);
}
+bool userdb_add_obj(const char *name, struct object_t *obj)
+{
+ struct userdata_t *user = userdb_lookup(name);
+
+ /* add aliases */
+ struct obj_alias_t *alias = obj->alias_list;
+ while(alias)
+ {
+ debugf("userdb adding object alias %s\n", alias->alias);
+ multimap_insert(user->objects, alias->alias, obj_dup(obj));
+ alias = alias->next;
+ }
+
+ return multimap_insert(user->objects, obj->name, obj_dup(obj));
+}
+
/*** child request wrappers ***/
/* NOTE: these also work from the master, but it's better to use the
* userdb_* funcs instead */