This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[inseparable changes from match from perl-5.003_96 to perl-5.003_97]
[perl5.git] / lib / syslog.pl
index c98baf3..9e03399 100644 (file)
@@ -1,6 +1,8 @@
 #
 # syslog.pl
 #
+# $Log:        syslog.pl,v $
+# 
 # tom christiansen <tchrist@convex.com>
 # modified to use sockets by Larry Wall <lwall@jpl-devvax.jpl.nasa.gov>
 # NOTE: openlog now takes three arguments, just like openlog(3)
@@ -15,7 +17,7 @@
 #
 #      do openlog($program,'cons,pid','user');
 #      do syslog('info','this is another test');
-#      do syslog('warn','this is a better test: %d', time);
+#      do syslog('mail|warning','this is a better test: %d', time);
 #      do closelog();
 #      
 #      do syslog('debug','this is the last test');
@@ -29,13 +31,23 @@ package syslog;
 
 $host = 'localhost' unless $host;      # set $syslog'host to change
 
+if ($] >= 5) {
+    warn "You should 'use Sys::Syslog' instead; continuing" # if $^W
+} 
+
 require 'syslog.ph';
 
+ eval 'use Socket; 1'                  ||
+     eval { require "socket.ph" }      ||
+     require "sys/socket.ph";
+
+$maskpri = &LOG_UPTO(&LOG_DEBUG);
+
 sub main'openlog {
     ($ident, $logopt, $facility) = @_;  # package vars
     $lo_pid = $logopt =~ /\bpid\b/;
     $lo_ndelay = $logopt =~ /\bndelay\b/;
-    $lo_cons = $logopt =~ /\bncons\b/;
+    $lo_cons = $logopt =~ /\bcons\b/;
     $lo_nowait = $logopt =~ /\bnowait\b/;
     &connect if $lo_ndelay;
 } 
@@ -44,33 +56,71 @@ sub main'closelog {
     $facility = $ident = '';
     &disconnect;
 } 
+
+sub main'setlogmask {
+    local($oldmask) = $maskpri;
+    $maskpri = shift;
+    $oldmask;
+}
  
 sub main'syslog {
     local($priority) = shift;
     local($mask) = shift;
     local($message, $whoami);
+    local(@words, $num, $numpri, $numfac, $sum);
+    local($facility) = $facility;      # may need to change temporarily.
 
-    &connect unless $connected;
+    die "syslog: expected both priority and mask" unless $mask && $priority;
 
-    $whoami = $ident;
+    @words = split(/\W+/, $priority, 2);# Allow "level" or "level|facility".
+    undef $numpri;
+    undef $numfac;
+    foreach (@words) {
+       $num = &xlate($_);              # Translate word to number.
+       if (/^kern$/ || $num < 0) {
+           die "syslog: invalid level/facility: $_\n";
+       }
+       elsif ($num <= &LOG_PRIMASK) {
+           die "syslog: too many levels given: $_\n" if defined($numpri);
+           $numpri = $num;
+           return 0 unless &LOG_MASK($numpri) & $maskpri;
+       }
+       else {
+           die "syslog: too many facilities given: $_\n" if defined($numfac);
+           $facility = $_;
+           $numfac = $num;
+       }
+    }
 
-    die "syslog: expected both priority and mask" unless $mask && $priority;
+    die "syslog: level must be given\n" unless defined($numpri);
+
+    if (!defined($numfac)) {   # Facility not specified in this call.
+       $facility = 'user' unless $facility;
+       $numfac = &xlate($facility);
+    }
 
-    $facility = "user" unless $facility;
+    &connect unless $connected;
+
+    $whoami = $ident;
 
     if (!$ident && $mask =~ /^(\S.*):\s?(.*)/) {
        $whoami = $1;
        $mask = $2;
     } 
-    $whoami .= " [$$]" if $lo_pid;
+
+    unless ($whoami) {
+       ($whoami = getlogin) ||
+           ($whoami = getpwuid($<)) ||
+               ($whoami = 'syslog');
+    }
+
+    $whoami .= "[$$]" if $lo_pid;
 
     $mask =~ s/%m/$!/g;
     $mask .= "\n" unless $mask =~ /\n$/;
     $message = sprintf ($mask, @_);
 
-    $whoami = sprintf ("%s %d",$ENV{'USER'}||$ENV{'LOGNAME'},$$) unless $whoami;
-
-    $sum = &xlate($priority) + &xlate($facility);
+    $sum = $numpri + $numfac;
     unless (send(SYSLOG,"<$sum>$whoami: $message",0)) {
        if ($lo_cons) {
            if ($pid = fork) {
@@ -80,7 +130,7 @@ sub main'syslog {
            }
            else {
                open(CONS,">/dev/console");
-               print CONS "$<facility.$priority>$whoami: $message\n";
+               print CONS "<$facility.$priority>$whoami: $message\r";
                exit if defined $pid;           # if fork failed, we're parent
                close CONS;
            }
@@ -90,25 +140,25 @@ sub main'syslog {
 
 sub xlate {
     local($name) = @_;
-    $name =~ y/a-z/A-Z/;
+    $name = uc $name;
     $name = "LOG_$name" unless $name =~ /^LOG_/;
     $name = "syslog'$name";
-    &$name;
+    defined &$name ? &$name : -1;
 }
 
 sub connect {
     $pat = 'S n C4 x8';
 
-    $af_unix = 1;
-    $af_inet = 2;
+    $af_unix = &AF_UNIX;
+    $af_inet = &AF_INET;
 
-    $stream = 1;
-    $datagram = 2;
+    $stream = &SOCK_STREAM;
+    $datagram = &SOCK_DGRAM;
 
     ($name,$aliases,$proto) = getprotobyname('udp');
     $udp = $proto;
 
-    ($name,$aliase,$port,$proto) = getservbyname('syslog','udp');
+    ($name,$aliases,$port,$proto) = getservbyname('syslog','udp');
     $syslog = $port;
 
     if (chop($myname = `hostname`)) {