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