1 use ExtUtils::MakeMaker;
5 our $VERSION = "1.09_00";
9 unlink "Errno.pm" if -f "Errno.pm";
10 open OUT, ">Errno.pm" or die "Cannot open Errno.pm: $!";
13 foreach $file (get_files()) {
17 unlink "errno.c" if -f "errno.c";
22 return unless defined $file and -f $file;
25 if (($^O eq 'VMS') && ($Config{vms_cc_type} ne 'gnuc')) {
26 unless(open(FH," LIBRARY/EXTRACT=ERRNO/OUTPUT=SYS\$OUTPUT $file |")) {
27 warn "Cannot open '$file'";
30 } elsif ($Config{gccversion} ne ''
31 # OpenSTEP has gcc 2.7.2.1 which recognizes but
32 # doesn't implement the -dM flag.
33 && $^O ne 'openstep' && $^O ne 'next' && $^O ne 'darwin'
35 # With the -dM option, gcc outputs every #define it finds
36 unless(open(FH,"$Config{cc} -E -dM $Config{cppflags} $file |")) {
37 warn "Cannot open '$file'";
41 unless(open(FH,"< $file")) {
42 # This file could be a temporary file created by cppstdin
43 # so only warn under -w, and return
44 warn "Cannot open '$file'" if $^W;
52 if /^\s*#\s*define\s+(E\w+)\s+(\d+)/;
57 if /^\s*#\s*define\s+(E\w+)\s+/;
66 unless (defined $cppstdin) {
68 $cppstdin = $Config{cppstdin};
69 my $upup_cppstdin = File::Spec->catfile(File::Spec->updir,
72 my $cppstdin_is_wrapper =
73 ($cppstdin eq 'cppstdin'
75 and -x $upup_cppstdin);
76 $cppstdin = $upup_cppstdin if $cppstdin_is_wrapper;
78 return "$cppstdin $Config{cppflags} $Config{cppminus}";
83 # VMS keeps its include files in system libraries (well, except for Gcc)
85 if ($Config{vms_cc_type} eq 'decc') {
86 $file{'Sys$Library:DECC$RTLDEF.TLB'} = 1;
87 } elsif ($Config{vms_cc_type} eq 'vaxc') {
88 $file{'Sys$Library:vaxcdef.tlb'} = 1;
89 } elsif ($Config{vms_cc_type} eq 'gcc') {
90 $file{'gnu_cc_include:[000000]errno.h'} = 1;
92 } elsif ($^O eq 'os390') {
93 # OS/390 C compiler doesn't generate #file or #line directives
94 $file{'/usr/include/errno.h'} = 1;
95 } elsif ($^O eq 'vmesa') {
96 # OS/390 C compiler doesn't generate #file or #line directives
97 $file{'../../vmesa/errno.h'} = 1;
98 } elsif ($Config{archname} eq 'epoc') {
99 # Watch out for cross compiling for EPOC (usually done on linux)
100 $file{'/usr/local/epoc/include/libc/sys/errno.h'} = 1;
101 } elsif ($^O eq 'linux' &&
102 $Config{gccversion} ne '' # might be using, say, Intel's icc
104 # Some Linuxes have weird errno.hs which generate
105 # no #file or #line directives
106 $file{'/usr/include/errno.h'} = 1;
107 } elsif ($^O eq 'MacOS') {
108 # note that we are only getting the GUSI errno's here ...
109 # we might miss out on compiler-specific ones
110 $file{"$ENV{GUSI}include:sys:errno.h"} = 1;
113 open(CPPI,"> errno.c") or
114 die "Cannot open errno.c";
116 if ($^O eq 'NetWare') {
117 print CPPI "#include <nwerrno.h>\n";
119 print CPPI "#include <errno.h>\n";
124 # invoke CPP and read the output
125 if ($^O eq 'MSWin32' || $^O eq 'NetWare') {
126 open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or
127 die "Cannot run '$Config{cpprun} $Config{cppflags} errno.c'";
129 my $cpp = default_cpp();
130 open(CPPO,"$cpp < errno.c |") or
131 die "Cannot exec $cpp";
135 if (($^O eq 'MSWin32' || $^O eq 'NetWare') and $Config{cc} =~ /^bcc/i) {
136 $pat = '^/\*\s+(.+)\s+\d+\s*:\s+\*/';
139 $pat = '^#\s*(?:line)?\s*\d+\s+"([^"]+)"';
142 if ($^O eq 'os2' or $^O eq 'MSWin32' or $^O eq 'NetWare') {
150 $file{$1} = 1 if /$pat/o;
163 die "No error definitions found" unless keys %err;
165 # create the CPP input
167 open(CPPI,"> errno.c") or
168 die "Cannot open errno.c";
170 if ($^O eq 'NetWare') {
171 print CPPI "#include <nwerrno.h>\n";
173 print CPPI "#include <errno.h>\n";
176 foreach $err (keys %err) {
177 print CPPI '"',$err,'" [[',$err,']]',"\n";
182 unless ($^O eq 'MacOS') { # trust what we have
183 # invoke CPP and read the output
186 my $cpp = "$Config{cppstdin} $Config{cppflags} $Config{cppminus}";
187 $cpp =~ s/sys\$input//i;
188 open(CPPO,"$cpp errno.c |") or
189 die "Cannot exec $Config{cppstdin}";
190 } elsif ($^O eq 'MSWin32' || $^O eq 'NetWare') {
191 open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or
192 die "Cannot run '$Config{cpprun} $Config{cppflags} errno.c'";
194 my $cpp = default_cpp();
195 open(CPPO,"$cpp < errno.c |")
196 or die "Cannot exec $cpp";
203 next unless ($name, $expr) = /"(.*?)"\s*\[\s*\[\s*(.*?)\s*\]\s*\]/;
204 next if $name eq $expr;
205 $err{$name} = eval $expr;
214 # This file is auto-generated. ***ANY*** changes here will be lost
218 our (\@EXPORT_OK,\%EXPORT_TAGS,\@ISA,\$VERSION,\%errno,\$AUTOLOAD);
223 "\$Config{'archname'}-\$Config{'osvers'}" eq
224 "$Config{'archname'}-$Config{'osvers'}" or
225 die "Errno architecture ($Config{'archname'}-$Config{'osvers'}) does not match executable architecture (\$Config{'archname'}-\$Config{'osvers'})";
227 \$VERSION = "$VERSION";
228 \@ISA = qw(Exporter);
233 my @err = sort { $err{$a} <=> $err{$b} } keys %err;
234 map { $len = length if length > $len } @err;
236 my $j = "\@EXPORT_OK = qw(" . join(" ",keys %err) . ");\n";
237 $j =~ s/(.{50,70})\s/$1\n\t/g;
245 my $k = join(" ", grep { exists $err{$_} }
246 qw(E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT
247 EAGAIN EALREADY EBADF EBUSY ECHILD ECONNABORTED
248 ECONNREFUSED ECONNRESET EDEADLK EDESTADDRREQ EDOM EDQUOT
249 EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH EINPROGRESS
250 EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK
251 EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH
252 ENFILE ENOBUFS ENODEV ENOENT ENOEXEC ENOLCK ENOMEM
253 ENOPROTOOPT ENOSPC ENOSYS ENOTBLK ENOTCONN ENOTDIR
254 ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM
255 EPFNOSUPPORT EPIPE EPROCLIM EPROTONOSUPPORT EPROTOTYPE
256 ERANGE EREMOTE ERESTART EROFS ESHUTDOWN ESOCKTNOSUPPORT
257 ESPIPE ESRCH ESTALE ETIMEDOUT ETOOMANYREFS ETXTBSY
258 EUSERS EWOULDBLOCK EXDEV));
260 $k =~ s/(.{50,70})\s/$1\n\t/g;
261 print "\t",$k,"\n )]\n);\n\n";
263 foreach $err (@err) {
264 printf "sub %s () { %d }\n",,$err,$err{$err};
269 sub TIEHASH { bless [] }
272 my ($self, $errname) = @_;
273 my $proto = prototype("Errno::$errname");
275 if (defined($proto) && $proto eq "") {
278 $errno = 0 unless $! == $errno;
285 Carp::confess("ERRNO hash is read only!");
293 while(($k,$v) = each %Errno::) {
294 my $proto = prototype("Errno::$k");
295 last if (defined($proto) && $proto eq "");
301 my $s = scalar keys %Errno::; # initialize iterator
306 my ($self, $errname) = @_;
307 my $proto = prototype($errname);
308 defined($proto) && $proto eq "";
318 Errno - System errno constants
322 use Errno qw(EINTR EIO :POSIX);
326 C<Errno> defines and conditionally exports all the error constants
327 defined in your system C<errno.h> include file. It has a single export
328 tag, C<:POSIX>, which will export all POSIX defined error numbers.
330 C<Errno> also makes C<%!> magic such that each element of C<%!> has a
331 non-zero value only if C<$!> is set to that value. For example:
335 unless (open(FH, "/fangorn/spouse")) {
337 warn "Get a wife!\n";
339 warn "This path is barred: $!";
343 If a specified constant C<EFOO> does not exist on the system, C<$!{EFOO}>
344 returns C<"">. You may use C<exists $!{EFOO}> to check whether the
345 constant is available on the system.
349 Importing a particular constant may not be very portable, because the
350 import will fail on platforms that do not have that constant. A more
351 portable way to set C<$!> to a valid value is to use:
353 if (exists &Errno::EFOO) {
359 Graham Barr <gbarr@pobox.com>
363 Copyright (c) 1997-8 Graham Barr. All rights reserved.
364 This program is free software; you can redistribute it and/or modify it
365 under the same terms as Perl itself.