# -*-Perl-*- ################################################################ ### ### Log.pm ### ### Author: Internet Message Group ### Created: Apr 23, 1997 ### Revised: Jul 4, 2004 ### my $PM_VERSION = "IM::Log.pm version 20031028(IM146)"; package IM::Log; require 5.003; require Exporter; use IM::Config qw(expand_path used_selectors msg_mode); use IM::Util; use integer; use strict; use vars qw(@ISA @EXPORT); @ISA = qw(Exporter); @EXPORT = qw(log_action); use vars qw($initialized); ##### WRITE DISPATCHING ACTION HISTORY ##### # # log_action(protocol, server, to, stat, response) # protocol: current protocol to be logged # server: server name # stat: result status to be logged # to: list of recipients # return value: none # sub log_action($$$$;@) { my($proto, $server, $to, $stat, @resp) = @_; # my($proto, $server, $id, $to, $stat, @resp) = @_; return if ($main::Log_file eq '' && !$main::opt_syslog); unless (defined($initialized)) { $initialized = 1; if ($main::opt_syslog) { require Socket && import Socket; require 'sys/syslog.ph'; unless (socket(SYSLOG, &AF_UNIX, &SOCK_DGRAM, 0)) { im_warn("syslog socket: $!\n"); return; } unless (-S &_PATH_LOG) { im_warn(&_PATH_LOG . " not found\n"); return; } my $sun = sockaddr_un(&_PATH_LOG); unless (connect(SYSLOG, $sun)) { im_warn("syslog connect: $!\n"); return; } } else { # eval 'use IM::Folder'; } } my($tm_sec, $tm_min, $tm_hour, $tm_mday, $tm_mon, $tm_year) = localtime(time); my $msg = ''; $msg = sprintf "%d/%02d/%02d %02d:%02d:%02d ", $tm_year + 1900, $tm_mon+1, $tm_mday, $tm_hour, $tm_min, $tm_sec unless ($main::opt_syslog); $msg .= "proto=$proto"; $msg .= " server=$server" if ($server); $msg .= " id=$main::Cur_mid" if ($main::Cur_mid); my $cfg = &used_selectors(); $msg .= " from=$main::Sender ($cfg)" if ($cfg ne ''); $msg .= " to=$to" if ($to ne ''); if ($#resp >= 0) { $msg .= " stat=$stat (" . join('/', @resp) . ')'; } else { $msg .= " stat=$stat"; } if ($main::opt_syslog) { my $pname = progname() . "[$$]"; my $sum = &LOG_MAIL + &LOG_INFO; send(SYSLOG, "<$sum>$pname: $msg", 0); return; } my $file = expand_path($main::Log_file); return unless ($file =~ /(.+)/); if ($> != 0) { $file = $1; # to pass through taint check } &msg_mode(1); unless (im_open(\*HISTORY, ">>$file")) { im_warn("can't open history file: $file ($!)\n"); return; } unless (print HISTORY "$msg\n") { im_warn("can't write to history file: $file ($!)\n"); close(HISTORY); return; } unless (close(HISTORY)) { im_warn("can't write to history file: $file ($!)\n"); } } 1; __END__ =head1 NAME IM::Log - IM log handler =head1 SYNOPSIS use IM::Log; $main::Log_file = "putlog"; log_action($proto, $server, $to, $stat, @resp); =head1 DESCRIPTION The I module handles log file of IM. This modules is provided by IM (Internet Message). =head1 COPYRIGHT IM (Internet Message) is copyrighted by IM developing team. You can redistribute it and/or modify it under the modified BSD license. See the copyright file for more details. =cut ### Copyright (C) 1997, 1998, 1999 IM developing team ### All rights reserved. ### ### Redistribution and use in source and binary forms, with or without ### modification, are permitted provided that the following conditions ### are met: ### ### 1. Redistributions of source code must retain the above copyright ### notice, this list of conditions and the following disclaimer. ### 2. Redistributions in binary form must reproduce the above copyright ### notice, this list of conditions and the following disclaimer in the ### documentation and/or other materials provided with the distribution. ### 3. Neither the name of the team nor the names of its contributors ### may be used to endorse or promote products derived from this software ### without specific prior written permission. ### ### THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ### ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ### IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ### PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ### LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ### CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ### SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ### BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ### WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ### OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ### IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.