#!/usr/bin/perl eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}' if $running_under_some_shell; # # Usage: bsd2cyrus inputfile # # Purpose: Maps a user's Berkeley-format mail folder names into the # Cyrus namespace # # Input: List of usernames, one per line # # Output: Lines of the format # username:Cyrus-mailbox-name:BSD-mailbox-name # #$Id: bsd2cyrus,v 1.1 2004/02/04 12:59:42 karsten Exp $ require "find.pl"; # User's subdirectory where personal mail folders are stored # (typically $HOME/mail) $maildir = "mail"; $inputfile = "$ARGV[0]"; if (! $inputfile) { die "Usage: $0 inputfile\n"; } open (DATA, $inputfile) || die "can't open $inputfile"; while () { chop; ($user,$pw,$uid,$gid,$quota,$cmnt,$gcos,$home) = getpwnam $_; next if $home eq ""; &find("$home/$maildir"); } close DATA; foreach (@folders) { ($user,$folder) = split(/:/,$_,2); if (! rfc822($folder) ) { next; } @tokens = split(/\//, $folder); $mailbox = $tokens[$#tokens]; # Sanity checks - earlier tests should have caught these. next if ($mailbox =~ /\.gz$/); # Skip gzipped files next if ($mailbox =~ /\.Z$/); # Skip compressed files next if ($mailbox =~ /^\./); # Skip hidden files # Replace "bad" characters with an underscore followed by # the ASCII representation of the "bad" character. $mailbox = rm_badchars($mailbox); print "$user:user.$user.$mailbox:$folder\n"; } sub wanted { (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) && -f _; if ($_ ne '.') { push @folders, "$user:$dir/$_"; } } sub rfc822 { my ($file) = @_; my ($rc) = 1; if (-d $file || -z $file || -B $file || -x $file) { $rc = 0; } return $rc; } sub rm_badchars { my ($mailbox) = @_; $mailbox =~ s/ /_040/g; $mailbox =~ s/\!/_041/g; $mailbox =~ s/\"/_042/g; $mailbox =~ s/\#/_043/g; return $mailbox; }