(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.32 and 1.135

version 1.32, 2003/08/17 13:52:38 version 1.135, 2012/12/13 14:38:55
Line 1 
Line 1 
 //%/////////////////////////////////////////////////////////////////////////////  //%LICENSE////////////////////////////////////////////////////////////////
 // //
 // Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Company, IBM,  // Licensed to The Open Group (TOG) under one or more contributor license
 // The Open Group, Tivoli Systems  // agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
   // this work for additional information regarding copyright ownership.
   // Each contributor licenses this file to you under the OpenPegasus Open
   // Source License; you may not use this file except in compliance with the
   // License.
   //
   // Permission is hereby granted, free of charge, to any person obtaining a
   // copy of this software and associated documentation files (the "Software"),
   // to deal in the Software without restriction, including without limitation
   // the rights to use, copy, modify, merge, publish, distribute, sublicense,
   // and/or sell copies of the Software, and to permit persons to whom the
   // Software is furnished to do so, subject to the following conditions:
   //
   // The above copyright notice and this permission notice shall be included
   // in all copies or substantial portions of the Software.
   //
   // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
   // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
   // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
   // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
   // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
   // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
   // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 // //
 // Permission is hereby granted, free of charge, to any person obtaining a copy  //////////////////////////////////////////////////////////////////////////
 // of this software and associated documentation files (the "Software"), to  
 // deal in the Software without restriction, including without limitation the  
 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or  
 // sell copies of the Software, and to permit persons to whom the Software is  
 // furnished to do so, subject to the following conditions:  
 //  
 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN  
 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED  
 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT  
 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR  
 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT  
 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN  
 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  
 //  
 //==============================================================================  
 //  
 // Author: Mike Brasher (mbrasher@bmc.com)  
 //  
 // Modified By:  
 //         Jenny Yu, Hewlett-Packard Company (jenny_yu@hp.com)  
 //         Nag Boranna, Hewlett-Packard Company (nagaraja_boranna@hp.com)  
 //         Dave Rosckes (rosckes@us.ibm.com)  
 // //
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
 #include "Config.h" #include "Config.h"
 #include "Constants.h" #include "Constants.h"
 #include <iostream> #include <iostream>
 #include "Socket.h"  
   
 #ifdef PEGASUS_PLATFORM_WIN32_IX86_MSVC  
 #include <windows.h>  
 #else  
 # include <cctype>  
 # include <cstdlib>  
 # include <errno.h>  
 # include <fcntl.h>  
 # include <netdb.h>  
 # include <netinet/in.h>  
 # include <arpa/inet.h>  
 # include <sys/socket.h>  
 # ifdef PEGASUS_LOCAL_DOMAIN_SOCKET  
 # include <unistd.h>  
 #  include <sys/un.h>  
 # endif  
 #endif  
  
   #include "Network.h"
 #include "Socket.h" #include "Socket.h"
 #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_OS_PASE
   # include <as400_protos.h>
   # include <Pegasus/Common/PaseCcsid.h>
   #endif
  
 PEGASUS_USING_STD; PEGASUS_USING_STD;
  
 PEGASUS_NAMESPACE_BEGIN PEGASUS_NAMESPACE_BEGIN
  
   
   static int _maxConnectionQueueLength = -1;
   
   Uint32 HTTPAcceptor::_socketWriteTimeout =
       PEGASUS_DEFAULT_SOCKETWRITE_TIMEOUT_SECONDS;
   
   #ifndef PEGASUS_INTEGERS_BOUNDARY_ALIGNED
   Mutex HTTPAcceptor::_socketWriteTimeoutMutex;
   #endif
   
 //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
 // //
 // HTTPAcceptorRep // HTTPAcceptorRep
Line 72 
Line 70 
 class HTTPAcceptorRep class HTTPAcceptorRep
 { {
 public: public:
     HTTPAcceptorRep(Boolean local)      HTTPAcceptorRep(Uint16 connectionType)
     {     {
         if (local)          if (connectionType == HTTPAcceptor::LOCAL_CONNECTION)
         {         {
 #ifdef PEGASUS_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()
       {
           closeSocket();
           delete address;
       }
   
       void closeSocket()
       {
           Socket::close(socket);
     }     }
  
     struct sockaddr* address;     struct sockaddr* address;
  
 #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM)      SocketLength address_size;
    size_t address_size;  
 #elif defined(PEGASUS_PLATFORM_AIX_RS_IBMCXX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) || (defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC) && !defined(SUNOS_5_6))  
    socklen_t address_size;  
 #else  
    int address_size;  
 #endif  
       Mutex _connection_mut;       Mutex _connection_mut;
  
       Sint32 socket;      SocketHandle socket;
       Array<HTTPConnection*> connections;       Array<HTTPConnection*> connections;
 }; };
  
   
 //////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
 // //
 // HTTPAcceptor // HTTPAcceptor
Line 113 
Line 131 
  
 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,
                              HostAddress *listenOn)
    : Base(PEGASUS_QUEUENAME_HTTPACCEPTOR),  // ATTN: Need unique names?    : Base(PEGASUS_QUEUENAME_HTTPACCEPTOR),  // ATTN: Need unique names?
      _monitor(monitor),      _monitor(monitor),
      _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),
       _listenAddress(listenOn)
 { {
      PEGASUS_ASSERT(!_sslcontext == !_sslContextObjectLock);
    Socket::initializeInterface();    Socket::initializeInterface();
   
      /*
           Platforms interpret the value of _maxConnectionQueueLength
           differently.  Some platforms interpret the value literally, while
           others multiply a fudge factor. When the server is under stress from
           multiple clients with multiple requests, toggling this number may
           prevent clients from being dropped.  Instead of hard coding the
           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 _maxConnectionQueueLength = 15
   
   /*
       if (_maxConnectionQueueLength == -1)
       {
           const char* env = getenv("PEGASUS_MAX_BACKLOG_CONNECTION_QUEUE");
           if (!env)
           {
               _maxConnectionQueueLength = 15;
           }
           else
           {
               char* end = NULL;
               _maxConnectionQueueLength = strtol(env, &end, 10);
               if (*end)
                   _maxConnectionQueueLength = 15;
               cout << " _maxConnectionQueueLength = " <<
                   _maxConnectionQueueLength << endl;
           }
       }
   */
   #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()
 { {
       destroyConnections();
    unbind();    unbind();
    // ATTN: Is this correct in a multi-HTTPAcceptor server?    // ATTN: Is this correct in a multi-HTTPAcceptor server?
    Socket::uninitializeInterface();    Socket::uninitializeInterface();
Line 140 
Line 210 
    if (! message)    if (! message)
       return;       return;
  
       PEGASUS_ASSERT(_rep != 0);
    switch (message->getType())    switch (message->getType())
    {    {
       case SOCKET_MESSAGE:       case SOCKET_MESSAGE:
Line 147 
Line 218 
          SocketMessage* socketMessage = (SocketMessage*)message;          SocketMessage* socketMessage = (SocketMessage*)message;
  
          // If this is a connection request:          // If this is a connection request:
               PEGASUS_ASSERT(socketMessage->socket == _rep->socket);
   
               PEGASUS_ASSERT(socketMessage->events & SocketMessage::READ);
  
          if (socketMessage->socket == _rep->socket &&  
              socketMessage->events | SocketMessage::READ)  
          {  
             _acceptConnection();             _acceptConnection();
          }  
          else  
          {  
             // ATTN! this can't happen!  
          }  
  
          break;          break;
       }       }
  
       case CLOSE_CONNECTION_MESSAGE:       case CLOSE_CONNECTION_MESSAGE:
       {       {
          CloseConnectionMessage* closeConnectionMessage             CloseConnectionMessage* closeConnectionMessage =
             = (CloseConnectionMessage*)message;                 (CloseConnectionMessage*)message;
  
          _rep->_connection_mut.lock(pegasus_thread_self());             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];
             Sint32 socket = connection->getSocket();                 SocketHandle socket = connection->getSocket();
  
             if (socket == closeConnectionMessage->socket)             if (socket == closeConnectionMessage->socket)
             {             {
Line 181 
Line 247 
                break;                break;
             }             }
          }          }
          _rep->_connection_mut.unlock();  
              break;
       }       }
  
       default:       default:
       // ATTN: need unexpected message error!             PEGASUS_ASSERT(false);
       break;       break;
    };      }
  
    delete message;    delete message;
 } }
