+ my ($ibx, $mm, $max);
+
+ if ($mailbox =~ /\A(.+)\.([0-9]+)-([0-9]+)\z/) {
+ # old mail: inbox.comp.foo.$uid_min-$uid_end
+ my ($mb_top, $uid_min, $uid_end) = ($1, $2 + 0, $3 + 0);
+ $ibx = $self->{imapd}->{groups}->{lc $mb_top};
+ if (!$ibx || ($uid_end % UID_BLOCK) != 0 ||
+ ($uid_min + UID_BLOCK - 1) != $uid_end) {
+ return "$tag NO Mailbox doesn't exist: $mailbox\r\n";
+ }
+ $mm = $ibx->mm;
+ $max = $mm->max // 0;
+
+ # don't let users create inboxes w/ not-yet-possible range:
+ $uid_min > $max and
+ return "$tag NO Mailbox doesn't exist: $mailbox\r\n";
+
+ $max = $uid_min + UID_BLOCK + 1;
+ $self->{uid_min} = $uid_min;
+ ensure_old_ranges_exist($self, $ibx, $uid_min);
+ } else { # current mailbox (most recent UID_BLOCK messages)
+ $ibx = $self->{imapd}->{groups}->{lc $mailbox} or
+ return "$tag NO Mailbox doesn't exist: $mailbox\r\n";
+
+ $mm = $ibx->mm;
+ $max = $mm->max // 0;
+
+ my $uid_min = UID_BLOCK * int($max/UID_BLOCK) + 1;
+ if ($uid_min == 1) { # normal inbox with <UID_BLOCK messages
+ delete $self->{uid_min}; # implicit cmd_close
+ } else { # we have a giant inbox:
+ $self->{uid_min} = $uid_min;
+ ensure_old_ranges_exist($self, $ibx, $uid_min);
+ }
+ }
+