Make saxdb_context definition private.
authorMichael Poole <mdpoole@troilus.org>
Sun, 30 Mar 2008 02:24:45 +0000 (22:24 -0400)
committerMichael Poole <mdpoole@troilus.org>
Sun, 30 Mar 2008 02:24:45 +0000 (22:24 -0400)
src/saxdb.h (struct saxdb_context): Declare, do not define.
  (saxdb_jmp_buf): Declare new function.
src/saxdb.c (struct saxdb_context): Define.
  (saxdb_write_db): Use saxdb_jmp_buf() instead of ctx.jbuf.
  (write_database): Likewise.
  (saxdb_jmp_buf): Define.
src/modcmd.c (cmd_dump_messages): Use saxdb_jmp_buf().
src/mod-helpserv.c (helpserv_log_request): Likewise.

src/mod-helpserv.c
src/modcmd.c
src/saxdb.c
src/saxdb.h

index 7eabafd6d0cd71c8e329c6d304967f68a7e8de90..f1d6b8f2b6116c332986115019f20da2d5052a33 100644 (file)
@@ -705,7 +705,7 @@ static void helpserv_log_request(struct helpserv_request *req, const char *reaso
     if (!(ctx = saxdb_open_context(reqlog_f)))
         return;
     sprintf(key, "%s-%lu-%lu", req->hs->helpserv->nick, (unsigned long)req->opened, req->id);
-    if ((res = setjmp(ctx->jbuf)) != 0) {
+    if ((res = setjmp(*saxdb_jmp_buf(ctx))) != 0) {
         log_module(HS_LOG, LOG_ERROR, "Unable to log helpserv request: %s.", strerror(res));
     } else {
         saxdb_start_record(ctx, key, 1);
index f30a4e9f073daf7688478cbb309229c15de416e8..cc298a9a0cced2bf94a08923bc9b3c89ffdd2fe9 100644 (file)
@@ -1834,8 +1834,7 @@ static MODCMD_FUNC(cmd_dump_messages) {
         reply("MSG_INTERNAL_FAILURE");
         return 0;
     }
-    if ((res = setjmp(ctx->jbuf)) != 0) {
-        ctx->complex.used = 0; /* to avoid false assert()s in close */
+    if ((res = setjmp(*saxdb_jmp_buf(ctx))) != 0) {
         saxdb_close_context(ctx);
         fclose(pf);
         reply("MCMSG_MESSAGE_DUMP_FAILED", strerror(res));
index b5ac4224f547d0586580cfabfa08f0c4d6830b01..d504702bad104bd0c18d3a82ba2cd6b5ae6a3bc9 100644 (file)
@@ -38,6 +38,13 @@ struct saxdb {
     struct saxdb *prev;
 };
 
+struct saxdb_context {
+    FILE *output;
+    unsigned int indent;
+    struct int_list complex;
+    jmp_buf jbuf;
+};
+
 #define COMPLEX(CTX) ((CTX)->complex.used ? ((CTX)->complex.list[(CTX)->complex.used-1]) : 1)
 
 static struct saxdb *last_db;
@@ -135,7 +142,7 @@ saxdb_write_db(struct saxdb *db) {
         return 1;
     }
     start = time(NULL);
-    if ((res = setjmp(ctx.jbuf)) || (res2 = db->writer(&ctx))) {
+    if ((res = setjmp(*saxdb_jmp_buf(&ctx))) || (res2 = db->writer(&ctx))) {
         if (res) {
             log_module(MAIN_LOG, LOG_ERROR, "Error writing to %s: %s", tmp_fname, strerror(res));
         } else {
@@ -536,7 +543,7 @@ write_database(FILE *out, struct dict *db) {
     ctx.output = out;
     ctx.indent = 0;
     int_list_init(&ctx.complex);
-    if (!(res = setjmp(ctx.jbuf))) {
+    if (!(res = setjmp(*saxdb_jmp_buf(&ctx)))) {
         write_database_helper(&ctx, db);
     } else {
         log_module(MAIN_LOG, LOG_ERROR, "Exception %d caught while writing to stream", res);
@@ -560,6 +567,12 @@ saxdb_open_context(FILE *file) {
     return ctx;
 }
 
+jmp_buf *
+saxdb_jmp_buf(struct saxdb_context *ctx) {
+    return &ctx->jbuf;
+}
+
+
 void
 saxdb_close_context(struct saxdb_context *ctx) {
     assert(ctx->complex.used == 0);
index 0a2eecbc18c253c35d4eab8e21aa56091869232a..bf928c28b03ddf92137309e8d7f4f6b975baa2a0 100644 (file)
 DECLARE_LIST(int_list, int);
 
 struct saxdb;
-/* This definition should ONLY be used so callers of
- * saxdb_open_context() can initialize jbuf properly. */
-struct saxdb_context {
-    FILE *output;
-    unsigned int indent;
-    struct int_list complex;
-    jmp_buf jbuf;
-};
-
+struct saxdb_context;
 
 #define SAXDB_READER(NAME) int NAME(struct dict *db)
 typedef SAXDB_READER(saxdb_reader_func_t);
@@ -59,6 +51,7 @@ void saxdb_write_sint(struct saxdb_context *dest, const char *name, long value);
 
 /* For doing db writing by hand */
 struct saxdb_context *saxdb_open_context(FILE *f);
+jmp_buf *saxdb_jmp_buf(struct saxdb_context *ctx);
 void saxdb_close_context(struct saxdb_context *ctx);
 
 #endif /* !defined(DBMGR_H) */