00001
00002
00003 #include "ace/ATM_Stream.h"
00004
00005 ACE_RCSID (ace, ATM_Stream, "$Id: ATM_Stream.cpp 79636 2007-09-13 15:18:33Z sowayaa $")
00006
00007 #if defined (ACE_HAS_ATM)
00008
00009 #if !defined (__ACE_INLINE__)
00010 #include "ace/ATM_Stream.inl"
00011 #endif
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
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
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
00053
00054
00055 return (name.buf);
00056
00057 #elif defined (ACE_HAS_FORE_ATM_WS2)
00058
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 ACE_OS::sprintf (buffer, "%s%02x.", buffer, name.satm_number.Addr[ index ]);
00073 }
00074 buffer[ (ATM_ADDR_SIZE - 1) * 3 ] = '\0';
00075 ACE_OS::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] = ACE_OS::ace_tolower (buffer[index]);
00079
00080 ifstream atm_hosts ("C:/WINNT/atmhosts");
00081 assert (atm_hosts.is_open ());
00082
00083
00084
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
00091 for (index = 0; index < ACE_OS::strlen (line); ++index)
00092 line[index] = ACE_OS::ace_tolower (line[index]);
00093 if (ACE_OS::strstr (line, buffer) != 0)
00094 {
00095 char *strtok_p;
00096
00097 ACE_OS::strtok_r (line, " \t", &strtok_p);
00098 host_ptr = ACE_OS::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_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
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
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
00188
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)
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_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)
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_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_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
00283 #else
00284 return (-1);
00285 #endif
00286 }
00287
00288 ACE_END_VERSIONED_NAMESPACE_DECL
00289
00290 #endif