(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.89 and 1.105

version 1.89, 2006/10/13 18:17:52 version 1.105, 2007/09/07 20:08:37
Line 40 
Line 40 
 #include "TLS.h" #include "TLS.h"
 #include "HTTPAcceptor.h" #include "HTTPAcceptor.h"
 #include "HTTPConnection.h" #include "HTTPConnection.h"
   #include "HostAddress.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_OS_PASE
 #include "EBCDIC_OS400.h"  # include <as400_protos.h>
   # include <Pegasus/Common/PaseCcsid.h>
 #endif #endif
  
   
 PEGASUS_USING_STD; PEGASUS_USING_STD;
  
 PEGASUS_NAMESPACE_BEGIN PEGASUS_NAMESPACE_BEGIN
  
  
 static int MAX_CONNECTION_QUEUE_LENGTH = -1;  static int _maxConnectionQueueLength = -1;
  
 //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
 // //
Line 64 
Line 65 
 class HTTPAcceptorRep class HTTPAcceptorRep
 { {
 public: public:
     HTTPAcceptorRep(Boolean local)      HTTPAcceptorRep(Uint16 connectionType)
     {     {
         if (local)          if (connectionType == HTTPAcceptor::LOCAL_CONNECTION)
         {         {
 #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
         }         }
         else  #ifdef PEGASUS_ENABLE_IPV6
           else if (connectionType == HTTPAcceptor::IPV6_CONNECTION)
           {
               address =
                   reinterpret_cast<struct sockaddr*>(new struct sockaddr_in6);
               address_size = sizeof(struct sockaddr_in6);
           }
   #endif
           else if (connectionType == HTTPAcceptor::IPV4_CONNECTION)
         {         {
             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);
         }         }
           else
           {
               PEGASUS_ASSERT(false);
       }
     }     }
   
     ~HTTPAcceptorRep()     ~HTTPAcceptorRep()
     {     {
         delete address;         delete address;
Line 103 
Line 119 
  
 HTTPAcceptor::HTTPAcceptor(Monitor* monitor, HTTPAcceptor::HTTPAcceptor(Monitor* monitor,
                            MessageQueue* outputMessageQueue,                            MessageQueue* outputMessageQueue,
                            Boolean localConnection,                             Uint16 connectionType,
                            Uint32 portNumber,                            Uint32 portNumber,
                            SSLContext * sslcontext,                            SSLContext * sslcontext,
                            ReadWriteSem* sslContextObjectLock)                            ReadWriteSem* sslContextObjectLock)
Line 112 
Line 128 
      _outputMessageQueue(outputMessageQueue),      _outputMessageQueue(outputMessageQueue),
      _rep(0),      _rep(0),
      _entry_index(-1),      _entry_index(-1),
      _localConnection(localConnection),       _connectionType(connectionType),
      _portNumber(portNumber),      _portNumber(portNumber),
      _sslcontext(sslcontext),      _sslcontext(sslcontext),
      _sslContextObjectLock(sslContextObjectLock)      _sslContextObjectLock(sslContextObjectLock)
Line 120 
Line 136 
    Socket::initializeInterface();    Socket::initializeInterface();
  
    /*    /*
         Platforms interpret the value of MAX_CONNECTION_QUEUE_LENGTH differently.  Some platforms interpret          Platforms interpret the value of _maxConnectionQueueLength
         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
           _maxConnectionQueueLength = 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 _maxConnectionQueueLength = 15
  
 /* /*
    if(MAX_CONNECTION_QUEUE_LENGTH == -1){      if (_maxConnectionQueueLength == -1)
 #ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM      {
 #pragma convert(37)  
     const char* env = getenv("PEGASUS_MAX_BACKLOG_CONNECTION_QUEUE");  
     EtoA(env);  
 #pragma convert(0)  
 #else  
     const char* env = getenv("PEGASUS_MAX_BACKLOG_CONNECTION_QUEUE");     const char* env = getenv("PEGASUS_MAX_BACKLOG_CONNECTION_QUEUE");
 #endif          if (!env)
     if(!env){          {
         MAX_CONNECTION_QUEUE_LENGTH = 15;              _maxConnectionQueueLength = 15;
     }else{          }
           else
           {
         char *end = NULL;         char *end = NULL;
         MAX_CONNECTION_QUEUE_LENGTH = strtol(env, &end, 10);              _maxConnectionQueueLength = strtol(env, &end, 10);
         if(*end)         if(*end)
             MAX_CONNECTION_QUEUE_LENGTH = 15;                  _maxConnectionQueueLength = 15;
         cout << " MAX_CONNECTION_QUEUE_LENGTH = " << MAX_CONNECTION_QUEUE_LENGTH << endl;              cout << " _maxConnectionQueueLength = " <<
                   _maxConnectionQueueLength << endl;
     }     }
    }    }
 */ */
    MAX_CONNECTION_QUEUE_LENGTH = 15;  #ifdef PEGASUS_WMIMAPPER
       //The WMI Mapper can be used as a proxy to multiple WMI Servers.
       //If a client application simultaneously initiates connections
       //to many Windows systems, many of these connections may be routed
       //to a single WMI Mapper. A larger _maxConnectionQueueLength
       //value is required to allow these connections to be initiated
       //successfully.
       _maxConnectionQueueLength = 40;
   #else
       _maxConnectionQueueLength = 15;
   #endif
 } }
  
 HTTPAcceptor::~HTTPAcceptor() HTTPAcceptor::~HTTPAcceptor()
Line 185 
Line 212 
      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;
Line 194 
Line 222 
  
       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);
  
Line 218 
Line 246 
  
       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 233 
Line 261 
  
    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);
    }    }
  
    _rep = new HTTPAcceptorRep(_localConnection);      _rep = new HTTPAcceptorRep(_connectionType);
  
    // 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()
 { {
   #ifdef PEGASUS_OS_PASE
       // bind need ccsid is 819
       int orig_ccsid;
       orig_ccsid = _SETCCSID(-1);
       if (orig_ccsid == -1)
       {
           PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
               String("HTTPAcceptor::_bind: Can not get current PASE CCSID."));
           orig_ccsid = 1208;
       }
       PaseCcsid ccsid(819, orig_ccsid);
   #endif
  
    PEGASUS_ASSERT(_rep != 0);    PEGASUS_ASSERT(_rep != 0);
    // Create address:    // Create address:
       memset(_rep->address, 0, _rep->address_size);
  
    memset(_rep->address, 0, sizeof(*_rep->address));      if (_connectionType == LOCAL_CONNECTION)
   
    if (_localConnection)  
    {    {
 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
           //
           // Make sure the local domain socket can be owned by the cimserver
           // user.  Otherwise, the bind may fail with a vague "bind failed"
           // error.
           //
           if (System::exists(PEGASUS_LOCAL_DOMAIN_SOCKET_PATH))
           {
               if (!System::removeFile(PEGASUS_LOCAL_DOMAIN_SOCKET_PATH))
               {
                   throw CannotRemoveFile(PEGASUS_LOCAL_DOMAIN_SOCKET_PATH);
               }
           }
   
        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,
               PEGASUS_LOCAL_DOMAIN_SOCKET_PATH);               PEGASUS_LOCAL_DOMAIN_SOCKET_PATH);
 #ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM  
        AtoE(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);  
 #endif  
        ::unlink(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);  
 #else #else
        PEGASUS_ASSERT(false);        PEGASUS_ASSERT(false);
 #endif #endif
    }    }
    else  #ifdef PEGASUS_ENABLE_IPV6
       else if (_connectionType == IPV6_CONNECTION)
       {
           reinterpret_cast<struct sockaddr_in6*>(_rep->address)->sin6_addr =
               in6addr_any;
           reinterpret_cast<struct sockaddr_in6*>(_rep->address)->sin6_family =
               AF_INET6;
           reinterpret_cast<struct sockaddr_in6*>(_rep->address)->sin6_port =
               htons(_portNumber);
       }
   #endif
       else if(_connectionType == IPV4_CONNECTION)
    {    {
        reinterpret_cast<struct sockaddr_in*>(_rep->address)->sin_addr.s_addr =        reinterpret_cast<struct sockaddr_in*>(_rep->address)->sin_addr.s_addr =
            INADDR_ANY;            INADDR_ANY;
Line 301 
Line 355 
        reinterpret_cast<struct sockaddr_in*>(_rep->address)->sin_port =        reinterpret_cast<struct sockaddr_in*>(_rep->address)->sin_port =
            htons(_portNumber);            htons(_portNumber);
    }    }
       else
       {
           PEGASUS_ASSERT(false);
       }
  
    // Create socket:    // Create socket:
  
    if (_localConnection)      if (_connectionType == LOCAL_CONNECTION)
    {    {
        _rep->socket = Socket::createSocket(AF_UNIX, SOCK_STREAM, 0);        _rep->socket = Socket::createSocket(AF_UNIX, SOCK_STREAM, 0);
    }    }
    else  #ifdef PEGASUS_ENABLE_IPV6
       else if (_connectionType == IPV6_CONNECTION)
       {
           _rep->socket = Socket::createSocket(PF_INET6, SOCK_STREAM, IPPROTO_TCP);
       }
   #endif
       else if (_connectionType == IPV4_CONNECTION)
    {    {
        _rep->socket = Socket::createSocket(PF_INET, SOCK_STREAM, IPPROTO_TCP);        _rep->socket = Socket::createSocket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
       }
       else
       {
           PEGASUS_ASSERT(false);
    }    }
  
    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 334 
