1 use ExtUtils::MakeMaker;
11 unlink "Errno.pm" if -f "Errno.pm";
12 open OUT, ">Errno.pm" or die "Cannot open Errno.pm: $!";
15 foreach $file (get_files()) {
19 unlink "errno.c" if -f "errno.c";
24 return unless defined $file and -f $file;
27 if (($^O eq 'VMS') && ($Config{vms_cc_type} ne 'gnuc')) {
28 unless(open(FH," LIBRARY/EXTRACT=ERRNO/OUTPUT=SYS\$OUTPUT $file |")) {
29 warn "Cannot open '$file'";
33 unless(open(FH,"< $file")) {
34 # This file could be a temporary file created by cppstdin
35 # so only warn under -w, and return
36 warn "Cannot open '$file'" if $^W;
42 if /^\s*#\s*define\s+(E\w+)\s+/;
50 unless (defined $cppstdin) {
52 $cppstdin = $Config{cppstdin};
53 my $upup_cppstdin = File::Spec->catfile(File::Spec->updir,
56 my $cppstdin_is_wrapper =
57 ($cppstdin eq 'cppstdin'
59 and -x $upup_cppstdin);
60 $cppstdin = $upup_cppstdin if $cppstdin_is_wrapper;
62 return "$cppstdin $Config{cppflags} $Config{cppminus}";
67 # VMS keeps its include files in system libraries (well, except for Gcc)
69 if ($Config{vms_cc_type} eq 'decc') {
70 $file{'Sys$Library:DECC$RTLDEF.TLB'} = 1;
71 } elsif ($Config{vms_cc_type} eq 'vaxc') {
72 $file{'Sys$Library:vaxcdef.tlb'} = 1;
73 } elsif ($Config{vms_cc_type} eq 'gcc') {
74 $file{'gnu_cc_include:[000000]errno.h'} = 1;
76 } elsif ($^O eq 'os390') {
77 # OS/390 C compiler doesn't generate #file or #line directives
78 $file{'/usr/include/errno.h'} = 1;
79 } elsif ($^O eq 'vmesa') {
80 # OS/390 C compiler doesn't generate #file or #line directives
81 $file{'../../vmesa/errno.h'} = 1;
83 open(CPPI,"> errno.c") or
84 die "Cannot open errno.c";
86 print CPPI "#include <errno.h>\n";
90 # invoke CPP and read the output
91 if ($^O eq 'MSWin32') {
92 open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or
93 die "Cannot run '$Config{cpprun} $Config{cppflags} errno.c'";
95 my $cpp = default_cpp();
96 open(CPPO,"$cpp < errno.c |") or
97 die "Cannot exec $cpp";
101 if ($^O eq 'MSWin32' and $Config{cc} =~ /^bcc/i) {
102 $pat = '^/\*\s+(.+)\s+\d+\s*:\s+\*/';
105 $pat = '^#(?:line)?\s*\d+\s+"([^"]+)"';
108 if ($^O eq 'os2' or $^O eq 'MSWin32') {
116 $file{$1} = 1 if /$pat/o;
129 die "No error definitions found" unless keys %err;
131 # create the CPP input
133 open(CPPI,"> errno.c") or
134 die "Cannot open errno.c";
136 print CPPI "#include <errno.h>\n";
138 foreach $err (keys %err) {
139 print CPPI '"',$err,'" [[',$err,']]',"\n";
144 # invoke CPP and read the output
147 my $cpp = "$Config{cppstdin} $Config{cppflags} $Config{cppminus}";
148 $cpp =~ s/sys\$input//i;
149 open(CPPO,"$cpp errno.c |") or
150 die "Cannot exec $Config{cppstdin}";
151 } elsif ($^O eq 'MSWin32') {
152 open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or
153 die "Cannot run '$Config{cpprun} $Config{cppflags} errno.c'";
155 my $cpp = default_cpp();
156 open(CPPO,"$cpp < errno.c |")
157 or die "Cannot exec $cpp";
164 next unless ($name, $expr) = /"(.*?)"\s*\[\s*\[\s*(.*?)\s*\]\s*\]/;
165 next if $name eq $expr;
166 $err{$name} = eval $expr;
174 # This file is auto-generated. ***ANY*** changes here will be lost
178 use vars qw(\@EXPORT_OK \%EXPORT_TAGS \@ISA \$VERSION \%errno \$AUTOLOAD);
183 "\$Config{'archname'}-\$Config{'osvers'}" eq
184 "$Config{'archname'}-$Config{'osvers'}" or
185 die "Errno architecture ($Config{'archname'}-$Config{'osvers'}) does not match executable architecture (\$Config{'archname'}-\$Config{'osvers'})";
187 \$VERSION = "$VERSION";
188 \@ISA = qw(Exporter);
193 my @err = sort { $err{$a} <=> $err{$b} } keys %err;
194 map { $len = length if length > $len } @err;
196 my $j = "\@EXPORT_OK = qw(" . join(" ",keys %err) . ");\n";
197 $j =~ s/(.{50,70})\s/$1\n\t/g;
205 my $k = join(" ", grep { exists $err{$_} }
206 qw(E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT
207 EAGAIN EALREADY EBADF EBUSY ECHILD ECONNABORTED
208 ECONNREFUSED ECONNRESET EDEADLK EDESTADDRREQ EDOM EDQUOT
209 EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH EINPROGRESS
210 EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK
211 EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH
212 ENFILE ENOBUFS ENODEV ENOENT ENOEXEC ENOLCK ENOMEM
213 ENOPROTOOPT ENOSPC ENOSYS ENOTBLK ENOTCONN ENOTDIR
214 ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM
215 EPFNOSUPPORT EPIPE EPROCLIM EPROTONOSUPPORT EPROTOTYPE
216 ERANGE EREMOTE ERESTART EROFS ESHUTDOWN ESOCKTNOSUPPORT
217 ESPIPE ESRCH ESTALE ETIMEDOUT ETOOMANYREFS ETXTBSY
218 EUSERS EWOULDBLOCK EXDEV));
220 $k =~ s/(.{50,70})\s/$1\n\t/g;
221 print "\t",$k,"\n )]\n);\n\n";
223 foreach $err (@err) {
224 printf "sub %s () { %d }\n",,$err,$err{$err};
229 sub TIEHASH { bless [] }
232 my ($self, $errname) = @_;
233 my $proto = prototype("Errno::$errname");
234 if (defined($proto) && $proto eq "") {
236 return $! == &$errname;
243 Carp::confess("ERRNO hash is read only!");
251 while(($k,$v) = each %Errno::) {
252 my $proto = prototype("Errno::$k");
253 last if (defined($proto) && $proto eq "");
259 my $s = scalar keys %Errno::;
264 my ($self, $errname) = @_;
265 my $proto = prototype($errname);
266 defined($proto) && $proto eq "";
276 Errno - System errno constants
280 use Errno qw(EINTR EIO :POSIX);
284 C<Errno> defines and conditionally exports all the error constants
285 defined in your system C<errno.h> include file. It has a single export
286 tag, C<:POSIX>, which will export all POSIX defined error numbers.
288 C<Errno> also makes C<%!> magic such that each element of C<%!> has a
289 non-zero value only if C<$!> is set to that value, eg
293 unless (open(FH, "/fangorn/spouse")) {
295 warn "Get a wife!\n";
297 warn "This path is barred: $!";
301 If a specified constant C<EFOO> doesn't exist on the system, C<$!{EFOO}>
302 has a false value. You may use C<exists $!{EFOO}> to check whether the
303 constant is available on the system.
307 Graham Barr <gbarr@pobox.com>
311 Copyright (c) 1997-8 Graham Barr. All rights reserved.
312 This program is free software; you can redistribute it and/or modify it
313 under the same terms as Perl itself.