version 1.88, 2006/10/04 11:20:36
|
version 1.88.6.2, 2006/12/18 15:38:34
|
|
|
{ | { |
if (local) | if (local) |
{ | { |
|
#ifndef PEGASUS_OS_TYPE_WINDOWS |
|
|
#ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET | #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET |
address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_un); | address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_un); |
address_size = sizeof(struct sockaddr_un); | address_size = sizeof(struct sockaddr_un); |
#else | #else |
PEGASUS_ASSERT(false); | PEGASUS_ASSERT(false); |
#endif | #endif |
|
#endif |
} | } |
else | else |
{ | { |
|
|
Mutex _connection_mut; | Mutex _connection_mut; |
| |
SocketHandle socket; | SocketHandle socket; |
|
// Added for NamedPipe implementation for windows |
|
#if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET) |
|
NamedPipeServer* namedPipeServer; |
|
#endif |
|
|
Array<HTTPConnection*> connections; | Array<HTTPConnection*> connections; |
}; | }; |
| |
|
|
break; | break; |
} | } |
| |
|
// Added for NamedPipe implementation for windows |
|
#if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET) |
|
case NAMEDPIPE_MESSAGE: |
|
{ |
|
NamedPipeMessage* namedPipeMessage = (NamedPipeMessage*)message; |
|
|
|
if (((namedPipeMessage->namedPipe.getPipe()) == ( _rep->namedPipeServer->getPipe())) && |
|
(namedPipeMessage->events & NamedPipeMessage::READ)) |
|
{ |
|
_acceptNamedPipeConnection(); |
|
} |
|
else |
|
{ |
|
// ATTN! this can't happen! |
|
Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
|
"HTTPAcceptor::handleEnqueue: Invalid NAMEDPIPE_MESSAGE received."); |
|
} |
|
break; |
|
} |
|
#endif |
|
|
case CLOSE_CONNECTION_MESSAGE: | case CLOSE_CONNECTION_MESSAGE: |
{ | { |
CloseConnectionMessage* closeConnectionMessage | CloseConnectionMessage* closeConnectionMessage |
|
|
for (Uint32 i = 0, n = _rep->connections.size(); i < n; i++) | for (Uint32 i = 0, n = _rep->connections.size(); i < n; i++) |
{ | { |
HTTPConnection* connection = _rep->connections[i]; | HTTPConnection* connection = _rep->connections[i]; |
|
// Added for NamedPipe implementation for windows |
|
#if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET) |
|
if(!connection->isNamedPipeConnection()) |
|
{ |
|
#endif |
|
|
SocketHandle socket = connection->getSocket(); | SocketHandle socket = connection->getSocket(); |
| |
if (socket == closeConnectionMessage->socket) | if (socket == closeConnectionMessage->socket) |
|
|
delete connection; | delete connection; |
break; | break; |
} | } |
|
// Added for NamedPipe implementation for windows |
|
#if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET) |
|
} |
|
else |
|
{ |
|
NamedPipe namedPipe = connection->getNamedPipe(); |
|
//NamedPipeMessage* namedPipeMessage = (NamedPipeMessage*)message; |
|
|
|
if (namedPipe.getPipe() == closeConnectionMessage->namedPipe.getPipe()) |
|
{ |
|
_monitor->unsolicitPipeMessages(namedPipe); |
|
_rep->connections.remove(i); |
|
delete connection; |
|
break; |
|
} |
|
} |
|
#endif |
|
|
} | } |
| |
break; | break; |
|
|
PEGASUS_ASSERT(_rep != 0); | PEGASUS_ASSERT(_rep != 0); |
// Create address: | // Create address: |
| |
memset(_rep->address, 0, sizeof(*_rep->address)); |
#if defined PEGASUS_OS_TYPE_WINDOWS |
|
if (!_localConnection) |
|
{ |
|
#endif |
| |
|
memset(_rep->address, 0, sizeof(*_rep->address)); |
|
#if defined PEGASUS_OS_TYPE_WINDOWS |
|
} |
|
#endif |
if (_localConnection) | if (_localConnection) |
{ | { |
|
// Added for NamedPipe implementation for windows |
#ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET | #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET |
|
# ifdef PEGASUS_OS_TYPE_WINDOWS |
|
# ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG |
|
{ |
|
AutoMutex automut(Monitor::_cout_mut); |
|
PEGASUS_STD(cout) << "in HTTPAcceptor::_bind before calling _createNamedPipe() " |
|
<< PEGASUS_STD(endl); |
|
} |
|
# endif |
|
_createNamedPipe(); |
|
# ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG |
|
{ |
|
AutoMutex automut(Monitor::_cout_mut); |
|
PEGASUS_STD(cout) << "in HTTPAcceptor::_bind after calling _createNamedPipe() " << PEGASUS_STD(endl); |
|
} |
|
# endif |
|
return; |
|
# else // Other than Windows platform |
|
|
reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_family = | reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_family = |
AF_UNIX; | AF_UNIX; |
strcpy(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path, | strcpy(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path, |
|
|
AtoE(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path); | AtoE(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path); |
#endif | #endif |
::unlink(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path); | ::unlink(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path); |
|
# endif |
#else | #else |
PEGASUS_ASSERT(false); | PEGASUS_ASSERT(false); |
#endif | #endif |
|
|
// Unlink Local Domain Socket Bug# 3312 | // Unlink Local Domain Socket Bug# 3312 |
if (_localConnection) | if (_localConnection) |
{ | { |
|
#ifndef PEGASUS_OS_TYPE_WINDOWS |
#ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET | #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET |
PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2, | PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2, |
"HTTPAcceptor::closeConnectionSocket Unlinking local connection." ); | "HTTPAcceptor::closeConnectionSocket Unlinking local connection." ); |
|
|
#else | #else |
PEGASUS_ASSERT(false); | PEGASUS_ASSERT(false); |
#endif | #endif |
|
#endif |
} | } |
| |
} | } |
|
|
// Unlink Local Domain Socket Bug# 3312 | // Unlink Local Domain Socket Bug# 3312 |
if (_localConnection) | if (_localConnection) |
{ | { |
#ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET |
|
|
#ifndef PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET) |
PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2, | PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2, |
"HTTPAcceptor::reconnectConnectionSocket Unlinking local connection." ); | "HTTPAcceptor::reconnectConnectionSocket Unlinking local connection." ); |
::unlink( | ::unlink( |
|
|
#else | #else |
PEGASUS_ASSERT(false); | PEGASUS_ASSERT(false); |
#endif | #endif |
|
|
} | } |
// open the socket | // open the socket |
_bind(); | _bind(); |
|
|
if (_localConnection) | if (_localConnection) |
{ | { |
#ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET | #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET |
|
# ifndef PEGASUS_OS_TYPE_WINDOWS |
::unlink( | ::unlink( |
reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path); | reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path); |
|
# endif |
#else | #else |
PEGASUS_ASSERT(false); | PEGASUS_ASSERT(false); |
#endif | #endif |
} | } |
|
#if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET) |
|
if (!_localConnection) |
|
{ |
|
#endif |
delete _rep; | delete _rep; |
|
#if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET) |
|
} |
|
#endif |
_rep = 0; | _rep = 0; |
} | } |
else | else |
|
|
for (Uint32 i = 0, n = _rep->connections.size(); i < n; i++) | for (Uint32 i = 0, n = _rep->connections.size(); i < n; i++) |
{ | { |
HTTPConnection* connection = _rep->connections[i]; | HTTPConnection* connection = _rep->connections[i]; |
|
// Added for NamedPipe implementation for windows |
|
#if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET) |
|
if(!connection->isNamedPipeConnection()) |
|
{ |
|
#endif |
SocketHandle socket = connection->getSocket(); | SocketHandle socket = connection->getSocket(); |
| |
// Unsolicit SocketMessages: | // Unsolicit SocketMessages: |
| |
_monitor->unsolicitSocketMessages(socket); | _monitor->unsolicitSocketMessages(socket); |
| |
|
// Added for NamedPipe implementation for windows |
// Destroy the connection (causing it to close): | // Destroy the connection (causing it to close): |
|
#if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET) |
|
} |
|
else |
|
{ |
|
NamedPipe namedPipe = connection->getNamedPipe(); |
|
_monitor->unsolicitPipeMessages(namedPipe); |
|
} |
|
#endif |
while (connection->refcount.get()) { } | while (connection->refcount.get()) { } |
delete connection; | delete connection; |
} | } |
|
|
| |
if (_localConnection) | if (_localConnection) |
{ | { |
|
#ifndef PEGASUS_OS_TYPE_WINDOWS |
#ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET | #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET |
accept_address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_un); | accept_address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_un); |
address_size = sizeof(struct sockaddr_un); | address_size = sizeof(struct sockaddr_un); |
#else | #else |
PEGASUS_ASSERT(false); | PEGASUS_ASSERT(false); |
#endif | #endif |
|
#endif |
} | } |
else | else |
{ | { |
|
|
AutoMutex autoMut(_rep->_connection_mut); | AutoMutex autoMut(_rep->_connection_mut); |
_rep->connections.append(connection); | _rep->connections.append(connection); |
} | } |
|
// Added for NamedPipe implementation for windows |
|
#if defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET) |
|
void HTTPAcceptor::_createNamedPipe() |
|
{ |
|
#ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG |
|
{ |
|
AutoMutex automut(Monitor::_cout_mut); |
|
PEGASUS_STD(cout) << "Entering HTTPAcceptor::_createNamedPipe()." << PEGASUS_STD(endl); |
|
} |
|
#endif |
|
_rep->namedPipeServer = new NamedPipeServer(PEGASUS_NAMEDPIPE_PATH); |
|
#ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG |
|
{ |
|
AutoMutex automut(Monitor::_cout_mut); |
|
PEGASUS_STD(cout) << "in HTTPAcceptor::_createNamedPipe() after calling the pipe server constructor" << PEGASUS_STD(endl); |
|
} |
|
|
|
{ |
|
AutoMutex automut(Monitor::_cout_mut); |
|
cout << "Named pipe...in _createNamedPipe..." << _rep->namedPipeServer->getPipe() << endl; |
|
} |
|
#endif |
|
// Register to receive Messages on Connection pipe: |
|
|
|
if ( -1 == ( _entry_index = _monitor->solicitPipeMessages( |
|
*_rep->namedPipeServer, |
|
NamedPipeMessage::READ | NamedPipeMessage::EXCEPTION, |
|
getQueueId(), |
|
Monitor::ACCEPTOR))) |
|
{ |
|
::CloseHandle(_rep->namedPipeServer->getPipe()); |
|
delete _rep; |
|
_rep = 0; |
|
//l10n |
|
MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_SOLICIT_SOCKET_MESSAGES", |
|
"Failed to solicit socket messaeges"); |
|
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
|
"HTTPAcceptor::_bind: Failed to solicit pipe messages(2)."); |
|
throw BindFailedException(parms); |
|
#ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG |
|
{ |
|
AutoMutex automut(Monitor::_cout_mut); //added |
|
PEGASUS_STD(cout) << "in HTTPAcceptor::_createNamedPipe() _monitor->solicitSocketMessages failed" |
|
<< PEGASUS_STD(endl); |
|
} |
|
#endif |
|
} |
|
#ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG |
|
{ |
|
AutoMutex automut(Monitor::_cout_mut); |
|
PEGASUS_STD(cout) << "Leaving HTTPAcceptor::_createNamedPipe()." << PEGASUS_STD(endl); |
|
} |
|
#endif |
|
return; |
|
} |
|
|
|
void HTTPAcceptor::_acceptNamedPipeConnection() |
|
{ |
|
PEGASUS_ASSERT(_rep != 0); |
|
|
|
if (!_rep) |
|
return; |
|
#ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG |
|
{ |
|
AutoMutex automut(Monitor::_cout_mut); |
|
cout <<"In HTTPAcceptor::_acceptNamedPipeConnection " << endl; |
|
} |
|
#endif |
|
|
|
|
|
NamedPipeServerEndPoint nPSEndPoint = _rep->namedPipeServer->accept(); |
|
// Register to receive Messages on Connection pipe: |
|
#ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG |
|
{ |
|
AutoMutex automut(Monitor::_cout_mut); |
|
cout << " In _acceptNamedPipeConnection -- after calling namedPipeServer->accept()" << endl; |
|
} |
|
#endif |
|
HTTPConnection* connection = new HTTPConnection(_monitor, nPSEndPoint, |
|
this, static_cast<MessageQueue *>(_outputMessageQueue),false); |
|
|
|
// Solicit events on this new connection's socket: |
|
int index; |
|
#ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG |
|
{ |
|
AutoMutex automut(Monitor::_cout_mut); |
|
cout << endl << connection->getNamedPipe().getName() << " has a this as a QueueID " << |
|
connection->getQueueId() << endl; |
|
} |
|
#endif |
|
if (-1 == (index = _monitor->solicitPipeMessages( |
|
connection->getNamedPipe(), |
|
NamedPipeMessage::READ | NamedPipeMessage::EXCEPTION, |
|
connection->getQueueId(), Monitor::ACCEPTOR)) ) |
|
{ |
|
// ATTN-DE-P2-2003100503::TODO::Need to enhance code to return |
|
// an error message to Client application. |
|
Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
|
"HTTPAcceptor::_acceptPipeConnection: Attempt to allocate entry in _entries table failed."); |
|
delete connection; |
|
return; |
|
} |
|
|
|
// Save the socket for cleanup later: |
|
connection->_entry_index = index; |
|
AutoMutex autoMut(_rep->_connection_mut); |
|
_rep->connections.append(connection); |
|
#ifdef PEGASUS_LOCALDOMAINSOCKET_DEBUG |
|
{ |
|
AutoMutex automut(Monitor::_cout_mut); |
|
PEGASUS_STD(cout) |
|
<< "in HTTPAcceptor::_acceptNamedPipeConnection() at the end" << PEGASUS_STD(endl); |
|
} |
|
#endif |
|
} |
|
#endif |
| |
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |