(file) Return to HTTPAcceptor.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

Diff for /pegasus/src/Pegasus/Common/HTTPAcceptor.cpp between version 1.88.6.1 and 1.93.4.1

version 1.88.6.1, 2006/11/03 05:04:20 version 1.93.4.1, 2007/04/04 11:04:44
Line 41 
Line 41 
 #include "HTTPAcceptor.h" #include "HTTPAcceptor.h"
 #include "HTTPConnection.h" #include "HTTPConnection.h"
 #include "Tracer.h" #include "Tracer.h"
 #include <Pegasus/Common/MessageLoader.h> //l10n  #include <Pegasus/Common/MessageLoader.h>
  
 #ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM #ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM
 #include "EBCDIC_OS400.h" #include "EBCDIC_OS400.h"
Line 68 
Line 68 
     {     {
         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
         {         {
             address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_in);              address =
                   reinterpret_cast<struct sockaddr*>(new struct sockaddr_in);
             address_size = sizeof(struct sockaddr_in);             address_size = sizeof(struct sockaddr_in);
         }         }
     }     }
Line 94 
Line 93 
     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;
 }; };
  
Line 128 
Line 122 
    Socket::initializeInterface();    Socket::initializeInterface();
  
    /*    /*
         Platforms interpret the value of MAX_CONNECTION_QUEUE_LENGTH differently.  Some platforms interpret          Platforms interpret the value of MAX_CONNECTION_QUEUE_LENGTH
         the value literally, while others multiply a fudge factor. When the server is under          differently.  Some platforms interpret the value literally, while
         stress from multiple clients with multiple requests, toggling this number may prevent clients from          others multiply a fudge factor. When the server is under stress from
         being dropped.  Instead of hard coding the value, we allow an environment variable to be set which          multiple clients with multiple requests, toggling this number may
         specifies a number greater than the maximum concurrent client connections possible.  If this environment          prevent clients from being dropped.  Instead of hard coding the
         var is not specified, then MAX_CONNECTION_QUEUE_LENGTH = 15.          value, we allow an environment variable to be set which specifies a
           number greater than the maximum concurrent client connections
           possible.  If this environment var is not specified, then
           MAX_CONNECTION_QUEUE_LENGTH = 15.
    */    */
  
 //To engage runtime backlog queue length: uncomment the following block AND comment out the line MAX_CONNECTION_QUEUE_LENGTH = 15  //To engage runtime backlog queue length: uncomment the following block AND
   //comment out the line MAX_CONNECTION_QUEUE_LENGTH = 15
  
 /* /*
    if(MAX_CONNECTION_QUEUE_LENGTH == -1){      if (MAX_CONNECTION_QUEUE_LENGTH == -1)
       {
 #ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM #ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM
 #pragma convert(37) #pragma convert(37)
     const char* env = getenv("PEGASUS_MAX_BACKLOG_CONNECTION_QUEUE");     const char* env = getenv("PEGASUS_MAX_BACKLOG_CONNECTION_QUEUE");
Line 148 
Line 147 
 #else #else
     const char* env = getenv("PEGASUS_MAX_BACKLOG_CONNECTION_QUEUE");     const char* env = getenv("PEGASUS_MAX_BACKLOG_CONNECTION_QUEUE");
 #endif #endif
     if(!env){          if (!env)
           {
         MAX_CONNECTION_QUEUE_LENGTH = 15;         MAX_CONNECTION_QUEUE_LENGTH = 15;
     }else{          }
           else
           {
         char *end = NULL;         char *end = NULL;
         MAX_CONNECTION_QUEUE_LENGTH = strtol(env, &end, 10);         MAX_CONNECTION_QUEUE_LENGTH = strtol(env, &end, 10);
         if(*end)         if(*end)
             MAX_CONNECTION_QUEUE_LENGTH = 15;             MAX_CONNECTION_QUEUE_LENGTH = 15;
         cout << " MAX_CONNECTION_QUEUE_LENGTH = " << MAX_CONNECTION_QUEUE_LENGTH << endl;              cout << " MAX_CONNECTION_QUEUE_LENGTH = " <<
                   MAX_CONNECTION_QUEUE_LENGTH << endl;
     }     }
    }    }
 */ */
    MAX_CONNECTION_QUEUE_LENGTH = 15;    MAX_CONNECTION_QUEUE_LENGTH = 15;
   
 } }
  
 HTTPAcceptor::~HTTPAcceptor() HTTPAcceptor::~HTTPAcceptor()
