#!/usr/bin/perl -w

# Script to generate a single list of Maildir folders below a specific directory
# Parameters are 
# 1. Directory to recurse from e.g. ~/Mail
# 2. Directories to ignore (comma separated list) e.g. outbox

use strict;

my $dir = $ARGV[0];
my $ignore = $ARGV[1];
my $entry = "";
my $list = "";
my @filter = ();

if (!defined($dir))
{
   print STDERR "Usage: maildirs <directory to recurse from>";
   print STDERR " [comma separated list of directories to ignore]\n";
   exit;
}

if (defined($ignore))
{
   @filter = split (/,/, $ignore);
}

&checkDir(\$dir, \$list, \@filter);

print "$list\n";

sub checkDir ($dir, $list, @filter)
{
   my ($dir, $list, $filter) = @_;
   my @files = ();

   opendir(DIR, $$dir) || die ("Unable to open $$dir as a directory $!");

# As this function is recursive and the DIR variable is global
# The recursive reading of directories breaks
# So, read it into a local array for each recursive call
   while (defined($entry = readdir(DIR)))
   {
      push (@files, $entry);
   }


   foreach $entry (@files)
   {
      if ((&properDir("$entry") == 1) && (-d "$$dir/$entry"))
      {
	 if (&filter(\$entry, \@$filter) == 1)
	 {
	    if (&isMaildir("$$dir/$entry"))
	    {
	       $$list .= " " . "$$dir/$entry";
	    }

	    my $newdir = "$$dir/$entry";

	    &checkDir (\$newdir, \$$list, \@filter)
	 }
      }
   }

   close (DIR);
}

# properDir
# skips the following subdirs, ., .., cur, new and tmp
sub properDir($dir)
{
   my $dir = $_[0];

   if ($dir eq ".")
   {
      return 0;
   }
   if ($dir eq "..")
   {
      return 0;
   }
   if ($dir eq "cur")
   {
      return 0;
   }
   if ($dir eq "new")
   {
      return 0;
   }
   if ($dir eq "tmp")
   {
      return 0;
   }

   return 1;
}

# isMaildir
# must have at least the following three subdirs, cur, new and tmp
sub isMaildir($dir)
{
   my $dir = $_[0];
   my $entry = "";
   my $match = 0;

   opendir(SUBDIR, $dir) || die ("Unable to open $dir as a directory $!");

   while (defined($entry = readdir(SUBDIR)))
   {
      if ($entry eq "cur")
      {
	 $match++;
      }
      elsif ($entry eq "new")
      {
	 $match++;
      }
      elsif ($entry eq "tmp")
      {
	 $match++;
      }
   }

   close (SUBDIR);

   if ($match == 3)
   {
      return 1;
   }
   else
   {
      return 0;
   }
}


sub filter ($entry, @filter)
{
   my $allow = 1;
   my ($entry, $filter) = @_;

   foreach $_ (@$filter)
   {
      if ($$entry eq $_)
      {
	 $allow = 0;
      }
   }

   return $allow;
}