Line 196 
Line 263 
 void HTTPAcceptor::handleEnqueue() void HTTPAcceptor::handleEnqueue()
 { {
    Message* message = dequeue();    Message* message = dequeue();
   
    if (!message)  
       return;  
   
    handleEnqueue(message);    handleEnqueue(message);
   
 } }
  
 void HTTPAcceptor::bind() void HTTPAcceptor::bind()
 { {
    if (_rep){      if (_rep)
         //l10n      {
       //throw BindFailedException("HTTPAcceptor already bound");  
       String s0 = "HTTPAcceptor";  
       MessageLoaderParms parms("Common.HTTPAcceptor.ALREADY_BOUND",       MessageLoaderParms parms("Common.HTTPAcceptor.ALREADY_BOUND",
                                                    "$0 already bound",              "HTTPAcceptor already bound");
                                                    s0);  
       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_LOCAL_DOMAIN_SOCKET is 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
       AutoPtr<PaseCcsid> ccsid;
   #endif
  
       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)  
    {    {
 #ifdef PEGASUS_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.
           //
   #ifdef PEGASUS_OS_PASE
           // PASE domain socket needs ccsid 819
           int orig_ccsid;
           orig_ccsid = _SETCCSID(-1);
           if (orig_ccsid == -1)
           {
               PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
                       "HTTPAcceptor::_bind: Can not get current PASE CCSID.");
               orig_ccsid = 1208;
           }
           ccsid.reset(new PaseCcsid(819, orig_ccsid));
   #endif
           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);
        ::unlink(reinterpret_cast<struct sockaddr_un*>(_rep->address)->sun_path);  
 #else #else
        PEGASUS_ASSERT(false);        PEGASUS_ASSERT(false);
 #endif #endif
    }    }
   #ifdef PEGASUS_ENABLE_IPV6
       else if (_connectionType == IPV6_CONNECTION)
       {
           if(_listenAddress)
           {
               String hostAdd = _listenAddress->getHost();
               CString ip = hostAdd.getCString();
   
               struct sockaddr_in6 in6addr;
               memset(&in6addr, 0, sizeof(sockaddr_in6));
               if(_listenAddress ->isHostAddLinkLocal())
               {
                   HostAddress::convertTextToBinary(AF_INET6,
                   (const char*)ip,
                   &in6addr.sin6_addr);
                   reinterpret_cast<struct sockaddr_in6*>(
                       _rep->address)->sin6_addr = in6addr.sin6_addr;
                   reinterpret_cast<struct sockaddr_in6*>(
                       _rep->address)->sin6_scope_id =
                           _listenAddress->getScopeID();
               }
               else
               {
                   HostAddress::convertTextToBinary(AF_INET6,
                   (const char*)ip,
                   &in6addr.sin6_addr);
                   reinterpret_cast<struct sockaddr_in6*>(
                       _rep->address)->sin6_addr = in6addr.sin6_addr;
               }
           }
           else
           {
           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)
       {
           if(_listenAddress)
           {
               String hostAdd = _listenAddress->getHost();
               CString ip = hostAdd.getCString();
               struct sockaddr_in addrs;
               HostAddress::convertTextToBinary(
                   AF_INET,
                   (const char*)ip,
                   &addrs.sin_addr);
               reinterpret_cast<struct sockaddr_in*>(
                   _rep->address)->sin_addr.s_addr = addrs.sin_addr.s_addr;
           }
    else    else
    {    {
        reinterpret_cast<struct sockaddr_in*>(_rep->address)->sin_addr.s_addr =              reinterpret_cast<struct sockaddr_in*>(
            INADDR_ANY;              _rep->address)->sin_addr.s_addr = INADDR_ANY;
           }
        reinterpret_cast<struct sockaddr_in*>(_rep->address)->sin_family =        reinterpret_cast<struct sockaddr_in*>(_rep->address)->sin_family =
            AF_INET;            AF_INET;
        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);
       }
   #ifdef PEGASUS_ENABLE_IPV6
       else if (_connectionType == IPV6_CONNECTION)
    {    {
        _rep->socket = socket(AF_UNIX, SOCK_STREAM, 0);          _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);
    }    }
    else    else
    {    {
        _rep->socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);          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");
       throw BindFailedException(parms);       throw BindFailedException(parms);
    }    }
  
       Socket::disableBlocking(_rep->socket);
  
 // set the close-on-exec bit for this file handle. // set the close-on-exec bit for this file handle.
 // any unix that forks needs this bit set. // any unix that forks needs this bit set.
 #ifndef PEGASUS_PLATFORM_WIN32_IX86_MSVC  #if !defined PEGASUS_OS_TYPE_WINDOWS && !defined(PEGASUS_OS_VMS)
    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_HTTP, Tracer::LEVEL2,          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
                         "HTTPAcceptor: fcntl(F_GETFD) failed");              "HTTPAcceptor::_bind: fcntl(F_GETFD) failed");
    }    }
    else    else
    {    {
       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_HTTP, Tracer::LEVEL2,              PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
                         "HTTPAcceptor: fcntl(F_SETFD) failed");                  "HTTPAcceptor::_bind: fcntl(F_SETFD) failed");
       }       }
    }    }
 #endif #endif