Line 193 
Line 195 
             else             else
             {             {
                 // ATTN! this can't happen!                 // ATTN! this can't happen!
                 Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,                  PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                     "HTTPAcceptor::handleEnqueue: Invalid SOCKET_MESSAGE received.");                      "HTTPAcceptor::handleEnqueue: Invalid SOCKET_MESSAGE "
                           "received.");
             }             }
  
             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 =
             = (CloseConnectionMessage*)message;                 (CloseConnectionMessage*)message;
  
         AutoMutex autoMut(_rep->_connection_mut);         AutoMutex autoMut(_rep->_connection_mut);
  
         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)
Line 246 
Line 222 
                         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;
Line 271 
Line 229 
  
         default:         default:
         // ATTN: need unexpected message error!         // ATTN: need unexpected message error!
         Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,             PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
             "HTTPAcceptor::handleEnqueue: Invalid MESSAGE received.");             "HTTPAcceptor::handleEnqueue: Invalid MESSAGE received.");
         break;         break;
     };      }
  
     delete message;     delete message;
 } }
Line 286 
Line 244 
  
    if (!message)    if (!message)
    {    {
       Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
            "HTTPAcceptor::handleEnqueue(): No message on queue.");            "HTTPAcceptor::handleEnqueue(): No message on queue.");
       return;       return;
    }    }
  
    handleEnqueue(message);    handleEnqueue(message);
   
 } }
  
 void HTTPAcceptor::bind() void HTTPAcceptor::bind()
 { {
    if (_rep){      if (_rep)
     //l10n      {
       //throw BindFailedException("HTTPAcceptor already bound");  
   
       MessageLoaderParms parms("Common.HTTPAcceptor.ALREADY_BOUND",       MessageLoaderParms parms("Common.HTTPAcceptor.ALREADY_BOUND",
                    "HTTPAcceptor already bound");                    "HTTPAcceptor already bound");
  
       Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
            "HTTPAcceptor::bind: HTTPAcceptor already bound.");            "HTTPAcceptor::bind: HTTPAcceptor already bound.");
       throw BindFailedException(parms);       throw BindFailedException(parms);
    }    }
Line 313 
Line 268 
  
    // bind address    // bind address
    _bind();    _bind();
   
    return;  
 } }
  
 /** /**
    _bind - creates a new server socket and bind socket to the port address.    _bind - creates a new server socket and bind socket to the port address.
    If PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET is not defined, the port number is ignored and      If PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET is not defined, the port number is
    a domain socket is bound.      ignored and a domain socket is bound.
 */ */
 void HTTPAcceptor::_bind() void HTTPAcceptor::_bind()
 { {
   
    PEGASUS_ASSERT(_rep != 0);    PEGASUS_ASSERT(_rep != 0);
    // Create address:    // Create address:
  
 #if defined PEGASUS_OS_TYPE_WINDOWS  
    if (!_localConnection)  
    {  
 #endif  
   
    memset(_rep->address, 0, sizeof(*_rep->address));    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,
Line 366 
Line 292 
 #ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM #ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM
        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(
 # endif              reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);
 #else #else
        PEGASUS_ASSERT(false);        PEGASUS_ASSERT(false);
 #endif #endif
Line 391 
Line 317 
    else    else
    {    {
        _rep->socket = Socket::createSocket(PF_INET, SOCK_STREAM, IPPROTO_TCP);        _rep->socket = Socket::createSocket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
   
    }    }
  
    if (_rep->socket < 0)    if (_rep->socket < 0)
    {    {
       delete _rep;       delete _rep;
       _rep = 0;       _rep = 0;
       //l10n  
       //throw BindFailedException("Failed to create socket");  
       MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_CREATE_SOCKET",       MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_CREATE_SOCKET",
                    "Failed to create socket");                    "Failed to create socket");
       Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
            "HTTPAcceptor::_bind _rep->socket < 0");            "HTTPAcceptor::_bind _rep->socket < 0");
       throw BindFailedException(parms);       throw BindFailedException(parms);
    }    }
