1 use ExtUtils::MakeMaker;
5 our $VERSION = "1.09_00";
10 unlink "Errno.pm" if -f "Errno.pm";
11 open OUT, ">Errno.pm" or die "Cannot open Errno.pm: $!";
14 foreach $file (get_files()) {
16 if ($^O eq 'MSWin32') {
17 $file =~ s/errno/winsock/;
22 unlink "errno.c" if -f "errno.c";
27 return unless defined $file and -f $file;
28 # warn "Processing $file\n";
31 if (($^O eq 'VMS') && ($Config{vms_cc_type} ne 'gnuc')) {
32 unless(open(FH," LIBRARY/EXTRACT=ERRNO/OUTPUT=SYS\$OUTPUT $file |")) {
33 warn "Cannot open '$file'";
36 } elsif ($Config{gccversion} ne ''
37 # OpenSTEP has gcc 2.7.2.1 which recognizes but
38 # doesn't implement the -dM flag.
39 && $^O ne 'openstep' && $^O ne 'next' && $^O ne 'darwin'
41 # With the -dM option, gcc outputs every #define it finds
42 unless(open(FH,"$Config{cc} -E -dM $Config{cppflags} $file |")) {
43 warn "Cannot open '$file'";
47 unless(open(FH,"< $file")) {
48 # This file could be a temporary file created by cppstdin
49 # so only warn under -w, and return
50 warn "Cannot open '$file'" if $^W;
58 if /^\s*#\s*define\s+(E\w+)\s+(\d+)/;
63 if /^\s*#\s*define\s+(E\w+)\s+/;
64 if ($^O eq 'MSWin32') {
66 if /^\s*#\s*define\s+WSA(E\w+)\s+/;
76 unless (defined $cppstdin) {
78 $cppstdin = $Config{cppstdin};
79 my $upup_cppstdin = File::Spec->catfile(File::Spec->updir,
82 my $cppstdin_is_wrapper =
83 ($cppstdin eq 'cppstdin'
85 and -x $upup_cppstdin);
86 $cppstdin = $upup_cppstdin if $cppstdin_is_wrapper;
88 return "$cppstdin $Config{cppflags} $Config{cppminus}";
93 # VMS keeps its include files in system libraries (well, except for Gcc)
95 if ($Config{vms_cc_type} eq 'decc') {
96 $file{'Sys$Library:DECC$RTLDEF.TLB'} = 1;
97 } elsif ($Config{vms_cc_type} eq 'vaxc') {
98 $file{'Sys$Library:vaxcdef.tlb'} = 1;
99 } elsif ($Config{vms_cc_type} eq 'gcc') {
100 $file{'gnu_cc_include:[000000]errno.h'} = 1;
102 } elsif ($^O eq 'os390') {
103 # OS/390 C compiler doesn't generate #file or #line directives
104 $file{'/usr/include/errno.h'} = 1;
105 } elsif ($^O eq 'vmesa') {
106 # OS/390 C compiler doesn't generate #file or #line directives
107 $file{'../../vmesa/errno.h'} = 1;
108 } elsif ($Config{archname} eq 'epoc') {
109 # Watch out for cross compiling for EPOC (usually done on linux)
110 $file{'/usr/local/epocemx/epocsdk/include/libc/sys/errno.h'} = 1;
111 } elsif ($^O eq 'linux' &&
112 $Config{gccversion} ne '' # might be using, say, Intel's icc
114 # Some Linuxes have weird errno.hs which generate
115 # no #file or #line directives
116 $file{'/usr/include/errno.h'} = 1;
117 } elsif ($^O eq 'MacOS') {
118 # note that we are only getting the GUSI errno's here ...
119 # we might miss out on compiler-specific ones
120 $file{"$ENV{GUSI}include:sys:errno.h"} = 1;
122 } elsif ($^O eq 'beos') {
123 # hidden in a special place
124 $file{'/boot/develop/headers/posix/errno.h'} = 1;
126 } elsif ($^O eq 'vos') {
127 # avoid problem where cpp returns non-POSIX pathnames
128 $file{'/system/include_library/errno.h'} = 1;
130 open(CPPI,"> errno.c") or
131 die "Cannot open errno.c";
133 if ($^O eq 'NetWare') {
134 print CPPI "#include <nwerrno.h>\n";
136 print CPPI "#include <errno.h>\n";
141 # invoke CPP and read the output
142 if ($^O eq 'MSWin32' || $^O eq 'NetWare') {
143 open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or
144 die "Cannot run '$Config{cpprun} $Config{cppflags} errno.c'";
146 my $cpp = default_cpp();
147 open(CPPO,"$cpp < errno.c |") or
148 die "Cannot exec $cpp";
152 if (($^O eq 'MSWin32' || $^O eq 'NetWare') and $Config{cc} =~ /^bcc/i) {
153 $pat = '^/\*\s+(.+)\s+\d+\s*:\s+\*/';
156 $pat = '^#\s*(?:line)?\s*\d+\s+"([^"]+)"';
159 if ($^O eq 'os2' or $^O eq 'MSWin32' or $^O eq 'NetWare') {
167 $file{$1} = 1 if /$pat/o;
180 die "No error definitions found" unless keys %err;
182 # create the CPP input
184 open(CPPI,"> errno.c") or
185 die "Cannot open errno.c";
187 if ($^O eq 'NetWare') {
188 print CPPI "#include <nwerrno.h>\n";
191 print CPPI "#include <errno.h>\n";
193 if ($^O eq 'MSWin32') {
194 print CPPI "#include <winsock.h>\n";
195 foreach $err (keys %wsa) {
196 print CPPI "#ifndef $err\n";
197 print CPPI "#define $err WSA$err\n";
198 print CPPI "#endif\n";
203 foreach $err (keys %err) {
204 print CPPI '"',$err,'" [[',$err,']]',"\n";
209 unless ($^O eq 'MacOS') { # trust what we have
210 # invoke CPP and read the output
213 my $cpp = "$Config{cppstdin} $Config{cppflags} $Config{cppminus}";
214 $cpp =~ s/sys\$input//i;
215 open(CPPO,"$cpp errno.c |") or
216 die "Cannot exec $Config{cppstdin}";
217 } elsif ($^O eq 'MSWin32' || $^O eq 'NetWare') {
218 open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or
219 die "Cannot run '$Config{cpprun} $Config{cppflags} errno.c'";
221 my $cpp = default_cpp();
222 open(CPPO,"$cpp < errno.c |")
223 or die "Cannot exec $cpp";
230 next unless ($name, $expr) = /"(.*?)"\s*\[\s*\[\s*(.*?)\s*\]\s*\]/;
231 next if $name eq $expr;
232 $expr =~ s/(\d+)[LU]+\b/$1/g; # 2147483647L et alia
233 $err{$name} = eval $expr;
238 # Many of the E constants (including ENOENT, which is being
239 # used in the Perl test suite a lot), are available only as
240 # enums in BeOS, so compiling and executing some code is about
241 # only way to find out what the numeric Evalues are.
244 if (open(C, ">errno.c")) {
245 my @zero = grep { !$err{$_} } keys %err;
252 print C qq[printf("$_ %d\n", $_);]
256 system("cc -o errno errno.c");
258 if (open(C, "./errno|")) {
260 if (/^(\w+) (-?\d+)$/) { $err{$1} = $2 }
264 die "failed to execute ./errno: $!\n";
268 die "failed to create errno.c: $!\n";
276 # This file is auto-generated. ***ANY*** changes here will be lost
280 our (\@EXPORT_OK,\%EXPORT_TAGS,\@ISA,\$VERSION,\%errno,\$AUTOLOAD);
285 "\$Config{'archname'}-\$Config{'osvers'}" eq
286 "$Config{'archname'}-$Config{'osvers'}" or
287 die "Errno architecture ($Config{'archname'}-$Config{'osvers'}) does not match executable architecture (\$Config{'archname'}-\$Config{'osvers'})";
289 \$VERSION = "$VERSION";
290 \@ISA = qw(Exporter);
295 my @err = sort { $err{$a} <=> $err{$b} } keys %err;
296 map { $len = length if length > $len } @err;
298 my $j = "\@EXPORT_OK = qw(" . join(" ",keys %err) . ");\n";
299 $j =~ s/(.{50,70})\s/$1\n\t/g;
307 my $k = join(" ", grep { exists $err{$_} }
308 qw(E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT
309 EAGAIN EALREADY EBADF EBUSY ECHILD ECONNABORTED
310 ECONNREFUSED ECONNRESET EDEADLK EDESTADDRREQ EDOM EDQUOT
311 EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH EINPROGRESS
312 EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK
313 EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH
314 ENFILE ENOBUFS ENODEV ENOENT ENOEXEC ENOLCK ENOMEM
315 ENOPROTOOPT ENOSPC ENOSYS ENOTBLK ENOTCONN ENOTDIR
316 ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM
317 EPFNOSUPPORT EPIPE EPROCLIM EPROTONOSUPPORT EPROTOTYPE
318 ERANGE EREMOTE ERESTART EROFS ESHUTDOWN ESOCKTNOSUPPORT
319 ESPIPE ESRCH ESTALE ETIMEDOUT ETOOMANYREFS ETXTBSY
320 EUSERS EWOULDBLOCK EXDEV));
322 $k =~ s/(.{50,70})\s/$1\n\t/g;
323 print "\t",$k,"\n )]\n);\n\n";
325 foreach $err (@err) {
326 printf "sub %s () { %d }\n",,$err,$err{$err};
331 sub TIEHASH { bless [] }
334 my ($self, $errname) = @_;
335 my $proto = prototype("Errno::$errname");
337 if (defined($proto) && $proto eq "") {
340 $errno = 0 unless $! == $errno;
347 Carp::confess("ERRNO hash is read only!");
355 while(($k,$v) = each %Errno::) {
356 my $proto = prototype("Errno::$k");
357 last if (defined($proto) && $proto eq "");
363 my $s = scalar keys %Errno::; # initialize iterator
368 my ($self, $errname) = @_;
369 my $proto = prototype($errname);
370 defined($proto) && $proto eq "";
380 Errno - System errno constants
384 use Errno qw(EINTR EIO :POSIX);
388 C<Errno> defines and conditionally exports all the error constants
389 defined in your system C<errno.h> include file. It has a single export
390 tag, C<:POSIX>, which will export all POSIX defined error numbers.
392 C<Errno> also makes C<%!> magic such that each element of C<%!> has a
393 non-zero value only if C<$!> is set to that value. For example:
397 unless (open(FH, "/fangorn/spouse")) {
399 warn "Get a wife!\n";
401 warn "This path is barred: $!";
405 If a specified constant C<EFOO> does not exist on the system, C<$!{EFOO}>
406 returns C<"">. You may use C<exists $!{EFOO}> to check whether the
407 constant is available on the system.
411 Importing a particular constant may not be very portable, because the
412 import will fail on platforms that do not have that constant. A more
413 portable way to set C<$!> to a valid value is to use:
415 if (exists &Errno::EFOO) {
421 Graham Barr <gbarr@pobox.com>
425 Copyright (c) 1997-8 Graham Barr. All rights reserved.
426 This program is free software; you can redistribute it and/or modify it
427 under the same terms as Perl itself.