Line 312 
Line 466 
    if (setsockopt(_rep->socket, SOL_SOCKET, SO_REUSEADDR,    if (setsockopt(_rep->socket, SOL_SOCKET, SO_REUSEADDR,
                   (char *)&opt, sizeof(opt)) < 0)                   (char *)&opt, sizeof(opt)) < 0)
    {    {
       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");
       throw BindFailedException(parms);       throw BindFailedException(parms);
    }    }
  
    // Bind socket to port:  
  
       //
       // Bind socket to port:
       //
    if (::bind(_rep->socket, _rep->address, _rep->address_size) < 0)    if (::bind(_rep->socket, _rep->address, _rep->address_size) < 0)
    {    {
       Socket::close(_rep->socket);          MessageLoaderParms parms(
               "Common.HTTPAcceptor.FAILED_BIND_SOCKET_DETAIL",
               "Failed to bind socket on port $0: $1.",
               _portNumber, PEGASUS_SYSTEM_NETWORK_ERRORMSG_NLS);
   
       delete _rep;       delete _rep;
       _rep = 0;       _rep = 0;
       //l10n  
       //throw BindFailedException("Failed to bind socket");  
       MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_BIND_SOCKET",  
                                                    "Failed to bind socket");  
       throw BindFailedException(parms);       throw BindFailedException(parms);
    }    }
  
   
       //
       // Get the actual port value used if the caller specified a port value of 0.
       //
       if (_portNumber == 0)
       {
           sockaddr_in buf;
           SocketLength bufSize = sizeof(buf);
           if (getsockname(_rep->socket, reinterpret_cast<sockaddr *>(&buf),
                   &bufSize) == 0 )
           {
               _portNumber = ntohs(buf.sin_port);
           }
       }
   
   
       //
       // 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) || \
         defined(PEGASUS_OS_ZOS) || \
         defined(PEGASUS_OS_PASE))
       if (_connectionType == LOCAL_CONNECTION)
       {
           if (::chmod(PEGASUS_LOCAL_DOMAIN_SOCKET_PATH,
                   S_IRUSR | S_IWUSR | S_IXUSR |
                   S_IRGRP | S_IWGRP | S_IXGRP |
                   S_IROTH | S_IWOTH | S_IXOTH ) < 0 )
           {
               MessageLoaderParms parms(
                   "Common.HTTPAcceptor.FAILED_SET_LDS_FILE_OPTION",
                   "Failed to set permission on local domain socket $0: $1.",
                   PEGASUS_LOCAL_DOMAIN_SOCKET_PATH,
                   PEGASUS_SYSTEM_ERRORMSG_NLS );
   
               delete _rep;
               _rep = 0;
               throw BindFailedException(parms);
           }
       }
   #endif
   
    // Set up listening on the given socket:    // Set up listening on the given socket:
  
    int const MAX_CONNECTION_QUEUE_LENGTH = 5;      //int const _maxConnectionQueueLength = 15;
  
    if (listen(_rep->socket, MAX_CONNECTION_QUEUE_LENGTH) < 0)      if (::listen(_rep->socket, _maxConnectionQueueLength) < 0)
    {    {
       Socket::close(_rep->socket);          MessageLoaderParms parms(
               "Common.HTTPAcceptor.FAILED_LISTEN_SOCKET",
               "Failed to listen on socket $0: $1.",
               (int)_rep->socket,PEGASUS_SYSTEM_NETWORK_ERRORMSG_NLS );
   
       delete _rep;       delete _rep;
       _rep = 0;       _rep = 0;
       //l10n  
       //throw BindFailedException("Failed to bind socket");  
       MessageLoaderParms parms("Common.HTTPAcceptor.FAILED_BIND_SOCKET",  
                                                    "Failed to bind socket");  
       throw BindFailedException(parms);       throw BindFailedException(parms);
    }    }
  
