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 # Some Linuxes have weird errno.hs which generate
103 # no #file or #line directives
104 $file{'/usr/include/errno.h'} = 1;
105 } elsif ($^O eq 'MacOS') {
106 # note that we are only getting the GUSI errno's here ...
107 # we might miss out on compiler-specific ones
108 $file{"$ENV{GUSI}include:sys:errno.h"} = 1;
111 open(CPPI,"> errno.c") or
112 die "Cannot open errno.c";
114 if ($^O eq 'NetWare') {
115 print CPPI "#include <nwerrno.h>\n";
117 print CPPI "#include <errno.h>\n";
122 # invoke CPP and read the output
123 if ($^O eq 'MSWin32' || $^O eq 'NetWare') {
124 open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or
125 die "Cannot run '$Config{cpprun} $Config{cppflags} errno.c'";
127 my $cpp = default_cpp();
128 open(CPPO,"$cpp < errno.c |") or
129 die "Cannot exec $cpp";
133 if (($^O eq 'MSWin32' || $^O eq 'NetWare') and $Config{cc} =~ /^bcc/i) {
134 $pat = '^/\*\s+(.+)\s+\d+\s*:\s+\*/';
137 $pat = '^#\s*(?:line)?\s*\d+\s+"([^"]+)"';
140 if ($^O eq 'os2' or $^O eq 'MSWin32' or $^O eq 'NetWare') {
148 $file{$1} = 1 if /$pat/o;
161 die "No error definitions found" unless keys %err;
163 # create the CPP input
165 open(CPPI,"> errno.c") or
166 die "Cannot open errno.c";
168 if ($^O eq 'NetWare') {
169 print CPPI "#include <nwerrno.h>\n";
171 print CPPI "#include <errno.h>\n";
174 foreach $err (keys %err) {
175 print CPPI '"',$err,'" [[',$err,']]',"\n";
180 unless ($^O eq 'MacOS') { # trust what we have
181 # invoke CPP and read the output
184 my $cpp = "$Config{cppstdin} $Config{cppflags} $Config{cppminus}";
185 $cpp =~ s/sys\$input//i;
186 open(CPPO,"$cpp errno.c |") or
187 die "Cannot exec $Config{cppstdin}";
188 } elsif ($^O eq 'MSWin32' || $^O eq 'NetWare') {
189 open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or
190 die "Cannot run '$Config{cpprun} $Config{cppflags} errno.c'";
192 my $cpp = default_cpp();
193 open(CPPO,"$cpp < errno.c |")
194 or die "Cannot exec $cpp";
201 next unless ($name, $expr) = /"(.*?)"\s*\[\s*\[\s*(.*?)\s*\]\s*\]/;
202 next if $name eq $expr;
203 $err{$name} = eval $expr;
212 # This file is auto-generated. ***ANY*** changes here will be lost
216 our (\@EXPORT_OK,\%EXPORT_TAGS,\@ISA,\$VERSION,\%errno,\$AUTOLOAD);
221 "\$Config{'archname'}-\$Config{'osvers'}" eq
222 "$Config{'archname'}-$Config{'osvers'}" or
223 die "Errno architecture ($Config{'archname'}-$Config{'osvers'}) does not match executable architecture (\$Config{'archname'}-\$Config{'osvers'})";
225 \$VERSION = "$VERSION";
226 \@ISA = qw(Exporter);
231 my @err = sort { $err{$a} <=> $err{$b} } keys %err;
232 map { $len = length if length > $len } @err;
234 my $j = "\@EXPORT_OK = qw(" . join(" ",keys %err) . ");\n";
235 $j =~ s/(.{50,70})\s/$1\n\t/g;
243 my $k = join(" ", grep { exists $err{$_} }
244 qw(E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT
245 EAGAIN EALREADY EBADF EBUSY ECHILD ECONNABORTED
246 ECONNREFUSED ECONNRESET EDEADLK EDESTADDRREQ EDOM EDQUOT
247 EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH EINPROGRESS
248 EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK
249 EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH
250 ENFILE ENOBUFS ENODEV ENOENT ENOEXEC ENOLCK ENOMEM
251 ENOPROTOOPT ENOSPC ENOSYS ENOTBLK ENOTCONN ENOTDIR
252 ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM
253 EPFNOSUPPORT EPIPE EPROCLIM EPROTONOSUPPORT EPROTOTYPE
254 ERANGE EREMOTE ERESTART EROFS ESHUTDOWN ESOCKTNOSUPPORT
255 ESPIPE ESRCH ESTALE ETIMEDOUT ETOOMANYREFS ETXTBSY
256 EUSERS EWOULDBLOCK EXDEV));
258 $k =~ s/(.{50,70})\s/$1\n\t/g;
259 print "\t",$k,"\n )]\n);\n\n";
261 foreach $err (@err) {
262 printf "sub %s () { %d }\n",,$err,$err{$err};
267 sub TIEHASH { bless [] }
270 my ($self, $errname) = @_;
271 my $proto = prototype("Errno::$errname");
273 if (defined($proto) && $proto eq "") {
276 $errno = 0 unless $! == $errno;
283 Carp::confess("ERRNO hash is read only!");
291 while(($k,$v) = each %Errno::) {
292 my $proto = prototype("Errno::$k");
293 last if (defined($proto) && $proto eq "");
299 my $s = scalar keys %Errno::; # initialize iterator
304 my ($self, $errname) = @_;
305 my $proto = prototype($errname);
306 defined($proto) && $proto eq "";
316 Errno - System errno constants
320 use Errno qw(EINTR EIO :POSIX);
324 C<Errno> defines and conditionally exports all the error constants
325 defined in your system C<errno.h> include file. It has a single export
326 tag, C<:POSIX>, which will export all POSIX defined error numbers.
328 C<Errno> also makes C<%!> magic such that each element of C<%!> has a
329 non-zero value only if C<$!> is set to that value. For example:
333 unless (open(FH, "/fangorn/spouse")) {
335 warn "Get a wife!\n";
337 warn "This path is barred: $!";
341 If a specified constant C<EFOO> does not exist on the system, C<$!{EFOO}>
342 returns C<"">. You may use C<exists $!{EFOO}> to check whether the
343 constant is available on the system.
347 Importing a particular constant may not be very portable, because the
348 import will fail on platforms that do not have that constant. A more
349 portable way to set C<$!> to a valid value is to use:
351 if (exists &Errno::EFOO) {
357 Graham Barr <gbarr@pobox.com>
361 Copyright (c) 1997-8 Graham Barr. All rights reserved.
362 This program is free software; you can redistribute it and/or modify it
363 under the same terms as Perl itself.