Line 414 
Line 337 
    int sock_flags;    int sock_flags;
  if( (sock_flags = fcntl(_rep->socket, F_GETFD, 0)) < 0)  if( (sock_flags = fcntl(_rep->socket, F_GETFD, 0)) < 0)
    {    {
        PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                   "HTTPAcceptor::_bind: fcntl(F_GETFD) failed");                   "HTTPAcceptor::_bind: fcntl(F_GETFD) failed");
    }    }
    else    else
Line 422 
Line 345 
       sock_flags |= FD_CLOEXEC;       sock_flags |= FD_CLOEXEC;
       if (fcntl(_rep->socket, F_SETFD, sock_flags) < 0)       if (fcntl(_rep->socket, F_SETFD, sock_flags) < 0)
       {       {
        PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,              PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                   "HTTPAcceptor::_bind: fcntl(F_SETFD) failed");                   "HTTPAcceptor::_bind: fcntl(F_SETFD) failed");
       }       }
    }    }
Line 442 
Line 365 
       Socket::close(_rep->socket);       Socket::close(_rep->socket);
       delete _rep;       delete _rep;
       _rep = 0;       _rep = 0;
       //l10n  
       //throw BindFailedException("Failed to set socket option");  
       MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_SET_SOCKET_OPTION",       MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_SET_SOCKET_OPTION",
                    "Failed to set socket option");                    "Failed to set socket option");
       PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                    "HTTPAcceptor::_bind: Failed to set socket option.");                    "HTTPAcceptor::_bind: Failed to set socket option.");
       throw BindFailedException(parms);       throw BindFailedException(parms);
    }    }
Line 460 
Line 381 
       Socket::close(_rep->socket);       Socket::close(_rep->socket);
       delete _rep;       delete _rep;
       _rep = 0;       _rep = 0;
       //l10n  
       //throw BindFailedException("Failed to bind socket");  
       MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_BIND_SOCKET",       MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_BIND_SOCKET",
                    "Failed to bind socket");                    "Failed to bind socket");
       PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                         "HTTPAcceptor::_bind: Failed to bind socket.");                         "HTTPAcceptor::_bind: Failed to bind socket.");
       throw BindFailedException(parms);       throw BindFailedException(parms);
    }    }
Line 477 
Line 396 
    {    {
       sockaddr_in buf;       sockaddr_in buf;
       SocketLength bufSize = sizeof(buf);       SocketLength bufSize = sizeof(buf);
       if ( getsockname(_rep->socket, reinterpret_cast<sockaddr *>(&buf), &bufSize) == 0 )          if (getsockname(_rep->socket, reinterpret_cast<sockaddr *>(&buf),
                   &bufSize) == 0 )
       {       {
           _portNumber = ntohs(buf.sin_port);           _portNumber = ntohs(buf.sin_port);
       }       }
Line 485 
Line 405 
  
  
    //    //
    //  Change permissions on Linux local domain socket to allow writes by others.      // Change permissions on Linux local domain socket to allow writes by
       // others.
    //    //
 #if !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET) && defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU)  #if !defined(PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET) && \
        (defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) || \
         defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM))
    if (_localConnection)    if (_localConnection)
    {    {
      if (::chmod( PEGASUS_LOCAL_DOMAIN_SOCKET_PATH,      if (::chmod( PEGASUS_LOCAL_DOMAIN_SOCKET_PATH,
Line 498 
Line 421 
        Socket::close(_rep->socket);        Socket::close(_rep->socket);
        delete _rep;        delete _rep;
        _rep = 0;        _rep = 0;
        //l10n  
        //throw BindFailedException("Failed to bind socket");  
        MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_BIND_SOCKET",        MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_BIND_SOCKET",
                    "Failed to bind socket");                    "Failed to bind socket");
        PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,              PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
               "HTTPAcceptor::_bind: Failed to set domain socket permissions.");                  "HTTPAcceptor::_bind: Failed to set domain socket "
                       "permissions.");
        throw BindFailedException(parms);        throw BindFailedException(parms);
      }      }
    }    }
