diff options
Diffstat (limited to 'src/userdb.c')
| -rw-r--r-- | src/userdb.c | 16 |
1 files changed, 5 insertions, 11 deletions
diff --git a/src/userdb.c b/src/userdb.c index 3d42133..b434e54 100644 --- a/src/userdb.c +++ b/src/userdb.c @@ -26,27 +26,18 @@ static void *map = NULL; static char *db_file = NULL; -static void free_userdata_and_objs(void *ptr) +static void free_userdata(void *ptr) { struct userdata_t *data = ptr; if(data->objects) { - hash_setfreedata_cb(data->objects, obj_free); hash_free(data->objects); data->objects = NULL; } free(data); } -static void free_userdata(void *ptr) -{ - struct userdata_t *data = ptr; - - hash_free(data->objects); - free(data); -} - /* * the user DB is stored on disk as an binary flat file * @@ -87,6 +78,9 @@ void userdb_init(const char *file) hash_djb, compare_strings); + hash_setfreedata_cb(data->objects, obj_free); + hash_setdupdata_cb(data->objects, (void*(*)(void*))obj_dup); + for(unsigned i = 0; i < n_objects; ++i) { struct object_t *obj = obj_read(fd); @@ -163,6 +157,7 @@ struct userdata_t *userdb_add(struct userdata_t *data) /* don't overwrite their inventory */ struct userdata_t *old = userdb_lookup(new->username); + if(old && old->objects) new->objects = hash_dup(old->objects); else @@ -188,7 +183,6 @@ void userdb_shutdown(void) if(map) { - hash_setfreedata_cb(map, free_userdata_and_objs); hash_free(map); map = NULL; } |