bin/mailredir.userv, lib/Odin.pm: Modify multiple redirections at once.
[odin-cgi] / lib / Odin.pm
index d9307b2..b91eb96 100644 (file)
@@ -661,31 +661,34 @@ sub disable_redir ($$) {
   } $db;
 }
 
-sub modify_redir ($$\%) {
-  my ($dom, $l, $r) = @_;
+sub modify_redir ($\%@) {
+  my ($dom, $r, @l) = @_;
   my $db = open_db;
 
   check_fixup_redir $r;
   Odin::xact {
     clear_redir_reservations $db;
-    my ($recip, $st) = $db->selectrow_array
-      ("SELECT recip, st FROM odin_mailredir
-       WHERE lpart = ? AND dom = ? AND owner = ?", undef,
-       $l, $dom, $WHO);
-    if (!defined $recip) { Odin::fail "unknown local part `$l'"; }
-    elsif ($recip eq "") { $r->{recip} //= qualify_recip $WHO; }
-    if ($st ne "live") { $r->{st} = "live"; $r->{expire} //= -1; }
-    my @var = ();
-    my @val = ();
-    for my $v (keys %$r) {
-      push @var, $v;
-      push @val, $r->{$v};
+    for my $l (@l) {
+      my %r = %$r;
+      my ($recip, $st) = $db->selectrow_array
+       ("SELECT recip, st FROM odin_mailredir
+         WHERE lpart = ? AND dom = ? AND owner = ?", undef,
+        $l, $dom, $WHO);
+      if (!defined $recip) { Odin::fail "unknown local part `$l'"; }
+      elsif ($recip eq "") { $r{recip} //= qualify_recip $WHO; }
+      if ($st ne "live") { $r{st} = "live"; $r{expire} //= -1; }
+      my @var = ();
+      my @val = ();
+      for my $v (keys %r) {
+       push @var, $v;
+       push @val, $r{$v};
+      }
+      @var or fail "nothing to change";
+      $db->do("UPDATE odin_mailredir SET " .
+             join(", ", map { "$_ = ?" } @var) . " " .
+             "WHERE lpart = ? AND dom = ?", undef,
+             @val, $l, $dom);
     }
-    @var or fail "nothing to change";
-    $db->do("UPDATE odin_mailredir SET " .
-           join(", ", map { "$_ = ?" } @var) . " " .
-           "WHERE lpart = ? AND dom = ?", undef,
-           @val, $l, $dom);
   } $db;
 }