+ if ((object = database_get_data(db, KEY_TOPLEVEL, RECDB_OBJECT)))
+ dict_foreach(object, hostserv_saxdb_read_toplevel, NULL);
+
+ return 1;
+}
+
+static int
+hostserv_saxdb_write(struct saxdb_context *ctx)
+{
+ struct hs_toplevel *tlfh;
+ struct hs_secondlevel *slfh;
+ struct hs_assignment *assng;
+ struct hs_manager *manager;
+
+ saxdb_start_record(ctx, KEY_TOPLEVEL, 1);
+ for(tlfh = toplevels; tlfh; tlfh = tlfh->next) {
+ saxdb_start_record(ctx, tlfh->fakehost, 1);
+
+ saxdb_start_record(ctx, KEY_MANAGERS, 1);
+ for(manager = tlfh->managers; manager; manager = manager->next) {
+ saxdb_start_record(ctx, manager->user->hi->handle, 0);
+ //additional manager information?
+ if(manager->active)
+ saxdb_write_int(ctx, KEY_ACTIVE, manager->active);
+ saxdb_end_record(ctx);
+ }
+ saxdb_end_record(ctx);
+
+ saxdb_start_record(ctx, KEY_SECONDLEVEL, 1);
+ for(slfh = tlfh->secondlevel; slfh; slfh = slfh->next) {
+ saxdb_start_record(ctx, slfh->fakehost, 1);
+
+ saxdb_start_record(ctx, KEY_MANAGERS, 1);
+ for(manager = slfh->managers; manager; manager = manager->next) {
+ saxdb_start_record(ctx, manager->user->hi->handle, 0);
+ //additional manager information?
+ if(manager->active)
+ saxdb_write_int(ctx, KEY_ACTIVE, manager->active);
+ saxdb_end_record(ctx);
+ }
+ saxdb_end_record(ctx);
+
+ saxdb_start_record(ctx, KEY_ASSIGNMENTS, 1);
+ for(assng = slfh->assignments; assng; assng = assng->next) {
+ saxdb_start_record(ctx, assng->user->hi->handle, 0);
+ //additional assignment information?
+ if(assng->active)
+ saxdb_write_int(ctx, KEY_ACTIVE, assng->active);
+ saxdb_end_record(ctx);
+ }
+ saxdb_end_record(ctx);
+
+ saxdb_end_record(ctx);
+ }
+ saxdb_end_record(ctx);
+
+ saxdb_end_record(ctx);
+ }
+ saxdb_end_record(ctx);
+
+ return 0;
+}
+
+
+static void hostserv_db_cleanup(void) {
+ hs_free_all();
+}
+
+int hostserv_init() {
+ HS_LOG = log_register_type("HostServ", "file:hostserv.log");
+
+ const char *nick, *modes;
+ if((nick = conf_get_data("modules/hostserv/nick", RECDB_QSTRING))) {
+ modes = conf_get_data("modules/hostserv/modes", RECDB_QSTRING);
+ hostserv = AddLocalUser(nick, nick, NULL, "Host Service", modes);
+ hostserv_service = service_register(hostserv);
+ hostserv_service->trigger = '*';
+ }
+
+ conf_register_reload(hostserv_conf_read);
+ reg_exit_func(hostserv_db_cleanup);
+ saxdb_register("HostServ", hostserv_saxdb_read, hostserv_saxdb_write);
+ hostserv_module = module_register("HostServ", HS_LOG, "mod-hostserv.help", NULL);
+ modcmd_register(hostserv_module, "view", cmd_view, 0, MODCMD_REQUIRE_AUTHED, NULL);
+ modcmd_register(hostserv_module, "addmanager", cmd_addmanager, 3, MODCMD_REQUIRE_AUTHED, NULL);
+ modcmd_register(hostserv_module, "delmanager", cmd_delmanager, 3, MODCMD_REQUIRE_AUTHED, NULL);
+ modcmd_register(hostserv_module, "set", cmd_set, 2, MODCMD_REQUIRE_AUTHED, NULL);
+ modcmd_register(hostserv_module, "assign", cmd_assign, 3, MODCMD_REQUIRE_AUTHED, NULL);
+ modcmd_register(hostserv_module, "unassign", cmd_unassign, 3, MODCMD_REQUIRE_AUTHED, NULL);
+ modcmd_register(hostserv_module, "addhost", cmd_addhost, 2, MODCMD_REQUIRE_AUTHED, NULL);
+ modcmd_register(hostserv_module, "delhost", cmd_delhost, 2, MODCMD_REQUIRE_AUTHED, NULL);
+ message_register_table(msgtab);
+ return 1;
+}
+
+int hostserv_finalize(void) {
+ dict_t conf_node;
+ const char *str;
+
+ str = "modules/hostserv";
+ if (!(conf_node = conf_get_data(str, RECDB_OBJECT))) {
+ log_module(HS_LOG, LOG_ERROR, "config node `%s' is missing or has wrong type.", str);
+ return 0;
+ }
+
+ str = database_get_data(conf_node, "nick", RECDB_QSTRING);
+ if (str) hostserv_conf.nick = str;
+
+ str = database_get_data(conf_node, "modes", RECDB_QSTRING);
+ if (str) hostserv_conf.modes = str;
+ return 1;
+}
\ No newline at end of file