1b39c5158Smillertuse strict; 2eac174f2Safresh1use warnings; 3eac174f2Safresh1 4b39c5158Smillertuse Config; 56fb12b70Safresh1# We require DynaLoader to make sure that mod2fname is loaded 66fb12b70Safresh1eval { require DynaLoader }; 7b39c5158Smillert 8b39c5158Smillert1 while unlink "XSLoader.pm"; 99f11ffb7Safresh1open OUT, '>', 'XSLoader.pm' or die $!; 10b39c5158Smillertprint OUT <<'EOT'; 119f11ffb7Safresh1# Generated from XSLoader_pm.PL (resolved %Config::Config value) 12b8851fccSafresh1# This file is unique for every OS 13b39c5158Smillert 14eac174f2Safresh1use strict; 15eac174f2Safresh1no strict 'refs'; 16eac174f2Safresh1 17b39c5158Smillertpackage XSLoader; 18b39c5158Smillert 19*e0680481Safresh1our $VERSION = "0.32"; # remember to update version in POD! 20b39c5158Smillert 21898184e3Ssthenpackage DynaLoader; 22b39c5158Smillert 23b39c5158Smillert# No prizes for guessing why we don't say 'bootstrap DynaLoader;' here. 24b39c5158Smillert# NOTE: All dl_*.xs (including dl_none.xs) define a dl_error() XSUB 25b39c5158Smillertboot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) && 26b39c5158Smillert !defined(&dl_error); 27b39c5158Smillertpackage XSLoader; 28b39c5158Smillert 29b39c5158Smillertsub load { 30b39c5158Smillert package DynaLoader; 31b39c5158Smillert 32b8851fccSafresh1 my ($caller, $modlibname) = caller(); 33b8851fccSafresh1 my $module = $caller; 34b39c5158Smillert 35898184e3Ssthen if (@_) { 36898184e3Ssthen $module = $_[0]; 37898184e3Ssthen } else { 38898184e3Ssthen $_[0] = $module; 39898184e3Ssthen } 40b39c5158Smillert 41b39c5158Smillert # work with static linking too 42b39c5158Smillert my $boots = "$module\::bootstrap"; 43b39c5158Smillert goto &$boots if defined &$boots; 44b39c5158Smillert 45898184e3Ssthen goto \&XSLoader::bootstrap_inherit unless $module and defined &dl_load_file; 46b39c5158Smillert 47b39c5158Smillert my @modparts = split(/::/,$module); 48b39c5158Smillert my $modfname = $modparts[-1]; 499f11ffb7Safresh1 my $modfname_orig = $modfname; # For .bs file search 50b39c5158Smillert 51b39c5158SmillertEOT 52b39c5158Smillert 53b8851fccSafresh1# defined &DynaLoader::mod2fname catches most cases, except when 54b8851fccSafresh1# cross-compiling to a system that defines mod2fname. Using 55b8851fccSafresh1# $Config{d_libname_unique} is a best attempt at catching those cases. 56b8851fccSafresh1print OUT <<'EOT' if defined &DynaLoader::mod2fname || $Config{d_libname_unique}; 57b39c5158Smillert # Some systems have restrictions on files names for DLL's etc. 58b39c5158Smillert # mod2fname returns appropriate file base name (typically truncated) 59b39c5158Smillert # It may also edit @modparts if required. 60b8851fccSafresh1 $modfname = &DynaLoader::mod2fname(\@modparts) if defined &DynaLoader::mod2fname; 61b39c5158Smillert 62b39c5158SmillertEOT 63b39c5158Smillert 64b39c5158Smillertprint OUT <<'EOT' if $^O eq 'os2'; 65b39c5158Smillert 66b39c5158Smillert # os2 static build can dynaload, but cannot dynaload Perl modules... 67b39c5158Smillert die 'Dynaloaded Perl modules are not available in this build of Perl' if $OS2::is_static; 68b39c5158Smillert 69b39c5158SmillertEOT 70b39c5158Smillert 71b39c5158Smillertprint OUT <<'EOT'; 72b39c5158Smillert my $modpname = join('/',@modparts); 73b8851fccSafresh1 my $c = () = split(/::/,$caller,-1); 74b39c5158Smillert $modlibname =~ s,[\\/][^\\/]+$,, while $c--; # Q&D basename 75b8851fccSafresh1EOT 76b8851fccSafresh1 77b8851fccSafresh1my $to_print = <<'EOT'; 78ce05b150Smillert # Does this look like a relative path? 79b8851fccSafresh1 if ($modlibname !~ m{regexp}) { 80b8851fccSafresh1EOT 81b8851fccSafresh1 82b8851fccSafresh1$to_print =~ s~regexp~ 83b8851fccSafresh1 $^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'cygwin' || $^O eq 'amigaos' 84b8851fccSafresh1 ? '^(?:[A-Za-z]:)?[\\\/]' # Optional drive letter 85b8851fccSafresh1 : '^/' 86b8851fccSafresh1~e; 87b8851fccSafresh1 88b8851fccSafresh1print OUT $to_print, <<'EOT'; 89ce05b150Smillert # Someone may have a #line directive that changes the file name, or 90ce05b150Smillert # may be calling XSLoader::load from inside a string eval. We cer- 91ce05b150Smillert # tainly do not want to go loading some code that is not in @INC, 92ce05b150Smillert # as it could be untrusted. 93ce05b150Smillert # 94ce05b150Smillert # We could just fall back to DynaLoader here, but then the rest of 95ce05b150Smillert # this function would go untested in the perl core, since all @INC 96ce05b150Smillert # paths are relative during testing. That would be a time bomb 97ce05b150Smillert # waiting to happen, since bugs could be introduced into the code. 98ce05b150Smillert # 99ce05b150Smillert # So look through @INC to see if $modlibname is in it. A rela- 100ce05b150Smillert # tive $modlibname is not a common occurrence, so this block is 101ce05b150Smillert # not hot code. 102ce05b150Smillert FOUND: { 103ce05b150Smillert for (@INC) { 104ce05b150Smillert if ($_ eq $modlibname) { 105ce05b150Smillert last FOUND; 106ce05b150Smillert } 107ce05b150Smillert } 108ce05b150Smillert # Not found. Fall back to DynaLoader. 109ce05b150Smillert goto \&XSLoader::bootstrap_inherit; 110ce05b150Smillert } 111ce05b150Smillert } 112898184e3SsthenEOT 113898184e3Ssthen 114898184e3Ssthenmy $dl_dlext = quotemeta($Config::Config{'dlext'}); 115898184e3Ssthen 116898184e3Ssthenprint OUT <<"EOT"; 117898184e3Ssthen my \$file = "\$modlibname/auto/\$modpname/\$modfname.$dl_dlext"; 118898184e3SsthenEOT 119898184e3Ssthen 120898184e3Ssthenprint OUT <<'EOT'; 121b39c5158Smillert 122b39c5158Smillert# print STDERR "XSLoader::load for $module ($file)\n" if $dl_debug; 123b39c5158Smillert 1249f11ffb7Safresh1 # N.B. The .bs file does not following the naming convention used 1259f11ffb7Safresh1 # by mod2fname, so use the unedited version of the name. 126b39c5158Smillert 1279f11ffb7Safresh1 my $bs = "$modlibname/auto/$modpname/$modfname_orig.bs"; 128b39c5158Smillert 1299f11ffb7Safresh1 # This calls DynaLoader::bootstrap, which will load the .bs file if present 1309f11ffb7Safresh1 goto \&XSLoader::bootstrap_inherit if not -f $file or -s $bs; 131b39c5158Smillert 132b39c5158Smillert my $bootname = "boot_$module"; 133b39c5158Smillert $bootname =~ s/\W/_/g; 134b39c5158Smillert @DynaLoader::dl_require_symbols = ($bootname); 135b39c5158Smillert 136b39c5158Smillert my $boot_symbol_ref; 137b39c5158Smillert 138b39c5158SmillertEOT 139b39c5158Smillert 140b39c5158Smillert if ($^O eq 'darwin') { 141b8851fccSafresh1 my $extra_arg = ', 1 ' if $DynaLoader::VERSION ge '1.37'; 142b8851fccSafresh1print OUT <<"EOT"; 143b8851fccSafresh1 if (\$boot_symbol_ref = dl_find_symbol( 0, \$bootname $extra_arg)) { 144b39c5158Smillert goto boot; #extension library has already been loaded, e.g. darwin 145b39c5158Smillert } 146b39c5158SmillertEOT 147b39c5158Smillert } 148b39c5158Smillert 149b39c5158Smillertprint OUT <<'EOT'; 150b39c5158Smillert # Many dynamic extension loading problems will appear to come from 151b39c5158Smillert # this section of code: XYZ failed at line 123 of DynaLoader.pm. 152b39c5158Smillert # Often these errors are actually occurring in the initialisation 153b39c5158Smillert # C code of the extension XS file. Perl reports the error as being 154b39c5158Smillert # in this perl code simply because this was the last perl code 155b39c5158Smillert # it executed. 156b39c5158Smillert 157b39c5158Smillert my $libref = dl_load_file($file, 0) or do { 158b39c5158Smillert require Carp; 159b39c5158Smillert Carp::croak("Can't load '$file' for module $module: " . dl_error()); 160b39c5158Smillert }; 161b39c5158Smillert push(@DynaLoader::dl_librefs,$libref); # record loaded object 162b39c5158Smillert 163b8851fccSafresh1EOT 164b8851fccSafresh1my $dlsrc = $Config{dlsrc}; 165b8851fccSafresh1if ($dlsrc eq 'dl_freemint.xs' || $dlsrc eq 'dl_dld.xs') { 166b8851fccSafresh1 print OUT <<'EOT'; 167b39c5158Smillert my @unresolved = dl_undef_symbols(); 168b39c5158Smillert if (@unresolved) { 169b39c5158Smillert require Carp; 170b39c5158Smillert Carp::carp("Undefined symbols present after loading $file: @unresolved\n"); 171b39c5158Smillert } 172b39c5158Smillert 173b8851fccSafresh1EOT 174b8851fccSafresh1} 175b8851fccSafresh1 176b8851fccSafresh1print OUT <<'EOT'; 177b39c5158Smillert $boot_symbol_ref = dl_find_symbol($libref, $bootname) or do { 178b39c5158Smillert require Carp; 179b39c5158Smillert Carp::croak("Can't find '$bootname' symbol in $file\n"); 180b39c5158Smillert }; 181b39c5158Smillert 182b39c5158Smillert push(@DynaLoader::dl_modules, $module); # record loaded module 183b39c5158Smillert 184b39c5158Smillert boot: 185b39c5158Smillert my $xs = dl_install_xsub($boots, $boot_symbol_ref, $file); 186b39c5158Smillert 187b39c5158Smillert # See comment block above 188b39c5158Smillert push(@DynaLoader::dl_shared_objects, $file); # record files loaded 189b39c5158Smillert return &$xs(@_); 190898184e3Ssthen} 191b39c5158Smillert 192898184e3Ssthen# Can't test with DynaLoader->can('bootstrap_inherit') when building in the 193898184e3Ssthen# core, as XSLoader gets built before DynaLoader. 194898184e3Ssthen 195898184e3Ssthensub bootstrap_inherit { 196898184e3Ssthen require DynaLoader; 197898184e3Ssthen goto \&DynaLoader::bootstrap_inherit; 198b39c5158Smillert} 199b39c5158Smillert 200b39c5158Smillert1; 201b39c5158Smillert 202b39c5158Smillert__END__ 203b39c5158Smillert 204b39c5158Smillert=head1 NAME 205b39c5158Smillert 206b39c5158SmillertXSLoader - Dynamically load C libraries into Perl code 207b39c5158Smillert 208b39c5158Smillert=head1 VERSION 209b39c5158Smillert 210*e0680481Safresh1Version 0.32 211b39c5158Smillert 212b39c5158Smillert=head1 SYNOPSIS 213b39c5158Smillert 214b39c5158Smillert package YourPackage; 215898184e3Ssthen require XSLoader; 216b39c5158Smillert 2179f11ffb7Safresh1 XSLoader::load(__PACKAGE__, $VERSION); 218b39c5158Smillert 219b39c5158Smillert=head1 DESCRIPTION 220b39c5158Smillert 221b39c5158SmillertThis module defines a standard I<simplified> interface to the dynamic 222b39c5158Smillertlinking mechanisms available on many platforms. Its primary purpose is 223b39c5158Smillertto implement cheap automatic dynamic loading of Perl modules. 224b39c5158Smillert 225b39c5158SmillertFor a more complicated interface, see L<DynaLoader>. Many (most) 226b39c5158Smillertfeatures of C<DynaLoader> are not implemented in C<XSLoader>, like for 227b39c5158Smillertexample the C<dl_load_flags>, not honored by C<XSLoader>. 228b39c5158Smillert 229b39c5158Smillert=head2 Migration from C<DynaLoader> 230b39c5158Smillert 231b39c5158SmillertA typical module using L<DynaLoader|DynaLoader> starts like this: 232b39c5158Smillert 233b39c5158Smillert package YourPackage; 234b39c5158Smillert require DynaLoader; 235b39c5158Smillert 236b39c5158Smillert our @ISA = qw( OnePackage OtherPackage DynaLoader ); 237b39c5158Smillert our $VERSION = '0.01'; 2389f11ffb7Safresh1 __PACKAGE__->bootstrap($VERSION); 239b39c5158Smillert 240b39c5158SmillertChange this to 241b39c5158Smillert 242b39c5158Smillert package YourPackage; 243b39c5158Smillert use XSLoader; 244b39c5158Smillert 245b39c5158Smillert our @ISA = qw( OnePackage OtherPackage ); 246b39c5158Smillert our $VERSION = '0.01'; 2479f11ffb7Safresh1 XSLoader::load(__PACKAGE__, $VERSION); 248b39c5158Smillert 249b39c5158SmillertIn other words: replace C<require DynaLoader> by C<use XSLoader>, remove 250b39c5158SmillertC<DynaLoader> from C<@ISA>, change C<bootstrap> by C<XSLoader::load>. Do not 251b39c5158Smillertforget to quote the name of your package on the C<XSLoader::load> line, 252b39c5158Smillertand add comma (C<,>) before the arguments (C<$VERSION> above). 253b39c5158Smillert 254b39c5158SmillertOf course, if C<@ISA> contained only C<DynaLoader>, there is no need to have 255b39c5158Smillertthe C<@ISA> assignment at all; moreover, if instead of C<our> one uses the 256b39c5158Smillertmore backward-compatible 257b39c5158Smillert 258b39c5158Smillert use vars qw($VERSION @ISA); 259b39c5158Smillert 260b39c5158Smillertone can remove this reference to C<@ISA> together with the C<@ISA> assignment. 261b39c5158Smillert 262b39c5158SmillertIf no C<$VERSION> was specified on the C<bootstrap> line, the last line becomes 263b39c5158Smillert 2649f11ffb7Safresh1 XSLoader::load(__PACKAGE__); 265b39c5158Smillert 2669f11ffb7Safresh1in which case it can be further simplified to 267898184e3Ssthen 268898184e3Ssthen XSLoader::load(); 269898184e3Ssthen 270898184e3Ssthenas C<load> will use C<caller> to determine the package. 271898184e3Ssthen 272b39c5158Smillert=head2 Backward compatible boilerplate 273b39c5158Smillert 274b39c5158SmillertIf you want to have your cake and eat it too, you need a more complicated 275b39c5158Smillertboilerplate. 276b39c5158Smillert 277b39c5158Smillert package YourPackage; 278b39c5158Smillert 2799f11ffb7Safresh1 our @ISA = qw( OnePackage OtherPackage ); 2809f11ffb7Safresh1 our $VERSION = '0.01'; 281b39c5158Smillert eval { 282b39c5158Smillert require XSLoader; 2839f11ffb7Safresh1 XSLoader::load(__PACKAGE__, $VERSION); 284b39c5158Smillert 1; 285b39c5158Smillert } or do { 286b39c5158Smillert require DynaLoader; 287b39c5158Smillert push @ISA, 'DynaLoader'; 2889f11ffb7Safresh1 __PACKAGE__->bootstrap($VERSION); 289b39c5158Smillert }; 290b39c5158Smillert 291b39c5158SmillertThe parentheses about C<XSLoader::load()> arguments are needed since we replaced 292b39c5158SmillertC<use XSLoader> by C<require>, so the compiler does not know that a function 293b39c5158SmillertC<XSLoader::load()> is present. 294b39c5158Smillert 295b39c5158SmillertThis boilerplate uses the low-overhead C<XSLoader> if present; if used with 29691f110e0Safresh1an antique Perl which has no C<XSLoader>, it falls back to using C<DynaLoader>. 297b39c5158Smillert 298b39c5158Smillert=head1 Order of initialization: early load() 299b39c5158Smillert 300b39c5158SmillertI<Skip this section if the XSUB functions are supposed to be called from other 301b39c5158Smillertmodules only; read it only if you call your XSUBs from the code in your module, 302b39c5158Smillertor have a C<BOOT:> section in your XS file (see L<perlxs/"The BOOT: Keyword">). 303b39c5158SmillertWhat is described here is equally applicable to the L<DynaLoader|DynaLoader> 304b39c5158Smillertinterface.> 305b39c5158Smillert 306b39c5158SmillertA sufficiently complicated module using XS would have both Perl code (defined 307b39c5158Smillertin F<YourPackage.pm>) and XS code (defined in F<YourPackage.xs>). If this 308b39c5158SmillertPerl code makes calls into this XS code, and/or this XS code makes calls to 309b39c5158Smillertthe Perl code, one should be careful with the order of initialization. 310b39c5158Smillert 311898184e3SsthenThe call to C<XSLoader::load()> (or C<bootstrap()>) calls the module's 312898184e3Ssthenbootstrap code. For modules build by F<xsubpp> (nearly all modules) this 313898184e3Ssthenhas three side effects: 314b39c5158Smillert 315b39c5158Smillert=over 316b39c5158Smillert 317b39c5158Smillert=item * 318b39c5158Smillert 319898184e3SsthenA sanity check is done to ensure that the versions of the F<.pm> and the 320898184e3Ssthen(compiled) F<.xs> parts are compatible. If C<$VERSION> was specified, this 321898184e3Ssthenis used for the check. If not specified, it defaults to 322898184e3SsthenC<$XS_VERSION // $VERSION> (in the module's namespace) 323b39c5158Smillert 324b39c5158Smillert=item * 325b39c5158Smillert 326898184e3Ssthenthe XSUBs are made accessible from Perl 327b39c5158Smillert 328b39c5158Smillert=item * 329b39c5158Smillert 330b39c5158Smillertif a C<BOOT:> section was present in the F<.xs> file, the code there is called. 331b39c5158Smillert 332b39c5158Smillert=back 333b39c5158Smillert 334b39c5158SmillertConsequently, if the code in the F<.pm> file makes calls to these XSUBs, it is 335b39c5158Smillertconvenient to have XSUBs installed before the Perl code is defined; for 336b39c5158Smillertexample, this makes prototypes for XSUBs visible to this Perl code. 337b39c5158SmillertAlternatively, if the C<BOOT:> section makes calls to Perl functions (or 338b39c5158Smillertuses Perl variables) defined in the F<.pm> file, they must be defined prior to 339b39c5158Smillertthe call to C<XSLoader::load()> (or C<bootstrap()>). 340b39c5158Smillert 341b39c5158SmillertThe first situation being much more frequent, it makes sense to rewrite the 342b39c5158Smillertboilerplate as 343b39c5158Smillert 344b39c5158Smillert package YourPackage; 345b39c5158Smillert use XSLoader; 3469f11ffb7Safresh1 our ($VERSION, @ISA); 347b39c5158Smillert 348b39c5158Smillert BEGIN { 349b39c5158Smillert @ISA = qw( OnePackage OtherPackage ); 350b39c5158Smillert $VERSION = '0.01'; 351b39c5158Smillert 352b39c5158Smillert # Put Perl code used in the BOOT: section here 353b39c5158Smillert 3549f11ffb7Safresh1 XSLoader::load(__PACKAGE__, $VERSION); 355b39c5158Smillert } 356b39c5158Smillert 357b39c5158Smillert # Put Perl code making calls into XSUBs here 358b39c5158Smillert 359b39c5158Smillert=head2 The most hairy case 360b39c5158Smillert 361b39c5158SmillertIf the interdependence of your C<BOOT:> section and Perl code is 362b39c5158Smillertmore complicated than this (e.g., the C<BOOT:> section makes calls to Perl 363b39c5158Smillertfunctions which make calls to XSUBs with prototypes), get rid of the C<BOOT:> 364b39c5158Smillertsection altogether. Replace it with a function C<onBOOT()>, and call it like 365b39c5158Smillertthis: 366b39c5158Smillert 367b39c5158Smillert package YourPackage; 368b39c5158Smillert use XSLoader; 3699f11ffb7Safresh1 our ($VERSION, @ISA); 370b39c5158Smillert 371b39c5158Smillert BEGIN { 372b39c5158Smillert @ISA = qw( OnePackage OtherPackage ); 373b39c5158Smillert $VERSION = '0.01'; 3749f11ffb7Safresh1 XSLoader::load(__PACKAGE__, $VERSION); 375b39c5158Smillert } 376b39c5158Smillert 377b39c5158Smillert # Put Perl code used in onBOOT() function here; calls to XSUBs are 378b39c5158Smillert # prototype-checked. 379b39c5158Smillert 380b39c5158Smillert onBOOT; 381b39c5158Smillert 382b39c5158Smillert # Put Perl initialization code assuming that XS is initialized here 383b39c5158Smillert 384b39c5158Smillert 385b39c5158Smillert=head1 DIAGNOSTICS 386b39c5158Smillert 387b39c5158Smillert=over 388b39c5158Smillert 389b39c5158Smillert=item C<Can't find '%s' symbol in %s> 390b39c5158Smillert 391b39c5158SmillertB<(F)> The bootstrap symbol could not be found in the extension module. 392b39c5158Smillert 393b39c5158Smillert=item C<Can't load '%s' for module %s: %s> 394b39c5158Smillert 395b39c5158SmillertB<(F)> The loading or initialisation of the extension module failed. 396b39c5158SmillertThe detailed error follows. 397b39c5158Smillert 398b39c5158Smillert=item C<Undefined symbols present after loading %s: %s> 399b39c5158Smillert 400b39c5158SmillertB<(W)> As the message says, some symbols stay undefined although the 401b39c5158Smillertextension module was correctly loaded and initialised. The list of undefined 402b39c5158Smillertsymbols follows. 403b39c5158Smillert 404b39c5158Smillert=back 405b39c5158Smillert 406b39c5158Smillert=head1 LIMITATIONS 407b39c5158Smillert 408b39c5158SmillertTo reduce the overhead as much as possible, only one possible location 409b39c5158Smillertis checked to find the extension DLL (this location is where C<make install> 410b39c5158Smillertwould put the DLL). If not found, the search for the DLL is transparently 411b39c5158Smillertdelegated to C<DynaLoader>, which looks for the DLL along the C<@INC> list. 412b39c5158Smillert 413b39c5158SmillertIn particular, this is applicable to the structure of C<@INC> used for testing 414b39c5158Smillertnot-yet-installed extensions. This means that running uninstalled extensions 415b39c5158Smillertmay have much more overhead than running the same extensions after 416b39c5158SmillertC<make install>. 417b39c5158Smillert 418b39c5158Smillert 419898184e3Ssthen=head1 KNOWN BUGS 420898184e3Ssthen 421898184e3SsthenThe new simpler way to call C<XSLoader::load()> with no arguments at all 422898184e3Ssthendoes not work on Perl 5.8.4 and 5.8.5. 423898184e3Ssthen 424898184e3Ssthen 425b39c5158Smillert=head1 BUGS 426b39c5158Smillert 427b39c5158SmillertPlease report any bugs or feature requests via the perlbug(1) utility. 428b39c5158Smillert 429b39c5158Smillert 430b39c5158Smillert=head1 SEE ALSO 431b39c5158Smillert 432b39c5158SmillertL<DynaLoader> 433b39c5158Smillert 434b39c5158Smillert 435b39c5158Smillert=head1 AUTHORS 436b39c5158Smillert 437b39c5158SmillertIlya Zakharevich originally extracted C<XSLoader> from C<DynaLoader>. 438b39c5158Smillert 439b39c5158SmillertCPAN version is currently maintained by SE<eacute>bastien Aperghis-Tramoni 440b39c5158SmillertE<lt>sebastien@aperghis.netE<gt>. 441b39c5158Smillert 442b39c5158SmillertPrevious maintainer was Michael G Schwern <schwern@pobox.com>. 443b39c5158Smillert 444b39c5158Smillert 445b39c5158Smillert=head1 COPYRIGHT & LICENSE 446b39c5158Smillert 447898184e3SsthenCopyright (C) 1990-2011 by Larry Wall and others. 448b39c5158Smillert 449b39c5158SmillertThis program is free software; you can redistribute it and/or modify 450b39c5158Smillertit under the same terms as Perl itself. 451b39c5158Smillert 452b39c5158Smillert=cut 453b39c5158SmillertEOT 454b39c5158Smillert 455b39c5158Smillertclose OUT or die $!; 456