chiark / gitweb /
break out local_part_inuse
[d.git] / service
diff --git a/service b/service
index d9ca7e3bf5ae26867088d42b9dab1cf35c7283ba..a966409b8da72bc043b42c9a52506cbf689f6aac 100755 (executable)
--- a/service
+++ b/service
@@ -48,13 +48,17 @@ sub nextarg () {
     return $v;
 }
 
-sub nextarg_addr () {
-    my $addr = nextarg;
+sub addr2localpart ($) {
+    my ($addr) = @_;
     return $addr if $addr !~ m/\@/;
     die "address not in correct domain (\@$dom)\n" unless $' eq $dom; #';
     return $`; #`;
 }
 
+sub nextarg_addr () {
+    return addr2localpart nextarg;
+}
+
 sub nomoreargs () {
     die "too many arguments\n" if @ARGV;
 }
@@ -141,9 +145,16 @@ sub rhsargs ($) {
     return $row;
 }
 
-sub generate_local_part () {
+sub local_part_inuse ($) {
+    my ($s) = @_;
     our $checkexist_q ||=
        $dbh->prepare("SELECT localpart FROM addrs WHERE localpart=?");
+    $checkexist_q->execute($s);
+    my $row = $checkexist_q->fetchrow_arrayref();
+    return !!$row;
+}
+
+sub generate_local_part () {
     my $s;
     for (;;) {
        $s = chr(ord('a')+goodrand(26));
@@ -154,9 +165,7 @@ sub generate_local_part () {
                      : ord('0')+($v-26));
        }
 #      print STDERR "$s\n";
-       $checkexist_q->execute($s);
-       my $row = $checkexist_q->fetchrow_arrayref();
-       last if !$row;
+       last if !local_part_inuse($s);
     }
     return $s;
 }
@@ -329,8 +338,9 @@ if (defined $ENV{'USERV_USER'}) {
     $user = ((getpwuid $<)[0]) or die;
 }
 
-$usage2 .= "ADDR may be a local part, implicitly qualified with \@$dom\n"
-    if defined $qualdom;
+$usage2 .= defined $dom
+    ? "ADDR may be a local part, implicitly qualified with \@$dom\n"
+    : "ADDR must be a local part (only)\n";
 $usage2 .= "REDIRECT is implicitly qualified with \@$qualdom if it has no \@\n"
     if defined $qualdom;