SOCK_Netlink.cpp

Go to the documentation of this file.
00001 // SOCK_Netlink.cpp,v 1.2 2006/06/07 12:52:52 jwillemsen Exp
00002 
00003 #include /* */  "ace/SOCK_Netlink.h"
00004 
00005 #ifdef ACE_HAS_NETLINK
00006 
00007 #include "ace/Log_Msg.h"
00008 #include "ace/ACE.h"
00009 #include "ace/OS_NS_string.h"
00010 #include "ace/OS_NS_unistd.h"
00011 #include "ace/SOCK_Netlink.h"
00012 #include "ace/OS_NS_sys_socket.h"
00013 
00014 #if !defined (__ACE_INLINE__)
00015 #include "ace/SOCK_Netlink.inl"
00016 #endif /* __ACE_INLINE__ */
00017 
00018 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00019 
00020 ACE_ALLOC_HOOK_DEFINE (ACE_SOCK_Netlink)
00021 
00022 int ACE_SOCK_Netlink::open (ACE_Netlink_Addr &local,
00023                             int protocol_family,
00024                             int protocol) //! protocol of your choosing
00025 {
00026   ACE_TRACE ("ACE_SOCK_Netlink::open");
00027 
00028   if ( ACE_SOCK::open (SOCK_RAW,
00029                        protocol_family, //! RAW or DGRAM valid
00030                        protocol,0) < 0 ) {
00031     ACE_TRACE ("ACE_SOCK_Netlink::open failed to open");
00032     return -1;
00033   }
00034 
00035   if (ACE_OS::bind(this->get_handle(),
00036                    (sockaddr*)local.get_addr(),
00037                    local.get_addr_size())  == -1 ) {
00038     ACE_TRACE ("ACE_SOCK_Netlink::open failed to bind socket");
00039     return -1;
00040   }
00041   return 0;
00042 }
00043 
00044 
00045 ACE_SOCK_Netlink::ACE_SOCK_Netlink (ACE_Netlink_Addr &local,
00046                                     int protocol_family,
00047                                     int protocol)
00048 {
00049   ACE_TRACE ("ACE_SOCK_Netlink::ACE_SOCK_Netlink");
00050 
00051   if (this->open (local,
00052                   protocol_family,
00053                   protocol)  == -1)
00054     ACE_ERROR ((LM_ERROR,
00055                 ACE_LIB_TEXT ("%p\n"),
00056                 ACE_LIB_TEXT ("ACE_SOCK_Netlink")));
00057 }
00058 
00059 ssize_t
00060 ACE_SOCK_Netlink::send (const iovec iov[],
00061                         int n,
00062                         const ACE_Addr &addr,
00063                         int flags) const
00064 {
00065   ACE_TRACE ("ACE_SOCK_Netlink::send");
00066   msghdr send_msg;
00067 
00068   send_msg.msg_iov = (iovec *) iov;
00069   send_msg.msg_iovlen = n;
00070   send_msg.msg_name = (char *) addr.get_addr ();
00071   send_msg.msg_namelen = addr.get_size ();
00072   send_msg.msg_control = 0;
00073   send_msg.msg_controllen = 0;
00074   send_msg.msg_flags = 0;
00075 
00076   return ACE_OS::sendmsg (this->get_handle (),
00077                           &send_msg,
00078                           flags);
00079 }
00080 
00081 ssize_t
00082 ACE_SOCK_Netlink::recv (iovec iov[],
00083                         int n,
00084                         ACE_Addr &addr,
00085                         int flags) const
00086 {
00087   ACE_TRACE ("ACE_SOCK_Netlink::recv");
00088   msghdr recv_msg;
00089 
00090   recv_msg.msg_iov = (iovec *) iov;
00091   recv_msg.msg_iovlen = n;
00092   recv_msg.msg_name = (char *) addr.get_addr ();
00093   recv_msg.msg_namelen = addr.get_size ();
00094   recv_msg.msg_control = 0;
00095   recv_msg.msg_controllen = 0;
00096   recv_msg.msg_flags = 0;
00097 
00098   ssize_t status = ACE_OS::recvmsg (this->get_handle (),
00099                                     &recv_msg,
00100                                     flags);
00101 
00102   if (recv_msg.msg_flags & MSG_TRUNC)
00103     return -1;
00104 
00105   addr.set_size (recv_msg.msg_namelen);
00106   addr.set_type (((sockaddr_in *) addr.get_addr())->sin_family);
00107 
00108   return status;
00109 }
00110 
00111 ACE_END_VERSIONED_NAMESPACE_DECL
00112 
00113 #endif /* ACE_HAS_NETLINK */

Generated on Thu Nov 9 09:42:04 2006 for ACE by doxygen 1.3.6