#!/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;
}
