From: Mark Wooding Date: Tue, 4 Aug 2015 16:12:26 +0000 (+0100) Subject: bin/mailredir.userv, lib/Odin.pm: Allocate multiple local parts at once. X-Git-Url: https://git.distorted.org.uk/~mdw/odin-cgi/commitdiff_plain/f22ba7c6dbec7a6e8b30d699e13909abe4d82589?ds=sidebyside bin/mailredir.userv, lib/Odin.pm: Allocate multiple local parts at once. Add a new `-n' option which requests multiple local parts. The `new_redir' function is modified to handle all of the requests as a single database transaction. --- diff --git a/bin/mailredir.userv b/bin/mailredir.userv index ab8b54d..07cef16 100755 --- a/bin/mailredir.userv +++ b/bin/mailredir.userv @@ -68,7 +68,7 @@ Commands available: dormant help list - new [-GENOPTS] [-RECOPTS] RECIP + new [-n COUNT] [-GENOPTS] [-RECOPTS] [RECIP] release LPART ... reserve [-GENOPTS] N reserved @@ -107,18 +107,23 @@ EOF my $gencls = Odin::default_generator_class $dom; my %gp = (); my %r = (); + my $n = 1; while (my $o = $op->get) { - gen_opt $dom, $gencls, %gp, $o, $op - or record_opt %r, $o, $op - or $op->unk; + if ($o eq "n") { $n = $op->intarg(undef, 0) } + else { + gen_opt $dom, $gencls, %gp, $o, $op + or record_opt %r, $o, $op + or $op->unk; + } } my @a = $op->rest; if (@a) { $r{recip} = shift @a; } !@a or $op->bad; - $op->ok or Odin::fail "usage: new [-GENOPTS] [-RECOPTS] RECIP"; + $op->ok or + Odin::fail "usage: new [-n COUNT] [-GENOPTS] [-RECOPTS] [RECIP]"; my $gen = $gencls->new($dom, \%gp); - my $l = Odin::new_redir $dom, $gen, %r; - print $l, "\n"; + my @l = Odin::new_redir $dom, $gen, %r, $n; + print map { $_ . "\n" } @l; } elsif ($op eq "reserve") { my $op = Odin::OptParse->new(@ARGV); my $gencls = Odin::default_generator_class $dom; diff --git a/lib/Odin.pm b/lib/Odin.pm index a89ba88..d9307b2 100644 --- a/lib/Odin.pm +++ b/lib/Odin.pm @@ -574,23 +574,27 @@ sub check_fixup_redir ($) { } } -sub new_redir ($$\%) { - my ($dom, $gen, $r) = @_; +sub new_redir ($$\%;$) { + my ($dom, $gen, $r, $n) = @_; my $db = open_db; - my $l; + my @l; + $n //= 1; check_fixup_redir $r; Odin::xact { clear_redir_reservations $db; - $l = Odin::gen_redir_name $db, $gen; - insert_record $db, "odin_mailredir", - lpart => $l, dom => $dom, owner => $WHO, st => 'live', - recip => $r->{recip} // qualify_recip $Odin::WHO, - expire => $r->{expire} // -1, - comment => $r->{comment} // ""; + while (@l < $n) { + my $l = Odin::gen_redir_name $db, $gen; + insert_record $db, "odin_mailredir", + lpart => $l, dom => $dom, owner => $WHO, st => 'live', + recip => $r->{recip} // qualify_recip $Odin::WHO, + expire => $r->{expire} // -1, + comment => $r->{comment} // ""; + push @l, $l; + } check_redir_limits $db; } $db; - return $l; + return @l; } sub reserve_redir ($$$) {