[7297] Fixed profession spells sorting in trainer spell list at client.
[getmangos.git] / dep / ACE_wrappers / ace / ATM_Stream.cpp
blobaffb891475a3b36c3bdb31b92bfb04385659b99b
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)
17 char*
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 (),
25 // T_BIND,
26 // T_ADDR);
27 // struct t_bind *peeraddr
28 // = (struct t_bind *) ACE_OS::t_alloc (get_handle (),
29 // T_BIND,
30 // T_ADDR);
31 // ::t_getprotaddr (get_handle (),
32 // localaddr,
33 // peeraddr);
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,
39 // T_BIND);
40 // ACE_OS::t_free ((char *) peeraddr,
41 // T_BIND);
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!"
47 ACE_ATM_Addr sa;
48 struct netbuf name;
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 (),
53 // TI_GETPEERNAME,
54 // &name);
55 return (name.buf);
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,
65 &nameSize) != 0) {
66 return 0;
69 char buffer[256];
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
84 // host name
85 char line[256];
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)
95 char *strtok_p;
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);
100 break;
104 return host_name;
105 #elif defined (ACE_HAS_LINUX_ATM)
106 ATM_Addr name;
107 int nameSize = sizeof (name.sockaddratmsvc);
109 if (ACE_OS::getpeername (this->get_handle (),
110 (struct sockaddr *) & (name.sockaddratmsvc),
111 &nameSize) < 0) {
112 ACE_OS::perror ("ACE_ATM_Stream (get_peer_name) : ");
113 return 0;
116 static ACE_TCHAR buffer[MAX_ATM_ADDR_LEN + 1];
117 int total_len;
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));
122 return 0;
125 return (char*) buffer;
126 #else
127 return 0;
128 #endif /* ACE_HAS_FORE_ATM_XTI || ACE_HAS_FORE_ATM_WS2 || ACE_HAS_LINUX_ATM */
131 ACE_HANDLE
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 ();
137 #else
138 return 0;
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);
151 struct t_info info;
152 struct t_optmgmt opt_req, opt_ret;
154 if (ACE_OS::t_getinfo (stream_.get_handle (),
155 &info) < 0)
157 ACE_OS::t_error ("t_getinfo");
158 return -1;
161 char *buf_req = (char *) ACE_OS::malloc (info.options);
162 if (buf_req == 0)
164 ACE_OS::fprintf (stderr,
165 "Unable to allocate %ld bytes for options\n",
166 info.options);
167 return -1;
170 char *buf_ret = (char *) ACE_OS::malloc (info.options);
171 if (buf_ret == 0)
173 ACE_OS::fprintf (stderr,
174 "Unable to allocate %ld bytes for options\n",
175 info.options);
176 return -1;
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
188 // here.
189 popt->level = T_ATM_SIGNALING;
190 popt->name = T_ATM_CONN_PROP;
191 popt->status = 0;
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,
198 info.options,
199 popt);
200 opt_ret.opt.maxlen = info.options;
201 opt_ret.opt.buf = (char *) popt_ret;
203 if (ACE_OS::t_optmgmt (stream_.get_handle (),
204 &opt_req,
205 &opt_ret) < 0) {
206 ACE_OS::t_error ("t_optmgmt");
207 return -1;
210 ACE_OS::memcpy (connect_opts,
211 (char *) popt_ret + sizeof (struct t_opthdr),
212 opt_size);
214 ACE_OS::free (buf_ret);
215 ACE_OS::free (buf_req);
217 vpi = conn_prop.vpi;
218 vci = conn_prop.vci;
219 return (0);
220 #elif defined (ACE_HAS_FORE_ATM_WS2)
221 ATM_CONNECTION_ID connID;
222 DWORD bytes = 0;
224 if (::WSAIoctl ((int) this -> get_handle (),
225 SIO_GET_ATM_CONNECTION_ID,
228 (LPVOID) &connID,
229 sizeof (ATM_CONNECTION_ID),
230 &bytes,
233 == SOCKET_ERROR) {
234 ACE_OS::printf ("Error: WSAIoctl %d\n", WSAGetLastError ());
237 vpi = (ACE_UINT16) connID.VPI;
238 vci = (ACE_UINT16) connID.VCI;
240 return 0;
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 (),
246 SOL_ATM,
247 SO_ATMPVC,
248 reinterpret_cast<char*> (&mypvcaddr),
249 &addrpvclen) < 0) {
250 ACE_DEBUG (LM_DEBUG,
251 ACE_TEXT ("ACE_ATM_Stream::get_vpi_vci: getsockopt %d\n"),
252 errno);
253 return -1;
255 vpi = (ACE_UINT16) mypvcaddr.sap_addr.vpi;
256 vci = (ACE_UINT16) mypvcaddr.sap_addr.vci;
258 return 0;
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 (),
263 SOL_ATM,SO_VCID,
264 reinterpret_cast<char*> (&mypvcid),
265 &pvcidlen) < 0) {
266 ACE_DEBUG (LM_DEBUG,
267 ACE_TEXT ("ACE_ATM_Stream::get_vpi_vci: getsockopt %d\n"),
268 errno);
269 return -1;
271 vpi = (ACE_UINT16) mypvcid.vpi;
272 vci = (ACE_UINT16) mypvcid.vci;
274 return 0;
275 #else
276 ACE_DEBUG (LM_DEBUG,
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);
281 return (-1);
282 #endif /* SO_ATMPVC || SO_VCID */
283 #else
284 return (-1);
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 */