00001
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
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)
00025 {
00026 ACE_TRACE ("ACE_SOCK_Netlink::open");
00027
00028 if ( ACE_SOCK::open (SOCK_RAW,
00029 protocol_family,
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