diff options
Diffstat (limited to 'ace/SOCK_SEQPACK_Association.cpp')
-rw-r--r-- | ace/SOCK_SEQPACK_Association.cpp | 347 |
1 files changed, 0 insertions, 347 deletions
diff --git a/ace/SOCK_SEQPACK_Association.cpp b/ace/SOCK_SEQPACK_Association.cpp deleted file mode 100644 index 820bd0fb78f..00000000000 --- a/ace/SOCK_SEQPACK_Association.cpp +++ /dev/null @@ -1,347 +0,0 @@ -// $Id$ - -#include "ace/SOCK_SEQPACK_Association.h" - -#include "ace/Auto_Ptr.h" -#include "ace/Log_Msg.h" -#include "ace/OS_Memory.h" -#include "ace/OS_NS_string.h" - -#if !defined (__ACE_INLINE__) -#include "ace/SOCK_SEQPACK_Association.inl" -#endif /* __ACE_INLINE__ */ - -ACE_RCSID(ace, SOCK_SEQPACK_Association, "$Id$") - -ACE_BEGIN_VERSIONED_NAMESPACE_DECL - -ACE_ALLOC_HOOK_DEFINE(ACE_SOCK_SEQPACK_Association) - -void -ACE_SOCK_SEQPACK_Association::dump (void) const -{ -#if defined (ACE_HAS_DUMP) - ACE_TRACE ("ACE_SOCK_SEQPACK_Association::dump"); -#endif /* ACE_HAS_DUMP */ -} - -int -ACE_SOCK_SEQPACK_Association::close (void) -{ -#if defined (ACE_WIN32) - // We need the following call to make things work correctly on - // Win32, which requires use to do a <close_writer> before doing the - // close in order to avoid losing data. Note that we don't need to - // do this on UNIX since it doesn't have this "feature". Moreover, - // this will cause subtle problems on UNIX due to the way that - // fork() works. - this->close_writer (); -#endif /* ACE_WIN32 */ - // Close down the socket. - return ACE_SOCK::close (); -} - -// Developed according to the API discussed in 7.1.4 of -// draft-ietf-tsvwg-sctpsocket-09.txt to abruptly free a transport -// transport association's resources. -int -ACE_SOCK_SEQPACK_Association::abort (void) -{ - // - // setsockopt() SO_LINGER configures socket to reap immediately. - // Normal close then aborts the association. - // - linger slinger; - - slinger.l_onoff = 1; - slinger.l_linger = 0; - - if (-1 == ACE_OS::setsockopt (this->get_handle (), - SOL_SOCKET, - SO_LINGER, - reinterpret_cast<const char *> (&slinger), - sizeof (linger))) - { - return -1; - } - - return this->close (); -} - -int -ACE_SOCK_SEQPACK_Association::get_local_addrs (ACE_INET_Addr *addrs, size_t &size) const -{ - ACE_TRACE ("ACE_SOCK_SEQPACK_Association::get_local_addrs"); - -#if defined (ACE_HAS_LKSCTP) - /* - The size of ACE_INET_Addr must be large enough to hold the number of - local addresses on the machine. If the array is too small, the function - will only return the number of addresses that will fit. If the array is - too large, the 'size' parameter will be modified to indicate the number - of addrs. - - We will call sctp_getladdrs() which accepts 3 parameters - 1. a socket fd - 2. a sctp association_id which will be ignored since we are using - tcp sockets - 3. a pointer to sockaddr - - lksctp/draft will allocate memory and we are responsible for freeing - it by calling sctp_freeladdrs(). - */ - - sockaddr_in *si = 0; - sockaddr *laddrs = 0; - int err = 0; - size_t len = 0; - - err = sctp_getladdrs(this->get_handle(), 0, &laddrs); - if (err > 0) - { - len = err; - // check to see if we have more addresses than we have - // space in our ACE_INET_Addr array - if (len > size) - { - // since our array is too small, we will only copy the first - // few that fit - len = size; - } - - for (size_t i = 0; i < len; i++) - { - // first we cast the sockaddr to sockaddr_in - // since we only support ipv4 at this time. - si = (sockaddr_in *) (&(laddrs[i])); - - // now we fillup the ace_inet_addr array - addrs[i].set_addr(si, sizeof(sockaddr_in)); - addrs[i].set_type(si->sin_family); - addrs[i].set_size(sizeof(sockaddr_in)); - } - } - else /* err < 0 */ - { - // sctp_getladdrs will return -1 on error - return -1; - } - - // indicate the num of addrs returned to the calling function - size = len; - - // make sure we free the struct using the system function - sctp_freeladdrs(laddrs); - -#else - - /* - We will be calling ACE_OS::getsockname, which accepts (and - potentially modifies) two reference parameters: - - 1. a sockaddr_in* that points to a buffer - 2. an int* that points to the size of this buffer - - The OpenSS7 implementation of SCTP copies an array of ipv4 - sockaddr_in into the buffer. Then, if the size of the buffer is - greater than the size used, the size parameter is reduced - accordingly. - - */ - - // The array of sockaddr_in will be stored in an ACE_Auto_Array_Ptr, - // which causes dynamically-allocated memory to be released as soon - // as the ACE_Auto_Array_Ptr goes out of scope. - ACE_Auto_Array_Ptr<sockaddr_in> addr_structs; - - // Allocate memory for this array. Return -1 if the memory cannot - // be allocated. (This activity requires a temporary variable---a - // bare sockaddr_in* --- because ACE_NEW_RETURN cannot act directory on - // an ACE_Auto_Array_Ptr.) - { - sockaddr_in *addr_structs_bootstrap = 0; - ACE_NEW_RETURN (addr_structs_bootstrap, sockaddr_in[size], -1); - addr_structs.reset(addr_structs_bootstrap); - } - - // Physical size of this array is its logical size multiplied by - // the physical size of one of its elements. - size_t physical_size = size * sizeof(sockaddr_in); - - /* Clear the array */ - ACE_OS::memset(addr_structs.get(), - 0, - physical_size); - - /* - ** Populate the array with real values from the getsockname system - ** call. addr_structs is modified, and name_size is modified to contain - ** the number of bytes written to addr_structs. - ** Use name_size to get the data types right across the call. - */ - int name_size = static_cast<int> (physical_size); - if (ACE_OS::getsockname (this->get_handle (), - reinterpret_cast<sockaddr *> (addr_structs.get()), - &name_size) == -1) - return -1; - - /* Calculate the NEW physical size of the array */ - name_size /= sizeof (sockaddr_in); - size = static_cast<size_t> (name_size); - - /* Copy each sockaddr_in to the address structure of an ACE_Addr from - the passed-in array */ - const int addrlen (static_cast<int> (sizeof (sockaddr_in))); - for (int i = 0; i < name_size; ++i) - { - addrs[i].set_addr (&(addr_structs[i]), addrlen); - addrs[i].set_type (addr_structs[i].sin_family); - addrs[i].set_size (addrlen); - } -#endif /* ACE_HAS_LKSCTP */ - return 0; -} - - -int -ACE_SOCK_SEQPACK_Association::get_remote_addrs (ACE_INET_Addr *addrs, size_t &size) const -{ - ACE_TRACE ("ACE_SOCK_SEQPACK_Association::get_remote_addrs"); -#if defined (ACE_HAS_LKSCTP) - /* - The size of ACE_INET_Addr must be large enough to hold the number of - remotes addresses in the association. If the array is too small, the - function will only return the number of addresses that will fit. If the - array is too large, the 'size' parameter will be modified to indicate - the number of addrs. - - We will call sctp_getpaddrs() which accepts 3 parameters - 1. a socket fd - 2. a sctp association_id which will be ignored since we are using - tcp sockets - 3. a pointer to a sockaddr - - lksctp/draft will allocate memory and we are responsible for freeing - it by calling sctp_freepaddrs(). - */ - - sockaddr_in *si = 0; - sockaddr *paddrs = 0; - int err = 0; - size_t len = 0; - - err = sctp_getpaddrs(this->get_handle(), 0, &paddrs); - if (err > 0) - { - len = err; - // check to see if we have more addresses than we have - // space in our ACE_INET_Addr array - if (len > size) - { - // since our array is too small, we will only copy the first - // few that fit - len = size; - } - - for (size_t i = 0; i < len; i++) - { - // first we cast the sockaddr to sockaddr_in - // since we only support ipv4 at this time. - si = (sockaddr_in *) (&(paddrs[i])); - - // now we fillup the ace_inet_addr array - addrs[i].set_addr(si, sizeof(sockaddr_in)); - addrs[i].set_type(si->sin_family); - addrs[i].set_size(sizeof(sockaddr_in)); - } - } - else /* err < 0 */ - { - // sctp_getpaddrs will return -1 on error - return -1; - } - - // indicate the num of addrs returned to the calling function - size = len; - - // make sure we free the struct using the system function - sctp_freepaddrs(paddrs); - -#else - - /* - We will be calling ACE_OS::getpeername, which accepts (and - potentially modifies) two reference parameters: - - 1. a sockaddr_in* that points to a buffer - 2. an int* that points to the size of this buffer - - The OpenSS7 implementation of SCTP copies an array of ipv4 - sockaddr_in into the buffer. Then, if the size of the buffer is - greater than the size used, the size parameter is reduced - accordingly. - - */ - - // The array of sockaddr_in will be stored in an ACE_Auto_Array_Ptr, - // which causes dynamically-allocated memory to be released as soon - // as the ACE_Auto_Array_Ptr goes out of scope. - ACE_Auto_Array_Ptr<sockaddr_in> addr_structs; - - // Allocate memory for this array. Return -1 if the memory cannot - // be allocated. (This activity requires a temporary variable---a - // bare sockaddr_in* --- because ACE_NEW_RETURN cannot act directory on - // an ACE_Auto_Array_Ptr.) - { - sockaddr_in *addr_structs_bootstrap = 0; - ACE_NEW_RETURN (addr_structs_bootstrap, sockaddr_in[size], -1); - addr_structs.reset(addr_structs_bootstrap); - } - - // Physical size of this array is its logical size multiplied by - // the physical size of one of its elements. - size_t physical_size = size * sizeof(sockaddr_in); - - /* Clear the array */ - ACE_OS::memset(addr_structs.get(), - 0, - physical_size); - - /* - ** Populate the array with real values from the getpeername system - ** call. addr_structs is modified, and name_size is modified to contain - ** the number of bytes written to addr_structs. - ** Use name_size to get the data types right across the call. - */ - int name_size = static_cast<int> (physical_size); - if (ACE_OS::getpeername (this->get_handle (), - reinterpret_cast<sockaddr *> (addr_structs.get()), - &name_size) == -1) - return -1; - - /* Calculate the NEW physical size of the array */ - name_size /= sizeof (sockaddr_in); - size = static_cast<size_t> (name_size); - - /* Copy each sockaddr_in to the address structure of an ACE_Addr from - the passed-in array */ - const int addrlen (static_cast<int> (sizeof (sockaddr_in))); - for (int i = 0; i < name_size; ++i) - { - addrs[i].set_addr (&(addr_structs[i]), addrlen); - addrs[i].set_type (addr_structs[i].sin_family); - addrs[i].set_size (addrlen); - } -#endif /* ACE_HAS_LKSCTP */ - return 0; -} - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -template class ACE_Auto_Array_Ptr<sockaddr_in>; -template class ACE_Auto_Basic_Array_Ptr<sockaddr_in>; -#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) -#pragma instantiate ACE_Auto_Array_Ptr<sockaddr_in> -#pragma instantiate ACE_Auto_Basic_Array_Ptr<sockaddr_in> -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ - -ACE_END_VERSIONED_NAMESPACE_DECL |