summaryrefslogtreecommitdiff
path: root/cpan/Socket/Makefile.PL
blob: 5518e33f88e653ccb186eea66f8510e710763e8c (plain)
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
use ExtUtils::MakeMaker;
use ExtUtils::Constant 0.23 'WriteConstants';
use Config;

my @DEFINES;
unless( $ENV{PERL_CORE} ) {
    # Building standalone, not as core.
    require ExtUtils::CChecker;
    my $cc = ExtUtils::CChecker->new;

    my %defines = (
	# -Dfoo               func()        $Config{key}
	HAS_GETADDRINFO => [ "getaddrinfo", "d_getaddrinfo" ],
	HAS_GETNAMEINFO => [ "getnameinfo", "d_getnameinfo" ],
	HAS_INET_ATON   => [ "inet_aton",   "d_inetaton" ],
	HAS_INETNTOP    => [ "inet_ntop",   "d_inetntop" ],
	HAS_INETPTON    => [ "inet_pton",   "d_inetpton" ],
    );

    foreach my $define ( sort keys %defines ) {
	my ( $func, $key ) = @{$defines{$define}};
	next if exists $Config{$key};

	$cc->try_compile_run(
	    define => $define,
	    source => <<"EOF" )
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[]) {
    void *p = &$func;
    return 0;
}
EOF
	    and print "$func() found\n"
	    or  print "$func() not found\n";
    }

    unless( exists $Config{d_sockaddr_sa_len} ) {
	$cc->try_compile_run(
	    define => "HAS_SOCKADDR_SA_LEN",
	    source => <<'EOF' )
#include <sys/types.h>
#include <sys/socket.h>
int main(int argc, char *argv[]) {
    struct sockaddr sa;
    sa.sa_len = 0;
    return 0;
}
EOF
	    and print "sockaddr has sa_len\n"
	    or  print "sockaddr does not have sa_len\n";
    }

    unless( exists $Config{d_sin6_scope_id} ) {
	$cc->try_compile_run(
	    define => "HAS_SIN6_SCOPE_ID",
	    source => <<'EOF' )
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char *argv[]) {
    struct sockaddr_in6 sin6;
    sin6.sin6_scope_id = 0;
    return 0;
}
EOF
	    and print "sockaddr_in6 has sin6_scope_id\n"
	    or  print "sockaddr_in6 does not have sin6_scope_id\n";
    }

    @DEFINES = @{ $cc->extra_compiler_flags };
}

