diff options
author | Gurusamy Sarathy <gsar@cpan.org> | 1998-07-12 10:04:33 +0000 |
---|---|---|
committer | Gurusamy Sarathy <gsar@cpan.org> | 1998-07-12 10:04:33 +0000 |
commit | 3ffabb8c74e0e03284558b6100656cb83a8a35fb (patch) | |
tree | c587a1959dc984ae92aa37440d7a873f2f9b295f /lib/Sys | |
parent | 9036c72f77785d95a636c25783175a110c373cd0 (diff) | |
download | perl-3ffabb8c74e0e03284558b6100656cb83a8a35fb.tar.gz |
merge changes 1424, 1428 from maintbranch
p4raw-id: //depot/perl@1453
Diffstat (limited to 'lib/Sys')
-rw-r--r-- | lib/Sys/Syslog.pm | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/lib/Sys/Syslog.pm b/lib/Sys/Syslog.pm index 709f5785f5..1f92e60ccf 100644 --- a/lib/Sys/Syslog.pm +++ b/lib/Sys/Syslog.pm @@ -5,6 +5,7 @@ use Carp; @ISA = qw(Exporter); @EXPORT = qw(openlog closelog setlogmask syslog); +@EXPORT_OK = qw(setlogsock); use Socket; use Sys::Hostname; @@ -14,6 +15,10 @@ use Sys::Hostname; # 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) +# Modified to add UNIX domain sockets by Sean Robinson <robinson_s@sc.maricopa.edu> +# with support from Tim Bunce <Tim.Bunce@ig.co.uk> and the perl5-porters mailing list + +# Todo: enable connect to try all three types before failing (auto setlogsock)? =head1 NAME @@ -21,8 +26,10 @@ Sys::Syslog, openlog, closelog, setlogmask, syslog - Perl interface to the UNIX =head1 SYNOPSIS - use Sys::Syslog; + use Sys::Syslog; # all except setlogsock, or: + use Sys::Syslog qw(:DEFAULT setlogsock); # default set, plus setlogsock + setlogsock $sock_type; openlog $ident, $logopt, $facility; syslog $priority, $format, @args; $oldmask = setlogmask $mask_priority; @@ -54,20 +61,18 @@ is replaced with C<"$!"> (the latest error message). Sets log mask I<$mask_priority> and returns the old mask. -=item setlogsock $sock_type (added in 5.004_03) - +=item setlogsock $sock_type (added in 5.004_02) + Sets the socket type to be used for the next call to -C<openlog()> or C<syslog()>. - +C<openlog()> or C<syslog()> and returns TRUE on success, +undef on failure. + A value of 'unix' will connect to the UNIX domain socket returned by -C<_PATH_LOG> in F<syslog.ph>. If F<syslog.ph> fails to define -C<_PATH_LOG>, C<setlogsock> returns C<undef>; otherwise a true value is -returned. A value of 'inet' will connect to an INET socket returned by -getservbyname(). Any other value croaks. +C<_PATH_LOG> in F<syslog.ph>. A value of 'inet' will connect to an +INET socket returned by getservbyname(). Any other value croaks. The default is for the INET socket to be used. - =item closelog Closes the log file. @@ -135,14 +140,19 @@ sub setlogmask { sub setlogsock { local($setsock) = shift; + &disconnect if $connected; if (lc($setsock) eq 'unix') { - if (defined &_PATH_LOG) { - $sock_unix = 1; - } else { - return undef; - } + if (defined &_PATH_LOG) { + $sock_type = 1; + } else { + return undef; + } } elsif (lc($setsock) eq 'inet') { - undef($sock_unix); + if (getservbyname('syslog','udp')) { + undef($sock_type); + } else { + return undef; + } } else { croak "Invalid argument passed to setlogsock; must be 'unix' or 'inet'"; } @@ -238,7 +248,7 @@ sub connect { my($host_uniq) = Sys::Hostname::hostname(); ($host) = $host_uniq =~ /([A-Za-z0-9_.-]+)/; # allow FQDN (inc _) } - unless ( $sock_unix ) { + unless ( $sock_type ) { my $udp = getprotobyname('udp'); my $syslog = getservbyname('syslog','udp'); my $this = sockaddr_in($syslog, INADDR_ANY); @@ -248,8 +258,11 @@ sub connect { } else { my $syslog = &_PATH_LOG || croak "_PATH_LOG not found in syslog.ph"; my $that = sockaddr_un($syslog) || croak "Can't locate $syslog"; - socket(SYSLOG,AF_UNIX,SOCK_STREAM,0) || croak "open: $!"; - connect(SYSLOG,$that) || croak "connect: $!"; + socket(SYSLOG,AF_UNIX,SOCK_STREAM,0) || croak "socket: $!"; + if (!connect(SYSLOG,$that)) { + socket(SYSLOG,AF_UNIX,SOCK_DGRAM,0) || croak "socket: $!"; + connect(SYSLOG,$that) || croak "connect: $! (SOCK_DGRAM after trying SOCK_STREAM)"; + } } local($old) = select(SYSLOG); $| = 1; select($old); $connected = 1; |