(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.55 and 1.61

version 1.55, 2005/01/15 00:42:09 version 1.61, 2005/02/15 01:28:51
Line 1 
Line 1 
 //%2004////////////////////////////////////////////////////////////////////////  //%2005////////////////////////////////////////////////////////////////////////
 // //
 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
Line 6 
Line 6 
 // IBM Corp.; EMC Corporation, The Open Group. // IBM Corp.; EMC Corporation, The Open Group.
 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.; // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
   // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
   // EMC Corporation; VERITAS Software Corporation; The Open Group.
 // //
 // Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to // of this software and associated documentation files (the "Software"), to
Line 34 
Line 36 
 //         Denise Eckstein (denise.eckstein@hp.com) //         Denise Eckstein (denise.eckstein@hp.com)
 //         Alagaraja Ramasubramanian (alags_raj@in.ibm.com) for Bug#1090 //         Alagaraja Ramasubramanian (alags_raj@in.ibm.com) for Bug#1090
 //         Amit Arora, IBM (amita@in.ibm.com) for Bug#2541 //         Amit Arora, IBM (amita@in.ibm.com) for Bug#2541
   //         Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
   //         Sean Keenan, Hewlett-Packard Company (sean.keenan@hp.com)
 // //
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
Line 106 
Line 110 
  
     struct sockaddr* address;     struct sockaddr* address;
  
 #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM)  #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_VMS)
    size_t 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)) #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;    socklen_t address_size;
Line 130 
Line 134 
                            Boolean localConnection,                            Boolean localConnection,
                            Uint32 portNumber,                            Uint32 portNumber,
                            SSLContext * sslcontext,                            SSLContext * sslcontext,
                            Boolean exportConnection)                             Boolean exportConnection,
                              ReadWriteSem* sslContextObjectLock)
    : Base(PEGASUS_QUEUENAME_HTTPACCEPTOR),  // ATTN: Need unique names?    : Base(PEGASUS_QUEUENAME_HTTPACCEPTOR),  // ATTN: Need unique names?
      _monitor(monitor),      _monitor(monitor),
      _outputMessageQueue(outputMessageQueue),      _outputMessageQueue(outputMessageQueue),