Line 399 
    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 342 
Line 407 
       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 362 
Line 427 
       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 380 
Line 443 
       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 397 
Line 458 
    {    {
       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 405 
Line 467 
  
  
    //    //
    //  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) && \
    if (_localConnection)       (defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) || \
         defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM))
       if (_connectionType == LOCAL_CONNECTION)
    {    {
      if (::chmod( PEGASUS_LOCAL_DOMAIN_SOCKET_PATH,      if (::chmod( PEGASUS_LOCAL_DOMAIN_SOCKET_PATH,
                   S_IRUSR | S_IWUSR | S_IXUSR |                   S_IRUSR | S_IWUSR | S_IXUSR |
Line 418 
Line 483 
        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 431 
Line 495 
  
    // Set up listening on the given socket:    // Set up listening on the given socket:
  
    //int const MAX_CONNECTION_QUEUE_LENGTH = 15;      //int const _maxConnectionQueueLength = 15;
  
    if (listen(_rep->socket, MAX_CONNECTION_QUEUE_LENGTH) < 0)      if (listen(_rep->socket, _maxConnectionQueueLength) < 0)
    {    {
       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 458 
Line 520 
       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 484 
Line 545 
       // close the socket       // close the socket
       Socket::close(_rep->socket);       Socket::close(_rep->socket);
       // Unlink Local Domain Socket Bug# 3312       // Unlink Local Domain Socket Bug# 3312
       if (_localConnection)          if (_connectionType == LOCAL_CONNECTION)
       {       {
 #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
       }       }
   
    }    }
    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 515 
Line 576 
    }    }
    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 533 
Line 594 
       // close the socket       // close the socket
       Socket::close(_rep->socket);       Socket::close(_rep->socket);
       // Unlink Local Domain Socket Bug# 3312       // Unlink Local Domain Socket Bug# 3312
       if (_localConnection)          if (_connectionType == LOCAL_CONNECTION)
       {       {
 #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::reconnectConnectionSocket Unlinking local connection." );                  "HTTPAcceptor::reconnectConnectionSocket 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
Line 549 
Line 611 
    }    }
    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 593 
Line 655 
       _portNumber = 0;       _portNumber = 0;
       Socket::close(_rep->socket);       Socket::close(_rep->socket);
  
       if (_localConnection)          if (_connectionType == LOCAL_CONNECTION)
       {       {
 #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
          ::unlink(          ::unlink(
Line 608 
Line 670 
    }    }
    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 650 
Line 712 
    struct sockaddr* accept_address;    struct sockaddr* accept_address;
    SocketLength address_size;    SocketLength address_size;
  
    if (_localConnection)      if (_connectionType == LOCAL_CONNECTION)
    {    {
 #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);
Line 661 
Line 724 
    }    }
    else    else
    {    {
        accept_address = reinterpret_cast<struct sockaddr*>(new struct sockaddr_in);  #ifdef PEGASUS_ENABLE_IPV6
           accept_address =
              reinterpret_cast<struct sockaddr*>
              (new struct sockaddr_storage);
           address_size = sizeof(struct sockaddr_storage);
   #else
           accept_address =
               reinterpret_cast<struct sockaddr*>(new struct sockaddr_in);
        address_size = sizeof(struct sockaddr_in);        address_size = sizeof(struct sockaddr_in);
   #endif
    }    }
  
    SocketHandle socket = accept(_rep->socket, accept_address, &address_size);      SocketHandle socket;
   #ifdef PEGASUS_OS_TYPE_WINDOWS
       socket = accept(_rep->socket, accept_address, &address_size);
   #else
       while (
           ((socket = accept(_rep->socket, accept_address, &address_size)) == -1)
           && (errno == EINTR))
           ;
   #endif
  
    if (socket == PEGASUS_SOCKET_ERROR)    if (socket == PEGASUS_SOCKET_ERROR)
    {    {
Line 675 
Line 754 
        // 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;
    }    }
  
    String ipAddress;    String ipAddress;
  
    if (_localConnection)      if (_connectionType == LOCAL_CONNECTION)
    {    {
        ipAddress = "localhost";        ipAddress = "localhost";
    }    }
    else    else
    {    {
   #ifdef PEGASUS_ENABLE_IPV6
           char ipBuffer[PEGASUS_INET6_ADDRSTR_LEN];
           int rc;
           while ((rc = getnameinfo(accept_address, address_size, ipBuffer,
               PEGASUS_INET6_ADDRSTR_LEN, 0, 0, NI_NUMERICHOST)) == EAI_AGAIN)
               ;
           if (rc)
           {
               Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
                   "HTTPAcceptor - getnameinfo() failure.  rc: $0", rc);
   
               PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                   "HTTPAcceptor: getnameinfo() failed");
               delete accept_address;
               Socket::close(socket);
               return;
           }
           ipAddress = ipBuffer;
   #else
        unsigned char* sa = reinterpret_cast<unsigned char*>(        unsigned char* sa = reinterpret_cast<unsigned char*>(
            &reinterpret_cast<struct sockaddr_in*>(            &reinterpret_cast<struct sockaddr_in*>(
                accept_address)->sin_addr.s_addr);                accept_address)->sin_addr.s_addr);
        char ipBuffer[32];        char ipBuffer[32];
        sprintf(ipBuffer, "%u.%u.%u.%u", sa[0], sa[1], sa[2], sa[3]);        sprintf(ipBuffer, "%u.%u.%u.%u", sa[0], sa[1], sa[2], sa[3]);
        ipAddress = ipBuffer;        ipAddress = ipBuffer;
   #endif
    }    }
  
    delete accept_address;    delete accept_address;
Line 715 
Line 813 
    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 723 
Line 821 
       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 733 
Line 831 
    PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER, 0,    PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER, 0,
        "HTTPAcceptor - accept() success.  Socket: $1" ,socket));        "HTTPAcceptor - accept() success.  Socket: $1" ,socket));
  
    AutoPtr<MP_Socket> mp_socket(new MP_Socket(      SharedPtr<MP_Socket> mp_socket(new MP_Socket(
        socket, _sslcontext, _sslContextObjectLock));          socket, _sslcontext, _sslContextObjectLock, ipAddress));
  
    mp_socket->setSocketWriteTimeout(_socketWriteTimeout);    mp_socket->setSocketWriteTimeout(_socketWriteTimeout);
  
Line 748 
Line 846 
  
    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 761 
Line 859 
  
    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 776 
Line 874 
    {    {
       // 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;


Legend:
Removed from v.1.89  
changed lines
  Added in v.1.105

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2