def rebuild_maildirsize
self.domain.create_dir(self.maildir, 0700) unless File.directory?(self.maildir)
%w(new cur tmp).each do |d|
sub_dir = File.join(self.maildir, d)
self.domain.create_dir(sub_dir, 0700) unless File.directory?(sub_dir)
end
expected_size = self.quota
expected_count = 0
if expected_size.nil? or (0 == expected_size and 0 == expected_count)
set_param("maildirsize", false, self.maildir)
return nil
end
real_size = 0
real_count = 0
real_quota_definition = get_param("maildirsize", self.maildir)
real_quota_definition = "" if false == real_quota_definition
real_quota_definition.split(",").each do |qpart|
case qpart
when /^(\d+)S$/
real_size = $1
when /^(\d+)C$/
real_count = $1
else
next
end
end
return nil if (real_count == expected_count) and (real_size == expected_size)
used_size = 0
used_count = 0
%w(new cur).each do |dir|
Dir.glob(File.join(self.maildir,"**",dir,"*"), File::FNM_DOTMATCH).each do |fn|
next unless File.file?(fn)
used_count += 1
if fn =~ /,S=(\d+)(?:[:,]|$)/
used_size += $1.to_i
else
begin
used_size += File.stat(fn).size
rescue Erro::ENOENT
end
end
end
end
tv = Time.now
tmpfile = File.join(self.maildir, "tmp", [tv.tv_sec, "M#{tv.tv_usec}P#{Process.pid}", Socket.gethostname].join("."))
self.domain.create_dir(File.dirname(tmpfile), 0700) unless File.exists?(File.dirname(tmpfile))
begin
safe_open(tmpfile, File::WRONLY|File::CREAT, :mode => 0644, :uid => self.uid, :gid => self.gid) do |fh|
fh.truncate(0)
fh.write "#{expected_size}S,#{expected_count}C".ljust(13) + "\n"
fh.write "#{used_size} #{used_count}".ljust(13) + "\n"
end
File.rename(tmpfile, File.join(self.maildir, "maildirsize"))
ensure
File.unlink(tmpfile) if File.exist?(tmpfile)
end
return nil
end