jabberd.in.patch   [plain text]


--- /tmp/jabberd-2.2.13/tools/jabberd.in	2011-02-23 08:24:34.000000000 -0800
+++ ./jabberd2/tools/jabberd.in	2011-02-24 16:25:21.000000000 -0800
@@ -25,12 +25,14 @@ use POSIX qw(setsid);
 # Define some initial variables and default them as needed.
 #-----------------------------------------------------------------------------
 my $Bin = "@bindir@";
+my $LibExec = "@libexecdir@";
 my $VERSION = "@VERSION@";
 my $config_dir = "@sysconfdir@";
 my $config = $config_dir."/jabberd.cfg";
 $config = "internal" unless (-e $config);
 my $debug = 0;
 my $daemon = 0;
+my $g_kill_signal = "";
 my $select = IO::Select->new();
 my ($exe) = ($0 =~ /([^\/]+)$/);
 my %jobs;
@@ -103,7 +105,12 @@ else
         next if /^\#/;
         next if /^\s*$/;
         my ($job,$config) = /^\s*(\S+)\s*(\S*)\s*$/;
-        push(@programs,[$job,$config]);
+        # Assume that all the commands are in the same directory
+        # as the jabberd script. The current configuration file
+        # format does not allow specification of pathnames for commands.
+        #my $cmd = "$Bin/$job";
+        my $cmd = $jobs{$job}->{cmd};
+        push(@programs,[$job,$config,$cmd]);
     }
     close(CFG);
 }
@@ -127,7 +134,7 @@ if ($#programs == -1)
 
 foreach my $job (@programs)
 {
-    &LaunchJob($job->[0],$job->[1]);
+    &LaunchJob($job->[0],$job->[1],$job->[2]);
 }
 
 unless (!$daemon || $debug)
@@ -151,6 +158,15 @@ unless (!$daemon || $debug)
 while (1)
 {
     my @ready = $select->can_read();
+    if ($g_kill_signal ne "") {
+        if (($g_kill_signal eq "INT") || ($g_kill_signal eq "TERM"))
+        {
+            &Shutdown($g_kill_signal);
+        } else {
+            &PassSignal($g_kill_signal);
+        }
+        $g_kill_signal = "";
+    }
     foreach my $fh (@ready)
     {
         my $line = <$fh>;
@@ -161,7 +177,7 @@ while (1)
         else
         {
             print "ERROR: $fhs{$fh}->{job} died.  Shutting down server.\n";
-            &Signal("TERM");
+            &Shutdown;
         }
     }
 }
@@ -177,18 +193,32 @@ sub LaunchJob
 {
     my $job = shift;
     my $config = shift;
+    my $cmd = shift;
 
-    my $cmd = $jobs{$job}->{cmd};
+    if (!defined($cmd) || $cmd eq "")
+    {
+        $cmd = $jobs{$job}->{cmd};
+        if ($cmd eq "") {
+            print "cmd is empty, cannot launch\n";
+            return;
+        }
+    }
 
     if (defined($config))
     {
         $cmd .= " -c ".$config;
     }
-    else
+    elsif (defined($jobs{$job}->{config}))
     {
         $cmd .= " -c ".$jobs{$job}->{config};
     }
-    $cmd .= " -D" if $debug;
+
+    if ($debug && $jobs{$job}->{prefix} ne "MUC") {
+        $cmd .= " -D";
+    }
+    if (defined($jobs{$job}->{args}) && ($jobs{$job}->{args} ne "")) {
+        $cmd .= " ".$jobs{$job}->{args};
+    }
     
     &debug("jabberd","stdout","LaunchJob: $job -> $cmd\n");
 
@@ -248,23 +278,41 @@ sub CloseJob
 ##############################################################################
 sub Signal
 {
-    my $sig = shift;
+    $g_kill_signal = shift;
+}
 
-    &debug("jabberd","stdout","Got a signal... pass it on.\n");
+sub PassSignal
+{
+    my $sig = shift;
+    if ((! defined($sig)) || ($sig eq "")) {
+        return;
+    }
         
     foreach my $job (keys(%jobs))
     {
         next unless exists($jobs{$job}->{launched});
+        &debug("jabberd","stdout","sending $sig to $jobs{$job}->{pid} : $job\n");
         kill $sig => $jobs{$job}->{pid};
     }
+}
 
-    if (($sig eq "INT") || ($sig eq "TERM"))
+sub Shutdown
     {
-        &debug("jabberd","stdout","It was a $sig.  Shut it all down!\n");
-        exit(0);
+    my $sig = shift;
+    if (! defined($sig)) {
+        $sig = "TERM";
     }
+
+    PassSignal($sig);
+
+    &debug("Shutting down.\n");
+    my $ret;
+    foreach my $job(keys(%jobs)) {
+        $ret = waitpid($jobs{$job}->{pid}, 0) if defined($jobs{$job}->{pid});
 }
 
+    exit(0);
+}
 
 ##############################################################################
 #