Line 518 
Line 440 
       Socket::close(_rep->socket);       Socket::close(_rep->socket);
       delete _rep;       delete _rep;
       _rep = 0;       _rep = 0;
       //l10n  
       //throw BindFailedException("Failed to bind socket");  
       MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_BIND_SOCKET",       MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_BIND_SOCKET",
                    "Failed to bind socket");                    "Failed to bind socket");
       PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                   "HTTPAcceptor::_bind: Failed to bind socket(1).");                   "HTTPAcceptor::_bind: Failed to bind socket(1).");
       throw BindFailedException(parms);       throw BindFailedException(parms);
    }    }
Line 538 
Line 458 
       Socket::close(_rep->socket);       Socket::close(_rep->socket);
       delete _rep;       delete _rep;
       _rep = 0;       _rep = 0;
       //l10n          MessageLoaderParms parms(
       //throw BindFailedException("Failed to solicit socket messaeges");              "Common.HTTPAcceptor.FAILED_SOLICIT_SOCKET_MESSAGES",
       MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_SOLICIT_SOCKET_MESSAGES",  
                    "Failed to solicit socket messaeges");                    "Failed to solicit socket messaeges");
       PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                   "HTTPAcceptor::_bind: Failed to solicit socket messages(2).");                   "HTTPAcceptor::_bind: Failed to solicit socket messages(2).");
       throw BindFailedException(parms);       throw BindFailedException(parms);
    }    }
Line 566 
Line 485 
       // 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_CSTRING(TRC_HTTP, Tracer::LEVEL2,
                         "HTTPAcceptor::closeConnectionSocket Unlinking local connection." );                  "HTTPAcceptor::closeConnectionSocket Unlinking local "
                       "connection.");
          ::unlink(          ::unlink(
              reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);              reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);
 # else # else
          PEGASUS_ASSERT(false);          PEGASUS_ASSERT(false);
 # endif # endif
 #endif  
       }       }
   
    }    }
    else    else
    {    {
       PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                         "HTTPAcceptor::closeConnectionSocket failure _rep is null." );                         "HTTPAcceptor::closeConnectionSocket failure _rep is null." );
    }    }
 } }
Line 597 
Line 514 
    }    }
    else    else
    {    {
       PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                         "HTTPAcceptor::reopenConnectionSocket failure _rep is null." );                         "HTTPAcceptor::reopenConnectionSocket failure _rep is null." );
    }    }
 } }
Line 617 
Line 534 
       // 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_CSTRING(TRC_HTTP, Tracer::LEVEL2,
           PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2,                  "HTTPAcceptor::reconnectConnectionSocket Unlinking local "
                         "HTTPAcceptor::reconnectConnectionSocket Unlinking local connection." );                      "connection." );
          ::unlink(          ::unlink(
              reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);              reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);
 #else #else
          PEGASUS_ASSERT(false);          PEGASUS_ASSERT(false);
 #endif #endif
   
       }       }
       // open the socket       // open the socket
       _bind();       _bind();
    }    }
    else    else
    {    {
       PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                         "HTTPAcceptor::reconnectConnectionSocket failure _rep is null." );                         "HTTPAcceptor::reconnectConnectionSocket failure _rep is null." );
    }    }
 } }
