# -*-Perl-*-
################################################################
###
### Util.pm
###
### Author: Internet Message Group
### Created: Apr 23, 1997
### Revised: Jul 4, 2004
###
my $PM_VERSION = "IM::Util.pm version 20031028(IM146)";
package IM::Util;
require 5.003;
require Exporter;
use integer;
use strict;
use vars qw(@ISA @EXPORT
$SUCCESS $ERROR $EXIT_SUCCESS $EXIT_ERROR
$old); # why not my($old)?
@ISA = qw(Exporter);
@EXPORT = qw($SUCCESS $ERROR $EXIT_SUCCESS $EXIT_ERROR
unixp win95p wntp os2p
progname
im_getlogin
im_msg im_info im_debug im_notice im_warn im_err im_die im_die2
im_save_error im_saved_errors im_open im_sysopen
debug_option set_debug debug set_verbose verbose
flush);
use vars qw($OS $SavedMsg %Debug);
###
### Constant
###
$SUCCESS = 1;
$ERROR = 0;
$EXIT_SUCCESS = 0;
$EXIT_ERROR = 1;
###
### get OS name
###
my $osname = $^O;
if ($osname =~ /win/i && $osname !~ /darwin/i) {
eval {
if (Win32::IsWinNT()) {
$OS = 'WNT';
} elsif (Win32::IsWin95()) {
$OS = 'WIN95';
} else {
$OS = 'WIN95'; # xxx
}
};
if ($@) {
$OS = 'UNIX';
}
} elsif ($osname =~ /os2/i) {
$OS = 'OS/2';
} else {
$OS = 'UNIX';
}
sub unixp {
if ($OS eq 'UNIX') {
return 1;
} else {
return 0;
}
}
sub win95p {
if (($OS eq 'WIN95') || ($OS eq 'WNT')) {
return 1;
} else {
return 0;
}
}
sub wntp {
if ($OS eq 'WNT') {
return 1;
} else {
return 0;
}
}
sub os2p {
if ($OS eq 'OS/2') {
return 1;
} else {
return 0;
}
}
sub progname() {
return $main::Prog;
}
###
### get login name
###
sub im_getlogin() {
if (&unixp()) {
my $login = getlogin();
if ($login ne '' && $login ne 'root') {
return $login;
} else {
return (getpwuid($<))[0] || undef;
}
} elsif (&os2p()) {
return getlogin() || undef;
} elsif (&win95p()) {
return Win32::LoginName();
}
}
###
### message
###
# im_msg - display desired information
# im_debug - display debugging information (with --debug or something)
# im_info - display informational messages (hidden with --quiet)
# im_notice - display process tracing information (shown with --verbose)
# im_warn - display problem report -- the problem may be ignored
# im_err - display critical error messages -- process will be aborted
# im_die - display critical error messages and exit
sub im_msg($) {
my $msg = shift;
print progname(), ': ', $msg;
}
sub im_info($) {
my $info = shift;
return if $main::opt_quiet;
print progname(), ': ', $info;
}
sub im_debug($) {
my $dbg = shift;
print STDERR progname(), ':DEBUG: ', $dbg;
}
sub im_notice($) {
return unless &verbose;
my $warn = progname() . ': '. shift;
$SavedMsg .= $warn;
print STDERR $warn;
}
sub im_warn($) {
my $warn = progname() . ': '. shift;
$SavedMsg .= $warn;
print STDERR $warn;
}
sub im_err($) {
my $err = progname() . ': ERROR: ' . shift;
$SavedMsg .= $err;
print STDERR $err;
}
sub im_die($) {
my $die = shift;
print STDERR progname(), ': ERROR: ', $die;
exit $EXIT_ERROR;
}
sub im_die2($) {
my $die = shift;
print STDERR progname(), ': ', $die;
exit $EXIT_ERROR;
}
sub im_save_error(;$) {
my $string = shift;
if ($string eq '') {
$SavedMsg = ''; # reset
} else {
$SavedMsg .= $string;
}
}
sub im_saved_errors() {
return $SavedMsg;
}
###
### Debug
###
sub print_hash(\%) {
my $hashref = shift;
foreach (keys(%{$hashref})) {
print "$_ -> $hashref->{$_}\n";
}
}
sub set_debug($$) {
my $category = shift;
$Debug{$category} = shift;
}
sub debug($) {
my $category = shift;
if ($Debug{'all'}) {
return $Debug{'all'};
} else {
return $Debug{$category};
}
}
sub set_verbose($) {
$main::opt_verbose = shift;
}
sub verbose() {
return $main::opt_verbose;
}
##### SET DEBUG OPTION #####
#
# debug_option()
#
sub debug_option($) {
my $DebugFlag = shift;
if ($DebugFlag && ($DebugFlag !~ /^(off|no|false|0)$/)) {
foreach (split(',', $DebugFlag)) {
im_warn("setting debug level $_=1\n");
&set_debug($_, 1);
}
&set_verbose(1);
}
}
#
# flush buffer
#
sub flush(*) {
local($old) = select(shift);
$| = 1;
print '';
$| = 0;
select($old);
}
#
# open file
#
sub im_open($$) {
my($d, $f) = @_;
my($r);
if ($> != 0) {
$f =~ /(.+)/; # may be tainted
$f = $1; # clean up
}
if ($r = open($d, $f)) {
binmode($d);
}
return $r;
}
sub im_sysopen($$$) {
my($d, $f, $a) = @_;
my($r);
if ($> != 0) {
$f =~ /(.+)/; # may be tainted
$f = $1; # clean up
}
if ($r = sysopen($d, $f, $a)) {
binmode($d);
}
return $r;
}
1;
__END__
=head1 NAME
IM::Util - utility functions for IM
=head1 SYNOPSIS
use IM::Util;
Constant variables:
$SUCCESS
$ERROR
$EXIT_SUCCESS
$EXIT_ERROR
Subroutines:
unixp win95p wntp os2p
progname
im_getlogin
im_msg im_info im_debug im_notice im_warn im_err im_die im_die2
im_save_error im_saved_errors im_open im_sysopen
debug_option set_debug debug set_verbose verbose
flush
=head1 DESCRIPTION
The I module provides utility functions for 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.