-
Notifications
You must be signed in to change notification settings - Fork 1
/
constants.pl.PL
executable file
·198 lines (157 loc) · 4.95 KB
/
constants.pl.PL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#! perl
# this file is unfortunately only executed at Makefile.PL time
my ($fh, $oldstdout);
BEGIN {
open $fh, ">lib/AnyEvent/constants.pl"
or die "lib/AnyEvent/constants.pl: $!\n";
$oldstdout = select $fh;
print "# automatically generated from constants.pl.PL\n";
}
{
# from common::sense 3.7
use strict qw(vars subs);
no warnings;
use warnings qw(FATAL closed threads internal debugging pack malloc portable prototype
inplace io pipe unpack deprecated glob digit printf
layer reserved taint closure semicolon);
no warnings qw(exec newline unopened);
BEGIN {
print "sub AnyEvent::common_sense {\n";
printf " local \$^W;\n";
printf " \${^WARNING_BITS} ^= \${^WARNING_BITS} ^ \"%s\";\n",
join "", map "\\x$_", unpack "(H2)*", ${^WARNING_BITS};
# use strict, use utf8;
printf " \$^H |= 0x%x;\n", $^H;
print "}\n";
}
}
use Config;
print "# generated for perl $] built for $Config{archname}\n";
# when built as part of perl, these are not available
BEGIN { eval "use Socket ()" }
BEGIN { eval "use Fcntl ()" }
BEGIN { eval "use POSIX ()" }
sub i($$) {
print "sub $_[0](){", $_[1]*1, "}\n";
}
sub n($$) {
print "sub $_[0](){", (defined $_[1] ? $_[1]*1 : "undef"), "}\n";
}
print "package AnyEvent;\n";
our $WIN32 = $^O =~ /mswin32/i;
# used a lot
i CYGWIN => $^O =~ /cygwin/i;
i WIN32 => $WIN32;
# add these purely to avoid loading Fcntl, which is slow and bloated.
i F_SETFD => eval { Fcntl::F_SETFD() } || 2;
i F_SETFL => eval { Fcntl::F_SETFL() } || 4;
i O_NONBLOCK => eval { Fcntl::O_NONBLOCK() } || 04000;
i FD_CLOEXEC => eval { Fcntl::FD_CLOEXEC() } || 1;
print "package AnyEvent::Base;\n";
# add these purely to avoid loading POSIX, which is slow and bloated.
i WNOHANG => eval { POSIX::WNOHANG() } || 1;
print "package AnyEvent::IO;\n";
i O_RDONLY => eval { Fcntl::O_RDONLY() } || 0;
i O_WRONLY => eval { Fcntl::O_WRONLY() } || 1;
i O_RDWR => eval { Fcntl::O_RDWR () } || 2;
i O_CREAT => eval { Fcntl::O_CREAT () } || 64;
i O_EXCL => eval { Fcntl::O_EXCL () } || 128;
i O_TRUNC => eval { Fcntl::O_TRUNC () } || 512;
i O_APPEND => eval { Fcntl::O_APPEND() } || 1024;
print "package AnyEvent::Util;\n";
# broken windows perls use undocumented error codes...
if ($WIN32) {
i WSAEINVAL => 10022;
i WSAEWOULDBLOCK => 10035;
i WSAEINPROGRESS => 10036;
} else {
# these should never match any errno value
i WSAEINVAL => -1e99;
i WSAEWOULDBLOCK => -1e99;
i WSAEINPROGRESS => -1e99;
}
my $af_inet6;
$af_inet6 ||= eval { Socket::AF_INET6 () }; # where it should be
$af_inet6 ||= eval { require Socket6; Socket6::AF_INET6() }; # where it actually is ...
# ... or isn't, because nobody has it installed
$af_inet6 ||= 10 if $^O =~ /linux/;
$af_inet6 ||= 23 if $^O =~ /cygwin/i;
$af_inet6 ||= 23 if AnyEvent::WIN32;
$af_inet6 ||= 24 if $^O =~ /openbsd|netbsd/;
$af_inet6 ||= 28 if $^O =~ /freebsd/;
#TODO: EDOM/ESPIPE
#TODO: maybe move socket stuff to Socket::?
i _AF_INET6 => $af_inet6;
#i AF_UNIX => Socket::AF_UNIX ();
#i SOCK_STREAM => Socket::SOCK_STREAM ();
#i SOCK_DGRAM => Socket::SOCK_DGRAM ();
#i SOL_SOCKET => Socket::SOL_SOCKET ();
#i SO_REUSEADDR => Socket::SO_REUSEADDR ();
#i SO_KEEPALIVE => Socket::SO_KEEPALIVE ();
#i SO_OOBINLINE => Socket::SO_OOBINLINE ();
#i IPPROTO_TCP => Socket::IPPROTO_TCP ();
print "package AnyEvent::Socket;\n";
# more hardcoded os-specific constants - none
# of these are available via any known module, but we
# are forward-looking and try Socket:: anyways.
my %const;
while (<DATA>) {
my ($os, $name, $default) = split /\s+/;
$const{$name} ||= undef; # make sure it exists
next unless $os eq $^O;
my $value = eval "Socket::$name ()";
$value = eval $default unless defined $value;
$const{$name} = $value;
}
for my $k (sort keys %const) {
n $k, $const{$k};
}
print "1;\n";
close $fh;
select $oldstdout;
1
__DATA__
linux TCP_MAXSEG 2
linux TCP_CORK 3
linux TCP_KEEPIDLE 4
linux TCP_KEEPINTVL 5
linux TCP_KEEPCNT 6
linux TCP_SYNCNT 7
linux TCP_LINGER2 8
linux TCP_DEFER_ACCEPT 9
linux TCP_WINDOW_CLAMP 10
linux TCP_INFO 11
linux TCP_QUICKACK 12
linux TCP_CONGESTION 13
linux TCP_MD5SIG 14
netbsd TCP_MAXSEG 2
netbsd TCP_KEEPIDLE 3
netbsd TCP_NOPUSH 4
netbsd TCP_KEEPINTVL 5
netbsd TCP_KEEPCNT 6
netbsd TCP_KEEPINIT 7
netbsd TCP_NOOPT 8
netbsd TCP_MD5SIG 0x10
netbsd TCP_CONGESTION 0x20
cygwin TCP_MAXSEG 0x02
cygwin TCP_NOPUSH 0x04
cygwin TCP_NOOPT 0x08
freebsd TCP_MAXSEG 0x02
freebsd TCP_NOPUSH 0x04
freebsd TCP_NOOPT 0x08
freebsd TCP_MD5SIG 0x10
freebsd TCP_INFO 0x20
freebsd TCP_CONGESTION 0x40
solaris TCP_CORK 0x18
solaris TCP_LINGER2 0x1C
solaris TCP_INIT_CWND 0x15
solaris TCP_KEEPALIVE 0x8
solaris TCP_MAXSEG 0x02
openbsd TCP_MAXSEG 0x02
openbsd TCP_MD5SIG 0x04
openbsd TCP_SACK_ENABLE 0x08
darwin TCP_MAXSEG 0x02
darwin TCP_NOPUSH 0x04
darwin TCP_NOOPT 0x08
darwin TCP_KEEPALIVE 0x10
darwin TCP_CONNECTIONTIMEOUT 0x20