diff options
-rw-r--r-- | MANIFEST | 1 | ||||
-rw-r--r-- | ext/Errno/ChangeLog | 34 | ||||
-rw-r--r-- | ext/Errno/Errno_pm.PL | 268 | ||||
-rw-r--r-- | ext/Errno/Makefile.PL | 29 | ||||
-rwxr-xr-x | t/lib/errno.t | 36 | ||||
-rw-r--r-- | win32/Makefile | 20 | ||||
-rw-r--r-- | win32/config.bc | 1 | ||||
-rw-r--r-- | win32/config.gc | 1 | ||||
-rw-r--r-- | win32/config.vc | 1 | ||||
-rw-r--r-- | win32/makefile.mk | 19 |
10 files changed, 404 insertions, 6 deletions
@@ -189,6 +189,7 @@ ext/DynaLoader/dl_next.xs Next implementation ext/DynaLoader/dl_none.xs Stub implementation ext/DynaLoader/dl_vms.xs VMS implementation ext/DynaLoader/dlutils.c Dynamic loader utilities for dl_*.xs files +ext/Errno/ChangeLog Errno perl module change log ext/Errno/Errno_pm.PL Errno perl module create script ext/Errno/Makefile.PL Errno extension makefile writer ext/Fcntl/Fcntl.pm Fcntl extension Perl module diff --git a/ext/Errno/ChangeLog b/ext/Errno/ChangeLog new file mode 100644 index 0000000000..a1d36e24c2 --- /dev/null +++ b/ext/Errno/ChangeLog @@ -0,0 +1,34 @@ +Change 160 on 1998/06/27 by <gbarr@pobox.com> (Graham Barr) + + - Added patch from Sarathy to support Win32 + - Changed use of $Config{cpp} to $Config{cpprun} as suggested by + Tom Horsley + +Change 159 on 1998/06/27 by <gbarr@pobox.com> (Graham Barr) + + - Changed to use cpp to locate required files + - Moved dummy Errno.pm file into d/ + - Added support for VMS + +Change 158 on 1998/06/27 by <gbarr@pobox.com> (Graham Barr) + + Rename errno.pl to Errno_pm.PL + +Change 146 on 1998/05/31 by <gbarr@pobox.com> (Graham Barr) + + Added ChangeLog to MANIFEST + +Change 140 on 1998/05/23 by <gbarr@pobox.com> (Graham Barr) + + Fix type in errno.pl + +Change 139 on 1998/05/23 by <gbarr@pobox.com> (Graham Barr) + + Moved code to generate Errno.pm into errno.pl + +Change 136 on 1998/05/19 by <gbarr@pobox.com> (Graham Barr) + + Changed to use cpp to locate constants + + Added t/errno.t + diff --git a/ext/Errno/Errno_pm.PL b/ext/Errno/Errno_pm.PL new file mode 100644 index 0000000000..b669790314 --- /dev/null +++ b/ext/Errno/Errno_pm.PL @@ -0,0 +1,268 @@ +#!perl +use ExtUtils::MakeMaker; +use Config; +use strict; + +use vars qw($VERSION); + +$VERSION = "1.08"; + +my %err = (); + +unlink "Errno.pm" if -f "Errno.pm"; +open OUT, ">Errno.pm" or die "Cannot open Errno.pm: $!"; +select OUT; +my $file; +foreach $file (get_files()) { + process_file($file); +} +write_errno_pm(); +unlink "errno.c" if -f "errno.c"; + +sub process_file { + my($file) = @_; + + return unless defined $file; + + local *FH; + if (($^O eq 'VMS') && ($Config{vms_cc_type} ne 'gnuc')) { + unless(open(FH," LIBRARY/EXTRACT=ERRNO/OUTPUT=SYS\$OUTPUT $file |")) { + warn "Cannot open '$file'"; + return; + } + } else { + unless(open(FH,"< $file")) { + warn "Cannot open '$file'"; + return; + } + } + while(<FH>) { + $err{$1} = 1 + if /^#\s*define\s+(E\w+)\s+/; + } + close(FH); +} + +sub get_files { + my %file = (); + # VMS keeps its include files in system libraries (well, except for Gcc) + if ($^O eq 'VMS') { + if ($Config{vms_cc_type} eq 'decc') { + $file{'Sys$Library:DECC$RTLDEF.TLB'} = 1; + } elsif ($Config{vms_cc_type} eq 'vaxc') { + $file{'Sys$Library:vaxcdef.tlb'} = 1; + } elsif ($Config{vms_cc_type} eq 'gcc') { + $file{'gnu_cc_include:[000000]errno.h'} = 1; + } + } else { + open(CPPI,"> errno.c") or + die "Cannot open errno.c"; + + print CPPI "#include <errno.h>\n"; + + close(CPPI); + + # invoke CPP and read the output + + open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or + die "Cannot exec $Config{cpprun}"; + + my $pat; + if ($^O eq 'MSWin32' and $Config{cc} =~ /^bcc/i) { + $pat = '^/\*\s+(.+)\s+\d+\s*:\s+\*/'; + } + else { + $pat = '^#(?:line)?\s+\d+\s+"([^"]+)"'; + } + while(<CPPO>) { + $file{$1} = 1 if /$pat/o; + } + close(CPPO); + } + return keys %file; +} + +sub write_errno_pm { + my $err; + + # create the CPP input + + open(CPPI,"> errno.c") or + die "Cannot open errno.c"; + + print CPPI "#include <errno.h>\n"; + + foreach $err (keys %err) { + print CPPI '"',$err,'" [[',$err,']]',"\n"; + } + + close(CPPI); + + # invoke CPP and read the output + if ($^O eq 'VMS') { + my $cpp = "$Config{cppstdin} $Config{cppflags} $Config{cppminus}"; + $cpp =~ s/sys\$input//i; + open(CPPO,"$cpp errno.c |") or + die "Cannot exec $Config{cppstdin}"; + } else { + open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or + die "Cannot exec $Config{cpprun}"; + } + + %err = (); + + while(<CPPO>) { + my($name,$expr); + next unless ($name, $expr) = /"(.*?)"\s*\[\s*\[\s*(.*?)\s*\]\s*\]/; + next if $name eq $expr; + $err{$name} = eval $expr; + } + close(CPPO); + + # Write Errno.pm + + print <<"EDQ"; +# +# This file is auto-generated. ***ANY*** changes here will be lost +# + +package Errno; +use vars qw(\@EXPORT_OK \%EXPORT_TAGS \@ISA \$VERSION \%errno \$AUTOLOAD); +use Exporter (); +use Config; +use strict; + +\$Config{'myarchname'} eq "$Config{'myarchname'}" or + die "Errno architecture ($Config{'myarchname'}) does not match executable architecture (\$Config{'myarchname'})"; + +\$VERSION = "$VERSION"; +\@ISA = qw(Exporter); + +EDQ + + my $len = 0; + my @err = sort { $err{$a} <=> $err{$b} } keys %err; + map { $len = length if length > $len } @err; + + my $j = "\@EXPORT_OK = qw(" . join(" ",keys %err) . ");\n"; + $j =~ s/(.{50,70})\s/$1\n\t/g; + print $j,"\n"; + +print <<'ESQ'; +%EXPORT_TAGS = ( + POSIX => [qw( +ESQ + + my $k = join(" ", grep { exists $err{$_} } + qw(E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT + EAGAIN EALREADY EBADF EBUSY ECHILD ECONNABORTED + ECONNREFUSED ECONNRESET EDEADLK EDESTADDRREQ EDOM EDQUOT + EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH EINPROGRESS + EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK + EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH + ENFILE ENOBUFS ENODEV ENOENT ENOEXEC ENOLCK ENOMEM + ENOPROTOOPT ENOSPC ENOSYS ENOTBLK ENOTCONN ENOTDIR + ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM + EPFNOSUPPORT EPIPE EPROCLIM EPROTONOSUPPORT EPROTOTYPE + ERANGE EREMOTE ERESTART EROFS ESHUTDOWN ESOCKTNOSUPPORT + ESPIPE ESRCH ESTALE ETIMEDOUT ETOOMANYREFS ETXTBSY + EUSERS EWOULDBLOCK EXDEV)); + + $k =~ s/(.{50,70})\s/$1\n\t/g; + print "\t",$k,"\n )]\n);\n\n"; + + foreach $err (@err) { + printf "sub %s () { %d }\n",,$err,$err{$err}; + } + + print <<'ESQ'; + +sub TIEHASH { bless [] } + +sub FETCH { + my ($self, $errname) = @_; + my $proto = prototype("Errno::$errname"); + if (defined($proto) && $proto eq "") { + no strict 'refs'; + return $! == &$errname; + } + require Carp; + Carp::confess("No errno $errname"); +} + +sub STORE { + require Carp; + Carp::confess("ERRNO hash is read only!"); +} + +*CLEAR = \&STORE; +*DELETE = \&STORE; + +sub NEXTKEY { + my($k,$v); + while(($k,$v) = each %Errno::) { + my $proto = prototype("Errno::$k"); + last if (defined($proto) && $proto eq ""); + + } + $k +} + +sub FIRSTKEY { + my $s = scalar keys %Errno::; + goto &NEXTKEY; +} + +sub EXISTS { + my ($self, $errname) = @_; + my $proto = prototype($errname); + defined($proto) && $proto eq ""; +} + +tie %!, __PACKAGE__; + +1; +__END__ + +=head1 NAME + +Errno - System errno constants + +=head1 SYNOPSIS + + use Errno qw(EINTR EIO :POSIX); + +=head1 DESCRIPTION + +C<Errno> defines and conditionally exports all the error constants +defined in your system C<errno.h> include file. It has a single export +tag, C<:POSIX>, which will export all POSIX defined error numbers. + +C<Errno> also makes C<%!> magic such that each element of C<%!> has a non-zero +value only if C<$!> is set to that value, eg + + use Errno; + + unless (open(FH, "/fangorn/spouse")) { + if ($!{ENOENT}) { + warn "Get a wife!\n"; + } else { + warn "This path is barred: $!"; + } + } + +=head1 AUTHOR + +Graham Barr <gbarr@pobox.com> + +=head1 COPYRIGHT + +Copyright (c) 1997-8 Graham Barr. All rights reserved. +This program is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +=cut + +ESQ + +} diff --git a/ext/Errno/Makefile.PL b/ext/Errno/Makefile.PL new file mode 100644 index 0000000000..ffc8c4b7e3 --- /dev/null +++ b/ext/Errno/Makefile.PL @@ -0,0 +1,29 @@ +use ExtUtils::MakeMaker; + +@VMS = ($^O eq 'VMS') ? (MAN3PODS => ' ') : (); + +WriteMakefile( + NAME => 'Errno', + VERSION_FROM => 'Errno_pm.PL', + PL_FILES => {'Errno_pm.PL'=>'Errno.pm'}, + PM => {'Errno.pm' => '$(INST_LIBDIR)/Errno.pm'}, + 'clean' => {FILES => 'Errno.pm'}, + 'dist' => { + COMPRESS => 'gzip -9f', + SUFFIX => '.gz', + DIST_DEFAULT => 'd/Errno.pm tardist', + }, + @VMS, +); + +sub MY::postamble { + my $TARG = MM->catfile('d','Errno.pm'); +qq!$TARG : Makefile + echo '#This is a dummy file so CPAN will find a VERSION' > $TARG + echo 'package Errno;' >> $TARG + echo '\$\$VERSION = "\$(VERSION)";' >>$TARG + echo '#This is to make sure require will return an error' >>$TARG + echo '0;' >>$TARG + +! +} diff --git a/t/lib/errno.t b/t/lib/errno.t new file mode 100755 index 0000000000..0e0462b32a --- /dev/null +++ b/t/lib/errno.t @@ -0,0 +1,36 @@ +#!./perl + +BEGIN { + unless(grep /blib/, @INC) { + chdir 't' if -d 't'; + @INC = '../lib' if -d '../lib'; + } +} + +use Errno; + +print "1..5\n"; + +print "not " unless @Errno::EXPORT_OK; +print "ok 1\n"; +die unless @Errno::EXPORT_OK; + +$err = $Errno::EXPORT_OK[0]; +$num = &{"Errno::$err"}; + +print "not " unless &{"Errno::$err"} == $num; +print "ok 2\n"; + +$! = $num; +print "not " unless $!{$err}; +print "ok 3\n"; + +$! = 0; +print "not " if $!{$err}; +print "ok 4\n"; + +$s1 = join(",",sort keys(%!)); +$s2 = join(",",sort @Errno::EXPORT_OK); + +print "not " unless $s1 eq $s2; +print "ok 5\n"; diff --git a/win32/Makefile b/win32/Makefile index 045834d9b1..fce1ed0610 100644 --- a/win32/Makefile +++ b/win32/Makefile @@ -450,6 +450,7 @@ PERL95_OBJ = $(PERL95_OBJ) DynaLoadmt$(o) DYNAMIC_EXT = Socket IO Fcntl Opcode SDBM_File POSIX attrs Thread B STATIC_EXT = DynaLoader +NONXS_EXT = Errno DYNALOADER = $(EXTDIR)\DynaLoader\DynaLoader SOCKET = $(EXTDIR)\Socket\Socket @@ -461,6 +462,7 @@ POSIX = $(EXTDIR)\POSIX\POSIX ATTRS = $(EXTDIR)\attrs\attrs THREAD = $(EXTDIR)\Thread\Thread B = $(EXTDIR)\B\B +ERRNO = $(EXTDIR)\Errno\Errno SOCKET_DLL = $(AUTODIR)\Socket\Socket.dll FCNTL_DLL = $(AUTODIR)\Fcntl\Fcntl.dll @@ -472,6 +474,8 @@ ATTRS_DLL = $(AUTODIR)\attrs\attrs.dll THREAD_DLL = $(AUTODIR)\Thread\Thread.dll B_DLL = $(AUTODIR)\B\B.dll +ERRNO_PM = $(LIBDIR)\Errno.pm + EXTENSION_C = \ $(SOCKET).c \ $(FCNTL).c \ @@ -493,6 +497,9 @@ EXTENSION_DLL = \ $(ATTRS_DLL) \ $(B_DLL) +EXTENSION_PM = \ + $(ERRNO_PM) + !IF "$(OBJECT)" == "" EXTENSION_DLL = \ $(EXTENSION_DLL)\ @@ -522,6 +529,7 @@ CFG_VARS = \ "make=nmake" \ "static_ext=$(STATIC_EXT)" \ "dynamic_ext=$(DYNAMIC_EXT)" \ + "nonxs_ext=$(NONXS_EXT)" \ "usethreads=$(USE_THREADS)" \ "LINK_FLAGS=$(LINK_FLAGS)" \ "optimize=$(OPTIMIZE)" @@ -531,7 +539,7 @@ CFG_VARS = \ # all : .\config.h $(GLOBEXE) $(MINIMOD) $(CONFIGPM) $(PERLEXE) $(PERL95EXE) \ - $(CAPILIB) $(X2P) $(EXTENSION_DLL) + $(CAPILIB) $(X2P) $(EXTENSION_DLL) $(EXTENSION_PM) $(DYNALOADER)$(o) : $(DYNALOADER).c $(CORE_H) $(EXTDIR)\DynaLoader\dlutils.c @@ -755,6 +763,12 @@ $(SOCKET_DLL): $(PERLEXE) $(SOCKET).xs $(MAKE) cd ..\..\win32 +$(ERRNO_PM): $(PERLEXE) $(ERRNO)_pm.PL + cd $(EXTDIR)\$(*B) + ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl + $(MAKE) + cd ..\..\win32 + doc: $(PERLEXE) copy ..\README.win32 ..\pod\perlwin32.pod $(PERLEXE) -I..\lib ..\installhtml --podroot=.. --htmldir=./html \ @@ -773,8 +787,8 @@ distclean: clean -del /f $(MINIPERL) $(PERLEXE) $(PERL95EXE) $(PERLDLL) $(GLOBEXE) \ $(PERLIMPLIB) ..\miniperl.lib $(MINIMOD) -del /f *.def *.map - -del /f $(EXTENSION_DLL) - -del /f $(EXTENSION_C) $(DYNALOADER).c + -del /f $(EXTENSION_DLL) $(EXTENSION_PM) + -del /f $(EXTENSION_C) $(DYNALOADER).c $(ERRNO).pm -del /f $(EXTDIR)\DynaLoader\dl_win32.xs -del /f $(LIBDIR)\.exists $(LIBDIR)\attrs.pm $(LIBDIR)\DynaLoader.pm -del /f $(LIBDIR)\Fcntl.pm $(LIBDIR)\IO.pm $(LIBDIR)\Opcode.pm diff --git a/win32/config.bc b/win32/config.bc index 78b6f191b0..5ee5af64f7 100644 --- a/win32/config.bc +++ b/win32/config.bc @@ -437,6 +437,7 @@ netdb_net_type='long' nm='' nm_opt='' nm_so_opt='' +nonxs_ext='Errno' nroff='' o_nonblock='O_NONBLOCK' obj_ext='.obj' diff --git a/win32/config.gc b/win32/config.gc index 720b5114b9..73f8219819 100644 --- a/win32/config.gc +++ b/win32/config.gc @@ -437,6 +437,7 @@ netdb_net_type='long' nm='nm' nm_opt='' nm_so_opt='' +nonxs_ext='Errno' nroff='' o_nonblock='O_NONBLOCK' obj_ext='.o' diff --git a/win32/config.vc b/win32/config.vc index b515fd7261..aefd0347c1 100644 --- a/win32/config.vc +++ b/win32/config.vc @@ -437,6 +437,7 @@ netdb_net_type='long' nm='' nm_opt='' nm_so_opt='' +nonxs_ext='Errno' nroff='' o_nonblock='O_NONBLOCK' obj_ext='.obj' diff --git a/win32/makefile.mk b/win32/makefile.mk index e99e80e1b2..3de2c57a77 100644 --- a/win32/makefile.mk +++ b/win32/makefile.mk @@ -562,6 +562,7 @@ PERL95_OBJ += DynaLoadmt$(o) DYNAMIC_EXT = Socket IO Fcntl Opcode SDBM_File POSIX attrs Thread B STATIC_EXT = DynaLoader +NONXS_EXT = Errno DYNALOADER = $(EXTDIR)\DynaLoader\DynaLoader SOCKET = $(EXTDIR)\Socket\Socket @@ -573,6 +574,7 @@ POSIX = $(EXTDIR)\POSIX\POSIX ATTRS = $(EXTDIR)\attrs\attrs THREAD = $(EXTDIR)\Thread\Thread B = $(EXTDIR)\B\B +ERRNO = $(EXTDIR)\Errno\Errno SOCKET_DLL = $(AUTODIR)\Socket\Socket.dll FCNTL_DLL = $(AUTODIR)\Fcntl\Fcntl.dll @@ -584,6 +586,8 @@ ATTRS_DLL = $(AUTODIR)\attrs\attrs.dll THREAD_DLL = $(AUTODIR)\Thread\Thread.dll B_DLL = $(AUTODIR)\B\B.dll +ERRNO_PM = $(LIBDIR)\Errno.pm + EXTENSION_C = \ $(SOCKET).c \ $(FCNTL).c \ @@ -605,6 +609,9 @@ EXTENSION_DLL = \ $(ATTRS_DLL) \ $(B_DLL) +EXTENSION_PM = \ + $(ERRNO_PM) + .IF "$(OBJECT)" == "" EXTENSION_DLL += \ $(THREAD_DLL) @@ -635,6 +642,7 @@ CFG_VARS = \ "_a=$(a)" "lib_ext=$(a)" \ "static_ext=$(STATIC_EXT)" \ "dynamic_ext=$(DYNAMIC_EXT)" \ + "nonxs_ext=$(NONXS_EXT)" \ "usethreads=$(USE_THREADS)" \ "LINK_FLAGS=$(LINK_FLAGS)" \ "optimize=$(OPTIMIZE)" @@ -644,7 +652,7 @@ CFG_VARS = \ # all : .\config.h $(GLOBEXE) $(MINIMOD) $(CONFIGPM) $(PERLEXE) $(PERL95EXE) \ - $(CAPILIB) $(X2P) $(EXTENSION_DLL) + $(CAPILIB) $(X2P) $(EXTENSION_DLL) $(EXTENSION_PM) $(DYNALOADER)$(o) : $(DYNALOADER).c $(CORE_H) $(EXTDIR)\DynaLoader\dlutils.c @@ -921,6 +929,11 @@ $(SOCKET_DLL): $(PERLEXE) $(SOCKET).xs ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl cd $(EXTDIR)\$(*B) && $(MAKE) +$(ERRNO_PM): $(PERLEXE) $(ERRNO)_pm.PL + cd $(EXTDIR)\$(*B) && \ + ..\..\miniperl -I..\..\lib Makefile.PL INSTALLDIRS=perl + cd $(EXTDIR)\$(*B) && $(MAKE) + doc: $(PERLEXE) copy ..\README.win32 ..\pod\perlwin32.pod $(PERLEXE) -I..\lib ..\installhtml --podroot=.. --htmldir=./html \ @@ -936,8 +949,8 @@ distclean: clean -del /f $(MINIPERL) $(PERLEXE) $(PERL95EXE) $(PERLDLL) $(GLOBEXE) \ $(PERLIMPLIB) ..\miniperl$(a) $(MINIMOD) -del /f *.def *.map - -del /f $(EXTENSION_DLL) - -del /f $(EXTENSION_C) $(DYNALOADER).c + -del /f $(EXTENSION_DLL) $(EXTENSION_PM) + -del /f $(EXTENSION_C) $(DYNALOADER).c $(ERRNO).pm -del /f $(EXTDIR)\DynaLoader\dl_win32.xs -del /f $(LIBDIR)\.exists $(LIBDIR)\attrs.pm $(LIBDIR)\DynaLoader.pm -del /f $(LIBDIR)\Fcntl.pm $(LIBDIR)\IO.pm $(LIBDIR)\Opcode.pm |