Line 139 
Line 144 
      _localConnection(localConnection),      _localConnection(localConnection),
      _portNumber(portNumber),      _portNumber(portNumber),
      _sslcontext(sslcontext),      _sslcontext(sslcontext),
      _exportConnection(exportConnection)       _exportConnection(exportConnection),
        _sslContextObjectLock(sslContextObjectLock)
 { {
    Socket::initializeInterface();    Socket::initializeInterface();
  
Line 350 
Line 356 
  
 // 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_PLATFORM_WIN32_IX86_MSVC && !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)
    {    {
Line 591 
Line 597 
    // 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)  #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_VMS)
    size_t address_size;    size_t address_size;
 #elif defined(PEGASUS_PLATFORM_AIX_RS_IBMCXX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) || (defined(PEGASUS_OS_SOLARIS) && !defined(SUNOS_5_6)) #elif defined(PEGASUS_PLATFORM_AIX_RS_IBMCXX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) || (defined(PEGASUS_OS_SOLARIS) && !defined(SUNOS_5_6))
    socklen_t address_size;    socklen_t address_size;
Line 631 
Line 637 
    }    }
  
 // set the close on exec flag // set the close on exec flag
 #ifndef PEGASUS_PLATFORM_WIN32_IX86_MSVC  #if !defined PEGASUS_PLATFORM_WIN32_IX86_MSVC && !defined(PEGASUS_OS_VMS)
    int sock_flags;    int sock_flags;
  if( (sock_flags = fcntl(socket, F_GETFD, 0)) < 0)  if( (sock_flags = fcntl(socket, F_GETFD, 0)) < 0)
    {    {
Line 657 
Line 663 
    // Create a new conection and add it to the connection list:    // Create a new conection and add it to the connection list:
  
    AutoPtr<MP_Socket> mp_socket(new MP_Socket(socket, _sslcontext, _exportConnection));    AutoPtr<MP_Socket> mp_socket(new MP_Socket(socket, _sslcontext, _exportConnection));
    if (mp_socket->accept() < 0)  
      Sint32 retVal;
   
      if (_sslcontext)
      {
          //
          // For SSL connections, obtain read lock to SSLContext object before
          // calling the accept() method of MP_Socket.
          //
          ReadLock rlock(*_sslContextObjectLock);
          retVal = mp_socket->accept();
      }
      else
      {
          retVal = mp_socket->accept();
      }
   
      if (retVal < 0)
    {    {
        PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,        PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                         "HTTPAcceptor: SSL_accept() failed");                         "HTTPAcceptor: SSL_accept() failed");
Line 692 
Line 715 
  
 } }
  
 AsyncDQueue<pegasus_acceptor> pegasus_acceptor::acceptors(true, 0);  
   
 void pegasus_acceptor::close_all_acceptors(void)  
 {  
    try  
    {  
       pegasus_acceptor* temp = acceptors.remove_first();  
       while(temp)  
       {  
          delete temp;  
          temp = acceptors.remove_first();  
       }  
    }  
    catch(...)  
    {  
    }  
   
 }  
   
   
   
 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)  
 {  
   
      Socket::initializeInterface();  
      try {  
        acceptors.insert_first(this);  
      }  
      catch(...){  
      }  
   
 }  
   
 pegasus_acceptor::~pegasus_acceptor(void)  
 {  
    unbind();  
    Socket::uninitializeInterface();  
    try {  
      acceptors.remove(this);  
    }  
    catch(...){  
    }  
   
 }  
   
   
 void pegasus_acceptor::bind()  
 {  
   
   PEGASUS_SOCKLEN_SIZE addr_size;  
   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_un.sun_family = AF_UNIX;  
     strcpy(addr_un.sun_path, PEGASUS_LOCAL_DOMAIN_SOCKET_PATH);  
 #ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM  
     AtoE(addr_un.sun_path);  
 #endif  
     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 ) {  
 #ifdef PEGASUS_HAS_SSL  
     ssl_socket_factory sf;  
     pegasus_socket temp(&sf, _sslcontext);  
 #else  
     bsd_socket_factory sf;  
     pegasus_socket temp(&sf);  
 #endif  
     _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);  
   }  
   
   _listener.bind((struct sockaddr*)addr, addr_size);  
   
   // second step: listen on the socket  
   
   _listener.listen(5);  
   
   // third step: add this listening socket to the monitor  
   
    _monitor->tickle();  
    _monitor->add_entry(_listener, LISTEN, this, this);  
 }  
   
   
 /** Unbind from the given port.  
  */  
 void pegasus_acceptor::unbind()  
 {  
   // remove the socket from the monitor  
   _monitor->remove_entry((Sint32)_listener);  
   
   // close the socket  
   _listener.close();  
 }  
   
   
       /** Close the connection socket.  
        */  
 void pegasus_acceptor::closeConnectionSocket()  
 {  
   unbind();  
 }  
   
   
       /** Reopen the connection socket.  
        */  
 void pegasus_acceptor::reopenConnectionSocket()  
 {  
   bind();  
 }  
   
   
   /** Returns the number of outstanding requests  
    */  
 Uint32 pegasus_acceptor::getOutstandingRequestCount()  
 {  
   return _monitor->getOutstandingRequestCount();  
 }  
   
 Boolean pegasus_acceptor::operator ==(const pegasus_acceptor& pa)  
 {  
   if(this == &pa)  
     return true;  
   return false;  
 }  
   
 Boolean pegasus_acceptor::operator ==(void* pa)  
 {  
   if((void*)this == pa)  
     return true;  
   return false;  
 }  
   
   
 pegasus_acceptor* pegasus_acceptor::find_acceptor(Boolean local, Uint32 port)  
 {  
   pegasus_acceptor* temp = 0;  
   
   try {  
     acceptors.try_lock(pegasus_thread_self());  
     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;  
   
 void pegasus_acceptor::accept_dispatch(monitor_2_entry *entry)  
 {  
   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);  
   
   monitor_2::insert_connection(connection);  
   
 }  
   
   
 PEGASUS_NAMESPACE_END PEGASUS_NAMESPACE_END


Legend:
Removed from v.1.55  
changed lines
  Added in v.1.61

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2