Mail-SPF-Query
view release on metacpan or search on metacpan
examples/sendmail-milter view on Meta::CPAN
}
$require_srs_dsn = 1 if ($opt_S);
$will_relay_srs1 = 1 if ($opt_r);
# Since we will daemonize, play nice.
chdir ('/') or exit 1;
umask (0077);
if (not (-e $basedir)) {
if (not mkdir $basedir) {
print STDERR "Odd; cannot create $basedir/\n";
exit 1;
}
}
# The Sendmail::Milter 0.18 engine has a small bug, causing it to extract
# the wrong socket-name when, next to the F flags, there's an additional flag
# in the Milter definition, (see: http://rt.cpan.org/NoAuth/Bug.html?id=3892
# for details). Since the extra flag is useful (T for timeouts), we preset our
# connection string to "local:/var/spf-milter/spf-milter.sock", with "spf-milter"
# as Milter name. A corresponding line in sendmail.cf could look like this:
#
# Xspf-milter, S=local:/var/spf-milter/spf-milter.sock, F=T, T=C:4m;S:4m;R:8m;E:16m
if (not $conn = Sendmail::Milter::auto_getconn ('spf-milter', '/etc/mail/sendmail.cf')) {
log_error_and_exit ("Milter for 'spf-milter' not found!");
}
if ($conn =~ /^local:(.+)/) {
if (not Sendmail::Milter::setconn ("local:$sock")) {
log_error_and_exit ("Failed to set connection information!");
}
# Now we set a fairly large timeout. The idea here is to set it so large, that
# the Milter will not try and compete with the sendmail T= timings, which allow
# for a more fine-grained tuning.
if (not Sendmail::Milter::settimeout ('8192')) {
log_error_and_exit ("Failed to set timeout value!");
}
if (not Sendmail::Milter::register ('spf-milter', \%my_callbacks, SMFI_CURR_ACTS)) {
log_error_and_exit ("Failed to register callbacks!");
}
# Get info on the user we want to run as. If $uid is undefined, the user
# does not exist on the system; if zero, it is the UID of root!
($login, $pass, $uid, $gid) = getpwnam ($user);
if (not defined ($uid)) {
log_error_and_exit ("$user is not a valid user on this system!");
} elsif (not $uid) {
log_error_and_exit ("You cannot run spf-milter as root!");
}
write_log ("Starting Sendmail::Milter $Sendmail::Milter::VERSION engine");
# Set all proper permissions/ownerships, according to the user we run as.
if ((not chown $uid, $gid, $basedir, glob ($basedir . '/*')) ||
(not chmod 0700, $basedir)) {
log_error_and_exit ("Cannot set proper permissions!");
}
# Drop the Sendmail::Milter privileges!
$) = $gid;
$( = $gid;
$> = $uid;
$< = $uid;
# Give us a pretty proc-title to look at in 'ps ax'. :)
$0 = 'spf-milter' . (($mx_mode) ? (" [mx mode]") : (""));
# Fork and give us a pid file.
if ($pid = fork ()) {
open (USERLOG, ">". $pidFile) or exit 1;
flock (USERLOG, 2);
seek (USERLOG, 0, 0);
print USERLOG " $pid";
close (USERLOG);
# Wait until either milter socket appears or child dies
my $kid = 0;
while (not -x $sock) {
select (undef,undef,undef,0.01);
$kid = waitpid (-1, WNOHANG);
if ($kid > 0) {
$pid = 0; # trigger cleanup
die "Could not start milter\n";
}
}
exit 0;
}
# Redirect all input/output from/to null
open (STDIN, '/dev/null');
open (STDOUT, '>/dev/null');
# Complete de daemonization process.
POSIX::setsid () or exit 1;
open (STDERR, '>&STDOUT');
if (Sendmail::Milter::main ()) {
write_log ("Successful exit from the Sendmail::Milter engine");
} else {
write_log ("Unsuccessful exit from the Sendmail::Milter engine");
}
} else {
log_error_and_exit ("$conn is not a valid connection object!");
}
END {
( run in 0.760 second using v1.01-cache-2.11-cpan-71847e10f99 )