1 karl 1.80 //%2006////////////////////////////////////////////////////////////////////////
|
2 mike 1.2 //
|
3 karl 1.52 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
|
6 karl 1.43 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.52 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 karl 1.57 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 karl 1.80 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
|
13 mike 1.2 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
|
15 kumpf 1.20 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
18 mike 1.2 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
|
20 kamal.locahana 1.88.6.1 //
|
21 kumpf 1.20 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
|
22 mike 1.2 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
24 kumpf 1.20 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
27 mike 1.2 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 //%/////////////////////////////////////////////////////////////////////////////
33
34 #include "Config.h"
|
35 kumpf 1.15 #include "Constants.h"
|
36 mike 1.2 #include <iostream>
37
|
38 mike 1.82 #include "Network.h"
|
39 mike 1.2 #include "Socket.h"
40 #include "TLS.h"
41 #include "HTTPAcceptor.h"
42 #include "HTTPConnection.h"
|
43 kumpf 1.19 #include "Tracer.h"
|
44 humberto 1.30 #include <Pegasus/Common/MessageLoader.h> //l10n
|
45 mike 1.2
|
46 chuck 1.38 #ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM
|
47 mike 1.85 #include "EBCDIC_OS400.h"
|
48 chuck 1.38 #endif
49
|
50 mike 1.79
|
51 mike 1.2 PEGASUS_USING_STD;
52
53 PEGASUS_NAMESPACE_BEGIN
54
|
55 david.dillard 1.65
|
56 a.arora 1.51 static int MAX_CONNECTION_QUEUE_LENGTH = -1;
57
|
58 mike 1.2 ////////////////////////////////////////////////////////////////////////////////
59 //
60 // HTTPAcceptorRep
61 //
62 ////////////////////////////////////////////////////////////////////////////////
63
|
64 kumpf 1.25 class HTTPAcceptorRep
|
65 mike 1.2 {
|
66 kumpf 1.25 public:
67 HTTPAcceptorRep(Boolean local)
68 {
69 if (local)
70 {
|
71 kamal.locahana 1.88.6.1 #ifndef PEGASUS_OS_TYPE_WINDOWS
72
|
73 h.sterling 1.63 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
|
74 kumpf 1.25 address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_un);
75 address_size = sizeof(struct sockaddr_un);
|
76 kumpf 1.11 #else
|
77 kumpf 1.25 PEGASUS_ASSERT(false);
|
78 kumpf 1.11 #endif
|
79 kamal.locahana 1.88.6.1 #endif
|
80 david.dillard 1.64 }
|
81 kumpf 1.25 else
82 {
83 address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_in);
84 address_size = sizeof(struct sockaddr_in);
85 }
86 }
|
87 konrad.r 1.69 ~HTTPAcceptorRep()
88 {
|
89 david.dillard 1.73 delete address;
|
90 konrad.r 1.69 }
|
91 kumpf 1.25 struct sockaddr* address;
92
|
93 mike 1.83 SocketLength address_size;
|
94 mike 1.77 Mutex _connection_mut;
|
95 david.dillard 1.64
|
96 mike 1.82 SocketHandle socket;
|
97 kamal.locahana 1.88.6.1 // Added for NamedPipe implementation for windows
|
98 kamal.locahana 1.88.6.3 #if defined (PEGASUS_OS_TYPE_WINDOWS) &&\
99 !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
|
100 kamal.locahana 1.88.6.1 NamedPipeServer* namedPipeServer;
101 #endif
102
|
103 mike 1.77 Array<HTTPConnection*> connections;
|
104 mike 1.2 };
105
|
106 mike 1.79
|
107 mike 1.2 ////////////////////////////////////////////////////////////////////////////////
108 //
109 // HTTPAcceptor
110 //
111 ////////////////////////////////////////////////////////////////////////////////
112
|
113 kumpf 1.25 HTTPAcceptor::HTTPAcceptor(Monitor* monitor,
114 MessageQueue* outputMessageQueue,
115 Boolean localConnection,
116 Uint32 portNumber,
|
117 kumpf 1.49 SSLContext * sslcontext,
|
118 nag.boranna 1.59 ReadWriteSem* sslContextObjectLock)
|
119 kumpf 1.25 : Base(PEGASUS_QUEUENAME_HTTPACCEPTOR), // ATTN: Need unique names?
120 _monitor(monitor),
121 _outputMessageQueue(outputMessageQueue),
122 _rep(0),
123 _entry_index(-1),
124 _localConnection(localConnection),
125 _portNumber(portNumber),
|
126 kumpf 1.49 _sslcontext(sslcontext),
|
127 nag.boranna 1.59 _sslContextObjectLock(sslContextObjectLock)
|
128 mike 1.2 {
|
129 mday 1.7 Socket::initializeInterface();
|
130 david.dillard 1.64
|
131 a.arora 1.51 /*
132 Platforms interpret the value of MAX_CONNECTION_QUEUE_LENGTH differently. Some platforms interpret
133 the value literally, while others multiply a fudge factor. When the server is under
134 stress from multiple clients with multiple requests, toggling this number may prevent clients from
135 being dropped. Instead of hard coding the value, we allow an environment variable to be set which
136 specifies a number greater than the maximum concurrent client connections possible. If this environment
137 var is not specified, then MAX_CONNECTION_QUEUE_LENGTH = 15.
138 */
139
140 //To engage runtime backlog queue length: uncomment the following block AND comment out the line MAX_CONNECTION_QUEUE_LENGTH = 15
141
142 /*
143 if(MAX_CONNECTION_QUEUE_LENGTH == -1){
144 #ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM
145 #pragma convert(37)
|
146 h.sterling 1.63 const char* env = getenv("PEGASUS_MAX_BACKLOG_CONNECTION_QUEUE");
147 EtoA(env);
|
148 a.arora 1.51 #pragma convert(0)
149 #else
|
150 h.sterling 1.63 const char* env = getenv("PEGASUS_MAX_BACKLOG_CONNECTION_QUEUE");
|
151 a.arora 1.51 #endif
|
152 h.sterling 1.63 if(!env){
153 MAX_CONNECTION_QUEUE_LENGTH = 15;
|
154 david.dillard 1.64 }else{
|
155 h.sterling 1.63 char *end = NULL;
156 MAX_CONNECTION_QUEUE_LENGTH = strtol(env, &end, 10);
157 if(*end)
158 MAX_CONNECTION_QUEUE_LENGTH = 15;
159 cout << " MAX_CONNECTION_QUEUE_LENGTH = " << MAX_CONNECTION_QUEUE_LENGTH << endl;
160 }
|
161 a.arora 1.51 }
162 */
163 MAX_CONNECTION_QUEUE_LENGTH = 15;
|
164 david.dillard 1.64
|
165 mike 1.2 }
166
167 HTTPAcceptor::~HTTPAcceptor()
168 {
|
169 konrad.r 1.70 destroyConnections();
|
170 mday 1.7 unbind();
|
171 kumpf 1.25 // ATTN: Is this correct in a multi-HTTPAcceptor server?
|
172 mday 1.7 Socket::uninitializeInterface();
|
173 mike 1.2 }
174
|
175 mday 1.7 void HTTPAcceptor::handleEnqueue(Message *message)
|
176 mike 1.2 {
|
177 mday 1.7 if (! message)
178 return;
|
179 david.dillard 1.64
|
180 konrad.r 1.68 PEGASUS_ASSERT(_rep != 0);
|
181 mday 1.7 switch (message->getType())
182 {
|
183 kamal.locahana 1.88.6.1 case SOCKET_MESSAGE:
184 {
185 SocketMessage* socketMessage = (SocketMessage*)message;
|
186 david.dillard 1.64
|
187 kamal.locahana 1.88.6.1 // If this is a connection request:
|
188 h.sterling 1.63
|
189 kamal.locahana 1.88.6.1 if (socketMessage->socket == _rep->socket &&
190 socketMessage->events & SocketMessage::READ)
191 {
192 _acceptConnection();
193 }
194 else
195 {
196 // ATTN! this can't happen!
197 Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,
198 "HTTPAcceptor::handleEnqueue: Invalid SOCKET_MESSAGE received.");
199 }
|
200 mday 1.7
|
201 kamal.locahana 1.88.6.1 break;
202 }
|
203 mday 1.7
|
204 kamal.locahana 1.88.6.1 // Added for NamedPipe implementation for windows
|
205 kamal.locahana 1.88.6.3 #if defined (PEGASUS_OS_TYPE_WINDOWS) &&\
206 !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
|
207 kamal.locahana 1.88.6.1 case NAMEDPIPE_MESSAGE:
208 {
209 NamedPipeMessage* namedPipeMessage = (NamedPipeMessage*)message;
|
210 h.sterling 1.63
|
211 kamal.locahana 1.88.6.1 if (((namedPipeMessage->namedPipe.getPipe()) == ( _rep->namedPipeServer->getPipe())) &&
212 (namedPipeMessage->events & NamedPipeMessage::READ))
213 {
214 _acceptNamedPipeConnection();
215 }
216 else
217 {
218 // ATTN! this can't happen!
219 Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,
220 "HTTPAcceptor::handleEnqueue: Invalid NAMEDPIPE_MESSAGE received.");
221 }
222 break;
223 }
224 #endif
|
225 david.dillard 1.64
|
226 kamal.locahana 1.88.6.1 case CLOSE_CONNECTION_MESSAGE:
227 {
228 CloseConnectionMessage* closeConnectionMessage
229 = (CloseConnectionMessage*)message;
|
230 mday 1.7
|
231 kamal.locahana 1.88.6.1 AutoMutex autoMut(_rep->_connection_mut);
232
233 for (Uint32 i = 0, n = _rep->connections.size(); i < n; i++)
|
234 h.sterling 1.63 {
|
235 kamal.locahana 1.88.6.1 HTTPConnection* connection = _rep->connections[i];
236 // Added for NamedPipe implementation for windows
|
237 kamal.locahana 1.88.6.3 #if defined (PEGASUS_OS_TYPE_WINDOWS) &&\
238 !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
|
239 kamal.locahana 1.88.6.1 if(!connection->isNamedPipeConnection())
240 {
241 #endif
242
243 SocketHandle socket = connection->getSocket();
244
245 if (socket == closeConnectionMessage->socket)
246 {
247 _monitor->unsolicitSocketMessages(socket);
248 _rep->connections.remove(i);
249 delete connection;
250 break;
251 }
252 // Added for NamedPipe implementation for windows
|
253 kamal.locahana 1.88.6.3 #if defined (PEGASUS_OS_TYPE_WINDOWS) &&\
254 !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
|
255 kamal.locahana 1.88.6.1 }
256 else
257 {
258 NamedPipe namedPipe = connection->getNamedPipe();
259 //NamedPipeMessage* namedPipeMessage = (NamedPipeMessage*)message;
260
261 if (namedPipe.getPipe() == closeConnectionMessage->namedPipe.getPipe())
262 {
263 _monitor->unsolicitPipeMessages(namedPipe);
264 _rep->connections.remove(i);
265 delete connection;
266 break;
267 }
268 }
269 #endif
|
270 david.dillard 1.64
|
271 kamal.locahana 1.88.6.1 }
|
272 mike 1.2
|
273 kamal.locahana 1.88.6.1 break;
274 }
|
275 mike 1.2
|
276 kamal.locahana 1.88.6.1 default:
277 // ATTN: need unexpected message error!
278 Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,
279 "HTTPAcceptor::handleEnqueue: Invalid MESSAGE received.");
280 break;
281 };
282
283 delete message;
|
284 mday 1.7 }
|
285 mike 1.2
286
|
287 mday 1.7 void HTTPAcceptor::handleEnqueue()
288 {
289 Message* message = dequeue();
|
290 mike 1.2
|
291 mday 1.7 if (!message)
|
292 kumpf 1.44 {
293 Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,
294 "HTTPAcceptor::handleEnqueue(): No message on queue.");
|
295 mday 1.7 return;
|
296 kumpf 1.44 }
|
297 david.dillard 1.64
|
298 mday 1.7 handleEnqueue(message);
|
299 mike 1.2
300 }
301
|
302 kumpf 1.25 void HTTPAcceptor::bind()
|
303 mike 1.2 {
|
304 humberto 1.30 if (_rep){
|
305 h.sterling 1.63 //l10n
|
306 david.dillard 1.64 //throw BindFailedException("HTTPAcceptor already bound");
|
307 humberto 1.34
|
308 humberto 1.30 MessageLoaderParms parms("Common.HTTPAcceptor.ALREADY_BOUND",
|
309 h.sterling 1.63 "HTTPAcceptor already bound");
|
310 humberto 1.34
|
311 kumpf 1.44 Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,
312 "HTTPAcceptor::bind: HTTPAcceptor already bound.");
|
313 humberto 1.30 throw BindFailedException(parms);
314 }
|
315 mike 1.2
|
316 kumpf 1.25 _rep = new HTTPAcceptorRep(_localConnection);
|
317 mike 1.2
|
318 mday 1.7 // bind address
319 _bind();
|
320 mike 1.2
|
321 mday 1.7 return;
|
322 mike 1.2 }
323
324 /**
|
325 mday 1.7 _bind - creates a new server socket and bind socket to the port address.
|
326 h.sterling 1.63 If PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET is not defined, the port number is ignored and
|
327 kumpf 1.11 a domain socket is bound.
|
328 mike 1.2 */
329 void HTTPAcceptor::_bind()
330 {
331
|
332 konrad.r 1.68 PEGASUS_ASSERT(_rep != 0);
|
333 mday 1.7 // Create address:
|
334 mike 1.2
|
335 kamal.locahana 1.88.6.1 #if defined PEGASUS_OS_TYPE_WINDOWS
336 if (!_localConnection)
337 {
338 #endif
|
339 kumpf 1.6
|
340 kamal.locahana 1.88.6.1 memset(_rep->address, 0, sizeof(*_rep->address));
341 #if defined PEGASUS_OS_TYPE_WINDOWS
342 }
343 #endif
|
344 kumpf 1.25 if (_localConnection)
345 {
|
346 kamal.locahana 1.88.6.1 // Added for NamedPipe implementation for windows
|
347 h.sterling 1.63 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
|
348 kamal.locahana 1.88.6.1 # ifdef PEGASUS_OS_TYPE_WINDOWS
349 # ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
350 {
351 AutoMutex automut(Monitor::_cout_mut);
352 PEGASUS_STD(cout) << "in HTTPAcceptor::_bind before calling _createNamedPipe() "
353 << PEGASUS_STD(endl);
354 }
355 # endif
356 _createNamedPipe();
357 # ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
358 {
359 AutoMutex automut(Monitor::_cout_mut);
360 PEGASUS_STD(cout) << "in HTTPAcceptor::_bind after calling _createNamedPipe() " << PEGASUS_STD(endl);
361 }
362 # endif
363 return;
364 # else // Other than Windows platform
365
|
366 kumpf 1.25 reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_family =
367 AF_UNIX;
368 strcpy(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path,
369 PEGASUS_LOCAL_DOMAIN_SOCKET_PATH);
|
370 chuck 1.38 #ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM
371 AtoE(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);
372 #endif
|
373 kumpf 1.25 ::unlink(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);
|
374 kamal.locahana 1.88.6.1 # endif
|
375 kumpf 1.6 #else
|
376 kumpf 1.25 PEGASUS_ASSERT(false);
|
377 kumpf 1.11 #endif
|
378 kumpf 1.25 }
379 else
380 {
381 reinterpret_cast<struct sockaddr_in*>(_rep->address)->sin_addr.s_addr =
382 INADDR_ANY;
383 reinterpret_cast<struct sockaddr_in*>(_rep->address)->sin_family =
384 AF_INET;
385 reinterpret_cast<struct sockaddr_in*>(_rep->address)->sin_port =
386 htons(_portNumber);
387 }
|
388 mike 1.2
|
389 mday 1.7 // Create socket:
|
390 david.dillard 1.64
|
391 kumpf 1.25 if (_localConnection)
392 {
|
393 thilo.boehm 1.88 _rep->socket = Socket::createSocket(AF_UNIX, SOCK_STREAM, 0);
|
394 kumpf 1.25 }
395 else
396 {
|
397 thilo.boehm 1.88 _rep->socket = Socket::createSocket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
|
398 mike 1.79
|
399 kumpf 1.25 }
|
400 mike 1.2
|
401 mday 1.7 if (_rep->socket < 0)
402 {
403 delete _rep;
404 _rep = 0;
|
405 humberto 1.30 //l10n
406 //throw BindFailedException("Failed to create socket");
407 MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_CREATE_SOCKET",
|
408 h.sterling 1.63 "Failed to create socket");
|
409 kumpf 1.44 Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,
410 "HTTPAcceptor::_bind _rep->socket < 0");
|
411 humberto 1.30 throw BindFailedException(parms);
|
412 mday 1.7 }
413
|
414 mday 1.28
415 // set the close-on-exec bit for this file handle.
|
416 david.dillard 1.64 // any unix that forks needs this bit set.
|
417 david.dillard 1.78 #if !defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_OS_VMS)
|
418 mday 1.28 int sock_flags;
419 if( (sock_flags = fcntl(_rep->socket, F_GETFD, 0)) < 0)
420 {
|
421 kumpf 1.44 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
422 "HTTPAcceptor::_bind: fcntl(F_GETFD) failed");
|
423 mday 1.28 }
424 else
425 {
426 sock_flags |= FD_CLOEXEC;
427 if (fcntl(_rep->socket, F_SETFD, sock_flags) < 0)
428 {
|
429 kumpf 1.44 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
430 "HTTPAcceptor::_bind: fcntl(F_SETFD) failed");
|
431 mday 1.28 }
432 }
|
433 david.dillard 1.64 #endif
|
434 mday 1.28
435
|
436 mday 1.7 //
437 // Set the socket option SO_REUSEADDR to reuse the socket address so
438 // that we can rebind to a new socket using the same address when we
439 // need to resume the cimom as a result of a timeout during a Shutdown
440 // operation.
441 //
442 int opt=1;
443 if (setsockopt(_rep->socket, SOL_SOCKET, SO_REUSEADDR,
|
444 h.sterling 1.63 (char *)&opt, sizeof(opt)) < 0)
|
445 mday 1.7 {
|
446 mday 1.28 Socket::close(_rep->socket);
|
447 mday 1.7 delete _rep;
448 _rep = 0;
|
449 humberto 1.30 //l10n
450 //throw BindFailedException("Failed to set socket option");
451 MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_SET_SOCKET_OPTION",
|
452 h.sterling 1.63 "Failed to set socket option");
|
453 kumpf 1.44 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
454 "HTTPAcceptor::_bind: Failed to set socket option.");
|
455 humberto 1.30 throw BindFailedException(parms);
|
456 mday 1.7 }
457
|
458 david.dillard 1.64
459 //
|
460 mday 1.7 // Bind socket to port:
|
461 david.dillard 1.64 //
|
462 kumpf 1.25 if (::bind(_rep->socket, _rep->address, _rep->address_size) < 0)
|
463 mday 1.7 {
464 Socket::close(_rep->socket);
465 delete _rep;
466 _rep = 0;
|
467 humberto 1.30 //l10n
468 //throw BindFailedException("Failed to bind socket");
469 MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_BIND_SOCKET",
|
470 h.sterling 1.63 "Failed to bind socket");
|
471 kumpf 1.44 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
472 "HTTPAcceptor::_bind: Failed to bind socket.");
|
473 humberto 1.30 throw BindFailedException(parms);
|
474 mday 1.7 }
475
|
476 david.dillard 1.64
477 //
478 // Get the actual port value used if the caller specified a port value of 0.
479 //
480 if ( _portNumber == 0 )
481 {
482 sockaddr_in buf;
|
483 mike 1.83 SocketLength bufSize = sizeof(buf);
|
484 david.dillard 1.64 if ( getsockname(_rep->socket, reinterpret_cast<sockaddr *>(&buf), &bufSize) == 0 )
485 {
486 _portNumber = ntohs(buf.sin_port);
487 }
488 }
489
490
|
491 w.otsuka 1.54 //
492 // Change permissions on Linux local domain socket to allow writes by others.
493 //
|
494 h.sterling 1.63 #if !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET) && defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU)
|
495 w.otsuka 1.54 if (_localConnection)
496 {
|
497 david.dillard 1.64 if (::chmod( PEGASUS_LOCAL_DOMAIN_SOCKET_PATH,
498 S_IRUSR | S_IWUSR | S_IXUSR |
|
499 w.otsuka 1.54 S_IRGRP | S_IWGRP | S_IXGRP |
500 S_IROTH | S_IWOTH | S_IXOTH ) < 0 )
501 {
502 Socket::close(_rep->socket);
503 delete _rep;
504 _rep = 0;
505 //l10n
506 //throw BindFailedException("Failed to bind socket");
507 MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_BIND_SOCKET",
|
508 h.sterling 1.63 "Failed to bind socket");
|
509 w.otsuka 1.54 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
510 "HTTPAcceptor::_bind: Failed to set domain socket permissions.");
511 throw BindFailedException(parms);
512 }
513 }
514 #endif
515
|
516 kumpf 1.11 // Set up listening on the given socket:
|
517 mday 1.7
|
518 a.arora 1.51 //int const MAX_CONNECTION_QUEUE_LENGTH = 15;
|
519 mday 1.7
520 if (listen(_rep->socket, MAX_CONNECTION_QUEUE_LENGTH) < 0)
521 {
522 Socket::close(_rep->socket);
523 delete _rep;
524 _rep = 0;
|
525 humberto 1.30 //l10n
526 //throw BindFailedException("Failed to bind socket");
527 MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_BIND_SOCKET",
|
528 h.sterling 1.63 "Failed to bind socket");
|
529 kumpf 1.44 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
530 "HTTPAcceptor::_bind: Failed to bind socket(1).");
|
531 humberto 1.30 throw BindFailedException(parms);
|
532 mday 1.7 }
533
534 // Register to receive SocketMessages on this socket:
535
|
536 mday 1.21 if ( -1 == ( _entry_index = _monitor->solicitSocketMessages(
|
537 h.sterling 1.63 _rep->socket,
538 SocketMessage::READ | SocketMessage::EXCEPTION,
|
539 david.dillard 1.64 getQueueId(),
|
540 h.sterling 1.63 Monitor::ACCEPTOR)))
|
541 mday 1.7 {
542 Socket::close(_rep->socket);
543 delete _rep;
544 _rep = 0;
|
545 humberto 1.30 //l10n
546 //throw BindFailedException("Failed to solicit socket messaeges");
547 MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_SOLICIT_SOCKET_MESSAGES",
|
548 h.sterling 1.63 "Failed to solicit socket messaeges");
|
549 kumpf 1.44 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
550 "HTTPAcceptor::_bind: Failed to solicit socket messages(2).");
|
551 humberto 1.30 throw BindFailedException(parms);
|
552 mday 1.7 }
|
553 mike 1.2 }
554
555 /**
|
556 mday 1.7 closeConnectionSocket - close the server listening socket to disallow
557 new client connections.
|
558 mike 1.2 */
559 void HTTPAcceptor::closeConnectionSocket()
560 {
|
561 mday 1.7 if (_rep)
562 {
563 // unregister the socket
|
564 kumpf 1.35
565 // ATTN - comment out - see CIMServer::stopClientConnection()
566 //_monitor->unsolicitSocketMessages(_rep->socket);
|
567 mday 1.7
568 // close the socket
569 Socket::close(_rep->socket);
|
570 j.alex 1.67 // Unlink Local Domain Socket Bug# 3312
571 if (_localConnection)
572 {
|
573 kamal.locahana 1.88.6.1 #ifndef PEGASUS_OS_TYPE_WINDOWS
574 # ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
|
575 denise.eckstein 1.71 PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2,
|
576 j.alex 1.67 "HTTPAcceptor::closeConnectionSocket Unlinking local connection." );
577 ::unlink(
578 reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);
|
579 kamal.locahana 1.88.6.1 # else
|
580 j.alex 1.67 PEGASUS_ASSERT(false);
|
581 kamal.locahana 1.88.6.1 # endif
|
582 j.alex 1.67 #endif
583 }
584
|
585 mday 1.7 }
|
586 kumpf 1.44 else
587 {
588 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
589 "HTTPAcceptor::closeConnectionSocket failure _rep is null." );
590 }
|
591 mike 1.2 }
592
593 /**
|
594 mday 1.7 reopenConnectionSocket - creates a new server socket.
|
595 mike 1.2 */
596 void HTTPAcceptor::reopenConnectionSocket()
597 {
|
598 mday 1.7 if (_rep)
599 {
600 _bind();
601 }
|
602 kumpf 1.44 else
603 {
604 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
605 "HTTPAcceptor::reopenConnectionSocket failure _rep is null." );
606 }
|
607 mike 1.2 }
608
|
609 thilo.boehm 1.88
610 /**
611 reconnectConnectionSocket - creates a new server socket.
612 */
613 void HTTPAcceptor::reconnectConnectionSocket()
614 {
615 if (_rep)
|
616 kamal.locahana 1.88.6.1 {
|
617 thilo.boehm 1.88 // unregister the socket
618 _monitor->unsolicitSocketMessages(_rep->socket);
619 // close the socket
620 Socket::close(_rep->socket);
621 // Unlink Local Domain Socket Bug# 3312
622 if (_localConnection)
623 {
|
624 kamal.locahana 1.88.6.1
625 #ifndef PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
|
626 thilo.boehm 1.88 PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2,
627 "HTTPAcceptor::reconnectConnectionSocket Unlinking local connection." );
628 ::unlink(
629 reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);
630 #else
631 PEGASUS_ASSERT(false);
632 #endif
|
633 kamal.locahana 1.88.6.1
|
634 thilo.boehm 1.88 }
635 // open the socket
636 _bind();
637 }
638 else
639 {
640 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
641 "HTTPAcceptor::reconnectConnectionSocket failure _rep is null." );
642 }
643 }
644
|
645 mike 1.2 /**
|
646 mday 1.7 getOutstandingRequestCount - returns the number of outstanding requests.
|
647 mike 1.2 */
|
648 david.dillard 1.64 Uint32 HTTPAcceptor::getOutstandingRequestCount() const
|
649 mike 1.2 {
|
650 mday 1.28 Uint32 count = 0;
|
651 konrad.r 1.68 if (_rep)
|
652 mday 1.7 {
|
653 konrad.r 1.68 AutoMutex autoMut(_rep->_connection_mut);
654 if (_rep->connections.size() > 0)
655 {
656 HTTPConnection* connection = _rep->connections[0];
657 count = connection->getRequestCount();
658 }
|
659 mday 1.7 }
|
660 mday 1.28 return count;
|
661 mike 1.2 }
662
|
663 david.dillard 1.64
664 /**
665 getPortNumber - returns the port number used for the connection
666 */
667 Uint32 HTTPAcceptor::getPortNumber() const
668 {
669 return _portNumber;
670 }
671
|
672 marek 1.84 void HTTPAcceptor::setSocketWriteTimeout(Uint32 socketWriteTimeout)
673 {
674 _socketWriteTimeout = socketWriteTimeout;
675 }
676
|
677 mike 1.2 void HTTPAcceptor::unbind()
678 {
|
679 mday 1.7 if (_rep)
680 {
|
681 david.dillard 1.64 _portNumber = 0;
|
682 mday 1.7 Socket::close(_rep->socket);
|
683 kumpf 1.25
684 if (_localConnection)
685 {
|
686 h.sterling 1.63 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
|
687 kamal.locahana 1.88.6.1 # ifndef PEGASUS_OS_TYPE_WINDOWS
|
688 kumpf 1.25 ::unlink(
689 reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);
|
690 kamal.locahana 1.88.6.1 # endif
|
691 kumpf 1.25 #else
692 PEGASUS_ASSERT(false);
693 #endif
694 }
|
695 kamal.locahana 1.88.6.3 #if defined (PEGASUS_OS_TYPE_WINDOWS) &&\
696 !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
|
697 kamal.locahana 1.88.6.1 if (!_localConnection)
698 {
699 #endif
|
700 mday 1.7 delete _rep;
|
701 kamal.locahana 1.88.6.3 #if defined (PEGASUS_OS_TYPE_WINDOWS) &&\
702 !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
|
703 kamal.locahana 1.88.6.1 }
704 #endif
|
705 mday 1.7 _rep = 0;
706 }
|
707 kumpf 1.44 else
708 {
709 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
710 "HTTPAcceptor::unbind failure _rep is null." );
711 }
|
712 mike 1.2 }
713
714 void HTTPAcceptor::destroyConnections()
715 {
|
716 konrad.r 1.68 if (_rep)
717 {
718 // For each connection created by this object:
|
719 mday 1.28
|
720 konrad.r 1.68 AutoMutex autoMut(_rep->_connection_mut);
721 for (Uint32 i = 0, n = _rep->connections.size(); i < n; i++)
722 {
723 HTTPConnection* connection = _rep->connections[i];
|
724 kamal.locahana 1.88.6.1 // Added for NamedPipe implementation for windows
|
725 kamal.locahana 1.88.6.3 #if defined (PEGASUS_OS_TYPE_WINDOWS) &&\
726 !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
|
727 kamal.locahana 1.88.6.1 if(!connection->isNamedPipeConnection())
728 {
729 #endif
|
730 mike 1.82 SocketHandle socket = connection->getSocket();
|
731 mike 1.2
|
732 konrad.r 1.68 // Unsolicit SocketMessages:
|
733 mike 1.2
|
734 konrad.r 1.68 _monitor->unsolicitSocketMessages(socket);
|
735 mike 1.2
|
736 kamal.locahana 1.88.6.1 // Added for NamedPipe implementation for windows
|
737 konrad.r 1.68 // Destroy the connection (causing it to close):
|
738 kamal.locahana 1.88.6.3 #if defined (PEGASUS_OS_TYPE_WINDOWS) &&\
739 !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
|
740 kamal.locahana 1.88.6.1 }
741 else
742 {
743 NamedPipe namedPipe = connection->getNamedPipe();
744 _monitor->unsolicitPipeMessages(namedPipe);
745 }
746 #endif
|
747 mike 1.75 while (connection->refcount.get()) { }
|
748 konrad.r 1.68 delete connection;
749 }
|
750 mike 1.2
|
751 konrad.r 1.68 _rep->connections.clear();
|
752 mday 1.7 }
|
753 mike 1.2 }
754
755 void HTTPAcceptor::_acceptConnection()
756 {
|
757 mday 1.7 // This function cannot be called on an invalid socket!
|
758 mike 1.2
|
759 mday 1.7 PEGASUS_ASSERT(_rep != 0);
|
760 mike 1.2
|
761 mday 1.7 // Accept the connection (populate the address):
|
762 mike 1.2
|
763 kumpf 1.25 struct sockaddr* accept_address;
|
764 mike 1.83 SocketLength address_size;
|
765 mike 1.2
|
766 kumpf 1.25 if (_localConnection)
767 {
|
768 kamal.locahana 1.88.6.1 #ifndef PEGASUS_OS_TYPE_WINDOWS
|
769 h.sterling 1.63 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
|
770 kumpf 1.25 accept_address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_un);
771 address_size = sizeof(struct sockaddr_un);
|
772 mike 1.2 #else
|
773 kumpf 1.25 PEGASUS_ASSERT(false);
|
774 mike 1.2 #endif
|
775 kamal.locahana 1.88.6.1 #endif
|
776 kumpf 1.25 }
777 else
778 {
779 accept_address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_in);
780 address_size = sizeof(struct sockaddr_in);
781 }
782
|
783 mike 1.82 SocketHandle socket = accept(_rep->socket, accept_address, &address_size);
|
784 kumpf 1.25
|
785 thilo.boehm 1.88 if (socket == PEGASUS_SOCKET_ERROR)
|
786 mday 1.7 {
|
787 thilo.boehm 1.88 // the remote connection is invalid, destroy client address.
788 delete accept_address;
|
789 mday 1.36
|
790 thilo.boehm 1.88 // TCPIP is down reconnect this acceptor
791 if(getSocketError() == PEGASUS_NETWORK_TCPIP_STOPPED)
792 {
|
793 kamal.locahana 1.88.6.1
|
794 thilo.boehm 1.88 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
795 "Socket has an IO error. TCP/IP down. Try to reconnect." );
796
797 reconnectConnectionSocket();
|
798 kamal.locahana 1.88.6.1
|
799 thilo.boehm 1.88 return;
800 }
|
801 david 1.27 Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
|
802 h.sterling 1.63 "HTTPAcceptor - accept() failure. errno: $0"
803 ,errno);
|
804 david 1.27
|
805 kumpf 1.44 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
|
806 kumpf 1.19 "HTTPAcceptor: accept() failed");
|
807 mday 1.7 return;
808 }
|
809 david 1.27
|
810 kumpf 1.87 String ipAddress;
811
812 if (_localConnection)
813 {
814 ipAddress = "localhost";
815 }
816 else
817 {
818 unsigned char* sa = reinterpret_cast<unsigned char*>(
819 &reinterpret_cast<struct sockaddr_in*>(
820 accept_address)->sin_addr.s_addr);
821 char ipBuffer[32];
822 sprintf(ipBuffer, "%u.%u.%u.%u", sa[0], sa[1], sa[2], sa[3]);
823 ipAddress = ipBuffer;
824 }
825
826 delete accept_address;
827
|
828 david.dillard 1.64 // set the close on exec flag
|
829 david.dillard 1.78 #if !defined(PEGASUS_OS_TYPE_WINDOWS) && !defined(PEGASUS_OS_VMS)
|
830 mday 1.28 int sock_flags;
831 if( (sock_flags = fcntl(socket, F_GETFD, 0)) < 0)
832 {
|
833 kumpf 1.44 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
|
834 mday 1.28 "HTTPAcceptor: fcntl(F_GETFD) failed");
835 }
836 else
837 {
838 sock_flags |= FD_CLOEXEC;
839 if (fcntl(socket, F_SETFD, sock_flags) < 0)
840 {
|
841 kumpf 1.44 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
|
842 mday 1.28 "HTTPAcceptor: fcntl(F_SETFD) failed");
843 }
844 }
|
845 david.dillard 1.64 #endif
|
846 mday 1.28
847
|
848 mike 1.76 PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER, 0,
849 "HTTPAcceptor - accept() success. Socket: $1" ,socket));
|
850 mike 1.2
|
851 kumpf 1.72 AutoPtr<MP_Socket> mp_socket(new MP_Socket(
|
852 sushma.fernandes 1.86 socket, _sslcontext, _sslContextObjectLock));
|
853 mike 1.2
|
854 marek 1.84 mp_socket->setSocketWriteTimeout(_socketWriteTimeout);
855
|
856 kumpf 1.72 // Perform the SSL handshake, if applicable. Make the socket non-blocking
857 // for this operation so we can send it back to the Monitor's select() loop
858 // if it takes a while.
859
860 mp_socket->disableBlocking();
861 Sint32 socketAcceptStatus = mp_socket->accept();
862 mp_socket->enableBlocking();
|
863 nag.boranna 1.59
|
864 kumpf 1.72 if (socketAcceptStatus < 0)
|
865 kumpf 1.19 {
|
866 nag.boranna 1.61 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
|
867 kumpf 1.19 "HTTPAcceptor: SSL_accept() failed");
|
868 nag.boranna 1.61 mp_socket->close();
869 return;
|
870 mday 1.7 }
|
871 mike 1.2
|
872 kumpf 1.72 // Create a new connection and add it to the connection list:
873
|
874 david.dillard 1.64 HTTPConnection* connection = new HTTPConnection(_monitor, mp_socket,
|
875 kumpf 1.87 ipAddress, this, static_cast<MessageQueue *>(_outputMessageQueue));
|
876 mike 1.2
|
877 kumpf 1.72 if (socketAcceptStatus == 0)
878 {
879 PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2,
880 "HTTPAcceptor: SSL_accept() pending");
881 connection->_acceptPending = true;
882 }
883
|
884 mday 1.7 // Solicit events on this new connection's socket:
|
885 mday 1.21 int index;
|
886 david.dillard 1.64
|
887 mday 1.22 if (-1 == (index = _monitor->solicitSocketMessages(
|
888 h.sterling 1.63 connection->getSocket(),
889 SocketMessage::READ | SocketMessage::EXCEPTION,
890 connection->getQueueId(), Monitor::CONNECTION)) )
|
891 mday 1.7 {
|
892 kumpf 1.37 // ATTN-DE-P2-2003100503::TODO::Need to enhance code to return
893 // an error message to Client application.
|
894 kumpf 1.44 Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,
895 "HTTPAcceptor::_acceptConnection: Attempt to allocate entry in _entries table failed.");
|
896 mday 1.7 delete connection;
897 Socket::close(socket);
|
898 kumpf 1.37 return;
|
899 mday 1.7 }
|
900 a.arora 1.48
|
901 mday 1.7 // Save the socket for cleanup later:
|
902 mday 1.21 connection->_entry_index = index;
|
903 a.arora 1.50 AutoMutex autoMut(_rep->_connection_mut);
|
904 mday 1.7 _rep->connections.append(connection);
|
905 mike 1.2 }
|
906 kamal.locahana 1.88.6.1 // Added for NamedPipe implementation for windows
|
907 kamal.locahana 1.88.6.3 #if defined (PEGASUS_OS_TYPE_WINDOWS) &&\
908 !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET)
|
909 kamal.locahana 1.88.6.1 void HTTPAcceptor::_createNamedPipe()
910 {
911 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
912 {
913 AutoMutex automut(Monitor::_cout_mut);
914 PEGASUS_STD(cout) << "Entering HTTPAcceptor::_createNamedPipe()." << PEGASUS_STD(endl);
915 }
916 #endif
917 _rep->namedPipeServer = new NamedPipeServer(PEGASUS_NAMEDPIPE_PATH);
918 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
919 {
920 AutoMutex automut(Monitor::_cout_mut);
921 PEGASUS_STD(cout) << "in HTTPAcceptor::_createNamedPipe() after calling the pipe server constructor" << PEGASUS_STD(endl);
922 }
923
924 {
925 AutoMutex automut(Monitor::_cout_mut);
926 cout << "Named pipe...in _createNamedPipe..." << _rep->namedPipeServer->getPipe() << endl;
927 }
928 #endif
929 // Register to receive Messages on Connection pipe:
930 kamal.locahana 1.88.6.1
931 if ( -1 == ( _entry_index = _monitor->solicitPipeMessages(
932 *_rep->namedPipeServer,
933 NamedPipeMessage::READ | NamedPipeMessage::EXCEPTION,
934 getQueueId(),
935 Monitor::ACCEPTOR)))
936 {
937 ::CloseHandle(_rep->namedPipeServer->getPipe());
938 delete _rep;
939 _rep = 0;
940 //l10n
941 MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_SOLICIT_SOCKET_MESSAGES",
942 "Failed to solicit socket messaeges");
943 PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
944 "HTTPAcceptor::_bind: Failed to solicit pipe messages(2).");
945 throw BindFailedException(parms);
946 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
947 {
948 AutoMutex automut(Monitor::_cout_mut); //added
949 PEGASUS_STD(cout) << "in HTTPAcceptor::_createNamedPipe() _monitor->solicitSocketMessages failed"
950 << PEGASUS_STD(endl);
951 kamal.locahana 1.88.6.1 }
952 #endif
953 }
954 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
955 {
956 AutoMutex automut(Monitor::_cout_mut);
957 PEGASUS_STD(cout) << "Leaving HTTPAcceptor::_createNamedPipe()." << PEGASUS_STD(endl);
958 }
959 #endif
960 return;
961 }
962
963 void HTTPAcceptor::_acceptNamedPipeConnection()
964 {
965 PEGASUS_ASSERT(_rep != 0);
966
967 if (!_rep)
968 return;
969 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
970 {
971 AutoMutex automut(Monitor::_cout_mut);
972 kamal.locahana 1.88.6.1 cout <<"In HTTPAcceptor::_acceptNamedPipeConnection " << endl;
973 }
974 #endif
975
976
|
977 kamal.locahana 1.88.6.2 NamedPipeServerEndPoint nPSEndPoint = _rep->namedPipeServer->accept();
|
978 kamal.locahana 1.88.6.1 // Register to receive Messages on Connection pipe:
979 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
980 {
981 AutoMutex automut(Monitor::_cout_mut);
982 cout << " In _acceptNamedPipeConnection -- after calling namedPipeServer->accept()" << endl;
983 }
984 #endif
985 HTTPConnection* connection = new HTTPConnection(_monitor, nPSEndPoint,
986 this, static_cast<MessageQueue *>(_outputMessageQueue),false);
987
988 // Solicit events on this new connection's socket:
989 int index;
990 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
991 {
992 AutoMutex automut(Monitor::_cout_mut);
993 cout << endl << connection->getNamedPipe().getName() << " has a this as a QueueID " <<
994 connection->getQueueId() << endl;
995 }
996 #endif
997 if (-1 == (index = _monitor->solicitPipeMessages(
998 connection->getNamedPipe(),
999 kamal.locahana 1.88.6.1 NamedPipeMessage::READ | NamedPipeMessage::EXCEPTION,
1000 connection->getQueueId(), Monitor::ACCEPTOR)) )
1001 {
1002 // ATTN-DE-P2-2003100503::TODO::Need to enhance code to return
1003 // an error message to Client application.
1004 Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,
1005 "HTTPAcceptor::_acceptPipeConnection: Attempt to allocate entry in _entries table failed.");
1006 delete connection;
1007 return;
1008 }
1009
1010 // Save the socket for cleanup later:
1011 connection->_entry_index = index;
1012 AutoMutex autoMut(_rep->_connection_mut);
1013 _rep->connections.append(connection);
1014 #ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG
1015 {
1016 AutoMutex automut(Monitor::_cout_mut);
1017 PEGASUS_STD(cout)
1018 << "in HTTPAcceptor::_acceptNamedPipeConnection() at the end" << PEGASUS_STD(endl);
1019 }
1020 kamal.locahana 1.88.6.1 #endif
1021 }
1022 #endif
|
1023 mday 1.32
|
1024 mike 1.2 PEGASUS_NAMESPACE_END
|