aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/room.c13
-rw-r--r--src/server.c4
-rw-r--r--src/userdb.c25
-rw-r--r--src/util.c7
4 files changed, 37 insertions, 12 deletions
diff --git a/src/room.c b/src/room.c
index df819a6..848c9e5 100644
--- a/src/room.c
+++ b/src/room.c
@@ -94,7 +94,7 @@ void world_save(const char *fname)
if(!obj)
break;
id = ROOM_NONE;
-
+ obj_write(fd, obj);
}
}
close(fd);
@@ -104,6 +104,7 @@ static void room_free(struct room_t *room)
{
hash_free(room->users);
room->users = NULL;
+ hash_setfreedata_cb(room->objects, obj_free);
hash_free(room->objects);
room->objects = NULL;
free(room->data.name);
@@ -132,21 +133,12 @@ bool room_obj_add(room_id room, struct object_t *obj)
#define OBJMAP_SIZE 8
-static void free_obj(void *ptr)
-{
- struct object_t *obj = ptr;
- if(obj->class->hook_destroy)
- obj->class->hook_destroy(obj);
- free(obj);
-}
-
/* initialize the room's hash tables */
static void room_init_maps(struct room_t *room)
{
room->users = hash_init((userdb_size() / 2) + 1, hash_djb, compare_strings);
room->objects = hash_init(OBJMAP_SIZE, hash_djb, compare_strings);
- hash_setfreedata_cb(room->objects, free_obj);
}
/**
@@ -201,6 +193,7 @@ bool world_load(const char *fname, const struct roomdata_t *data, size_t data_sz
for(unsigned j = 0; j < n_objects; ++j)
{
+ debugf("READING %dth OBJECT\n", j);
struct object_t *obj = obj_read(fd);
if(!room_obj_add(i, obj))
diff --git a/src/server.c b/src/server.c
index d81075c..e67fa20 100644
--- a/src/server.c
+++ b/src/server.c
@@ -127,6 +127,8 @@ static void __attribute__((noreturn)) serv_cleanup(void)
userdb_shutdown();
+ obj_shutdown();
+
extern char *current_user;
if(current_user)
free(current_user);
@@ -260,6 +262,8 @@ static void new_connection_cb(EV_P_ ev_io *w, int revents)
/* user DB requests go through the master */
userdb_shutdown();
+ obj_shutdown();
+
debugf("Child with PID %d spawned\n", getpid());
server_socket = new_sock;
diff --git a/src/userdb.c b/src/userdb.c
index e107a6c..5e948ab 100644
--- a/src/userdb.c
+++ b/src/userdb.c
@@ -26,9 +26,25 @@
static void *map = NULL;
static char *db_file = NULL;
+static void free_userdata_and_objs(void *ptr)
+{
+ struct userdata_t *data = ptr;
+
+ debugf("Freeing DATA AND OBJECTS of %s\n", data->username);
+
+ 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);
}
@@ -55,11 +71,17 @@ void userdb_init(const char *file)
struct userdata_t *data = calloc(1, sizeof(*data));
if(read(fd, data, sizeof(*data)) != sizeof(*data))
+ {
+ free(data);
break;
+ }
size_t n_objects;
if(read(fd, &n_objects, sizeof(n_objects)) != sizeof(n_objects))
+ {
+ free(data);
break;
+ }
data->objects = hash_init(MIN(8, n_objects),
hash_djb,
@@ -114,7 +136,6 @@ void userdb_write(const char *file)
if(!obj)
break;
objptr = NULL;
- debugf("WRITING OBJECT %s\n", obj->name);
obj_write(fd, obj);
}
}
@@ -167,8 +188,10 @@ void userdb_shutdown(void)
{
if(map && db_file && !are_child)
userdb_write(db_file);
+
if(map)
{
+ hash_setfreedata_cb(map, free_userdata_and_objs);
hash_free(map);
map = NULL;
}
diff --git a/src/util.c b/src/util.c
index a349d5a..3da294b 100644
--- a/src/util.c
+++ b/src/util.c
@@ -17,6 +17,7 @@
*/
#include "globals.h"
+#include <sys/resource.h>
void remove_cruft(char *str)
{
@@ -90,7 +91,11 @@ room_id read_roomid(int fd)
char *read_string(int fd)
{
size_t sz;
- read(fd, &sz, sizeof(sz));
+ if(read(fd, &sz, sizeof(sz)) != sizeof(sz))
+ {
+ error("read_string: EOF");
+ }
+ debugf("sz is %d\n", sz);
char *ret = malloc(sz + 1);
if(read(fd, ret, sz) < 0)
{