ATM_Stream.cpp

Go to the documentation of this file.
00001 // ATM_Stream.cpp,v 4.17 2005/10/28 16:14:51 ossama Exp
00002 
00003 #include "ace/ATM_Stream.h"
00004 
00005 ACE_RCSID (ace, ATM_Stream, "ATM_Stream.cpp,v 4.17 2005/10/28 16:14:51 ossama Exp")
00006 
00007 #if defined (ACE_HAS_ATM)
00008 
00009 #if !defined (__ACE_INLINE__)
00010 #include "ace/ATM_Stream.inl"
00011 #endif /* __ACE_INLINE__ */
00012 
00013 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00014 
00015 ACE_ALLOC_HOOK_DEFINE (ACE_ATM_Stream)
00016 
00017 char*
00018 ACE_ATM_Stream::get_peer_name (void) const
00019 {
00020   ACE_TRACE ("ACE_ATM_Stream::get_peer_name");
00021 #if defined (ACE_HAS_FORE_ATM_XTI)
00022   //   // Use t_getprotaddr for XTI/ATM
00023   //   struct t_bind *localaddr
00024   //     = (struct t_bind *) ACE_OS::t_alloc (get_handle (),
00025   //                                          T_BIND,
00026   //                                          T_ADDR);
00027   //   struct t_bind *peeraddr
00028   //      = (struct t_bind *) ACE_OS::t_alloc (get_handle (),
00029   //                                           T_BIND,
00030   //                                           T_ADDR);
00031   //   ::t_getprotaddr (get_handle (),
00032   //                   localaddr,
00033   //                   peeraddr);
00034 
00035   //   char* connected_name = (char*) ACE_OS::malloc (peeraddr->addr.len + 1);
00036   //   ACE_OS::strcpy (connected_name,
00037   //                  peeraddr->addr.buf);
00038   //   ACE_OS::t_free ((char *) localaddr,
00039   //                   T_BIND);
00040   //   ACE_OS::t_free ((char *) peeraddr,
00041   //                   T_BIND);
00042   //   return (connected_name);
00043 
00044 #error "This doesn't seem to work. May need to jimmy-rig something with the"
00045 #error "/etc/xti_hosts file - Ugh!"
00046 
00047   ACE_ATM_Addr sa;
00048   struct netbuf name;
00049   name.maxlen = sa.get_size ();
00050   name.buf = (char *) sa.get_addr ();
00051   ACE_OS::t_getname (this->get_handle (), &name, REMOTENAME);
00052   //  ACE_OS::ioctl (this->get_handle (),
00053   //               TI_GETPEERNAME,
00054   //               &name);
00055   return (name.buf);
00056 
00057 #elif defined (ACE_HAS_FORE_ATM_WS2)
00058   // Use getpeername for WinSock2.
00059   struct sockaddr_atm name;
00060   ACE_OS::memset (&name, 0, sizeof (name));
00061   int nameSize = sizeof (name);
00062 
00063   if (ACE_OS::getpeername (this->get_handle (),
00064  (struct sockaddr *) &name,
00065                           &nameSize) != 0) {
00066     return 0;
00067   }
00068 
00069   char buffer[256];
00070   for (unsigned int index = 0; index < ATM_ADDR_SIZE - 1; index++) {
00071     buffer[ index * 3 ] = '\0';
00072     sprintf (buffer, "%s%02x.", buffer, name.satm_number.Addr[ index ]);
00073   }
00074   buffer[ (ATM_ADDR_SIZE - 1) * 3 ] = '\0';
00075   sprintf (buffer, "%s%02x.", buffer, 0);
00076   buffer[ ATM_ADDR_SIZE * 3 - 1 ] = '\0';
00077   for (index = 0; index < ACE_OS::strlen (buffer); ++index)
00078     buffer[index] = tolower (buffer[index]);
00079 
00080   ifstream atm_hosts ("C:/WINNT/atmhosts");
00081   assert (atm_hosts.is_open ());
00082 
00083   // Find the host address in the ATM hosts file and return the
00084   //  host name
00085   char line[256];
00086   char *host_ptr, *host_name = 0;
00087   ACE_NEW_RETURN (host_name, char[256], 0);
00088   while (!atm_hosts.eof ()) {
00089     atm_hosts.getline (line, 256);
00090     // Convert the line to lower case to ease comparison
00091     for (index = 0; index < ACE_OS::strlen (line); ++index)
00092       line[index] = tolower (line[index]);
00093     if (ACE_OS::strstr (line, buffer) != 0)
00094       {
00095         char *strtok_p;
00096         // Grab the second token which is the host name
00097         ACE_OS::strtok_r (line, " \t", &strtok_p);
00098         host_ptr = strtok (0, " \t", &strtok_p);
00099         ACE_OS::strcpy (host_name, host_ptr);
00100         break;
00101       }
00102   }
00103 
00104   return host_name;
00105 #elif defined (ACE_HAS_LINUX_ATM)
00106   ATM_Addr name;
00107   int nameSize = sizeof (name.sockaddratmsvc);
00108 
00109   if (ACE_OS::getpeername (this->get_handle (),
00110  (struct sockaddr *) & (name.sockaddratmsvc),
00111                           &nameSize) < 0) {
00112     ACE_OS::perror ("ACE_ATM_Stream (get_peer_name) : ");
00113     return 0;
00114   }
00115 
00116   static ACE_TCHAR buffer[MAX_ATM_ADDR_LEN + 1];
00117   int total_len;
00118   if ((total_len = atm2text (buffer,sizeof buffer,
00119  (struct sockaddr *) & (name.sockaddratmsvc),
00120                             A2T_PRETTY|A2T_NAME)) < 0) {
00121     ACE_DEBUG ((LM_DEBUG,ACE_LIB_TEXT ("ACE_ATM_Stream (get_peer_name) :%d"),errno));
00122     return 0;
00123   }
00124 
00125   return (char*) buffer;
00126 #else
00127   return 0;
00128 #endif /* ACE_HAS_FORE_ATM_XTI || ACE_HAS_FORE_ATM_WS2 || ACE_HAS_LINUX_ATM */
00129 }
00130 
00131 ACE_HANDLE
00132 ACE_ATM_Stream::get_handle (void) const
00133 {
00134   ACE_TRACE ("ACE_ATM_Stream::get_handle");
00135 #if defined (ACE_HAS_FORE_ATM_XTI) || defined (ACE_HAS_FORE_ATM_WS2) || defined (ACE_HAS_LINUX_ATM)
00136   return stream_.get_handle ();
00137 #else
00138   return 0;
00139 #endif /* ACE_HAS_FORE_ATM_XTI || ACE_HAS_FORE_ATM_WS2 || ACE_HAS_LINUX_ATM */
00140 }
00141 
00142 int
00143 ACE_ATM_Stream::get_vpi_vci (ACE_UINT16 &vpi,
00144                              ACE_UINT16 &vci) const
00145 {
00146   ACE_TRACE ("ACE_ATM_Stream::get_vpi_vci");
00147 #if defined (ACE_HAS_FORE_ATM_XTI)
00148   struct t_atm_conn_prop conn_prop;
00149   char* connect_opts = (char *) &conn_prop;
00150   int opt_size = sizeof (t_atm_conn_prop);
00151   struct t_info info;
00152   struct t_optmgmt opt_req, opt_ret;
00153 
00154   if (ACE_OS::t_getinfo (stream_.get_handle (),
00155                         &info) < 0)
00156     {
00157       ACE_OS::t_error ("t_getinfo");
00158       return -1;
00159     }
00160 
00161   char *buf_req = (char *) ACE_OS::malloc (info.options);
00162   if (buf_req == 0)
00163     {
00164       ACE_OS::fprintf (stderr,
00165                       "Unable to allocate %ld bytes for options\n",
00166                       info.options);
00167       return -1;
00168     }
00169 
00170   char *buf_ret = (char *) ACE_OS::malloc (info.options);
00171   if (buf_ret == 0)
00172     {
00173       ACE_OS::fprintf (stderr,
00174                       "Unable to allocate %ld bytes for options\n",
00175                       info.options);
00176       return -1;
00177     }
00178 
00179   ACE_OS::memset (&opt_req, 0, sizeof (opt_req));
00180   ACE_OS::memset (&opt_ret, 0, sizeof (opt_ret));
00181 
00182   struct t_opthdr *popt = (struct t_opthdr *) buf_req;
00183   struct t_opthdr *popt_ret = (struct t_opthdr *) buf_ret;
00184 
00185   popt->len= sizeof (struct t_opthdr) + opt_size;
00186 
00187   // We are only concerned with SVCs so no other check or values are needed
00188   //  here.
00189   popt->level = T_ATM_SIGNALING;
00190   popt->name = T_ATM_CONN_PROP;
00191   popt->status = 0;
00192 
00193   opt_req.opt.len = popt->len;
00194   opt_req.opt.buf = (char *) popt;
00195   opt_req.flags = T_CURRENT;
00196 
00197   popt = T_OPT_NEXTHDR (buf_req,
00198                        info.options,
00199                        popt);
00200   opt_ret.opt.maxlen  = info.options;
00201   opt_ret.opt.buf = (char *) popt_ret;
00202 
00203   if (ACE_OS::t_optmgmt (stream_.get_handle (),
00204                         &opt_req,
00205                         &opt_ret) < 0) {
00206     ACE_OS::t_error ("t_optmgmt");
00207     return -1;
00208   }
00209 
00210   ACE_OS::memcpy (connect_opts,
00211  (char *) popt_ret + sizeof (struct t_opthdr),
00212                  opt_size);
00213 
00214   ACE_OS::free (buf_ret);
00215   ACE_OS::free (buf_req);
00216 
00217   vpi = conn_prop.vpi;
00218   vci = conn_prop.vci;
00219   return (0);
00220 #elif defined (ACE_HAS_FORE_ATM_WS2)
00221   ATM_CONNECTION_ID connID;
00222   DWORD bytes = 0;
00223 
00224   if (::WSAIoctl ((int) this -> get_handle (),
00225                   SIO_GET_ATM_CONNECTION_ID,
00226                   0,
00227                   0,
00228  (LPVOID) &connID,
00229                   sizeof (ATM_CONNECTION_ID),
00230                   &bytes,
00231                   0,
00232                   0)
00233        == SOCKET_ERROR) {
00234     ACE_OS::printf ("Error: WSAIoctl %d\n", WSAGetLastError ());
00235   }
00236 
00237   vpi = (ACE_UINT16) connID.VPI;
00238   vci = (ACE_UINT16) connID.VCI;
00239 
00240   return 0;
00241 #elif defined (ACE_HAS_LINUX_ATM)
00242 #if defined (SO_ATMPVC) /* atm version>=0.62 */
00243   struct sockaddr_atmpvc mypvcaddr;
00244   int addrpvclen = sizeof (mypvcaddr);
00245   if (ACE_OS::getsockopt (stream_.get_handle (),
00246                          SOL_ATM,
00247                          SO_ATMPVC,
00248                          reinterpret_cast<char*> (&mypvcaddr),
00249                          &addrpvclen) < 0) {
00250     ACE_DEBUG (LM_DEBUG,
00251               ACE_LIB_TEXT ("ACE_ATM_Stream::get_vpi_vci: getsockopt %d\n"),
00252               errno);
00253     return -1;
00254   }
00255   vpi = (ACE_UINT16) mypvcaddr.sap_addr.vpi;
00256   vci = (ACE_UINT16) mypvcaddr.sap_addr.vci;
00257 
00258   return 0;
00259 #elif defined (SO_VCID) /* patch for atm version 0.59 */
00260   struct atm_vcid mypvcid;
00261   int pvcidlen = sizeof (mypvcid);
00262   if (ACE_OS::getsockopt (stream_.get_handle (),
00263                          SOL_ATM,SO_VCID,
00264                          reinterpret_cast<char*> (&mypvcid),
00265                          &pvcidlen) < 0) {
00266     ACE_DEBUG (LM_DEBUG,
00267               ACE_LIB_TEXT ("ACE_ATM_Stream::get_vpi_vci: getsockopt %d\n"),
00268               errno);
00269     return -1;
00270   }
00271   vpi = (ACE_UINT16) mypvcid.vpi;
00272   vci = (ACE_UINT16) mypvcid.vci;
00273 
00274   return 0;
00275 #else
00276   ACE_DEBUG (LM_DEBUG,
00277             ACE_LIB_TEXT ("ACE_ATM_Stream::get_vpi_vci: Not implemented in this ATM version. Update to >= 0.62\n Or patch 0.59"));
00278   ACE_UNUSED_ARG (vci);
00279   ACE_UNUSED_ARG (vpi);
00280 
00281   return (-1);
00282 #endif /* SO_ATMPVC || SO_VCID */
00283 #else
00284   return (-1);
00285 #endif /* ACE_HAS_FORE_ATM_XTI || ACE_HAS_FORE_ATM_WS2 || ACE_HAS_LINUX_ATM */
00286 }
00287 
00288 ACE_END_VERSIONED_NAMESPACE_DECL
00289 
00290 #endif /* ACE_HAS_ATM */

Generated on Thu Nov 9 09:41:46 2006 for ACE by doxygen 1.3.6