netutils.h #1

  • //
  • 2016-1/
  • guest/
  • dannyz_snps/
  • p4/
  • 2016-1/
  • net/
  • netutils.h
  • View
  • Commits
  • Open Download .zip Download (3 KB)
// -*- mode: C++; tab-width: 4; -*-
// vi:ts=8 sw=4 noexpandtab autoindent

/*
 * Copyright 2011 Perforce Software.  All rights reserved.
 *
 * This file is part of Perforce - the FAST SCM System.
 */

/*
 * netutils - Utility routines for network support
 *
 * Classes Defined:
 *
 *    NetUtils - IP network address utilities
 */

# define do_setsockopt( module, fd, level, optname, optval, optlen )	NetUtils::setsockopt( module, fd, level, optname, optval, optlen, #optname )

// a guess at a good buffer size; big enough for a max IPv6 address plus surrounding "[...]"
#define P4_INET6_ADDRSTRLEN	(INET6_ADDRSTRLEN+2)

class NetUtils
{
public:
    static const bool IPADDR_PREFIX_PROHIBIT = false;
    static const bool IPADDR_PREFIX_ALLOW = true;

    static int
    setsockopt( const char *module, int sockfd, int level, int optname, const SOCKOPT_T *optval, socklen_t optlen, const char *name );

    /*
     * Get IPv4 or IPv6 sin[6]_addr ptr convenience function.
     * Returns the sockaddr's sin_addr or sin6_addr pointer,
     * depending on the sockaddr's family.
     * Returns NULL if the sockaddr is neither IPv4 nor IPv6.
     */
    static const void *
    GetInAddr(const sockaddr *sa);

    /*
     * Get IPv4 or IPv6 sockaddr size convenience function.
     * Returns 0 if the sockaddr is neither IPv4 nor IPv6.
     */
    static size_t
    GetAddrSize(const sockaddr *sa);

    /*
     * Get IPv4 or IPv6 sin[6]_port convenience function.
     * Returns the sockaddr's sin_addr or sin6_addr port,
     * depending on the sockaddr's family.
     * Returns -1 if the sockaddr is neither IPv4 nor IPv6.
     */
    static int
    GetInPort(const sockaddr *sa);

    /*
     * Return true iff this address is unspecified ("0.0.0.0" or "::").
     */
    static bool
    IsAddrUnspecified(const sockaddr *sa);

    // make this address be unspecified
    static bool
    SetAddrUnspecified(sockaddr *sa);

    static bool
    IsAddrIPv6(const sockaddr *sa);

    static bool
    IsIpV4Address(const char *addr, bool allowPrefix);

    // allowPrefix is ignored for IPv6
    static bool
    IsIpV6Address(const char *addr, bool allowPrefix = true);

    static bool
    IsLocalAddress(const char *addr);

    // return a printable address
    static void
    GetAddress(
	    int family,
	    const sockaddr *addr,
	    int raf_flags,
	    StrBuf &printableAddress);

    // currently no-op except on Windows
    static int
    InitNetwork();

    // currently no-op except on Windows
    static void
    CleanupNetwork();
};

# if defined(OS_MINGW) || (defined(OS_NT) && defined(_MSC_VER))

  // ensure that we don't conflict with a global DLL version
  # define inet_ntop p4_inet_ntop
  # define inet_pton p4_inet_pton

    // MINGW doesn't currently (v4.5) provide inet_ntop() or inet_pton()
    const char *
    p4_inet_ntop(
	    int af,
	    const void *src,
	    char *dst,
	    TYPE_SOCKLEN size);

    int
    p4_inet_pton(
	    int af,
	    const char *src,
	    void *dst);
# endif // OS_MINGW || (OS_NT && Visual Studio)

# if defined(OS_MINGW) || defined(OS_NT)
    // Windows doesn't yet provide inet_aton(); this handles only IPv4 addresses.
    int
    inet_aton(
	const char *cp,
	in_addr *addr);
# endif // OS_MINGW || OS_NT
# Change User Description Committed
#1 21443 dannyz_snps "Forking branch 2016-1 of perforce_software-p4 to dannyz_snps-p4."
//guest/perforce_software/p4/2016-1/net/netutils.h
#1 19472 Liz Lam Initial add of the 2016.1 p4/p4api source code.