1 // $Id: ATM_Stream.cpp 80826 2008-03-04 14:51:23Z wotte $
3 #include "ace/ATM_Stream.h"
5 ACE_RCSID (ace
, ATM_Stream
, "$Id: ATM_Stream.cpp 80826 2008-03-04 14:51:23Z wotte $")
7 #if defined (ACE_HAS_ATM)
9 #if !defined (__ACE_INLINE__)
10 #include "ace/ATM_Stream.inl"
11 #endif /* __ACE_INLINE__ */
13 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
15 ACE_ALLOC_HOOK_DEFINE (ACE_ATM_Stream
)
18 ACE_ATM_Stream::get_peer_name (void) const
20 ACE_TRACE ("ACE_ATM_Stream::get_peer_name");
21 #if defined (ACE_HAS_FORE_ATM_XTI)
22 // // Use t_getprotaddr for XTI/ATM
23 // struct t_bind *localaddr
24 // = (struct t_bind *) ACE_OS::t_alloc (get_handle (),
27 // struct t_bind *peeraddr
28 // = (struct t_bind *) ACE_OS::t_alloc (get_handle (),
31 // ::t_getprotaddr (get_handle (),
35 // char* connected_name = (char*) ACE_OS::malloc (peeraddr->addr.len + 1);
36 // ACE_OS::strcpy (connected_name,
37 // peeraddr->addr.buf);
38 // ACE_OS::t_free ((char *) localaddr,
40 // ACE_OS::t_free ((char *) peeraddr,
42 // return (connected_name);
44 #error "This doesn't seem to work. May need to jimmy-rig something with the"
45 #error "/etc/xti_hosts file - Ugh!"
49 name
.maxlen
= sa
.get_size ();
50 name
.buf
= (char *) sa
.get_addr ();
51 ACE_OS::t_getname (this->get_handle (), &name
, REMOTENAME
);
52 // ACE_OS::ioctl (this->get_handle (),
57 #elif defined (ACE_HAS_FORE_ATM_WS2)
58 // Use getpeername for WinSock2.
59 struct sockaddr_atm name
;
60 ACE_OS::memset (&name
, 0, sizeof (name
));
61 int nameSize
= sizeof (name
);
63 if (ACE_OS::getpeername (this->get_handle (),
64 (struct sockaddr
*) &name
,
70 for (unsigned int index
= 0; index
< ATM_ADDR_SIZE
- 1; index
++) {
71 buffer
[ index
* 3 ] = '\0';
72 ACE_OS::sprintf (buffer
, "%s%02x.", buffer
, name
.satm_number
.Addr
[ index
]);
74 buffer
[ (ATM_ADDR_SIZE
- 1) * 3 ] = '\0';
75 ACE_OS::sprintf (buffer
, "%s%02x.", buffer
, 0);
76 buffer
[ ATM_ADDR_SIZE
* 3 - 1 ] = '\0';
77 for (index
= 0; index
< ACE_OS::strlen (buffer
); ++index
)
78 buffer
[index
] = ACE_OS::ace_tolower (buffer
[index
]);
80 ifstream
atm_hosts ("C:/WINNT/atmhosts");
81 assert (atm_hosts
.is_open ());
83 // Find the host address in the ATM hosts file and return the
86 char *host_ptr
, *host_name
= 0;
87 ACE_NEW_RETURN (host_name
, char[256], 0);
88 while (!atm_hosts
.eof ()) {
89 atm_hosts
.getline (line
, 256);
90 // Convert the line to lower case to ease comparison
91 for (index
= 0; index
< ACE_OS::strlen (line
); ++index
)
92 line
[index
] = ACE_OS::ace_tolower (line
[index
]);
93 if (ACE_OS::strstr (line
, buffer
) != 0)
96 // Grab the second token which is the host name
97 ACE_OS::strtok_r (line
, " \t", &strtok_p
);
98 host_ptr
= ACE_OS::strtok (0, " \t", &strtok_p
);
99 ACE_OS::strcpy (host_name
, host_ptr
);
105 #elif defined (ACE_HAS_LINUX_ATM)
107 int nameSize
= sizeof (name
.sockaddratmsvc
);
109 if (ACE_OS::getpeername (this->get_handle (),
110 (struct sockaddr
*) & (name
.sockaddratmsvc
),
112 ACE_OS::perror ("ACE_ATM_Stream (get_peer_name) : ");
116 static ACE_TCHAR buffer
[MAX_ATM_ADDR_LEN
+ 1];
118 if ((total_len
= atm2text (buffer
,sizeof buffer
,
119 (struct sockaddr
*) & (name
.sockaddratmsvc
),
120 A2T_PRETTY
|A2T_NAME
)) < 0) {
121 ACE_DEBUG ((LM_DEBUG
,ACE_TEXT ("ACE_ATM_Stream (get_peer_name) :%d"),errno
));
125 return (char*) buffer
;
128 #endif /* ACE_HAS_FORE_ATM_XTI || ACE_HAS_FORE_ATM_WS2 || ACE_HAS_LINUX_ATM */
132 ACE_ATM_Stream::get_handle (void) const
134 ACE_TRACE ("ACE_ATM_Stream::get_handle");
135 #if defined (ACE_HAS_FORE_ATM_XTI) || defined (ACE_HAS_FORE_ATM_WS2) || defined (ACE_HAS_LINUX_ATM)
136 return stream_
.get_handle ();
139 #endif /* ACE_HAS_FORE_ATM_XTI || ACE_HAS_FORE_ATM_WS2 || ACE_HAS_LINUX_ATM */
143 ACE_ATM_Stream::get_vpi_vci (ACE_UINT16
&vpi
,
144 ACE_UINT16
&vci
) const
146 ACE_TRACE ("ACE_ATM_Stream::get_vpi_vci");
147 #if defined (ACE_HAS_FORE_ATM_XTI)
148 struct t_atm_conn_prop conn_prop
;
149 char* connect_opts
= (char *) &conn_prop
;
150 int opt_size
= sizeof (t_atm_conn_prop
);
152 struct t_optmgmt opt_req
, opt_ret
;
154 if (ACE_OS::t_getinfo (stream_
.get_handle (),
157 ACE_OS::t_error ("t_getinfo");
161 char *buf_req
= (char *) ACE_OS::malloc (info
.options
);
164 ACE_OS::fprintf (stderr
,
165 "Unable to allocate %ld bytes for options\n",
170 char *buf_ret
= (char *) ACE_OS::malloc (info
.options
);
173 ACE_OS::fprintf (stderr
,
174 "Unable to allocate %ld bytes for options\n",
179 ACE_OS::memset (&opt_req
, 0, sizeof (opt_req
));
180 ACE_OS::memset (&opt_ret
, 0, sizeof (opt_ret
));
182 struct t_opthdr
*popt
= (struct t_opthdr
*) buf_req
;
183 struct t_opthdr
*popt_ret
= (struct t_opthdr
*) buf_ret
;
185 popt
->len
= sizeof (struct t_opthdr
) + opt_size
;
187 // We are only concerned with SVCs so no other check or values are needed
189 popt
->level
= T_ATM_SIGNALING
;
190 popt
->name
= T_ATM_CONN_PROP
;
193 opt_req
.opt
.len
= popt
->len
;
194 opt_req
.opt
.buf
= (char *) popt
;
195 opt_req
.flags
= T_CURRENT
;
197 popt
= T_OPT_NEXTHDR (buf_req
,
200 opt_ret
.opt
.maxlen
= info
.options
;
201 opt_ret
.opt
.buf
= (char *) popt_ret
;
203 if (ACE_OS::t_optmgmt (stream_
.get_handle (),
206 ACE_OS::t_error ("t_optmgmt");
210 ACE_OS::memcpy (connect_opts
,
211 (char *) popt_ret
+ sizeof (struct t_opthdr
),
214 ACE_OS::free (buf_ret
);
215 ACE_OS::free (buf_req
);
220 #elif defined (ACE_HAS_FORE_ATM_WS2)
221 ATM_CONNECTION_ID connID
;
224 if (::WSAIoctl ((int) this -> get_handle (),
225 SIO_GET_ATM_CONNECTION_ID
,
229 sizeof (ATM_CONNECTION_ID
),
234 ACE_OS::printf ("Error: WSAIoctl %d\n", WSAGetLastError ());
237 vpi
= (ACE_UINT16
) connID
.VPI
;
238 vci
= (ACE_UINT16
) connID
.VCI
;
241 #elif defined (ACE_HAS_LINUX_ATM)
242 #if defined (SO_ATMPVC) /* atm version>=0.62 */
243 struct sockaddr_atmpvc mypvcaddr
;
244 int addrpvclen
= sizeof (mypvcaddr
);
245 if (ACE_OS::getsockopt (stream_
.get_handle (),
248 reinterpret_cast<char*> (&mypvcaddr
),
251 ACE_TEXT ("ACE_ATM_Stream::get_vpi_vci: getsockopt %d\n"),
255 vpi
= (ACE_UINT16
) mypvcaddr
.sap_addr
.vpi
;
256 vci
= (ACE_UINT16
) mypvcaddr
.sap_addr
.vci
;
259 #elif defined (SO_VCID) /* patch for atm version 0.59 */
260 struct atm_vcid mypvcid
;
261 int pvcidlen
= sizeof (mypvcid
);
262 if (ACE_OS::getsockopt (stream_
.get_handle (),
264 reinterpret_cast<char*> (&mypvcid
),
267 ACE_TEXT ("ACE_ATM_Stream::get_vpi_vci: getsockopt %d\n"),
271 vpi
= (ACE_UINT16
) mypvcid
.vpi
;
272 vci
= (ACE_UINT16
) mypvcid
.vci
;
277 ACE_TEXT ("ACE_ATM_Stream::get_vpi_vci: Not implemented in this ATM version. Update to >= 0.62\n Or patch 0.59"));
278 ACE_UNUSED_ARG (vci
);
279 ACE_UNUSED_ARG (vpi
);
282 #endif /* SO_ATMPVC || SO_VCID */
285 #endif /* ACE_HAS_FORE_ATM_XTI || ACE_HAS_FORE_ATM_WS2 || ACE_HAS_LINUX_ATM */
288 ACE_END_VERSIONED_NAMESPACE_DECL
290 #endif /* ACE_HAS_ATM */