From 6c2ef782119912a0e6a5615fc04f419a69b5ce66 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Tue, 4 Aug 2015 17:13:47 +0100 Subject: [PATCH] bin/mailredir.userv, lib/Odin.pm: Modify multiple redirections at once. Allow multiple local parts to the `set' command, and alter the `modify_redir' function to handle all of the changes in a single transaction. --- bin/mailredir.userv | 9 ++++----- lib/Odin.pm | 41 ++++++++++++++++++++++------------------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/bin/mailredir.userv b/bin/mailredir.userv index 07cef16..f5acb06 100755 --- a/bin/mailredir.userv +++ b/bin/mailredir.userv @@ -72,7 +72,7 @@ Commands available: release LPART ... reserve [-GENOPTS] N reserved - set [-RECOPTS] LPART + set [-RECOPTS] LPART ... GENOPTS ::= [-g GENERATOR] [-p PARAM=VALUE] RECOPTS ::= [-c COMMENT] [-r RECIP] [-x EXPIRES] @@ -165,10 +165,9 @@ EOF or $op->unk; } my @a = $op->rest; - my $l = shift @a or $op->bad; - @a and $op->bad; - $op->ok or Odin::fail "usage: set [-RECOPTS] LPART"; - Odin::modify_redir $dom, $l, %r; + @a or $op->bad; + $op->ok or Odin::fail "usage: set [-RECOPTS] LPART ..."; + Odin::modify_redir $dom, %r, @a; } else { Odin::fail "unknown operation `$op'"; } diff --git a/lib/Odin.pm b/lib/Odin.pm index d9307b2..b91eb96 100644 --- a/lib/Odin.pm +++ b/lib/Odin.pm @@ -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; } -- 2.11.0