]> git.llucax.com Git - software/posixx.git/blobdiff - src/linux/tipc.hpp
Add Boost License
[software/posixx.git] / src / linux / tipc.hpp
index 16f569ffa4a60ea2e1a5d1b3bcdea3dee46ee709..bd985e504eb32b97b34a8996a82c3c764503f3dd 100644 (file)
@@ -1,3 +1,9 @@
+// Copyright Leandro Lucarella 2008 - 2010.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file COPYING or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
 #ifndef POSIXX_LINUX_TIPC_HPP_
 #define POSIXX_LINUX_TIPC_HPP_
 
@@ -96,6 +102,15 @@ struct portid: tipc_portid
         */
        portid(__u32 ref, addr node) throw ();
 
+       /// Access to the node addr.
+       addr& node_addr() throw ();
+
+       /// Access to the node addr.
+       const addr& node_addr() const throw ();
+
+       /// Compares 2 port ids.
+       bool operator == (const portid& other) const throw ();
+
 };
 
 /**
@@ -114,6 +129,9 @@ struct name: tipc_name
         */
        name(__u32 type, __u32 instance) throw ();
 
+       /// Compares 2 port names.
+       bool operator == (const name& other) const throw ();
+
 };
 
 /**
@@ -141,6 +159,9 @@ struct nameseq: tipc_name_seq
         */
        nameseq(__u32 type, __u32 instance) throw ();
 
+       /// Compares 2 port name sequences.
+       bool operator == (const nameseq& other) const throw ();
+
 };
 
 /**
@@ -246,12 +267,21 @@ struct subscr: tipc_subscr
                        const char* usr_handle, size_t handle_size)
                        throw ();
 
+       /// Access to the subscribed name sequence.
+       nameseq& name_seq() throw ();
+
+       /// Access to the subscribed name sequence.
+       const nameseq& name_seq() const throw ();
+
        /// Set the user handle as a string.
        void handle(const char* usr_handle) throw ();
 
        /// Set the user handle as binary data.
        void handle(const char* usr_handle, size_t handle_size) throw ();
 
+       /// Compares 2 subscription request messages.
+       bool operator == (const subscr& other) const throw ();
+
 };
 
 /// Type of events.
@@ -276,6 +306,39 @@ enum event_t
  */
 struct subscr_event: tipc_event
 {
+
+       /// Access to the subscribed name sequence.
+       portid& port_id() throw ();
+
+       /// Access to the subscribed name sequence.
+       const portid& port_id() const throw ();
+
+       /// Access to the subscribed name sequence.
+       subscr& subscription() throw ();
+
+       /// Access to the subscribed name sequence.
+       const subscr& subscription() const throw ();
+
+};
+
+/// Type of TIPC address
+enum type_t
+{
+       ID = TIPC_ADDR_ID,           ///< Port ID
+       NAME = TIPC_ADDR_NAME,       ///< Port name
+       NAMESEQ = TIPC_ADDR_NAMESEQ  ///< Name sequence or multicast
+};
+
+/**
+ * Bind scope.
+ *
+ * @see TIPC documentation: 2.1.2 bind
+ */
+enum scope_t
+{
+       ZONE = TIPC_ZONE_SCOPE,       ///< Zone scope.
+       CLUSTER = TIPC_CLUSTER_SCOPE, ///< Cluster scope.
+       NODE = TIPC_NODE_SCOPE        ///< Node scope.
 };
 
 /**
@@ -292,26 +355,6 @@ struct subscr_event: tipc_event
 struct sockaddr: sockaddr_tipc
 {
 
-       /// Type of TIPC address
-       enum type_t
-       {
-               ID = TIPC_ADDR_ID, ///< Port ID
-               NAME = TIPC_ADDR_NAME, ///< Port name
-               NAMESEQ = TIPC_ADDR_NAMESEQ ///< Name sequence or multicast
-       };
-
-       /**
-        * Bind scope.
-        *
-        * @see TIPC documentation: 2.1.2 bind
-        */
-       enum scope_t
-       {
-               ZONE = TIPC_ZONE_SCOPE,       ///< Zone scope.
-               CLUSTER = TIPC_CLUSTER_SCOPE, ///< Cluster scope.
-               NODE = TIPC_NODE_SCOPE        ///< Node scope.
-       };
-
        /// Constructor.
        sockaddr() throw ();
 
