bin/mailredir.userv, lib/Odin.pm: Allocate multiple local parts at once.
authorMark Wooding <mdw@distorted.org.uk>
Tue, 4 Aug 2015 16:12:26 +0000 (17:12 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Tue, 4 Aug 2015 16:12:26 +0000 (17:12 +0100)
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.

bin/mailredir.userv
lib/Odin.pm

index ab8b54d..07cef16 100755 (executable)
@@ -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;
index a89ba88..d9307b2 100644 (file)
@@ -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 ($$$) {