1# $Id: Signal.pm,v 1.4 1998-10-27 16:16:13-05 roderick Exp $
2#
3# Copyright (c) 1997 Roderick Schertler.  All rights reserved.  This
4# program is free software; you can redistribute it and/or modify it
5# under the same terms as Perl itself.
6
7package IPC::Signal;
8
9use 5.003_94;	# __PACKAGE__
10use strict;
11use vars	qw($VERSION @ISA @EXPORT_OK $AUTOLOAD %Sig_num @Sig_name);
12
13require Exporter;
14
15$VERSION	= '1.00';
16@ISA		= qw(Exporter);
17@EXPORT_OK	= qw(sig_num sig_name sig_translate_setup %Sig_num @Sig_name);
18%Sig_num	= ();
19@Sig_name	= ();
20
21sub sig_num  ($);
22sub sig_name ($);
23
24sub sig_translate_setup () {
25    return if %Sig_num && @Sig_name;
26
27    require Config;
28
29    # In 5.005 the sig_num entries are comma separated and there's a
30    # trailing 0.
31    my $num = $Config::Config{'sig_num'};
32    if ($num =~ s/,//g) {
33	$num =~ s/\s+0$//;
34    }
35
36    my @name	= split ' ', $Config::Config{'sig_name'};
37    my @num	= split ' ', $num;
38
39    @name			or die 'No signals defined';
40    @name == @num		or die 'Signal name/number mismatch';
41
42    @Sig_num{@name} = @num;
43    keys %Sig_num == @name	or die 'Duplicate signal names present';
44    for (@name) {
45	$Sig_name[$Sig_num{$_}] = $_
46	    unless defined $Sig_name[$Sig_num{$_}];
47    }
48}
49
50# This autoload routine just is just for sig_num() and sig_name().  It
51# calls sig_translate_setup() and then snaps the real function definitions
52# into place.
53
54sub AUTOLOAD {
55    if ($AUTOLOAD ne __PACKAGE__ . '::sig_num'
56	    && $AUTOLOAD ne __PACKAGE__ . '::sig_name') {
57	require Carp;
58	Carp::croak("Undefined subroutine &$AUTOLOAD called");
59    }
60    sig_translate_setup;
61    *sig_num  = sub ($) { $Sig_num{$_[0]} };
62    *sig_name = sub ($) { $Sig_name[$_[0]] };
63    goto &$AUTOLOAD;
64}
65
661
67
68__END__
69
70=head1 NAME
71
72IPC::Signal - Utility functions dealing with signals
73
74=head1 SYNOPSIS
75
76    $number = sig_num $name;
77    $name   = sig_name $number;
78
79    sig_translate_setup;
80    $number = $Sig_num{$name};
81    $name   = $Sig_name[$number];
82
83=head1 DESCRIPTION
84
85This module contains utility functions for dealing with signals.
86
87Nothing is exported by default.
88
89=over
90
91=item B<sig_num> I<chopped-signal-name>
92
93Returns the signal number of the signal whose name (sans C<SIG>) is
94I<chopped-signal-name>, or undef if there is no such signal.
95
96This function is prototyped to take a single scalar argument.
97
98=item B<sig_name> I<signal-number>
99
100Returns the chopped signal name (like C<HUP>) of signal number
101I<signal-number>, or undef if there is no such signal.
102
103This function is prototyped to take a single scalar argument.
104
105=item B<sig_translate_setup>
106
107If you want to use the @Sig_name and %Sig_num variables directly you must
108call B<sig_translate_setup> to initialize them.  This isn't necessary if
109you only use the function interfaces sig_name() and sig_num().
110
111This function is prototyped to take no arguments.
112
113=item B<%Sig_num>
114
115A hash with chopped signal name keys (like C<HUP>) and integer signal
116number values.
117
118=item B<@Sig_name>
119
120An array mapping signal numbers to chopped signal names (like C<HUP>).
121
122=back
123
124=head1 AUTHOR
125
126Roderick Schertler <F<roderick@argon.org>>
127
128=head1 SEE ALSO
129
130perl(1).
131
132=cut
133