aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/room.c13
-rw-r--r--src/server.c4
-rw-r--r--src/userdb.c25
-rw-r--r--src/util.c7
-rw-r--r--worlds/test.c13
5 files changed, 47 insertions, 15 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)
{
diff --git a/worlds/test.c b/worlds/test.c
index 3f43a7a..2ce4122 100644
--- a/worlds/test.c
+++ b/worlds/test.c
@@ -9,7 +9,7 @@ static void portal_init(room_id id)
{
debugf("portal room init.\n");
struct object_t *new = obj_new("weapon");
- new->name = "sword";
+ new->name = strdup("sword");
new->list = true;
new->userdata = malloc(sizeof(double));
double p = 3.14159265358979323846L;
@@ -99,7 +99,8 @@ const char *shiny(struct object_t *obj, user_t *user)
void weap_serialize(int fd, struct object_t *obj)
{
- write(fd, obj->userdata, sizeof(double));
+ if(obj->userdata)
+ write(fd, obj->userdata, sizeof(double));
}
void weap_deserialize(int fd, struct object_t *obj)
@@ -108,6 +109,12 @@ void weap_deserialize(int fd, struct object_t *obj)
read(fd, obj->userdata, sizeof(double));
}
+void weap_destroy(struct object_t *obj)
+{
+ free(obj->userdata);
+ obj->userdata = NULL;
+}
+
const struct obj_class_t netcosm_obj_classes[] = {
{ "weapon",
weap_serialize,
@@ -115,7 +122,7 @@ const struct obj_class_t netcosm_obj_classes[] = {
NULL,
NULL,
NULL,
- NULL,
+ weap_destroy,
shiny },
};