handle rxpd connection errors gracefully
authorChristian Thaeter <ct@pipapo.org>
Mon, 5 Nov 2007 03:47:18 +0000 (04:47 +0100)
committerChristian Thaeter <ct@pipapo.org>
Mon, 5 Nov 2007 03:47:18 +0000 (04:47 +0100)
contrib/irc/xchat/rx.c

index 05311fd..0798e28 100644 (file)
 #define PDESC "Uses rxpd to act on content";
 #define PVERSION "0.1"
 
+/*
+  TODO
+  * reconnect on connection loose
+  * config-file and auto startup
+*/
+
+
 #define PREFIXCMP(str, pfx) (!strncmp (str, pfx, sizeof (pfx)-1))
 
 static xchat_plugin *ph;   /* plugin handle */
@@ -86,7 +93,7 @@ rxopen (struct rx_plugin_data* rx)
   if (!conn)
     {
       close (fd);
-      xchat_printf (ph, "error connecting %s:%s, %s\n", rx->server, rx->port, strerror (errno));
+      xchat_printf (ph, "RX: error connecting %s:%s, %s\n", rx->server, rx->port, strerror (errno));
       return NULL;
     }
 
@@ -171,8 +178,12 @@ rxadd_cb (char *word[], char *word_eol[], void *userdata)
   if (!conn)
     return XCHAT_EAT_ALL;
 
-  fprintf (conn, "APPEND:%s%s\n", rx->prefix, word[2]);
-  fprintf (conn, "%s\n#EXIT:\n", word_eol[3]);
+  if (fprintf (conn, "APPEND:%s%s\n%s\n#EXIT:\n", rx->prefix, word[2], word_eol[3]) < 0)
+    {
+      xchat_printf (ph, "RX: sending command failed\n");
+      fclose (conn);
+      return XCHAT_EAT_ALL;
+    }
 
   char buffer[4096];
   *buffer = '\0';
@@ -198,8 +209,12 @@ rxdel_cb (char *word[], char *word_eol[], void *userdata)
   if (!conn)
     return XCHAT_EAT_ALL;
 
-  fprintf (conn, "REMOVE:%s%s\n", rx->prefix, word[2]);
-  fprintf (conn, "%s\n#EXIT:\n", word_eol[3]);
+  if (fprintf (conn, "REMOVE:%s%s\n%s\n#EXIT:\n", rx->prefix, word[2], word_eol[3]) < 0)
+    {
+      xchat_printf (ph, "RX: sending command failed\n");
+      fclose (conn);
+      return XCHAT_EAT_ALL;
+    }
 
   char buffer[4096];
   *buffer = '\0';
@@ -260,14 +275,15 @@ rxinfo_cb (char *word[], char *word_eol[], void *userdata)
 {
   struct rx_plugin_data* rx = (struct rx_plugin_data*)userdata;
   xchat_printf (ph, "RX: debugging is %s\n", rx->debug?"on":"off");  
-  if (rx->rxpd)
+  if (rx->addrs)
     {
-      xchat_printf (ph, "RX: connected to %s:%s\n", rx->server, rx->port);  
+      xchat_printf (ph, "RX: using server %s:%s\n", rx->server, rx->port);  
       xchat_printf (ph, "RX: using prefix %s\n", rx->prefix);
-      xchat_printf (ph, "RX: using list %s%s\n", rx->prefix, rx->list);
+      xchat_printf (ph, "RX: using list   %s%s\n", rx->prefix, rx->list);
+      xchat_printf (ph, "RX: connection is %s\n", rx->rxpd?"active":"broken");  
     }
   else
-    xchat_printf (ph, "RX: not connected\n");  
+    xchat_printf (ph, "RX: not started\n");
 
   return XCHAT_EAT_ALL;
 }
@@ -280,14 +296,23 @@ rxhook_cb (char *word[], char *word_eol[], void *userdata)
   if (rx->rxpd)
     {
       /* ok do the checking*/
-      fprintf (rx->rxpd, "%s\n", word_eol[1]);
-
-      // TODO xchat_printf (ph, "RXPD: error writing\n");
+      if (fprintf (rx->rxpd, "%s\n", word_eol[1]) < 0)
+        {
+          xchat_printf (ph, "RX: rxpd connection lost\n");
+          fclose (rx->rxpd);
+          rx->rxpd = NULL;
+          return XCHAT_EAT_NONE;
+        }
 
       char buffer[4096];
 
-      fgets (buffer, 4095, rx->rxpd);
-      /*todo error handling*/
+      if (!fgets (buffer, 4095, rx->rxpd))
+        {
+          xchat_printf (ph, "RX: rxpd connection lost\n");
+          fclose (rx->rxpd);
+          rx->rxpd = NULL;
+          return XCHAT_EAT_NONE;
+        }
 
       char* nl = strrchr(buffer, '\n');
       if (nl)