@@ -353,6 +396,30 @@ struct sockaddr: sockaddr_tipc
        /// Compare two TIPC socket addresses
        bool operator == (const sockaddr& other) const throw ();
 
+       /// Access to the port ID (only valid if addrtype == ID)
+       portid& port_id() throw ();
+
+       /// Access to the port ID (only valid if addrtype == ID)
+       const portid& port_id() const throw ();
+
+       /// Access to the port name (only valid if addrtype == NAME)
+       name& port_name() throw ();
+
+       /// Access to the port name (only valid if addrtype == NAME)
+       const name& port_name() const throw ();
+
+       /// Access to the port name domain (only valid if addrtype == NAME)
+       tipc::addr& name_domain() throw ();
+
+       /// Access to the port name domain (only valid if addrtype == NAME)
+       const tipc::addr& name_domain() const throw ();
+
+       /// Access to the port name sequence (only valid if addrtype == NAMESEQ)
+       nameseq& name_seq() throw ();
+
+       /// Access to the port name sequence (only valid if addrtype == NAMESEQ)
+       const nameseq& name_seq() const throw ();
+
 };
 
 /// TIPC socket traits.
@@ -439,6 +506,26 @@ posixx::linux::tipc::portid::portid(__u32 r, addr n) throw ()
        node = n;
 }
 
+inline
+posixx::linux::tipc::addr& posixx::linux::tipc::portid::node_addr() throw ()
+{
+       return *reinterpret_cast<addr*>(&node);
+}
+
+inline
+const posixx::linux::tipc::addr& posixx::linux::tipc::portid::node_addr() const
+               throw ()
+{
+       return *reinterpret_cast<const addr*>(&node);
+}
+
+inline
+bool posixx::linux::tipc::portid::operator == (
+               const posixx::linux::tipc::portid& other) const throw ()
+{
+       return memcmp(this, &other, sizeof(*this)) == 0;
+}
+
 inline
 posixx::linux::tipc::name::name(__u32 t, __u32 i) throw ()
 {
@@ -446,6 +533,13 @@ posixx::linux::tipc::name::name(__u32 t, __u32 i) throw ()
        instance = i;
 }
 
+inline
+bool posixx::linux::tipc::name::operator == (
+               const posixx::linux::tipc::name& other) const throw ()
+{
+       return memcmp(this, &other, sizeof(*this)) == 0;
+}
+
 inline
 posixx::linux::tipc::nameseq::nameseq(__u32 t, __u32 low, __u32 up) throw ()
 {
@@ -462,6 +556,13 @@ posixx::linux::tipc::nameseq::nameseq(__u32 t, __u32 instance) throw ()
        upper = instance;
 }
 
+inline
+bool posixx::linux::tipc::nameseq::operator == (
+               const posixx::linux::tipc::nameseq& other) const throw ()
+{
+       return memcmp(this, &other, sizeof(*this)) == 0;
+}
+
 inline
 posixx::linux::tipc::subscr::subscr(nameseq s, __u32 t, __u32 f,
                const char* uh) throw ()
@@ -482,6 +583,19 @@ posixx::linux::tipc::subscr::subscr(nameseq s, __u32 t, __u32 f,
        handle(uh, uh_size);
 }
 
+inline
+posixx::linux::tipc::nameseq& posixx::linux::tipc::subscr::name_seq() throw ()
+{
+       return *reinterpret_cast<nameseq*>(&seq);
+}
+
+inline
+const posixx::linux::tipc::nameseq&
+posixx::linux::tipc::subscr::name_seq() const throw ()
+{
+       return *reinterpret_cast<const nameseq*>(&seq);
+}
+
 inline
 void posixx::linux::tipc::subscr::handle(const char* uh) throw ()
 {
@@ -495,16 +609,53 @@ void posixx::linux::tipc::subscr::handle(const char* uh, size_t uh_size)
        std::memcpy(usr_handle, uh, uh_size);
 }
 
