perl program question
Article: 7557 of alt.hackers Newsgroups: alt.hackers From: byerr@netcom.com (*greeeeaaaaaaat*) Subject: perl program question Message-ID: byerrD66o07.AHG@netcom.com Organization: NETCOM On-line Communication Services (408 261-4700 guest) Date: Wed, 29 Mar 1995 03:50:31 GMT Approved: What? Lines: 158 Sender: byerr@netcom20.netcom.com Status: RO
ObHack/ObQuestion:
I'm using term on my linux box. I got sendmail compiled, and modified
it to listen for smtp connections on port 4225 or the machine I'm
dialed into. It's run out of my .forward. If I'm logged in, it's
supoosed to deliver the mail immediately. Otherwise, it's supposed to
defer it into a file, to be forwarded through a script. (It basically
does formail -s smtpforward). Now, the problem is, it always defers
the mail fine. When I'm logged in, it never actually forwards it,
just defers it (when run from the .forward). But, when I run the
script that forwards all of the deferred mail, it works fine! Anyway,
here is the script:
(Oh, and uhost is a script that takes a username as an argument and
returns something like 'byerr@netcom20')
smtpforward:
#!/usr/local/bin/perl -- # -*-Perl-*-
open(FOO,"/u1/byerr/bin/uhost byerr|");
$_=<FOO>;
split('@');
$them=$_[1] if $_[1] =~ /netcom/;
$trycount=0;
@message=<STDIN>;
foreach (@message) {
if(/From /) {
@foo=split;
$from=$foo[1];
}
}
print "Host: $them\n";
print "From: $from\n";
main:
{
# ($them,$port)=@ARGV;
$port=4225 unless $port;
$them= "localhost" unless $them;
$AF_INET=2;
$SOCK_STREAM=1;
$SIG{'INT'}='dokill';
sub dokill {
kill 9,$child if $child;
}
$sockaddr='S n a4 x8';
chop($hostname=`hostname`);
($name,$aliases,$proto)=getprotobyname('tcp');
($name,$aliases,$port)=getservbyname($port, 'tcp') unless $port=~
/^\d+$/;;
($name,$aliases,$type,$len,$thisaddr)=gethostbyname($hostname);
($name,$aliases,$type,$le,$thataddr)=gethostbyname($them);
$this=pack($sockaddr, $AF_INET, 0, $thisaddr);
$that=pack($sockaddr, $AF_INET, $port, $thataddr);
# Make the socket filehandle.
if(socket(S, $AF_INET, $SOCK_STREAM, $proto)) {
print "socket ok\n";
}
else {
die $!;
}
# Give the socket an address.
if (bind(S, $this)) {
print "bind ok\n";
}
else {
die $!;
}
# Call up the server,
if (connect(S, $that)) {
print "connect ok\n";
}
else {
# die $!;
$trycount++;
if($trycount<4)
{
print "retry $trycount\n";
goto main;
}
# Defer the message for when sendmail is running again.
open(DEFER,">>/u1/berr/incoming/deferred");
foreach(@message) {
print DEFER;
}
print "mail deferred\n";
exit;
}
# Set socket to be command buffered.
select(S); $|=1; select(STDOUT);
sleep 3;
print S "EHLO smtpforward\n";
sleep 5;
print S "MAIL FROM: $from\n";
sleep 2;
print S "RCPT TO: root\n";
sleep 5;
print S "data\n";
sleep 2;
foreach(@message) {
print S;
}
print S ".\n";
sleep 20;
print S "quit\n";
sleep 3;
print "Done.\n";
if(-r "/u1/byerr/incoming/deferred") {
# print "Sending deferred messages...\n";
# system("/u1/byerr/dodeferred");
}
exit;
}
(if you notice, the commented out part at the end doesn't work,
either... *sigh*)
this is my .forward:
"|exec /usr/local/bin/procmail #byerr "
this is part of my .procmailrc:
:0 c
|/u1/byerr/smtpforward
this is dodeferred:
#!/bin/sh
if test -s /u1/byerr/incoming/deferred;
then
sleep 180
mv /u1/byerr/incoming/deferred /u1/byerr/incoming/deferred.sending
cat /u1/byerr/incoming/deferred.sending|formail -s
/u1/byerr/smtpforward
else
echo No deferred mail.
fi
Thanks for the help!
--
Ben Byer byerr@netcom.com I am not a bushing
GC2.1:G!d?H+s+:g-p?+!aua--w+v-C++++US++P+L++3-EN+++K---W---
M--V--poY+t+5!jRG+tv-b+++D++B---e(see a)u+(*)h!f+n----!y