Line 356 
Line 553 
  
    if ( -1 == ( _entry_index = _monitor->solicitSocketMessages(    if ( -1 == ( _entry_index = _monitor->solicitSocketMessages(
           _rep->socket,           _rep->socket,
           SocketMessage::READ | SocketMessage::EXCEPTION,  
           getQueueId(),           getQueueId(),
           Monitor::ACCEPTOR)))              MonitorEntry::TYPE_ACCEPTOR)))
    {    {
       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");
       throw BindFailedException(parms);       throw BindFailedException(parms);
    }    }
Line 380 
Line 574 
    if (_rep)    if (_rep)
    {    {
       // unregister the socket       // unregister the socket
       _monitor->unsolicitSocketMessages(_rep->socket);  
           // ATTN - comment out - see CIMServer::stopClientConnection()
           //_monitor->unsolicitSocketMessages(_rep->socket);
  
       // close the socket       // close the socket
       Socket::close(_rep->socket);          _rep->closeSocket();
           // Unlink Local Domain Socket Bug# 3312
           if (_connectionType == LOCAL_CONNECTION)
           {
   #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
               PEG_TRACE_CSTRING(TRC_HTTP, Tracer::LEVEL3,
                   "HTTPAcceptor::closeConnectionSocket Unlinking local "
                       "connection.");
               ::unlink(
                       reinterpret_cast<struct sockaddr_un*>
                           (_rep->address)->sun_path);
   #else
               PEGASUS_ASSERT(false);
   #endif
           }
       }
       else
       {
           PEG_TRACE_CSTRING(TRC_HTTP, Tracer::LEVEL2,
               "HTTPAcceptor::closeConnectionSocket failure _rep is null.");
    }    }
 } }
  
