+# check that the search cache maildir is that and not a real maildir
+# otherwise there could be data loss when the search cache is emptied
+sub check_search_cache_maildir($) {
+ my ($maildir) = (@_);
+
+ return unless -e $maildir;
+
+ -d $maildir or die_dir($maildir, 'is not a directory');
+
+ opendir(my $mdh, $maildir) or die_dir($maildir, "cannot be opened: $!");
+ my @contents = grep { !/^\.\.?$/ } readdir $mdh;
+ closedir $mdh;
+
+ my @required = ('cur', 'new', 'tmp');
+ foreach my $d (@required) {
+ -l "$maildir/$d" and die_dir($maildir, "contains symlink $d");
+ -e "$maildir/$d" or die_subdir($maildir, $d, 'is missing');
+ -d "$maildir/$d" or die_subdir($maildir, $d, 'is not a directory');
+ find(sub {
+ $_ eq '.' and return;
+ $_ eq '..' and return;
+ -l $_ or die_subdir($maildir, $d, "contains non-symlink $_");
+ }, "$maildir/$d");
+ }
+
+ my %required = map { $_ => 1 } @required;
+ foreach my $d (@contents) {
+ -l "$maildir/$d" and die_dir( $maildir, "contains symlink $d");
+ -d "$maildir/$d" or die_dir( $maildir, "contains non-directory $d");
+ exists($required[$d]) or die_dir( $maildir, "contains directory $d");
+ }
+}
+
+# create an empty search cache maildir (if missing) or empty existing one
+sub empty_search_cache_maildir($) {