WriteMakefile(
    NAME	 => 'Socket',
    VERSION_FROM => 'Socket.pm',
   ($Config{libs} =~ /(-lsocks\S*)/ ? (LIBS => [ "$1" ] ) : ()),
    XSPROTOARG   => '-noprototypes', 		# XXX remove later?
    realclean => {FILES=> 'const-c.inc const-xs.inc'},
    DEFINE       => join( " ", @DEFINES ),
    CONFIGURE_REQUIRES => {
	'ExtUtils::CChecker' => 0,
	'ExtUtils::Constant' => '0.23',
    },
);
my @names = (qw(AF_802 AF_AAL AF_APPLETALK AF_CCITT AF_CHAOS AF_CTF
		AF_DATAKIT AF_DECnet AF_DLI AF_ECMA AF_GOSIP AF_HYLINK
		AF_IMPLINK AF_INET AF_INET6 AF_ISO AF_KEY
		AF_LAST AF_LAT AF_LINK AF_MAX AF_NBS AF_NIT AF_NS
		AF_OSI AF_OSINET AF_PUP AF_ROUTE AF_SNA
		AF_UNIX AF_UNSPEC AF_USER AF_WAN AF_X25
		AI_ADDRCONFIG AI_ALL AI_CANONIDN AI_CANONNAME AI_IDN
		AI_IDN_ALLOW_UNASSIGNED AI_IDN_USE_STD3_ASCII_RULES
		AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED
		EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL
		EAI_FAMILY EAI_NODATA EAI_NONAME EAI_PROTOCOL EAI_SERVICE
		EAI_SOCKTYPE EAI_SYSTEM
		IOV_MAX IP_OPTIONS IP_HDRINCL IP_TOS IP_TTL IP_RECVOPTS
	        IP_RECVRETOPTS IP_RETOPTS
		IPV6_ADD_MEMBERSHIP IPV6_DROP_MEMBERSHIP IPV6_MTU
		IPV6_MTU_DISCOVER IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF
		IPV6_MULTICAST_LOOP IPV6_UNICAST_HOPS IPV6_V6ONLY
		MSG_BCAST MSG_BTAG MSG_CTLFLAGS MSG_CTLIGNORE MSG_DONTWAIT
		MSG_EOF MSG_EOR MSG_ERRQUEUE MSG_ETAG MSG_FIN
		MSG_MAXIOVLEN MSG_MCAST MSG_NOSIGNAL MSG_RST MSG_SYN
		MSG_TRUNC MSG_URG MSG_WAITALL MSG_WIRE
		NI_DGRAM NI_IDN NI_IDN_ALLOW_UNASSIGNED
		NI_IDN_USE_STD3_ASCII_RULES NI_NAMEREQD NI_NOFQDN
		NI_NUMERICHOST NI_NUMERICSERV
		PF_802 PF_AAL PF_APPLETALK PF_CCITT PF_CHAOS PF_CTF
		PF_DATAKIT PF_DECnet PF_DLI PF_ECMA PF_GOSIP PF_HYLINK
		PF_IMPLINK PF_INET PF_INET6 PF_ISO PF_KEY
		PF_LAST PF_LAT PF_LINK PF_MAX PF_NBS PF_NIT PF_NS
		PF_OSI PF_OSINET PF_PUP PF_ROUTE PF_SNA
		PF_UNIX PF_UNSPEC PF_USER PF_WAN PF_X25
		SCM_CONNECT SCM_CREDENTIALS SCM_CREDS SCM_TIMESTAMP
		SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM
		SOL_SOCKET SOMAXCONN
		SO_ACCEPTCONN SO_ATTACH_FILTER SO_BACKLOG SO_BROADCAST
		SO_CHAMELEON SO_DEBUG SO_DETACH_FILTER SO_DGRAM_ERRIND
		SO_DONTLINGER SO_DONTROUTE SO_ERROR SO_FAMILY
		SO_KEEPALIVE SO_LINGER SO_OOBINLINE
		SO_PASSCRED SO_PASSIFNAME SO_PEERCRED
		SO_PROTOCOL SO_PROTOTYPE
		SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO
		SO_REUSEADDR SO_REUSEPORT
		SO_SECURITY_AUTHENTICATION
		SO_SECURITY_ENCRYPTION_NETWORK
		SO_SECURITY_ENCRYPTION_TRANSPORT
		SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO
		SO_STATE SO_TYPE SO_USELOOPBACK SO_XOPEN SO_XSE
		TCP_KEEPALIVE TCP_MAXRT TCP_MAXSEG TCP_NODELAY TCP_STDURG
		TCP_CORK TCP_KEEPIDLE TCP_KEEPINTVL TCP_KEEPCNT
		TCP_SYNCNT TCP_LINGER2 TCP_DEFER_ACCEPT TCP_WINDOW_CLAMP
		TCP_INFO TCP_QUICKACK TCP_CONGESTION TCP_MD5SIG
		UIO_MAXIOV
		),
            {name=>"IPPROTO_IP", type=>"IV", default=>["IV", 0]},
            {name=>"IPPROTO_IPV6", type=>"IV", default=>["IV", 41]},
            {name=>"IPPROTO_RAW", type=>"IV", default=>["IV", 255]},
            {name=>"IPPROTO_ICMP", type=>"IV", default=>["IV", 1]},
            {name=>"IPPROTO_TCP",  type=>"IV", default=>["IV", 6]},
            {name=>"IPPROTO_UDP",  type=>"IV", default=>["IV", 17]},
            {name=>"SHUT_RD", type=>"IV", default=>["IV", "0"]},
            {name=>"SHUT_WR", type=>"IV", default=>["IV", "1"]},
            {name=>"SHUT_RDWR", type=>"IV", default=>["IV", "2"]},
);

push @names,
  {name=>$_, type=>"IV",
   macro=>["#if defined($_) || defined(HAS_$_) /* might be an enum */\n",
           "#endif\n"]}
foreach qw (MSG_CTRUNC MSG_DONTROUTE MSG_OOB MSG_PEEK MSG_PROXY SCM_RIGHTS);

push @names,
{name => $_, type => "SV",
 pre=>"struct in_addr ip_address; ip_address.s_addr = htonl($_);",
 value => "newSVpvn_flags((char *)&ip_address,sizeof(ip_address), SVs_TEMP)",}
         foreach qw(INADDR_ANY INADDR_LOOPBACK INADDR_NONE INADDR_BROADCAST);

push @names,
{name => $_, type => "SV",
 macro=>["#ifdef ${_}_INIT\n",
         "#endif\n"],
 pre=>"struct in6_addr ip6_address = ${_}_INIT;",
 value => "newSVpvn_flags((char *)&ip6_address,sizeof(ip6_address), SVs_TEMP)",}
	 foreach qw(IN6ADDR_ANY IN6ADDR_LOOPBACK);

WriteConstants(
    PROXYSUBS => {autoload => 1},
    NAME => 'Socket',
    NAMES => \@names,
);