sub check_for
{
my %args = @_;
- return if exists $Config{$args{confkey}};
+ return if $ENV{PERL_CORE};
+ return if defined $Config{$args{confkey}};
require ExtUtils::CBuilder;
$cb ||= ExtUtils::CBuilder->new( quiet => 1 );
- my $main = $args{main};
+ my $main = $args{main} || "";
+ my $header = $args{header} || "";
print "Checking $args{define}...\n";
{
open( my $file_source_fh, ">", $file_source ) or die "Cannot write $file_source - $!";
print $file_source_fh <<"EOF";
+#include <stddef.h>
#include <sys/types.h>
-#include <sys/socket.h>
-#include <netdb.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
+#ifdef WIN32
+# include <ws2tcpip.h>
+# include <winsock.h>
+#else
+# include <sys/socket.h>
+# include <netdb.h>
+# include <netinet/in.h>
+# include <arpa/inet.h>
+#endif
+$header
int main(int argc, char *argv[])
{
(void)argc;
(void)argv;
- $main
+ { $main }
return 0;
}
EOF
{
my %args = @_;
my $func = delete $args{func};
- check_for( %args, main => "void *p = &$func; (void)p;" );
+ check_for( %args, main => "void *p = &$func; if(p == NULL) return 1;" );
}
my %defines = (
);
check_for(
- confkey => "d_sockaddr_in6", # invented - check with core later
+ confkey => "d_sockaddr_in6",
define => "HAS_SOCKADDR_IN6",
main => "struct sockaddr_in6 sin6; sin6.sin6_family = AF_INET6;"
);
);
check_for(
- confkey => "d_ipv6_mreq", # invented - check with core later
+ confkey => "d_ip_mreq",
+ define => "HAS_IP_MREQ",
+ main => "struct ip_mreq mreq; mreq.imr_multiaddr.s_addr = INADDR_ANY;"
+);
+
+check_for(
+ confkey => "d_ip_mreq_source",
+ define => "HAS_IP_MREQ_SOURCE",
+ main => "struct ip_mreq_source mreq; mreq.imr_multiaddr.s_addr = INADDR_ANY;"
+);
+
+check_for(
+ confkey => "d_ipv6_mreq",
define => "HAS_IPV6_MREQ",
main => "struct ipv6_mreq mreq; mreq.ipv6mr_interface = 0;"
);
+# TODO: Needs adding to perl5 core before importing dual-life again
+check_for(
+ confkey => "i_netinet_ip",
+ define => "I_NETINET_IP",
+ header => "#include <netinet/ip.h>",
+);
+
my %makefile_args;
# Since we're providing a later version of a core module, before 5.12 the
$makefile_args{INSTALLDIRS} = "perl" if $] < 5.012;
WriteMakefile(
- NAME => 'Socket',
- VERSION_FROM => 'Socket.pm',
+ NAME => 'Socket',
+ VERSION_FROM => 'Socket.pm',
+ # ABSTRACT_FROM gets confused by C<Socket>
+ ABSTRACT => 'networking constants and support functions',
($Config{libs} =~ /(-lsocks\S*)/ ? (LIBS => [ "$1" ] ) : ()),
- XSPROTOARG => '-noprototypes', # XXX remove later?
- realclean => {FILES=> 'const-c.inc const-xs.inc'},
- DEFINE => join( " ", map { "-D$_" } @DEFINES ),
+ XSPROTOARG => '-noprototypes', # XXX remove later?
+ realclean => {FILES=> 'const-c.inc const-xs.inc'},
+ DEFINE => join( " ", map { "-D$_" } @DEFINES ),
CONFIGURE_REQUIRES => {
'ExtUtils::CBuilder' => 0,
'ExtUtils::Constant' => '0.23',
},
MIN_PERL_VERSION => '5.006001',
+ LICENSE => 'perl',
%makefile_args,
);
my @names = (
IOV_MAX
- IP_OPTIONS IP_HDRINCL IP_TOS IP_TTL IP_RECVOPTS IP_RECVRETOPTS
- IP_RETOPTS
+ IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_DROP_MEMBERSHIP
+ IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MULTICAST_IF IP_MULTICAST_LOOP
+ IP_MULTICAST_TTL IP_OPTIONS IP_RECVOPTS IP_RECVRETOPTS IP_RETOPTS IP_TOS
+ IP_TTL
+
+ IPTOS_LOWDELAY IPTOS_THROUGHPUT IPTOS_RELIABILITY IPTOS_MINCOST
- 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
+ IPV6_ADD_MEMBERSHIP IPV6_DROP_MEMBERSHIP IPV6_JOIN_GROUP
+ IPV6_LEAVE_GROUP 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
SCM_CONNECT SCM_CREDENTIALS SCM_CREDS SCM_TIMESTAMP
SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM
+ SOCK_NONBLOCK SOCK_CLOEXEC
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_ACCEPTCONN SO_ATTACH_FILTER SO_BACKLOG SO_BINDTODEVICE SO_BROADCAST
+ SO_BSDCOMPAT SO_BUSY_POLL SO_CHAMELEON SO_DEBUG SO_DETACH_FILTER
+ SO_DGRAM_ERRIND SO_DOMAIN SO_DONTLINGER SO_DONTROUTE SO_ERROR SO_FAMILY
+ SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSIFNAME
+ SO_PEEK_OFF SO_PEERCRED SO_PRIORITY 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
+ SO_STATE SO_TIMESTAMP 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
+ TCP_CONGESTION TCP_CONNECTIONTIMEOUT TCP_CORK TCP_DEFER_ACCEPT TCP_INFO
+ TCP_INIT_CWND TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL
+ TCP_LINGER2 TCP_MAXRT TCP_MAXSEG TCP_MD5SIG TCP_NODELAY TCP_NOOPT
+ TCP_NOPUSH TCP_QUICKACK TCP_SACK_ENABLE TCP_STDURG TCP_SYNCNT
+ TCP_WINDOW_CLAMP
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=>"IPPROTO_ICMP", type=>"IV", default=>["IV", 1]},
+ {name=>"IPPROTO_IGMP", type=>"IV", default=>["IV", 2]},
+ {name=>"IPPROTO_TCP", type=>"IV", default=>["IV", 6]},
+ {name=>"IPPROTO_UDP", type=>"IV", default=>["IV", 17]},
+ {name=>"IPPROTO_GRE", type=>"IV", default=>["IV", 47]},
+ {name=>"IPPROTO_ESP", type=>"IV", default=>["IV", 50]},
+ {name=>"IPPROTO_AH", type=>"IV", default=>["IV", 51]},
+ {name=>"IPPROTO_SCTP", type=>"IV", default=>["IV", 132]},
{name=>"SHUT_RD", type=>"IV", default=>["IV", "0"]},
{name=>"SHUT_WR", type=>"IV", default=>["IV", "1"]},
{name=>"SHUT_RDWR", type=>"IV", default=>["IV", "2"]},