Line 396 
Line 611 
    {    {
       _bind();       _bind();
    }    }
       else
       {
           PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
               "HTTPAcceptor::reopenConnectionSocket failure _rep is null.");
       }
   }
   
   
   /**
      reconnectConnectionSocket - creates a new server socket.
   */
   void HTTPAcceptor::reconnectConnectionSocket()
   {
       if (_rep)
       {
           // unregister the socket
           _monitor->unsolicitSocketMessages(_rep->socket);
           // close the socket
           _rep->closeSocket();
           // Unlink Local Domain Socket
           if (_connectionType == LOCAL_CONNECTION)
           {
   #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
               PEG_TRACE_CSTRING(TRC_HTTP, Tracer::LEVEL3,
                   "HTTPAcceptor::reconnectConnectionSocket Unlinking local "
                       "connection." );
               ::unlink(
                       reinterpret_cast<struct sockaddr_un*>(
                           _rep->address)->sun_path);
   #else
               PEGASUS_ASSERT(false);
   #endif
           }
           // open the socket
           _bind();
       }
       else
       {
           PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
               "HTTPAcceptor::reconnectConnectionSocket failure _rep is null.");
       }
 } }
  
 /** /**
    getOutstandingRequestCount - returns the number of outstanding requests.    getOutstandingRequestCount - returns the number of outstanding requests.
 */ */
 Uint32 HTTPAcceptor::getOutstandingRequestCount()  Uint32 HTTPAcceptor::getOutstandingRequestCount() const
 { {
    Uint32 count = 0;    Uint32 count = 0;
       if (_rep)
    _rep->_connection_mut.lock(pegasus_thread_self());  
    if (_rep->connections.size() > 0)  
    {    {
       HTTPConnection* connection = _rep->connections[0];          AutoMutex autoMut(_rep->_connection_mut);
       count = connection->getRequestCount();          for (Uint32 i = 0, n = _rep->connections.size(); i < n; i++)
           {
               HTTPConnection* connection = _rep->connections[i];
               if (connection->isResponsePending())
               {
                   count++;
               }
           }
    }    }
    _rep->_connection_mut.unlock();  
    return count;    return count;
 } }
  
   
   /**
       getPortNumber - returns the port number used for the connection
   */
   Uint32 HTTPAcceptor::getPortNumber() const
   {
       return _portNumber;
   }
   
   void HTTPAcceptor::setSocketWriteTimeout(Uint32 socketWriteTimeout)
   {
   #ifndef PEGASUS_INTEGERS_BOUNDARY_ALIGNED
       AutoMutex lock(_socketWriteTimeoutMutex);
   #endif
       _socketWriteTimeout = socketWriteTimeout;
   }
   
 void HTTPAcceptor::unbind() void HTTPAcceptor::unbind()
 { {
    if (_rep)    if (_rep)
    {    {
       Socket::close(_rep->socket);          _portNumber = 0;
           _rep->closeSocket();
  
       if (_localConnection)          if (_connectionType == LOCAL_CONNECTION)
       {       {
 #ifdef PEGASUS_LOCAL_DOMAIN_SOCKET  #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
          ::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
Line 434 
Line 713 
       delete _rep;       delete _rep;
       _rep = 0;       _rep = 0;
    }    }
       else
       {
           PEG_TRACE_CSTRING(TRC_HTTP, Tracer::LEVEL1,
               "HTTPAcceptor::unbind failure _rep is null." );
       }
 } }
  
 void HTTPAcceptor::destroyConnections() void HTTPAcceptor::destroyConnections()
 { {
       if (_rep)
       {
    // For each connection created by this object:    // For each connection created by this object:
  
    _rep->_connection_mut.lock(pegasus_thread_self());          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];
       Sint32 socket = connection->getSocket();              SocketHandle socket = connection->getSocket();
  
       // Unsolicit SocketMessages:       // Unsolicit SocketMessages:
  
Line 454 
Line 738 
  
       // Destroy the connection (causing it to close):       // Destroy the connection (causing it to close):
  
       while (connection->refcount.value()) { }              while (connection->refcount.get()) { }
       delete connection;       delete connection;
    }    }
  
    _rep->connections.clear();    _rep->connections.clear();
    _rep->_connection_mut.unlock();      }
 } }
  
 void HTTPAcceptor::_acceptConnection() void HTTPAcceptor::_acceptConnection()