Line 680 
Line 596 
       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
    {    {
       PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
               "HTTPAcceptor::unbind failure _rep is null." );               "HTTPAcceptor::unbind failure _rep is null." );
    }    }
 } }
Line 715 
Line 623 
      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;
      }      }
Line 757 
Line 652 
  
    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
    {    {
        accept_address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_in);          accept_address =
               reinterpret_cast<struct sockaddr*>(new struct sockaddr_in);
        address_size = sizeof(struct sockaddr_in);        address_size = sizeof(struct sockaddr_in);
    }    }
  
Line 782 
Line 677 
        // TCPIP is down reconnect this acceptor        // TCPIP is down reconnect this acceptor
        if(getSocketError() == PEGASUS_NETWORK_TCPIP_STOPPED)        if(getSocketError() == PEGASUS_NETWORK_TCPIP_STOPPED)
        {        {
               PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
            PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,  
                     "Socket has an IO error. TCP/IP down. Try to reconnect." );                     "Socket has an IO error. TCP/IP down. Try to reconnect." );
  
            reconnectConnectionSocket();            reconnectConnectionSocket();
  
            return;            return;
        }        }
   
        Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,        Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
            "HTTPAcceptor - accept() failure.  errno: $0"              "HTTPAcceptor - accept() failure.  errno: $0", errno);
            ,errno);  
  
        PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                         "HTTPAcceptor: accept() failed");                         "HTTPAcceptor: accept() failed");
       return;       return;
    }    }
Line 822 
Line 716 
    int sock_flags;    int sock_flags;
  if( (sock_flags = fcntl(socket, F_GETFD, 0)) < 0)  if( (sock_flags = fcntl(socket, F_GETFD, 0)) < 0)
    {    {
        PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                         "HTTPAcceptor: fcntl(F_GETFD) failed");                         "HTTPAcceptor: fcntl(F_GETFD) failed");
    }    }
    else    else
Line 830 
Line 724 
       sock_flags |= FD_CLOEXEC;       sock_flags |= FD_CLOEXEC;
       if (fcntl(socket, F_SETFD, sock_flags) < 0)       if (fcntl(socket, F_SETFD, sock_flags) < 0)
       {       {
        PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,              PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                         "HTTPAcceptor: fcntl(F_SETFD) failed");                         "HTTPAcceptor: fcntl(F_SETFD) failed");
       }       }
    }    }
Line 855 
Line 749 
  
    if (socketAcceptStatus < 0)    if (socketAcceptStatus < 0)
    {    {
        PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                         "HTTPAcceptor: SSL_accept() failed");                         "HTTPAcceptor: SSL_accept() failed");
        mp_socket->close();        mp_socket->close();
        return;        return;
Line 868 
Line 762 
  
    if (socketAcceptStatus == 0)    if (socketAcceptStatus == 0)
    {    {
        PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2,          PEG_TRACE_CSTRING(TRC_HTTP, Tracer::LEVEL2,
            "HTTPAcceptor: SSL_accept() pending");            "HTTPAcceptor: SSL_accept() pending");
        connection->_acceptPending = true;        connection->_acceptPending = true;
    }    }
Line 883 
Line 777 
    {    {
       // ATTN-DE-P2-2003100503::TODO::Need to enhance code to return       // ATTN-DE-P2-2003100503::TODO::Need to enhance code to return
       // an error message to Client application.       // an error message to Client application.
       Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
           "HTTPAcceptor::_acceptConnection: Attempt to allocate entry in _entries table failed.");              "HTTPAcceptor::_acceptConnection: Attempt to allocate entry in "
                   "_entries table failed.");
       delete connection;       delete connection;
       Socket::close(socket);       Socket::close(socket);
       return;       return;
Line 895 
Line 790 
    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  
   
   
     NamedPipeServerEndPiont 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


Legend:
Removed from v.1.88.6.1  
changed lines
  Added in v.1.93.4.1

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2