Use C99 initialisations for iterators
[exim.git] / src / src / lookups / redis.c
index ad34d388c39ccf34ebabc3ac2023917b5cd8207c..e84f7667512cb32e69a1a75fbb430b5c46a27376 100644 (file)
@@ -2,7 +2,7 @@
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2017 */
+/* Copyright (c) University of Cambridge 1995 - 2018 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 #include "../exim.h"
@@ -92,7 +92,7 @@ We can write to the string, since it is in a nextinlist temporary buffer.
 This copy is also used for debugging output.  */
 
 memset(sdata, 0, sizeof(sdata)) /* Set all to NULL */;
-for (i = 2; i > 0; i--)
+for (int i = 2; i > 0; i--)
   {
   uschar *pp = Ustrrchr(server, '/');
 
@@ -205,9 +205,8 @@ if(sdata[1])
 /* split string on whitespace into argv */
   {
   uschar * argv[32];
-  int i;
   const uschar * s = command;
-  int siz, ptr;
+  int siz, ptr, i;
   uschar c;
 
   while (isspace(*s)) s++;
@@ -241,7 +240,20 @@ switch (redis_reply->type)
   {
   case REDIS_REPLY_ERROR:
     *errmsg = string_sprintf("REDIS: lookup result failed: %s\n", redis_reply->str);
-    *defer_break = FALSE;
+
+    /* trap MOVED cluster responses and follow them */
+    if (Ustrncmp(redis_reply->str, "MOVED", 5) == 0)
+      {
+      DEBUG(D_lookup)
+        debug_printf("REDIS: cluster redirect %s\n", redis_reply->str);
+      /* follow redirect
+      This is cheating, we simply set defer_break = FALSE to move on to
+      the next server in the redis_servers list */
+      *defer_break = FALSE;
+      return DEFER;
+      } else {
+      *defer_break = TRUE;
+      }
     *do_cache = 0;
     goto REDIS_EXIT;
     /* NOTREACHED */
@@ -268,7 +280,7 @@ switch (redis_reply->type)
     /* NOTE: For now support 1 nested array result. If needed a limitless
     result can be parsed */
 
-    for (i = 0; i < redis_reply->elements; i++)
+    for (int i = 0; i < redis_reply->elements; i++)
       {
       entry = redis_reply->element[i];
 
@@ -278,13 +290,13 @@ switch (redis_reply->type)
       switch (entry->type)
        {
        case REDIS_REPLY_INTEGER:
-         result = string_cat(result, string_sprintf("%d", entry->integer));
+         result = string_fmt_append(result, "%d", entry->integer);
          break;
        case REDIS_REPLY_STRING:
          result = string_catn(result, US entry->str, entry->len);
          break;
        case REDIS_REPLY_ARRAY:
-         for (j = 0; j < entry->elements; j++)
+         for (int j = 0; j < entry->elements; j++)
            {
            tentry = entry->element[j];
 
@@ -294,7 +306,7 @@ switch (redis_reply->type)
            switch (tentry->type)
              {
              case REDIS_REPLY_INTEGER:
-               result = string_cat(result, string_sprintf("%d", tentry->integer));
+               result = string_fmt_append(result, "%d", tentry->integer);
                break;
              case REDIS_REPLY_STRING:
                result = string_catn(result, US tentry->str, tentry->len);