Provided by: libnet-sip-perl_0.687-1_all bug

NAME

       Net::SIP::Util - utility functions used by all of Net::SIP

SYNOPSIS

         use Net::SIP::Util qw( create_rtp_sockets );
         my ($port,@socks) = create_rtp_sockets( '192.168.0.10' ) or die;

DESCRIPTION

       This package implements various utility function used within various Net::SIP packages and
       partly usable for the user of Net::SIP too.

       Each of this functions is exportable, but none is exported per default.  All functions can
       be exported at once with the import flag ":all".

SUBROUTINES

       invoke_callback ( CALLBACK, @ARGS )
           Invokes callback CALLBACK with additional args @ARGS.  CALLBACK can be:

           A code reference
                   In this case it will be called as "$CALLBACK->(@ARGS)" and return the return
                   value of this call.

           A reference to a scalar
                   In this case the scalar will be set to $ARGS[0] and the rest of @ARGS will be
                   ignored. If no @ARGS are given the scalar will be set to TRUE.  It will return
                   with the value of the scalar.

           An object which has a method run
                   In this case it will call "$CALLBACK->run(@ARGS)" and return with the return
                   value of this call.

           A reference to an array
                   The first element of the array will be interpreted as code reference, while
                   the rest as args, e.g. it will do:

                     my ($coderef,@cb_args) = @$CALLBACK;
                     return $coderef->( @cb_args, @ARGS );

           A regular expression
                   In this case it will try to match all @ARGS against the regex.  If anything
                   matches it will return TRUE, else FALSE.

       create_socket_to ( ADDR, [ PROTO ] )
           Creates socket with protocol PROTO (default 'udp') on a local interface, from where
           ADDR is reachable.  This is done by first creating a UDP socket with target ADDR and
           using getsockname(2) to find out the local address of this socket. The newly created
           socket than will be bound to this address.

           It will try to bind the socket to port 5060 (default SIP port).  If this fails it will
           try port 5062..5100 and if it cannot bind to any of these ports it will just use any
           port which gets assigned by the OS.

           For multihomed hosts where several addresses are bound to the same interface it will
           just use one of these addresses. If you need more control about the address the socket
           is bound to (and which will be used as the local IP in outgoing packets) you need to
           create the socket yourself.

           In scalar context it just returns the newly created socket.  In array context it will
           return the socket and the "ip:port" the created socket is bound to.  If the creation
           of the socket fails it will return "()" and set $!.

           Example:

             my ($sock,$ip_port) = create_socket_to ( '192.168.0.1' )
                   or die $!;

       create_rtp_sockets ( LADDR, [ RANGE, MINPORT, MAXPORT, TRIES ] )
           This tries to allocate sockets for RTP. RTP consists usually of a data socket on an
           even port number and a control socket (RTCP) and the following port. It will try to
           create these sockets. MINPORT is the minimal port number to use (default 2000),
           MAXPORT the highest port (default MINPORT+10000), TRIES is the number of attempts it
           makes to create such socket pairs and defaults to 1000.

           RANGE is the number of consecutive ports it needs to allocate and defaults to 2 (e.g.
           data and control socket).

           Allocation will be done by choosing a random even number between MINPORT and MAXPORT
           and then trying to allocate all the sockets on this and the following port numbers.

           If the allocation fails after TRIES attempts were made it will return "()", otherwise
           it will return an array with at first the starting port number followed by all the
           allocated sockets.

           Example:

             my ($port,$rtp_sock,$rtcp_sock) = create_rtp_sockets( '192.168.0.10' )
                   or die "allocation failed";

       sip_hdrval2parts ( KEY, VALUE )
           Interprets VALUE as a value for the SIP header field KEY and splits it into the parts
           (prefix, parameter). Because for most keys the delimiter is ";", but for some keys ","
           the field name KEY need to be known.

           KEY needs to be normalized already (lower case, no abbrevation).

           Returns array with initial data (up to first delimiter) and the parameters as hash.

           Example for key 'to':

             '"Silver; John" <silver@example.com>; tag=...; protocol=TCP'
             -> ( '"Silver; John" <silver@example.com>', { tag => ..., protocol => 'TCP' } )

           Example for key 'www-authenticate':

             'Digest method="md5", qop="auth"'
             -> ( 'Digest', { method => 'md5', qop => 'auth' } )

       sip_parts2hdrval ( KEY, PREFIX, \%PARAMETER )
           Inverse function to sip_hdrval2parts, e.g constructs header value for KEY from PREFIX
           and %PARAMETER and returns value.

       sip_uri2parts ( URI )
           Returns parts from URI. If called in scalar context it returns only the domain part.
           In array context it returns an array with the following values:

           domain - The domain part (including ports if any)
           user - The user part of the SIP address
           proto - The protocol, e.g. "sip" or "sips".
           data - The part before any parameter, includes SIP address
           param - A hash reference to any parameter, like in sip_hdrval2parts.
       sip_uri_eq ( URI1, URI2 )
           Returns true if both URIs point to the same SIP address.  This compares user part case
           sensitive, domain part case insensitive (does no DNS resolution) protocol and ports in
           domain (assumes default ports for protocol if no port is given).