Line 468 
Line 752 
  
    PEGASUS_ASSERT(_rep != 0);    PEGASUS_ASSERT(_rep != 0);
  
    if (!_rep)  
       return;  
   
    // Accept the connection (populate the address):    // Accept the connection (populate the address):
  
    struct sockaddr* accept_address;    struct sockaddr* accept_address;
 #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM)      SocketLength address_size;
    size_t address_size;  
 #elif defined(PEGASUS_PLATFORM_AIX_RS_IBMCXX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) || (defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC) && !defined(SUNOS_5_6))  
    socklen_t address_size;  
 #else  
    int address_size;  
 #endif  
  
    if (_localConnection)      if (_connectionType == LOCAL_CONNECTION)
    {    {
 #ifdef PEGASUS_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 493 
Line 769 
    }    }
    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
    }    }
  
    Sint32 socket = accept(_rep->socket, accept_address, &address_size);      // It is not necessary to handle EINTR errors from this accept() call.
       // An EINTR error should not occur on a non-blocking socket.  If the
       // listen socket is blocking and EINTR occurs, the new socket connection
       // is not accepted here.
  
       // EAGAIN errors are also not handled here.  An EAGAIN error should not
       // occur after select() indicates that the listen socket is available for
       // reading.  If the accept() fails with an EAGAIN error code, a new
       // connection is not accepted here.
   
       SocketHandle socket = accept(_rep->socket, accept_address, &address_size);
   
       if (socket == PEGASUS_SOCKET_ERROR)
       {
           // the remote connection is invalid, destroy client address.
    delete accept_address;    delete accept_address;
  
    if (socket < 0)          // TCPIP is down reconnect this acceptor
           if (getSocketError() == PEGASUS_NETWORK_TCPIP_STOPPED)
    {    {
        Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,              PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
                    "HTTPAcceptor - accept() failure.  errno: $0"                  "Socket has an IO error. TCP/IP down. Try to reconnect.");
                    ,errno);  
  
        PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2,              reconnectConnectionSocket();
                         "HTTPAcceptor: accept() failed");  
       return;  
    }  
  
 // set the close on exec flag              return;
 #ifndef PEGASUS_PLATFORM_WIN32_IX86_MSVC  
    int sock_flags;  
  if( (sock_flags = fcntl(socket, F_GETFD, 0)) < 0)  
    {  
        PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2,  
                         "HTTPAcceptor: fcntl(F_GETFD) failed");  
    }  
    else  
    {  
       sock_flags |= FD_CLOEXEC;  
       if (fcntl(socket, F_SETFD, sock_flags) < 0)  
       {  
        PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2,  
                         "HTTPAcceptor: fcntl(F_SETFD) failed");  
       }       }
           PEG_TRACE((
               TRC_DISCARDED_DATA,
               Tracer::LEVEL1,
               "HTTPAcceptor: accept() failed.  errno: %u",
               errno));
           return;
    }    }
 #endif  
  
       // Use an AutoPtr to ensure the socket handle is closed on exception
       AutoPtr<SocketHandle, CloseSocketHandle> socketPtr(&socket);
  
    Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,  #ifndef PEGASUS_OS_TYPE_WINDOWS
                "HTTPAcceptor - accept() success.  Socket: $1"      // We need to ensure that the socket number is not higher than
                ,socket);      // what fits into FD_SETSIZE, because we else won't be able to select on it
       // and won't ever communicate correct on that socket.
       if (socket >= FD_SETSIZE)
       {
           // the remote connection is invalid, destroy client address.
           delete accept_address;
  
    // Create a new conection and add it to the connection list:          PEG_TRACE(
               (TRC_DISCARDED_DATA,
                Tracer::LEVEL1,
                "HTTPAcceptor out of available sockets."
                    "accept() returned too large socket number %u."
                    "Closing connection to the new client.",
                socket));
  
    MP_Socket * mp_socket = new MP_Socket(socket, _sslcontext);  
    if (mp_socket->accept() < 0)  
    {  
        PEG_TRACE_STRING(TRC_HTTP, Tracer::LEVEL2,  
                         "HTTPAcceptor: SSL_accept() failed");  
       return;       return;
    }    }
   #endif
  
    HTTPConnection* connection = new HTTPConnection(      String ipAddress;
       _monitor, mp_socket, this, static_cast<MessageQueue *>(_outputMessageQueue));  
   
    // Solicit events on this new connection's socket:  
    int index;  
  
    if (-1 ==  (index = _monitor->solicitSocketMessages(      if (_connectionType == LOCAL_CONNECTION)
           socket,  
           SocketMessage::READ | SocketMessage::EXCEPTION,  
           connection->getQueueId(), Monitor::CONNECTION)) )  
    {    {
       delete connection;          ipAddress = "localhost";
       Socket::close(socket);  
    }  
   
    // Save the socket for cleanup later:  
    connection->_entry_index = index;  
       _rep->_connection_mut.lock(pegasus_thread_self());  
    _rep->connections.append(connection);  
    _rep->_connection_mut.unlock();  
 } }
       else
 AsyncDQueue<pegasus_acceptor> pegasus_acceptor::acceptors(true, 0);  
   
 pegasus_acceptor::pegasus_acceptor(monitor_2* monitor,  
                                    MessageQueue* outputMessageQueue,  
                                    Boolean localConnection,  
                                    Uint32 portNumber,  
                                    SSLContext* sslcontext)  
   : _monitor(monitor), _outputMessageQueue(outputMessageQueue),  
     _localConnection(localConnection), _portNumber(portNumber),  
     _sslcontext(sslcontext), connections(true, 0)  
 { {
   #ifdef PEGASUS_ENABLE_IPV6
      Socket::initializeInterface();          char ipBuffer[PEGASUS_INET6_ADDRSTR_LEN];
      try {          if (System::getNameInfo(accept_address,
        acceptors.insert_first(this);                  address_size,
      }                  ipBuffer,
      catch(...){                  PEGASUS_INET6_ADDRSTR_LEN,
      }                  0,
                   0,
 }                  NI_NUMERICHOST))
   
 pegasus_acceptor::~pegasus_acceptor(void)  
 { {
    unbind();              delete accept_address;
    Socket::uninitializeInterface();              return;
    try {  
      acceptors.remove(this);  
    }  
    catch(...){  
    }    }
           ipAddress = ipBuffer;
   #else
           unsigned char* sa = reinterpret_cast<unsigned char*>(
               &reinterpret_cast<struct sockaddr_in*>(
                   accept_address)->sin_addr.s_addr);
           char ipBuffer[32];
           sprintf(ipBuffer, "%u.%u.%u.%u", sa[0], sa[1], sa[2], sa[3]);
           ipAddress = ipBuffer;
   #endif
 } }
  
       delete accept_address;
  
 void pegasus_acceptor::bind()  // set the close on exec flag
   #if !defined(PEGASUS_OS_TYPE_WINDOWS) && !defined(PEGASUS_OS_VMS)
       int sock_flags;
       if ((sock_flags = fcntl(socket, F_GETFD, 0)) < 0)
 { {
           PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
   PEGASUS_SOCKLEN_SIZE addr_size;              "HTTPAcceptor: fcntl(F_GETFD) failed");
   struct sockaddr *addr;  
   struct sockaddr_in addr_in;  
 # ifdef PEGASUS_LOCAL_DOMAIN_SOCKET  
   struct sockaddr_un addr_un;  
 #endif  
   
   memset(&addr_in, 0, sizeof(addr_in));  
   addr_in.sin_addr.s_addr = INADDR_ANY;  
   addr_in.sin_family = AF_INET;  
   addr_in.sin_port = htons(_portNumber);  
   addr = (struct sockaddr*) &addr_in;  
   addr_size = sizeof(addr_in);  
   
   // first step: determine which kind of socket factory to initialize,  
   // then create the socket and bind it to an address  
   if(_localConnection == true){  
 #ifdef PEGASUS_LOCAL_DOMAIN_SOCKET  
     unix_socket_factory sf;  
     pegasus_socket temp(&sf);  
     _listener = temp;  
   
     memset(&addr_un, 0, sizeof(addr_un));  
     addr.sun_family = AF_UNIX;  
     strcpy(addr.sun_path, PEGASUS_LOCAL_DOMAIN_SOCKET_PATH);  
     addr = (struct sockaddr*) &addr_un;  
     addr_size = sizeof(addr_un);  
     _listener.socket(AF_UNIX, SOCK_STREAM, 0);  
 #else  
     bsd_socket_factory sf;  
     pegasus_socket temp(&sf);  
     _listener = temp;  
     _listener.socket(AF_UNIX, SOCK_STREAM, 0);  
 #endif  
   }   }
   else if( _sslcontext != 0 ) {      else
 #ifdef PEGASUS_HAS_SSL      {
     ssl_socket_factory sf;          sock_flags |= FD_CLOEXEC;
 #else          if (fcntl(socket, F_SETFD, sock_flags) < 0)
     bsd_socket_factory sf;          {
 #endif              PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
     pegasus_socket temp(&sf);                  "HTTPAcceptor: fcntl(F_SETFD) failed");
     _listener = temp;  
     _listener.socket(PF_INET, SOCK_STREAM, 0);  
   }   }
   else {  
     bsd_socket_factory sf;  
     pegasus_socket temp(&sf);  
     _listener = temp;  
     _listener.socket(PF_INET, SOCK_STREAM, 0);  
   }   }
   #endif
  
   _listener.bind((struct sockaddr*)addr, addr_size);  
   
   // second step: listen on the socket  
  
   _listener.listen(5);      PEG_TRACE((
           TRC_HTTP,
           Tracer::LEVEL3,
           "HTTPAcceptor - accept() success.  Socket: %u",
           socket));
  
   // third step: add this listening socket to the monitor      SharedPtr<MP_Socket> mp_socket(new MP_Socket(
           socket, _sslcontext, _sslContextObjectLock, ipAddress));
       // mp_socket now has responsibility for closing the socket handle
       socketPtr.release();
  
    _monitor->tickle();      mp_socket->disableBlocking();
    _monitor->add_entry(_listener, LISTEN, this, this);  
 }  
  
   
 /** Unbind from the given port.  
  */  
 void pegasus_acceptor::unbind()  
 { {
   // remove the socket from the monitor  #ifndef PEGASUS_INTEGERS_BOUNDARY_ALIGNED
   _monitor->remove_entry((Sint32)_listener);          AutoMutex lock(_socketWriteTimeoutMutex);
   #endif
   // close the socket          mp_socket->setSocketWriteTimeout(_socketWriteTimeout);
   _listener.close();  
 } }
  
       // Perform the SSL handshake, if applicable.
  
       /** Close the connection socket.      Sint32 socketAcceptStatus = mp_socket->accept();
        */  
 void pegasus_acceptor::closeConnectionSocket()  
 {  
   unbind();  
 }  
   
  
       /** Reopen the connection socket.      if (socketAcceptStatus < 0)
        */  
 void pegasus_acceptor::reopenConnectionSocket()  
 { {
   bind();          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
               "HTTPAcceptor: SSL_accept() failed");
           return;
 } }
  
       // Create a new connection and add it to the connection list:
  
   /** Returns the number of outstanding requests      AutoPtr<HTTPConnection> connection(new HTTPConnection(
    */          _monitor,
 Uint32 pegasus_acceptor::getOutstandingRequestCount()          mp_socket,
 {          ipAddress,
   return _monitor->getOutstandingRequestCount();          this,
 }          _outputMessageQueue));
  
 Boolean pegasus_acceptor::operator ==(const pegasus_acceptor& pa)      if (HTTPConnection::getIdleConnectionTimeout())
 { {
   if(this == &pa)          Time::gettimeofday(&connection->_idleStartTime);
     return true;  
   return false;  
 } }
  
 Boolean pegasus_acceptor::operator ==(void* pa)      if (socketAcceptStatus == 0)
 { {
   if((void*)this == pa)          PEG_TRACE_CSTRING(TRC_HTTP, Tracer::LEVEL1,
     return true;              "HTTPAcceptor: SSL_accept() pending");
   return false;          connection->_acceptPending = true;
           Time::gettimeofday(&connection->_acceptPendingStartTime);
 } }
  
       // Solicit events on this new connection's socket:
       int index;
  
 pegasus_acceptor* pegasus_acceptor::find_acceptor(Boolean local, Uint32 port)      if (-1 ==  (index = _monitor->solicitSocketMessages(
               connection->getSocket(),
               connection->getQueueId(), MonitorEntry::TYPE_CONNECTION)) )
 { {
   pegasus_acceptor* temp = 0;          PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1,
               "HTTPAcceptor::_acceptConnection: Attempt to allocate entry in "
   try {                  "_entries table failed.");
     acceptors.try_lock(pegasus_thread_self());          return;
     temp = acceptors.next(temp);  
     while(temp){  
       if( local == true ){  
         if(temp->_localConnection){  
           acceptors.unlock();  
           return temp;  
         }  
       }  
       if(temp->_localConnection == local && temp->_portNumber ==port){  
         acceptors.unlock();  
         return temp;  
       }  
       temp = acceptors.next(temp);  
     }  
     acceptors.unlock();  
   }  
   catch(...){  
   }  
   return temp;  
 } }
  
 class m2e_rep;      connection->_entry_index = index;
       AutoMutex autoMut(_rep->_connection_mut);
 void pegasus_acceptor::accept_dispatch(monitor_2_entry *entry)      _rep->connections.append(connection.get());
 {      connection.release();
   pegasus_acceptor* myself = (pegasus_acceptor*)entry->get_accept();  
   
   HTTPConnection2* connection = new HTTPConnection2(entry->_rep->psock, myself->_outputMessageQueue);  
   
   // set the entry's dispatch parameter to point to the connection object  
   entry->set_dispatch ((void*)connection);  
   
   try {  
     myself->connections.insert_first(connection);  
   }  
   catch(...){  
   }  
 } }
  
   
 PEGASUS_NAMESPACE_END PEGASUS_NAMESPACE_END


Legend:
Removed from v.1.32  
changed lines
  Added in v.1.135

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2