Router variables: change list-separator to semicolon
[exim.git] / src / src / route.c
index 416effd41deb8c62997fd5cd93a6eac818e1ed0b..b6930493f6899a7d85fdc087129a620590735e53 100644 (file)
@@ -1416,7 +1416,7 @@ set_router_vars(address_item * addr, const router_instance * r)
 {
 const uschar * varlist = r->set;
 tree_node ** root = (tree_node **) &addr->prop.variables;
-int sep = 0;
+int sep = ';';
 
 if (!varlist) return OK;
 
@@ -1433,7 +1433,11 @@ for (uschar * ele; (ele = string_nextinlist(&varlist, &sep, NULL, 0)); )
   /* Variable name must exist and start "r_". */
 
   if (!name || name[0] != 'r' || name[1] != '_' || !name[2])
+    {
+    log_write(0, LOG_MAIN|LOG_PANIC,
+       "bad router variable name '%s' in router '%s'\n", name, r->name);
     return FAIL;
+    }
   name += 2;
 
   while (isspace(*assignment)) assignment++;
@@ -1690,54 +1694,12 @@ for (r = addr->start_router ? addr->start_router : routers; r; r = nextr)
   router traversal.  On the addr string they are held as a variable tree, so
   as to maintain the post-expansion taints separate. */
 
-  if ((yield = set_router_vars(addr, r)) != OK)
-    if (yield == PASS)
-      continue;                /* with next router */
-    else
-      goto ROUTE_EXIT;
-
-#ifdef notdef
-  if (r->set)
+  switch (set_router_vars(addr, r))
     {
-    const uschar * list = r->set;
-    int sep = 0;
-    for (uschar * ele; (ele = string_nextinlist(&list, &sep, NULL, 0)); )
-      {
-      uschar * ee;
-      if (!(ee = expand_string(ele)))
-       if (f.expand_string_forcedfail)
-         {
-         DEBUG(D_route) debug_printf("forced failure in expansion of \"%s\" "
-             "(router variable): decline action taken\n", ele);
-
-         /* Expand "more" if necessary; DEFER => an expansion failed */
-
-         yield = exp_bool(addr, US"router", r->name, D_route,
-                         US"more", r->more, r->expand_more, &more);
-         if (yield != OK) goto ROUTE_EXIT;
-
-         if (!more)
-           {
-           DEBUG(D_route)
-             debug_printf("\"more\"=false: skipping remaining routers\n");
-           router_name = NULL;
-           r = NULL;
-           break;
-           }
-         else continue;    /* With next router */
-         }
-       else
-         {
-         addr->message = string_sprintf("expansion of \"%s\" failed "
-           "in %s router: %s", ele, r->name, expand_string_message);
-         yield = DEFER;
-         goto ROUTE_EXIT;
-         }
-
-      addr->prop.set = string_append_listele(addr->prop.set, ':', ee);
-      }
+    case OK:   break;
+    case PASS: continue;               /* with next router */
+    default:    goto ROUTE_EXIT;
     }
-#endif
 
   /* Finally, expand the address_data field in the router. Forced failure
   behaves as if the router declined. Any other failure is more serious. On