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

  1 karl  1.14 //%2003////////////////////////////////////////////////////////////////////////
  2 mike  1.2  //
  3 karl  1.14 // 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            // IBM Corp.; EMC Corporation, The Open Group.
  7 mike  1.2  //
  8            // Permission is hereby granted, free of charge, to any person obtaining a copy
  9 kumpf 1.4  // of this software and associated documentation files (the "Software"), to
 10            // deal in the Software without restriction, including without limitation the
 11            // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 12 mike  1.2  // sell copies of the Software, and to permit persons to whom the Software is
 13            // furnished to do so, subject to the following conditions:
 14            // 
 15 kumpf 1.4  // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 16 mike  1.2  // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 17            // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 18 kumpf 1.4  // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 19            // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 20            // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 21 mike  1.2  // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 22            // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 23            //
 24            //==============================================================================
 25            //
 26            // Author: Mike Brasher (mbrasher@bmc.com)
 27            //
 28            // Modified By:
 29            //
 30            //%/////////////////////////////////////////////////////////////////////////////
 31            
 32            #include "Socket.h"
 33            
 34            #ifdef PEGASUS_OS_TYPE_WINDOWS
 35 tony  1.9  #include <windows.h>
 36            # ifndef _WINSOCKAPI_
 37            #   include <winsock2.h>
 38            # endif
 39 mike  1.2  #else
 40            # include <cctype>
 41 chuck 1.5  #ifndef PEGASUS_OS_OS400
 42            #   include <unistd.h>
 43            #else
 44            #   include <unistd.cleinc>
 45            #endif
 46 marek 1.7  #   include <string.h>  // added by rk for memcpy
 47 mike  1.2  # include <cstdlib>
 48            # include <errno.h>
 49            # include <fcntl.h>
 50            # include <netdb.h>
 51            # include <netinet/in.h>
 52            # include <arpa/inet.h>
 53            # include <sys/socket.h>
 54 mday  1.11 # include <errno.h>
 55 mike  1.2  #endif
 56            
 57 mday  1.11 #include <Pegasus/Common/Sharable.h>
 58 mike  1.2  PEGASUS_NAMESPACE_BEGIN
 59            
 60            static Uint32 _socketInterfaceRefCount = 0;
 61            
 62            Sint32 Socket::read(Sint32 socket, void* ptr, Uint32 size)
 63            {
 64            #ifdef PEGASUS_OS_TYPE_WINDOWS
 65                return ::recv(socket, (char*)ptr, size, 0);
 66            #else
 67 keith.petley 1.13 #if defined (__GNUC__) && !defined(PEGASUS_OS_SOLARIS)
 68 mday         1.11     int ccode = TEMP_FAILURE_RETRY(::read(socket, (char*)ptr, size));
 69                       return ccode;
 70                   #else 
 71 mike         1.2      return ::read(socket, (char*)ptr, size);
 72                   #endif
 73 mday         1.11 #endif
 74 mike         1.2  }
 75                   
 76                   Sint32 Socket::write(Sint32 socket, const void* ptr, Uint32 size)
 77                   {
 78                   #ifdef PEGASUS_OS_TYPE_WINDOWS
 79                       return ::send(socket, (const char*)ptr, size, 0);
 80                   #else
 81 keith.petley 1.13 #if (__GNUC__) && !defined(PEGASUS_OS_SOLARIS)
 82 mday         1.11     int ccode = TEMP_FAILURE_RETRY(::write(socket, (char*)ptr, size));
 83                       return ccode;
 84                   #else
 85 mike         1.2      return ::write(socket, (char*)ptr, size);
 86                   #endif
 87 mday         1.11 #endif
 88 mike         1.2  }
 89                   
 90                   void Socket::close(Sint32 socket)
 91                   {
 92                   #ifdef PEGASUS_OS_TYPE_WINDOWS
 93                       closesocket(socket);
 94                   #else
 95 keith.petley 1.13 #if (__GNUC__) && !defined(PEGASUS_OS_SOLARIS)
 96 mday         1.11     TEMP_FAILURE_RETRY(::close(socket));
 97                   #else
 98 mike         1.2      ::close(socket);
 99                   #endif
100 mday         1.11 #endif
101 mike         1.2  }
102                   
103 mday         1.11 int Socket::close2(Sint32 socket)
104                   {
105                   #ifdef PEGASUS_OS_TYPE_WINDOWS
106                       return closesocket(socket);
107                   #else
108 keith.petley 1.13 #if (__GNUC__) && !defined(PEGASUS_OS_SOLARIS)
109 mday         1.11     int ccode = TEMP_FAILURE_RETRY(::close(socket));
110                       return ccode;
111                   #else
112                       return ::close(socket);
113                   #endif
114                   #endif
115                   }
116                   
117                   
118 mike         1.2  void Socket::enableBlocking(Sint32 socket)
119                   {
120                   #ifdef PEGASUS_OS_TYPE_WINDOWS
121                       unsigned long flag = 0;
122                       ioctlsocket(socket, FIONBIO, &flag);
123                   #else
124                       int flags = fcntl(socket, F_GETFL, 0);
125                       flags &= ~O_NONBLOCK;
126                       fcntl(socket, F_SETFL, flags);
127                   #endif
128                   }
129                   
130 mday         1.11 int Socket::enableBlocking2(Sint32 socket)
131                   {
132                   #ifdef PEGASUS_OS_TYPE_WINDOWS
133                       unsigned long flag = 0;
134                       return ioctlsocket(socket, FIONBIO, &flag);
135                   #else
136                       int flags = fcntl(socket, F_GETFL, 0);
137                       flags &= ~O_NONBLOCK;
138                       return fcntl(socket, F_SETFL, flags);
139                   #endif
140                   }
141                   
142 mike         1.2  void Socket::disableBlocking(Sint32 socket)
143                   {
144                   #ifdef PEGASUS_OS_TYPE_WINDOWS
145                       unsigned long flag = 1;
146                       ioctlsocket(socket, FIONBIO, &flag);
147                   #else
148                       int flags = fcntl(socket, F_GETFL, 0);
149                       flags |= O_NONBLOCK;
150                       fcntl(socket, F_SETFL, flags);
151                   #endif
152                   }
153                   
154 mday         1.11 int Socket::disableBlocking2(Sint32 socket)
155                   {
156                   #ifdef PEGASUS_OS_TYPE_WINDOWS
157                       unsigned long flag = 1;
158                       return ioctlsocket(socket, FIONBIO, &flag);
159                   #else
160                       int flags = fcntl(socket, F_GETFL, 0);
161                       flags |= O_NONBLOCK;
162                       return fcntl(socket, F_SETFL, flags);
163                   #endif
164                   }
165                   
166 mike         1.2  void Socket::initializeInterface()
167                   {
168                   #ifdef PEGASUS_OS_TYPE_WINDOWS
169                       if (_socketInterfaceRefCount == 0)
170                       {
171                   	WSADATA tmp;
172                   
173                   	if (WSAStartup(0x202, &tmp) == SOCKET_ERROR)
174                   	    WSACleanup();
175                       }
176                   
177                       _socketInterfaceRefCount++;
178                   #endif
179                   }
180                   
181                   void Socket::uninitializeInterface()
182                   {
183                   #ifdef PEGASUS_OS_TYPE_WINDOWS
184                       _socketInterfaceRefCount--;
185                   
186                       if (_socketInterfaceRefCount == 0)
187 mike         1.2  	WSACleanup();
188                   #endif
189                   }
190                   
191 mday         1.11 
192 mike         1.2  PEGASUS_NAMESPACE_END
193 mday         1.11 

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2