version 1.22, 2006/01/30 16:17:07
|
version 1.23, 2006/06/26 22:23:29
|
|
|
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
#include "Socket.h" | #include "Socket.h" |
|
#include "Network.h" |
|
#include <cctype> |
|
#include <cstring> |
|
#include <Pegasus/Common/Sharable.h> |
|
|
|
//------------------------------------------------------------------------------ |
|
// |
|
// PEGASUS_RETRY_SYSTEM_CALL() |
|
// |
|
// This macro repeats the given system call until it returns something |
|
// other than EINTR. |
|
// |
|
//------------------------------------------------------------------------------ |
| |
#ifdef PEGASUS_OS_TYPE_WINDOWS | #ifdef PEGASUS_OS_TYPE_WINDOWS |
#include <windows.h> |
# define PEGASUS_RETRY_SYSTEM_CALL(EXPR, RESULT) RESULT = EXPR |
# ifndef _WINSOCKAPI_ |
|
# include <winsock2.h> |
|
# endif |
|
#else | #else |
# include <cctype> |
# define PEGASUS_RETRY_SYSTEM_CALL(EXPR, RESULT) \ |
#ifndef PEGASUS_OS_OS400 |
while (((RESULT = (EXPR)) == -1) && (errno == EINTR)) |
# include <unistd.h> |
|
#else |
|
# include <unistd.cleinc> |
|
#endif |
|
# include <string.h> // added by rk for memcpy |
|
# include <cstdlib> |
|
# include <errno.h> |
|
# include <fcntl.h> |
|
# include <netdb.h> |
|
# include <netinet/in.h> |
|
# include <arpa/inet.h> |
|
# include <sys/socket.h> |
|
# include <errno.h> |
|
#endif | #endif |
| |
#include <Pegasus/Common/Sharable.h> |
|
PEGASUS_NAMESPACE_BEGIN | PEGASUS_NAMESPACE_BEGIN |
| |
static Uint32 _socketInterfaceRefCount = 0; | static Uint32 _socketInterfaceRefCount = 0; |
| |
Sint32 Socket::read(PEGASUS_SOCKET socket, void* ptr, Uint32 size) |
Sint32 Socket::read(SocketHandle socket, void* ptr, Uint32 size) |
{ | { |
#ifdef PEGASUS_OS_TYPE_WINDOWS | #ifdef PEGASUS_OS_TYPE_WINDOWS |
return ::recv(socket, (char*)ptr, size, 0); | return ::recv(socket, (char*)ptr, size, 0); |
#else | #else |
#if defined (__GNUC__) && !defined(PEGASUS_OS_SOLARIS) && !defined(PEGASUS_OS_DARWIN) && !defined(PEGASUS_OS_LSB) |
int status; |
int ccode = TEMP_FAILURE_RETRY(::read(socket, (char*)ptr, size)); |
PEGASUS_RETRY_SYSTEM_CALL(::read(socket, (char*)ptr, size), status); |
return ccode; |
return status; |
#else |
|
return ::read(socket, (char*)ptr, size); |
|
#endif |
|
#endif | #endif |
} | } |
| |
Sint32 Socket::write(PEGASUS_SOCKET socket, const void* ptr, Uint32 size) |
Sint32 Socket::write(SocketHandle socket, const void* ptr, Uint32 size) |
{ | { |
#ifdef PEGASUS_OS_TYPE_WINDOWS | #ifdef PEGASUS_OS_TYPE_WINDOWS |
return ::send(socket, (const char*)ptr, size, 0); | return ::send(socket, (const char*)ptr, size, 0); |
#else | #else |
#if (__GNUC__) && !defined(PEGASUS_OS_SOLARIS) && !defined(PEGASUS_OS_DARWIN) && !defined(PEGASUS_OS_LSB) |
int status; |
int ccode = TEMP_FAILURE_RETRY(::write(socket, (char*)ptr, size)); |
PEGASUS_RETRY_SYSTEM_CALL(::write(socket, (char*)ptr, size), status); |
return ccode; |
return status; |
#else |
|
return ::write(socket, (char*)ptr, size); |
|
#endif |
|
#endif | #endif |
} | } |
| |
void Socket::close(PEGASUS_SOCKET socket) |
void Socket::close(SocketHandle socket) |
{ | { |
if(-1 != socket) |
if (socket != -1) |
{ | { |
#ifdef PEGASUS_OS_TYPE_WINDOWS | #ifdef PEGASUS_OS_TYPE_WINDOWS |
if(!closesocket(socket)) socket=-1; |
if(!closesocket(socket)) |
|
socket = -1; |
#else | #else |
#if (__GNUC__) && !defined(PEGASUS_OS_SOLARIS) && !defined(PEGASUS_OS_DARWIN) && !defined(PEGASUS_OS_LSB) |
int status; |
if(!TEMP_FAILURE_RETRY(::close(socket))) socket = -1; |
PEGASUS_RETRY_SYSTEM_CALL(::close(socket), status); |
#else |
|
if(!::close(socket)) socket = -1; |
if (status == 0) |
#endif |
socket = -1; |
#endif | #endif |
} | } |
} | } |
| |
void Socket::enableBlocking(PEGASUS_SOCKET socket) |
void Socket::enableBlocking(SocketHandle socket) |
{ | { |
#ifdef PEGASUS_OS_TYPE_WINDOWS | #ifdef PEGASUS_OS_TYPE_WINDOWS |
unsigned long flag = 0; | unsigned long flag = 0; |
|
|
#endif | #endif |
} | } |
| |
void Socket::disableBlocking(PEGASUS_SOCKET socket) |
void Socket::disableBlocking(SocketHandle socket) |
{ | { |
#ifdef PEGASUS_OS_TYPE_WINDOWS | #ifdef PEGASUS_OS_TYPE_WINDOWS |
unsigned long flag = 1; | unsigned long flag = 1; |
|
|
#endif | #endif |
} | } |
| |
|
|
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |
| |