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

  1 karl  1.22 //%2006////////////////////////////////////////////////////////////////////////
  2 mike  1.2  //
  3 karl  1.17 // 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.14 // IBM Corp.; EMC Corporation, The Open Group.
  7 karl  1.17 // 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.18 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10            // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11 karl  1.22 // 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.4  // 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 karl  1.22 // 
 21 kumpf 1.4  // 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.4  // 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            // Author: Mike Brasher (mbrasher@bmc.com)
 33            //
 34 joyce.j 1.19 // Modified By: Josephine Eskaline Joyce, IBM (jojustin@in.ibm.com) for Bug#2513
 35 david.dillard 1.20 //              David Dillard, Symantec Corp.,  (david_dillard@symantec.com)
 36 mike          1.2  //
 37                    //%/////////////////////////////////////////////////////////////////////////////
 38                    
 39                    #include "Socket.h"
 40                    
 41                    #ifdef PEGASUS_OS_TYPE_WINDOWS
 42 tony          1.9  #include <windows.h>
 43                    # ifndef _WINSOCKAPI_
 44                    #   include <winsock2.h>
 45                    # endif
 46 mike          1.2  #else
 47                    # include <cctype>
 48 chuck         1.5  #ifndef PEGASUS_OS_OS400
 49                    #   include <unistd.h>
 50                    #else
 51                    #   include <unistd.cleinc>
 52                    #endif
 53 marek         1.7  #   include <string.h>  // added by rk for memcpy
 54 mike          1.2  # include <cstdlib>
 55                    # include <errno.h>
 56                    # include <fcntl.h>
 57                    # include <netdb.h>
 58                    # include <netinet/in.h>
 59                    # include <arpa/inet.h>
 60                    # include <sys/socket.h>
 61 mday          1.11 # include <errno.h>
 62 mike          1.2  #endif
 63                    
 64 mday          1.11 #include <Pegasus/Common/Sharable.h>
 65 mike          1.2  PEGASUS_NAMESPACE_BEGIN
 66                    
 67                    static Uint32 _socketInterfaceRefCount = 0;
 68                    
 69 david.dillard 1.20 Sint32 Socket::read(PEGASUS_SOCKET socket, void* ptr, Uint32 size)
 70 mike          1.2  {
 71                    #ifdef PEGASUS_OS_TYPE_WINDOWS
 72                        return ::recv(socket, (char*)ptr, size, 0);
 73                    #else
 74 konrad.r      1.16 #if defined (__GNUC__) && !defined(PEGASUS_OS_SOLARIS) && !defined(PEGASUS_OS_DARWIN) && !defined(PEGASUS_OS_LSB)
 75 mday          1.11     int ccode = TEMP_FAILURE_RETRY(::read(socket, (char*)ptr, size));
 76                        return ccode;
 77 david.dillard 1.20 #else
 78 mike          1.2      return ::read(socket, (char*)ptr, size);
 79                    #endif
 80 mday          1.11 #endif
 81 mike          1.2  }
 82                    
 83 david.dillard 1.20 Sint32 Socket::write(PEGASUS_SOCKET socket, const void* ptr, Uint32 size)
 84 mike          1.2  {
 85                    #ifdef PEGASUS_OS_TYPE_WINDOWS
 86                        return ::send(socket, (const char*)ptr, size, 0);
 87                    #else
 88 konrad.r      1.16 #if (__GNUC__) && !defined(PEGASUS_OS_SOLARIS) && !defined(PEGASUS_OS_DARWIN) && !defined(PEGASUS_OS_LSB)
 89 mday          1.11     int ccode = TEMP_FAILURE_RETRY(::write(socket, (char*)ptr, size));
 90                        return ccode;
 91                    #else
 92 mike          1.2      return ::write(socket, (char*)ptr, size);
 93                    #endif
 94 mday          1.11 #endif
 95 mike          1.2  }
 96                    
 97 david.dillard 1.20 void Socket::close(PEGASUS_SOCKET socket)
 98 mike          1.2  {
 99 joyce.j       1.19   if(-1 != socket)
100                       {
101                        #ifdef PEGASUS_OS_TYPE_WINDOWS
102                        if(!closesocket(socket)) socket=-1;
103                        #else
104                        #if (__GNUC__) && !defined(PEGASUS_OS_SOLARIS) && !defined(PEGASUS_OS_DARWIN) && !defined(PEGASUS_OS_LSB)
105                           if(!TEMP_FAILURE_RETRY(::close(socket))) socket = -1;
106                        #else
107                           if(!::close(socket)) socket = -1;
108                        #endif
109                        #endif
110                       }
111 mike          1.2  }
112                    
113 david.dillard 1.20 void Socket::enableBlocking(PEGASUS_SOCKET socket)
114 mike          1.2  {
115                    #ifdef PEGASUS_OS_TYPE_WINDOWS
116                        unsigned long flag = 0;
117                        ioctlsocket(socket, FIONBIO, &flag);
118                    #else
119                        int flags = fcntl(socket, F_GETFL, 0);
120                        flags &= ~O_NONBLOCK;
121                        fcntl(socket, F_SETFL, flags);
122                    #endif
123                    }
124                    
125 david.dillard 1.20 void Socket::disableBlocking(PEGASUS_SOCKET socket)
126 mike          1.2  {
127                    #ifdef PEGASUS_OS_TYPE_WINDOWS
128                        unsigned long flag = 1;
129                        ioctlsocket(socket, FIONBIO, &flag);
130                    #else
131                        int flags = fcntl(socket, F_GETFL, 0);
132                        flags |= O_NONBLOCK;
133                        fcntl(socket, F_SETFL, flags);
134                    #endif
135                    }
136                    
137                    void Socket::initializeInterface()
138                    {
139                    #ifdef PEGASUS_OS_TYPE_WINDOWS
140                        if (_socketInterfaceRefCount == 0)
141                        {
142 david.dillard 1.20         WSADATA tmp;
143 mike          1.2  
144 david.dillard 1.20     if (WSAStartup(0x202, &tmp) == SOCKET_ERROR)
145                            WSACleanup();
146 mike          1.2      }
147                    
148                        _socketInterfaceRefCount++;
149                    #endif
150                    }
151                    
152                    void Socket::uninitializeInterface()
153                    {
154                    #ifdef PEGASUS_OS_TYPE_WINDOWS
155                        _socketInterfaceRefCount--;
156                    
157                        if (_socketInterfaceRefCount == 0)
158 david.dillard 1.20         WSACleanup();
159 mike          1.2  #endif
160                    }
161                    
162 mday          1.11 
163 mike          1.2  PEGASUS_NAMESPACE_END
164 mday          1.11 

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2