Hopefully fix #143 (only PRIVMSG+NOTICE for BACKLOG command).
authorJelmer Vernooij <jelmer@samba.org>
Mon, 2 Jul 2007 20:55:33 +0000 (22:55 +0200)
committerJelmer Vernooij <jelmer@samba.org>
Mon, 2 Jul 2007 20:55:33 +0000 (22:55 +0200)
NEWS
src/admin.c
src/linestack.c
src/linestack.h

diff --git a/NEWS b/NEWS
index 65a08bc..918a2fa 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -35,6 +35,8 @@ Ctrlproxy 3.0.3 UNRELEASED
 
        * Handle 479 responses correctly. (#142)
 
+       * Only send PRIVMSG and NOTICE lines during the BACKLOG command. (#143)
+
   INTERNALS
 
     * Use GIOChannels for reading the motd. 
index 68235a7..a307402 100644 (file)
@@ -372,9 +372,10 @@ static void repl_command(admin_handle h, char **args, void *userdata)
                admin_out(h, "Sending backlog for network '%s'", n->info.name);
 
                if (n->global->config->report_time)
-                       linestack_send_timed(n->linestack, lm, NULL, admin_get_client(h));
+                       linestack_send_timed_dataonly(n->linestack, lm, NULL, 
+                                                                                 admin_get_client(h));
                else
-                       linestack_send(n->linestack, lm, NULL, admin_get_client(h));
+                       linestack_send_dataonly(n->linestack, lm, NULL, admin_get_client(h));
 
                g_hash_table_replace(markers, n, linestack_get_marker(n->linestack));
 
index 4e1d475..0f8f830 100644 (file)
@@ -240,6 +240,22 @@ static gboolean send_line(struct line *l, time_t t, void *_client)
        return client_send_line(c, l);
 }
 
+struct line *line_prefix_time(struct line *l, time_t t)
+{
+       struct line *nl = linedup(l);
+       char stime[512];
+       char *tmp;
+
+       strftime(stime, sizeof(stime), "%H:%M:%S", localtime(&t));
+       tmp = g_strdup_printf("[%s] %s", stime, nl->args[2]);
+       if (tmp == NULL)
+               return NULL;
+       g_free(nl->args[2]);
+       nl->args[2] = tmp;
+
+       return nl;
+}
+
 static gboolean send_line_timed(struct line *l, time_t t, void *_client)
 {
        struct client *c = _client;
@@ -247,15 +263,8 @@ static gboolean send_line_timed(struct line *l, time_t t, void *_client)
        if ((!g_strcasecmp(l->args[0], "PRIVMSG") ||
                !g_strcasecmp(l->args[0], "NOTICE")) &&
                l->argc > 2) {
+               struct line *nl = line_prefix_time(l, t);
                gboolean ret;
-               struct line *nl = linedup(l);
-               char stime[512];
-               char *tmp;
-
-               strftime(stime, sizeof(stime), "%H:%M:%S", localtime(&t));
-               tmp = g_strdup_printf("[%s] %s", stime, nl->args[2]);
-               g_free(nl->args[2]);
-               nl->args[2] = tmp;
                ret = client_send_line(c, nl);
                free_line(nl);
                return ret;
@@ -264,6 +273,39 @@ static gboolean send_line_timed(struct line *l, time_t t, void *_client)
        }
 }
 
+static gboolean send_line_timed_dataonly(struct line *l, time_t t, void *_client)
+{
+       struct client *c = _client;
+       gboolean ret;
+       struct line *nl;
+
+       if (g_strcasecmp(l->args[0], "PRIVMSG") != 0 && 
+               g_strcasecmp(l->args[0], "NOTICE") != 0)
+               return TRUE;
+
+       if (l->argc <= 2)
+               return TRUE;
+
+       nl = line_prefix_time(l, t);
+       ret = client_send_line(c, nl);
+       free_line(nl);
+       return ret;
+}
+
+static gboolean send_line_dataonly(struct line *l, time_t t, void *_client)
+{
+       struct client *c = _client;
+
+       if (g_strcasecmp(l->args[0], "PRIVMSG") != 0 && 
+               g_strcasecmp(l->args[0], "NOTICE") != 0)
+               return TRUE;
+
+       if (l->argc <= 2)
+               return TRUE;
+
+       return client_send_line(c, l);
+}
+
 gboolean linestack_send(struct linestack_context *ctx, struct linestack_marker *mf, struct linestack_marker *mt, struct client *c)
 {
        return linestack_traverse(ctx, mf, mt, send_line, c);
@@ -274,6 +316,16 @@ gboolean linestack_send_timed(struct linestack_context *ctx, struct linestack_ma
        return linestack_traverse(ctx, mf, mt, send_line_timed, c);
 }
 
+gboolean linestack_send_dataonly(struct linestack_context *ctx, struct linestack_marker *mf, struct linestack_marker *mt, struct client *c)
+{
+       return linestack_traverse(ctx, mf, mt, send_line_dataonly, c);
+}
+
+gboolean linestack_send_timed_dataonly(struct linestack_context *ctx, struct linestack_marker *mf, struct linestack_marker *mt, struct client *c)
+{
+       return linestack_traverse(ctx, mf, mt, send_line_timed_dataonly, c);
+}
+
 gboolean linestack_send_object(struct linestack_context *ctx, const char *obj, struct linestack_marker *mf, struct linestack_marker *mt, struct client *c)
 {
        return linestack_traverse_object(ctx, obj, mf, mt, send_line, c);
@@ -284,6 +336,16 @@ gboolean linestack_send_object_timed(struct linestack_context *ctx, const char *
        return linestack_traverse_object(ctx, obj, mf, mt, send_line_timed, c);
 }
 
+gboolean linestack_send_object_dataonly(struct linestack_context *ctx, const char *obj, struct linestack_marker *mf, struct linestack_marker *mt, struct client *c)
+{
+       return linestack_traverse_object(ctx, obj, mf, mt, send_line_dataonly, c);
+}
+
+gboolean linestack_send_object_timed_dataonly(struct linestack_context *ctx, const char *obj, struct linestack_marker *mf, struct linestack_marker *mt, struct client *c)
+{
+       return linestack_traverse_object(ctx, obj, mf, mt, send_line_timed_dataonly, c);
+}
+
 static gboolean replay_line(struct line *l, time_t t, void *state)
 {
        struct network_state *st = state;
index f767788..4b54c82 100644 (file)
@@ -139,6 +139,34 @@ G_MODULE_EXPORT gboolean linestack_send_object_timed(
                struct linestack_marker *to, 
                struct client *);
 
+/* Same as above, but only sends data (PRIVMSG/NOTICE) */
+G_MODULE_EXPORT gboolean linestack_send_object_timed_dataonly(
+               struct linestack_context *, 
+               const char *obj, 
+               struct linestack_marker *from, 
+               struct linestack_marker *to, 
+               struct client *);
+
+/* Same as above, but only sends data (PRIVMSG/NOTICE) */
+G_MODULE_EXPORT gboolean linestack_send_object_dataonly(
+               struct linestack_context *, 
+               const char *obj, 
+               struct linestack_marker *from, 
+               struct linestack_marker *to, 
+               struct client *);
+
+G_MODULE_EXPORT gboolean linestack_send_dataonly (
+               struct linestack_context *,
+               struct linestack_marker *from,
+               struct linestack_marker *to, /* Can be NULL for 'now' */
+               struct client *);
+
+G_MODULE_EXPORT gboolean linestack_send_timed_dataonly (
+               struct linestack_context *,
+               struct linestack_marker *from,
+               struct linestack_marker *to, /* Can be NULL for 'now' */
+               struct client *);
+
 G_MODULE_EXPORT gboolean linestack_send (
                struct linestack_context *,
                struct linestack_marker *from,