$| = 1;
-our $VERSION = '1.0.3';
+my $Revisn = <<'ENDE';
+ $Revision$
+ENDE
+$Revisn =~ s/^.*:\s*(\S+)\s*\$.*/$1/s;
+
+our $VERSION = '1.1.' . $Revisn;
=head1 NAME
sub do_incoming() {
- my ( $i, $CmdLine, $result, $sms, $id, $count, $osms, $filename, $lockname, $error_code );
+ my ( $i, $CmdLine, $result, $sms, $id, $count, $osms, $filename, $lockname, $error_code, $gammu_pid );
my ( %SMS, %SMSChains );
my ( @SMS, @Order, @SmsDelete );
+ my @Params = (
+ '--getsms',
+ $inbox_folder_nr,
+ 0
+ );
+
$mark = "incoming";
debug "Reading incoming SMS ...\n";
for ( $i = 1; $i <= $count_locations; $i++ ) {
- $CmdLine = $GammuExe . " --getsms " . $inbox_folder_nr . " " . $i;
+ $Params[2] = $i;
+ $CmdLine = join( " ", $GammuExe, @Params );
+ #$CmdLine = $GammuExe . " --getsms " . $inbox_folder_nr . " " . $i;
debug "Executing: '" . $CmdLine . "'", 2;
- $result = `$CmdLine`;
+ #$result = `$CmdLine`;
+
+ # sicheres Forken
+ $gammu_pid = open( GAMMU, "|-");
+
+ local $SIG{'ALRM'} = sub { die "Timeout\n" };
+
+ if ( $gammu_pid ) { # parent
+
+ $result = "";
+ eval {
+ alarm $timeout;
+ while ( <GAMMU> ) {
+ $result .= $_;
+ }
+ close( GAMMU ) || error "kid exited $?", "warning";
+ };
+ alarm 0;
+
+ if ( $@ ) {
+
+ chomp $@;
+ error "Irgendwas ging schief: " . $@, "warning";
+
+ if ( kill 0, $gammu_pid ) {
+ error "Kindprozess $gammu_pid laeuft noch, wird gekillt.", "warning";
+ kill $signo{'TERM'}, $gammu_pid;
+ error "Warte 2 Sekunden ...";
+ sleep 2;
+ if ( kill 0, $gammu_pid ) {
+ error "Kindprozess $gammu_pid laeuft immer noch, wird mit der Keule erschlagen!", "err";
+ kill $signo{'KILL'}, $gammu_pid;
+ }
+ }
+
+ }
+ alarm 0;
+
+ } else { # child
+
+ ($EUID, $EGID) = ($UID, $GID);
+ exec($GammuExe, @Params) || error( "can't exec program: $!", "err"), die;
+ # Bis hierhin sollte ich niemals kommen
+
+ }
+
unless ( $? ) { # Erfolgreich!!!
$sms = new SMS();
$sms->parse_from_gammu( $result );
eval {
alarm $timeout;
print GAMMU $sms->body();
- close( GAMMU ) || error "kid exited $?";
+ close( GAMMU ) || error "kid exited $?", "warning";
};
alarm 0;
if ( $@ ) {
chomp $@;
- error "Irgendwas ging schief: " . $@;
+ error "Irgendwas ging schief: " . $@, "warning";
if ( kill 0, $gammu_pid ) {
- error "Kindprozess $gammu_pid laeuft noch, wird gekillt.";
+ error "Kindprozess $gammu_pid laeuft noch, wird gekillt.", "warning";
kill $signo{'TERM'}, $gammu_pid;
error "Warte 2 Sekunden ...";
sleep 2;
if ( kill 0, $gammu_pid ) {
- error "Kindprozess $gammu_pid laeuft immer noch, wird mit der Keule erschlagen!";
+ error "Kindprozess $gammu_pid laeuft immer noch, wird mit der Keule erschlagen!", "err";
kill $signo{'KILL'}, $gammu_pid;
}
}
} else { # child
($EUID, $EGID) = ($UID, $GID);
- exec($GammuExe, @Params) || error( "can't exec program: $!"), die;
+ exec($GammuExe, @Params) || error( "can't exec program: $!", "err"), die;
# Bis hierhin sollte ich niemals kommen
}