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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2