This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Increase Socket.pm’s version
[perl5.git] / ext / Socket / Socket.pm
index 1fa108f..2d6e4d5 100644 (file)
@@ -1,11 +1,11 @@
 package Socket;
 
-use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
-$VERSION = "1.71";
+our($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+$VERSION = "1.92";
 
 =head1 NAME
 
-Socket, sockaddr_in, sockaddr_un, inet_aton, inet_ntoa - load the C socket.h defines and structure manipulators 
+Socket, sockaddr_in, sockaddr_un, inet_aton, inet_ntoa, inet_pton, inet_ntop - load the C socket.h defines and structure manipulators 
 
 =head1 SYNOPSIS
 
@@ -32,8 +32,8 @@ Socket, sockaddr_in, sockaddr_un, inet_aton, inet_ntoa - load the C socket.h def
 
     $proto = getprotobyname('tcp');
     socket(Socket_Handle, PF_UNIX, SOCK_STREAM, $proto);
-    unlink('/tmp/usock');
-    $sun = sockaddr_un('/tmp/usock');
+    unlink('/var/run/usock');
+    $sun = sockaddr_un('/var/run/usock');
     connect(Socket_Handle,$sun);
 
 =head1 DESCRIPTION
@@ -56,29 +56,34 @@ be imported individually, and with the C<:crlf> export tag:
 
 In addition, some structure manipulation functions are available:
 
-=over
+=over 4
 
 =item inet_aton HOSTNAME
 
-Takes a string giving the name of a host, and translates that
-to the 4-byte string (structure). Takes arguments of both
-the 'rtfm.mit.edu' type and '18.181.0.24'. If the host name
-cannot be resolved, returns undef. For multi-homed hosts (hosts
-with more than one address), the first address found is returned.
+Takes a string giving the name of a host, and translates that to an
+opaque string (if programming in C, struct in_addr). Takes arguments
+of both the 'rtfm.mit.edu' type and '18.181.0.24'. If the host name
+cannot be resolved, returns undef.  For multi-homed hosts (hosts with
+more than one address), the first address found is returned.
+
+For portability do not assume that the result of inet_aton() is 32
+bits wide, in other words, that it would contain only the IPv4 address
+in network order.
 
 =item inet_ntoa IP_ADDRESS
 
-Takes a four byte ip address (as returned by inet_aton())
-and translates it into a string of the form 'd.d.d.d'
-where the 'd's are numbers less than 256 (the normal
-readable four dotted number notation for internet addresses).
+Takes a string (an opaque string as returned by inet_aton(),
+or a v-string representing the four octets of the IPv4 address in
+network order) and translates it into a string of the form 'd.d.d.d'
+where the 'd's are numbers less than 256 (the normal human-readable
+four dotted number notation for Internet addresses).
 
 =item INADDR_ANY
 
 Note: does not return a number, but a packed string.
 
 Returns the 4-byte wildcard ip address which specifies any
-of the hosts ip addresses. (A particular machine can have
+of the hosts ip addresses.  (A particular machine can have
 more than one ip address, each address corresponding to
 a particular network interface. This wildcard address
 allows you to bind to all of them simultaneously.)
@@ -97,45 +102,89 @@ Normally equivalent to inet_aton('255.255.255.255').
 
 Note - does not return a number.
 
-Returns the 4-byte loopback address. Normally equivalent
+Returns the 4-byte loopback address.  Normally equivalent
 to inet_aton('localhost').
 
 =item INADDR_NONE
 
 Note - does not return a number.
 
-Returns the 4-byte 'invalid' ip address. Normally equivalent
+Returns the 4-byte 'invalid' ip address.  Normally equivalent
 to inet_aton('255.255.255.255').
 
+=item IN6ADDR_ANY
+
+Returns the 16-byte wildcard IPv6 address. Normally equivalent
+to inet_pton(AF_INET6, "::")
+
+=item IN6ADDR_LOOPBACK
+
+Returns the 16-byte loopback IPv6 address. Normally equivalent
+to inet_pton(AF_INET6, "::1")
+
+=item sockaddr_family SOCKADDR
+
+Takes a sockaddr structure (as returned by pack_sockaddr_in(),
+pack_sockaddr_un() or the perl builtin functions getsockname() and
+getpeername()) and returns the address family tag.  It will match the
+constant AF_INET for a sockaddr_in and AF_UNIX for a sockaddr_un.  It
+can be used to figure out what unpacker to use for a sockaddr of
+unknown type.
+
 =item sockaddr_in PORT, ADDRESS
 
 =item sockaddr_in SOCKADDR_IN
 
-In an array context, unpacks its SOCKADDR_IN argument and returns an array
+In a list context, unpacks its SOCKADDR_IN argument and returns an array
 consisting of (PORT, ADDRESS).  In a scalar context, packs its (PORT,
 ADDRESS) arguments as a SOCKADDR_IN and returns it.  If this is confusing,
 use pack_sockaddr_in() and unpack_sockaddr_in() explicitly.
 
 =item pack_sockaddr_in PORT, IP_ADDRESS
 
-Takes two arguments, a port number and a 4 byte IP_ADDRESS (as returned by
-inet_aton()). Returns the sockaddr_in structure with those arguments
-packed in with AF_INET filled in.  For internet domain sockets, this
-structure is normally what you need for the arguments in bind(),
-connect(), and send(), and is also returned by getpeername(),
-getsockname() and recv().
+Takes two arguments, a port number and an opaque string, IP_ADDRESS
+(as returned by inet_aton(), or a v-string).  Returns the sockaddr_in
+structure with those arguments packed in with AF_INET filled in.  For
+Internet domain sockets, this structure is normally what you need for
+the arguments in bind(), connect(), and send(), and is also returned
+by getpeername(), getsockname() and recv().
 
 =item unpack_sockaddr_in SOCKADDR_IN
 
 Takes a sockaddr_in structure (as returned by pack_sockaddr_in()) and
-returns an array of two elements: the port and the 4-byte ip-address.
-Will croak if the structure does not have AF_INET in the right place.
+returns an array of two elements: the port and an opaque string
+representing the IP address (you can use inet_ntoa() to convert the
+address to the four-dotted numeric format).  Will croak if the
+structure does not have AF_INET in the right place.
+
+=item sockaddr_in6 PORT, IP6_ADDRESS, [ SCOPE_ID, [ FLOWINFO ] ]
+
+=item sockaddr_in6 SOCKADDR_IN6
+
+In list context, unpacks its SOCKADDR_IN6 argument according to
+unpack_sockaddr_in6(). In scalar context, packs its arguments according to
+pack_sockaddr_in6().
+
+=item pack_sockaddr_in6 PORT, IP6_ADDRESS, [ SCOPE_ID, [ FLOWINFO ] ]
+
+Takes two to four arguments, a port number, an opaque string (as returned by
+inet_pton()), optionally a scope ID number, and optionally a flow label
+number. Returns the sockaddr_in6 structure with those arguments packed in
+with AF_INET6 filled in. IPv6 equivalent of pack_sockaddr_in().
+
+=item unpack_sockaddr_in6 SOCKADDR_IN6
+
+Takes a sockaddr_in6 structure (as returned by pack_sockaddr_in6()) and
+returns an array of four elements: the port number, an opaque string
+representing the IPv6 address, the scope ID, and the flow label. (You can
+use inet_ntop() to convert the address to the usual string format). Will
+croak if the structure does not have AF_INET6 in the right place.
 
 =item sockaddr_un PATHNAME
 
 =item sockaddr_un SOCKADDR_UN
 
-In an array context, unpacks its SOCKADDR_UN argument and returns an array
+In a list context, unpacks its SOCKADDR_UN argument and returns an array
 consisting of (PATHNAME).  In a scalar context, packs its PATHNAME
 arguments as a SOCKADDR_UN and returns it.  If this is confusing, use
 pack_sockaddr_un() and unpack_sockaddr_un() explicitly.
@@ -155,24 +204,50 @@ Takes a sockaddr_un structure (as returned by pack_sockaddr_un())
 and returns the pathname.  Will croak if the structure does not
 have AF_UNIX in the right place.
 
+=item inet_pton ADDRESS_FAMILY, HOSTNAME
+
+Takes an address family, either AF_INET or AF_INET6, and a string giving
+the name of a host, and translates that to an opaque string
+(if programming in C, struct in_addr or struct in6_addr depending on the 
+address family passed in).  The host string may be a string hostname, such
+as 'www.perl.org', or an IP address.  If using an IP address, the type of
+IP address must be consistant with the address family passed into the function.
+
+This function is not exported by default.
+
+=item inet_ntop ADDRESS_FAMILY, IP_ADDRESS
+
+Takes an address family, either AF_INET or AF_INET6, and a string 
+(an opaque string as returned by inet_aton() or inet_pton()) and
+translates it to an IPv4 or IPv6 address string.
+
+This function is not exported by default.
+
 =back
 
 =cut
 
 use Carp;
+use warnings::register;
 
 require Exporter;
-use XSLoader ();
+require XSLoader;
 @ISA = qw(Exporter);
 @EXPORT = qw(
-       inet_aton inet_ntoa pack_sockaddr_in unpack_sockaddr_in
+       inet_aton inet_ntoa
+       sockaddr_family
+       pack_sockaddr_in unpack_sockaddr_in
        pack_sockaddr_un unpack_sockaddr_un
-       sockaddr_in sockaddr_un
+       pack_sockaddr_in6 unpack_sockaddr_in6
+       sockaddr_in sockaddr_in6 sockaddr_un
        INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_NONE
+       IN6ADDR_ANY IN6ADDR_LOOPBACK
        AF_802
+       AF_AAL
        AF_APPLETALK
        AF_CCITT
        AF_CHAOS
+       AF_CTF
        AF_DATAKIT
        AF_DECnet
        AF_DLI
@@ -181,7 +256,12 @@ use XSLoader ();
        AF_HYLINK
        AF_IMPLINK
        AF_INET
+       AF_INET6
+       AF_ISO
+       AF_KEY
+       AF_LAST
        AF_LAT
+       AF_LINK
        AF_MAX
        AF_NBS
        AF_NIT
@@ -189,12 +269,23 @@ use XSLoader ();
        AF_OSI
        AF_OSINET
        AF_PUP
+       AF_ROUTE
        AF_SNA
        AF_UNIX
        AF_UNSPEC
+       AF_USER
+       AF_WAN
        AF_X25
        IOV_MAX
+       IP_OPTIONS
+       IP_HDRINCL
+       IP_TOS
+       IP_TTL
+       IP_RECVOPTS
+       IP_RECVRETOPTS
+       IP_RETOPTS
        MSG_BCAST
+       MSG_BTAG
        MSG_CTLFLAGS
        MSG_CTLIGNORE
        MSG_CTRUNC
@@ -203,6 +294,7 @@ use XSLoader ();
        MSG_EOF
        MSG_EOR
        MSG_ERRQUEUE
+       MSG_ETAG
        MSG_FIN
        MSG_MAXIOVLEN
        MSG_MCAST
@@ -215,10 +307,13 @@ use XSLoader ();
        MSG_TRUNC
        MSG_URG
        MSG_WAITALL
+       MSG_WIRE
        PF_802
+       PF_AAL
        PF_APPLETALK
        PF_CCITT
        PF_CHAOS
+       PF_CTF
        PF_DATAKIT
        PF_DECnet
        PF_DLI
@@ -227,7 +322,12 @@ use XSLoader ();
        PF_HYLINK
        PF_IMPLINK
        PF_INET
+       PF_INET6
+       PF_ISO
+       PF_KEY
+       PF_LAST
        PF_LAT
+       PF_LINK
        PF_MAX
        PF_NBS
        PF_NIT
@@ -235,15 +335,21 @@ use XSLoader ();
        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_RIGHTS
        SCM_TIMESTAMP
+       SHUT_RD
+       SHUT_RDWR
+       SHUT_WR
        SOCK_DGRAM
        SOCK_RAW
        SOCK_RDM
@@ -252,34 +358,73 @@ use XSLoader ();
        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
        UIO_MAXIOV
 );
 
 @EXPORT_OK = qw(CR LF CRLF $CR $LF $CRLF
 
+              inet_pton
+              inet_ntop
+
+              IPPROTO_IP
+              IPPROTO_IPV6
+              IPPROTO_RAW
+              IPPROTO_ICMP
               IPPROTO_TCP
+              IPPROTO_UDP
+
               TCP_KEEPALIVE
               TCP_MAXRT
               TCP_MAXSEG
               TCP_NODELAY
-              TCP_STDURG);
+              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);
 
 %EXPORT_TAGS = (
     crlf    => [qw(CR LF CRLF $CR $LF $CRLF)],
@@ -299,7 +444,8 @@ BEGIN {
 sub sockaddr_in {
     if (@_ == 6 && !wantarray) { # perl5.001m compat; use this && die
        my($af, $port, @quad) = @_;
-       carp "6-ARG sockaddr_in call is deprecated" if $^W;
+       warnings::warn "6-ARG sockaddr_in call is deprecated" 
+           if warnings::enabled();
        pack_sockaddr_in($port, inet_aton(join('.', @quad)));
     } elsif (wantarray) {
        croak "usage:   (port,iaddr) = sockaddr_in(sin_sv)" unless @_ == 1;
@@ -310,6 +456,17 @@ sub sockaddr_in {
     }
 }
 
+sub sockaddr_in6 {
+    if (wantarray) {
+       croak "usage:   (port,in6addr,scope_id,flowinfo) = sockaddr_in6(sin6_sv)" unless @_ == 1;
+       unpack_sockaddr_in6(@_);
+    }
+    else {
+       croak "usage:   sin6_sv = sockaddr_in6(port,in6addr,[scope_id,[flowinfo]])" unless @_ >= 2 and @_ <= 4;
+       pack_sockaddr_in6(@_);
+    }
+}
+
 sub sockaddr_un {
     if (wantarray) {
        croak "usage:   (filename) = sockaddr_un(sun_sv)" unless @_ == 1;
@@ -320,19 +477,6 @@ sub sockaddr_un {
     }
 }
 
-
-sub AUTOLOAD {
-    my($constname);
-    ($constname = $AUTOLOAD) =~ s/.*:://;
-    my $val = constant($constname, @_ ? $_[0] : 0);
-    if ($! != 0) {
-       my ($pack,$file,$line) = caller;
-       croak "Your vendor has not defined Socket macro $constname, used";
-    }
-    eval "sub $AUTOLOAD { $val }";
-    goto &$AUTOLOAD;
-}
-
-XSLoader::load 'Socket', $VERSION;
+XSLoader::load();
 
 1;