+inline
+bool posixx::linux::tipc::subscr::operator == (const subscr& other) const
+               throw ()
+{
+       return memcmp(this, &other, sizeof(*this)) == 0;
+}
+
+inline
+posixx::linux::tipc::portid& posixx::linux::tipc::subscr_event::port_id()
+               throw ()
+{
+       return *reinterpret_cast<portid*>(&port);
+}
+
+inline
+const posixx::linux::tipc::portid& posixx::linux::tipc::subscr_event::port_id()
+               const throw ()
+{
+       return *reinterpret_cast<const portid*>(&port);
+}
+
+inline
+posixx::linux::tipc::subscr& posixx::linux::tipc::subscr_event::subscription()
+               throw ()
+{
+       return *reinterpret_cast<subscr*>(&s);
+}
+
+inline
+const posixx::linux::tipc::subscr&
+posixx::linux::tipc::subscr_event::subscription() const throw ()
+{
+       return *reinterpret_cast<const subscr*>(&s);
+}
+
 inline
 posixx::linux::tipc::sockaddr::sockaddr() throw ()
 {
+       memset(this, 0, sizeof(*this));
+       family = AF_TIPC;
 }
 
 inline
 posixx::linux::tipc::sockaddr::sockaddr(portid port, scope_t s) throw ()
 {
        family = AF_TIPC;
-       addrtype = TIPC_ADDR_ID;
+       addrtype = ID;
        scope = s;
        addr.id = port;
 }
@@ -514,7 +665,7 @@ posixx::linux::tipc::sockaddr::sockaddr(name name, scope_t s, tipc::addr d)
                throw ()
 {
        family = AF_TIPC;
-       addrtype = TIPC_ADDR_NAME;
+       addrtype = NAME;
        scope = s;
        addr.name.name = name;
        addr.name.domain = d;
@@ -524,13 +675,13 @@ inline
 posixx::linux::tipc::sockaddr::sockaddr(nameseq nameseq, scope_t s) throw ()
 {
        family = AF_TIPC;
-       addrtype = TIPC_ADDR_NAMESEQ;
+       addrtype = NAMESEQ;
        scope = s;
        addr.nameseq = nameseq;
 }
 
 inline
-posixx::linux::tipc::sockaddr::type_t posixx::linux::tipc::sockaddr::type()
+posixx::linux::tipc::type_t posixx::linux::tipc::sockaddr::type()
                const throw ()
 {
        return static_cast< type_t >(addrtype);
@@ -546,7 +697,74 @@ inline
 bool posixx::linux::tipc::sockaddr::operator == (const sockaddr& other) const
                throw ()
 {
-       return !memcmp(this, &other, sizeof(*this));
+       if (family != other.family)
+               return false;
+       if (addrtype != other.addrtype)
+               return false;
+       if (scope != other.scope)
+               return false;
+       if (addrtype == ID)
+               return port_id() == other.port_id();
+       if (addrtype == NAME)
+               return name_domain() == other.name_domain()
+                               && port_name() == other.port_name();
+       if (addrtype == NAMESEQ)
+               return name_seq() == other.name_seq();
+       return memcmp(this, &other, sizeof(*this)) == 0;
+}
+
+inline
+posixx::linux::tipc::portid& posixx::linux::tipc::sockaddr::port_id() throw ()
+{
+       return *reinterpret_cast<portid*>(&addr.id);
+}
+
+inline
+const posixx::linux::tipc::portid& posixx::linux::tipc::sockaddr::port_id()
+               const throw ()
+{
+       return *reinterpret_cast<const portid*>(&addr.id);
+}
+
+inline
+posixx::linux::tipc::name& posixx::linux::tipc::sockaddr::port_name() throw ()
+{
+       return *reinterpret_cast<name*>(&addr.name.name);
+}
+
+inline
+const posixx::linux::tipc::name& posixx::linux::tipc::sockaddr::port_name()
+               const throw ()
+{
+       return *reinterpret_cast<const name*>(&addr.name.name);
+}
+
+inline
+posixx::linux::tipc::addr& posixx::linux::tipc::sockaddr::name_domain()
+               throw ()
+{
+       return *reinterpret_cast<tipc::addr*>(&addr.name.domain);
+}
+
+inline
+const posixx::linux::tipc::addr& posixx::linux::tipc::sockaddr::name_domain()
+               const throw ()
+{
+       return *reinterpret_cast<const tipc::addr*>(&addr.name.domain);
+}
+
+inline
+posixx::linux::tipc::nameseq& posixx::linux::tipc::sockaddr::name_seq()
+               throw ()
+{
+       return *reinterpret_cast<nameseq*>(&addr.nameseq);
+}
+
+inline
+const posixx::linux::tipc::nameseq& posixx::linux::tipc::sockaddr::name_seq()
+               const throw ()
+{
+       return *reinterpret_cast<const nameseq*>(&addr.nameseq);
 }
 
 #endif // POSIXX_LINUX_TIPC_HPP_