1 use ExtUtils::MakeMaker;
5 our $VERSION = "1.111";
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 # With the -dM option, gcc outputs every #define it finds
32 unless(open(FH,"$Config{cc} -E -dM $file |")) {
33 warn "Cannot open '$file'";
37 unless(open(FH,"< $file")) {
38 # This file could be a temporary file created by cppstdin
39 # so only warn under -w, and return
40 warn "Cannot open '$file'" if $^W;
48 if /^\s*#\s*define\s+(E\w+)\s+(\d+)/;
53 if /^\s*#\s*define\s+(E\w+)\s+/;
62 unless (defined $cppstdin) {
64 $cppstdin = $Config{cppstdin};
65 my $upup_cppstdin = File::Spec->catfile(File::Spec->updir,
68 my $cppstdin_is_wrapper =
69 ($cppstdin eq 'cppstdin'
71 and -x $upup_cppstdin);
72 $cppstdin = $upup_cppstdin if $cppstdin_is_wrapper;
74 return "$cppstdin $Config{cppflags} $Config{cppminus}";
79 # VMS keeps its include files in system libraries (well, except for Gcc)
81 if ($Config{vms_cc_type} eq 'decc') {
82 $file{'Sys$Library:DECC$RTLDEF.TLB'} = 1;
83 } elsif ($Config{vms_cc_type} eq 'vaxc') {
84 $file{'Sys$Library:vaxcdef.tlb'} = 1;
85 } elsif ($Config{vms_cc_type} eq 'gcc') {
86 $file{'gnu_cc_include:[000000]errno.h'} = 1;
88 } elsif ($^O eq 'os390') {
89 # OS/390 C compiler doesn't generate #file or #line directives
90 $file{'/usr/include/errno.h'} = 1;
91 } elsif ($^O eq 'vmesa') {
92 # OS/390 C compiler doesn't generate #file or #line directives
93 $file{'../../vmesa/errno.h'} = 1;
94 } elsif ($Config{archname} eq 'epoc') {
95 # Watch out for cross compiling for EPOC (usually done on linux)
96 $file{'/usr/local/epoc/include/libc/sys/errno.h'} = 1;
97 } elsif ($^O eq 'linux') {
98 # Some Linuxes have weird errno.hs which generate
99 # no #file or #line directives
100 $file{'/usr/include/errno.h'} = 1;
101 } elsif ($^O eq 'MacOS') {
102 # note that we are only getting the GUSI errno's here ...
103 # we might miss out on compiler-specific ones
104 $file{"$ENV{GUSI}include:sys:errno.h"} = 1;
107 open(CPPI,"> errno.c") or
108 die "Cannot open errno.c";
110 print CPPI "#include <errno.h>\n";
114 # invoke CPP and read the output
115 if ($^O eq 'MSWin32') {
116 open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or
117 die "Cannot run '$Config{cpprun} $Config{cppflags} errno.c'";
119 my $cpp = default_cpp();
120 open(CPPO,"$cpp < errno.c |") or
121 die "Cannot exec $cpp";
125 if ($^O eq 'MSWin32' and $Config{cc} =~ /^bcc/i) {
126 $pat = '^/\*\s+(.+)\s+\d+\s*:\s+\*/';
129 $pat = '^#\s*(?:line)?\s*\d+\s+"([^"]+)"';
132 if ($^O eq 'os2' or $^O eq 'MSWin32') {
140 $file{$1} = 1 if /$pat/o;
153 die "No error definitions found" unless keys %err;
155 # create the CPP input
157 open(CPPI,"> errno.c") or
158 die "Cannot open errno.c";
160 print CPPI "#include <errno.h>\n";
162 foreach $err (keys %err) {
163 print CPPI '"',$err,'" [[',$err,']]',"\n";
168 unless ($^O eq 'MacOS') { # trust what we have
169 # invoke CPP and read the output
172 my $cpp = "$Config{cppstdin} $Config{cppflags} $Config{cppminus}";
173 $cpp =~ s/sys\$input//i;
174 open(CPPO,"$cpp errno.c |") or
175 die "Cannot exec $Config{cppstdin}";
176 } elsif ($^O eq 'MSWin32') {
177 open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or
178 die "Cannot run '$Config{cpprun} $Config{cppflags} errno.c'";
180 my $cpp = default_cpp();
181 open(CPPO,"$cpp < errno.c |")
182 or die "Cannot exec $cpp";
189 next unless ($name, $expr) = /"(.*?)"\s*\[\s*\[\s*(.*?)\s*\]\s*\]/;
190 next if $name eq $expr;
191 $err{$name} = eval $expr;
200 # This file is auto-generated. ***ANY*** changes here will be lost
204 our (\@EXPORT_OK,\%EXPORT_TAGS,\@ISA,\$VERSION,\%errno,\$AUTOLOAD);
209 "\$Config{'archname'}-\$Config{'osvers'}" eq
210 "$Config{'archname'}-$Config{'osvers'}" or
211 die "Errno architecture ($Config{'archname'}-$Config{'osvers'}) does not match executable architecture (\$Config{'archname'}-\$Config{'osvers'})";
213 \$VERSION = "$VERSION";
214 \@ISA = qw(Exporter);
219 my @err = sort { $err{$a} <=> $err{$b} } keys %err;
220 map { $len = length if length > $len } @err;
222 my $j = "\@EXPORT_OK = qw(" . join(" ",keys %err) . ");\n";
223 $j =~ s/(.{50,70})\s/$1\n\t/g;
231 my $k = join(" ", grep { exists $err{$_} }
232 qw(E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT
233 EAGAIN EALREADY EBADF EBUSY ECHILD ECONNABORTED
234 ECONNREFUSED ECONNRESET EDEADLK EDESTADDRREQ EDOM EDQUOT
235 EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH EINPROGRESS
236 EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK
237 EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH
238 ENFILE ENOBUFS ENODEV ENOENT ENOEXEC ENOLCK ENOMEM
239 ENOPROTOOPT ENOSPC ENOSYS ENOTBLK ENOTCONN ENOTDIR
240 ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM
241 EPFNOSUPPORT EPIPE EPROCLIM EPROTONOSUPPORT EPROTOTYPE
242 ERANGE EREMOTE ERESTART EROFS ESHUTDOWN ESOCKTNOSUPPORT
243 ESPIPE ESRCH ESTALE ETIMEDOUT ETOOMANYREFS ETXTBSY
244 EUSERS EWOULDBLOCK EXDEV));
246 $k =~ s/(.{50,70})\s/$1\n\t/g;
247 print "\t",$k,"\n )]\n);\n\n";
249 foreach $err (@err) {
250 printf "sub %s () { %d }\n",,$err,$err{$err};
255 sub TIEHASH { bless [] }
258 my ($self, $errname) = @_;
259 my $proto = prototype("Errno::$errname");
261 if (defined($proto) && $proto eq "") {
264 $errno = 0 unless $! == $errno;
271 Carp::confess("ERRNO hash is read only!");
279 while(($k,$v) = each %Errno::) {
280 my $proto = prototype("Errno::$k");
281 last if (defined($proto) && $proto eq "");
287 my $s = scalar keys %Errno::; # initialize iterator
292 my ($self, $errname) = @_;
293 my $proto = prototype($errname);
294 defined($proto) && $proto eq "";
304 Errno - System errno constants
308 use Errno qw(EINTR EIO :POSIX);
312 C<Errno> defines and conditionally exports all the error constants
313 defined in your system C<errno.h> include file. It has a single export
314 tag, C<:POSIX>, which will export all POSIX defined error numbers.
316 C<Errno> also makes C<%!> magic such that each element of C<%!> has a
317 non-zero value only if C<$!> is set to that value. For example:
321 unless (open(FH, "/fangorn/spouse")) {
323 warn "Get a wife!\n";
325 warn "This path is barred: $!";
329 If a specified constant C<EFOO> does not exist on the system, C<$!{EFOO}>
330 returns C<"">. You may use C<exists $!{EFOO}> to check whether the
331 constant is available on the system.
335 Importing a particular constant may not be very portable, because the
336 import will fail on platforms that do not have that constant. A more
337 portable way to set C<$!> to a valid value is to use:
339 if (exists &Errno::EFOO) {
345 Graham Barr <gbarr@pobox.com>
349 Copyright (c) 1997-8 Graham Barr. All rights reserved.
350 This program is free software; you can redistribute it and/or modify it
351 under the same terms as Perl itself.