#ifndef _INCLUDED_BOBCAT_HOSTENT_
#define _INCLUDED_BOBCAT_HOSTENT_

#include <netdb.h>
#include <string>

class Hostent: private hostent
{
    union PTR
    {
        char const * const *p2;
        char const *p1;
    };

    size_t d_nAliases;
    size_t d_nAddresses;
            
    public:
        Hostent();
        Hostent(Hostent const &other)
        {
            copy(&other, other.d_nAliases, other.d_nAddresses);
        }
        Hostent(hostent const *other);

        ~Hostent()
        {
            destroy();
        }

        Hostent &operator=(Hostent const &other);

        char const *alias(size_t nr) const
        {
            return nr >= d_nAliases ? 0 : h_aliases[nr];
        }
        char const *binaryAddress(size_t nr) const    // length bytes!
        {
            return nr >= nAddresses() ? 0 : h_addr_list[nr];
        }
        char const * const *beginAlias() const
        {
            return h_aliases;
        }

        std::string dottedDecimalAddress(size_t nr) const;

        char const * const *endAlias() const
        {
            return h_aliases + nAliases();
        }
        char const *hostname() const
        {
            return h_name;
        }
        size_t nAliases() const
        {
            return d_nAliases - 1;
        }
        size_t nAddresses() const
        {
            return d_nAddresses - 1;
        }
        size_t addressLength() const
        {
            return h_length;
        }
        size_t addressType() const
        {
            return h_addrtype;
        }
    private:
        static char *xstrdup(char const *src);

        void copy(hostent const *other, size_t n_aliases, 
                                         size_t n_addresses);
        void destroy();
                                            // the count functions also count
                                            // the final 0-values.
        size_t countAliases(char const * const *alias) const;
        size_t countAddresses(char const * const *addresses, 
                                            size_t length) const;
};

        
#endif
