/* * The Unix Channel * * by Michel Beaudouin-Lafon * * Copyright 1990-1993 * Laboratoire de Recherche en Informatique (LRI) * * Addresses * * $Id$ * $CurLog$ */ #ifndef Address_H_ #define Address_H_ #include "cplus_bugs.h" #include "global.h" #include "ccu/SmartPointer.h" #include #include #include #ifdef UNIX_SOCK #include #endif #ifndef AF_UNIX #define AF_UNIX AF_UNSPEC #endif union gen_addr { struct sockaddr sa; // default #ifdef UNIX_SOCK struct sockaddr_un su; // unix #endif struct sockaddr_in si; // inet }; typedef struct sockaddr SockAddr; /* this union is useful for adresses returned by system calls */ typedef union gen_addr GEN_ADDR; class UchAddress : public CcuSmartData { protected: bool Valid; public: UchAddress (); ~UchAddress (); bool IsValid () const { return Valid; } virtual int Family () = 0; // AF_UNSPEC, AF_UNIX, AF_INET virtual int Length () = 0; virtual SockAddr* GetSockAddr () = 0; virtual char* StrRepr (char* buf) = 0; static UchAddress* Decode (GEN_ADDR*, int); }; PointerClass (pUchAddress, UchAddress) class UchInetAddress : public UchAddress { protected: struct sockaddr_in Addr; public: UchInetAddress (); UchInetAddress (lword, sword); // hostid, port# UchInetAddress (const char*, sword = 0); // hostname, port# ~UchInetAddress (); int Family (); int Length (); SockAddr* GetSockAddr (); inline sword Port () { return Addr.sin_port; } inline lword Host () { return Addr.sin_addr.s_addr; } char* StrRepr (char* buf); static lword LoopBack (); }; #ifndef INADDR_LOOPBACK #define INADDR_LOOPBACK (INET_ADDR::LoopBack ()) #endif #define ANYADDR ((lword) INADDR_ANY) #define LOOPBACK ((lword) INADDR_LOOPBACK) #define BROADCAST ((lword) INADDR_BROADCAST) #ifdef UNIX_SOCK class UchUnixAddress : public UchAddress { protected: struct sockaddr_un Addr; public: UchUnixAddress (); UchUnixAddress (const char*); ~UchUnixAddress (); int Family (); int Length (); SockAddr* GetSockAddr (); char* StrRepr (char* buf); }; #endif /* UNIX_ADDR */ #endif /* Address_H_ */