thread safe socket error to string function

This commit is contained in:
Jeff Hill
2003-04-22 18:06:42 +00:00
parent 2d114dc5bb
commit 1de5f1c3ef
34 changed files with 425 additions and 240 deletions
+12 -4
View File
@@ -39,10 +39,12 @@ ca_client_context::ca_client_context ( bool enablePreemptiveCallback ) :
this->sock = socket ( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
if ( this->sock == INVALID_SOCKET ) {
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
this->printf (
"ca_client_context: unable to create "
"datagram socket because = \"%s\"\n",
SOCKERRSTR (SOCKERRNO));
sockErrBuf );
throwWithLocation ( noSocket () );
}
@@ -51,10 +53,12 @@ ca_client_context::ca_client_context ( bool enablePreemptiveCallback ) :
int status = socket_ioctl ( this->sock,
FIONBIO, & yes); // X aCC 392
if ( status < 0 ) {
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
socket_close ( this->sock );
this->printf (
"%s: non blocking IO set fail because \"%s\"\n",
__FILE__, SOCKERRSTR ( SOCKERRNO ) );
__FILE__, sockErrBuf );
throwWithLocation ( noSocket () );
}
}
@@ -69,11 +73,13 @@ ca_client_context::ca_client_context ( bool enablePreemptiveCallback ) :
addr.ia.sin_port = epicsHTON16 ( PORT_ANY ); // X aCC 818
int status = bind (this->sock, &addr.sa, sizeof (addr) );
if ( status < 0 ) {
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
socket_close (this->sock);
this->printf (
"CAC: unable to bind to an unconstrained "
"address because = \"%s\"\n",
SOCKERRSTR (SOCKERRNO));
sockErrBuf );
throwWithLocation ( noSocket () );
}
}
@@ -83,8 +89,10 @@ ca_client_context::ca_client_context ( bool enablePreemptiveCallback ) :
osiSocklen_t saddr_length = sizeof ( tmpAddr );
int status = getsockname ( this->sock, & tmpAddr.sa, & saddr_length );
if ( status < 0 ) {
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
socket_close ( this->sock );
this->printf ( "CAC: getsockname () error was \"%s\"\n", SOCKERRSTR (SOCKERRNO) );
this->printf ( "CAC: getsockname () error was \"%s\"\n", sockErrBuf );
throwWithLocation ( noSocket () );
}
if ( tmpAddr.sa.sa_family != AF_INET) {
+23 -8
View File
@@ -102,8 +102,11 @@ int main ( int argc, char ** argv )
sock = socket ( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
if ( sock == INVALID_SOCKET ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ("casw: unable to create datagram socket because = \"%s\"\n",
SOCKERRSTR (SOCKERRNO));
sockErrBuf );
return -1;
}
@@ -113,18 +116,24 @@ int main ( int argc, char ** argv )
addr.ia.sin_port = epicsHTON16 ( 0 ); // any port
status = bind ( sock, &addr.sa, sizeof (addr) );
if ( status < 0 ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
socket_close ( sock );
errlogPrintf ("casw: unable to bind to an unconstrained address because = \"%s\"\n",
SOCKERRSTR (SOCKERRNO));
errlogPrintf ( "casw: unable to bind to an unconstrained address because = \"%s\"\n",
sockErrBuf );
return -1;
}
osiSockIoctl_t yes = true;
status = socket_ioctl ( sock, FIONBIO, &yes ); // X aCC 392
if ( status < 0 ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
socket_close ( sock );
errlogPrintf ("casw: unable to set socket to nonblocking state because \"%s\"\n",
SOCKERRSTR (SOCKERRNO));
errlogPrintf ( "casw: unable to set socket to nonblocking state because \"%s\"\n",
sockErrBuf );
return -1;
}
@@ -153,9 +162,12 @@ int main ( int argc, char ** argv )
osiSockIoctl_t no = false;
status = socket_ioctl ( sock, FIONBIO, &no ); // X aCC 392
if ( status < 0 ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
socket_close ( sock );
errlogPrintf ("casw: unable to set socket to blocking state because \"%s\"\n",
SOCKERRSTR (SOCKERRNO));
errlogPrintf ( "casw: unable to set socket to blocking state because \"%s\"\n",
sockErrBuf );
return -1;
}
@@ -166,9 +178,12 @@ int main ( int argc, char ** argv )
status = recvfrom ( sock, buf, sizeof ( buf ), 0,
&addr.sa, &addrSize );
if ( status <= 0 ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
socket_close ( sock );
errlogPrintf ("casw: error from recv was = \"%s\"\n",
SOCKERRSTR (SOCKERRNO));
sockErrBuf );
return -1;
}
+56 -65
View File
@@ -103,64 +103,47 @@ static tsDLList < repeaterClient > client_list;
static const unsigned short PORT_ANY = 0u;
typedef struct {
SOCKET sock;
int errNumber;
const char * pErrStr;
} makeSocketReturn;
/*
* makeSocket()
*/
static makeSocketReturn makeSocket ( unsigned short port, bool reuseAddr )
static bool makeSocket ( unsigned short port, bool reuseAddr, SOCKET * pSock )
{
int status;
union {
struct sockaddr_in ia;
struct sockaddr sa;
} bd;
makeSocketReturn msr;
int flag;
msr.sock = socket ( AF_INET, SOCK_DGRAM, 0 );
if ( msr.sock == INVALID_SOCKET ) {
msr.errNumber = SOCKERRNO;
msr.pErrStr = SOCKERRSTR (msr.errNumber);
return msr;
SOCKET sock = socket ( AF_INET, SOCK_DGRAM, 0 );
if ( sock == INVALID_SOCKET ) {
return false;
}
/*
* no need to bind if unconstrained
*/
if (port != PORT_ANY) {
if ( port != PORT_ANY ) {
memset ( (char *) &bd, 0, sizeof (bd) );
bd.ia.sin_family = AF_INET;
bd.ia.sin_addr.s_addr = epicsHTON32 (INADDR_ANY);
bd.ia.sin_port = epicsHTON16 (port);
status = bind ( msr.sock, &bd.sa, (int) sizeof(bd) );
status = bind ( sock, &bd.sa, (int) sizeof(bd) );
if ( status < 0 ) {
msr.errNumber = SOCKERRNO;
msr.pErrStr = SOCKERRSTR ( msr.errNumber );
socket_close (msr.sock);
msr.sock = INVALID_SOCKET;
return msr;
socket_close ( sock );
return false;
}
if (reuseAddr) {
flag = true;
status = setsockopt ( msr.sock, SOL_SOCKET, SO_REUSEADDR,
status = setsockopt ( sock, SOL_SOCKET, SO_REUSEADDR,
(char *) &flag, sizeof (flag) );
if ( status < 0 ) {
int errnoCpy = SOCKERRNO;
fprintf ( stderr, "%s: set socket option failed because \"%s\"\n",
__FILE__, SOCKERRSTR(errnoCpy));
return false;
}
}
}
msr.errNumber = 0;
msr.pErrStr = "no error";
return msr;
return true;
}
repeaterClient::repeaterClient ( const osiSockAddr &fromIn ) :
@@ -172,23 +155,23 @@ repeaterClient::repeaterClient ( const osiSockAddr &fromIn ) :
bool repeaterClient::connect ()
{
int status;
makeSocketReturn msr;
msr = makeSocket ( PORT_ANY, false );
if ( msr.sock == INVALID_SOCKET ) {
fprintf ( stderr, "%s: no client sock because %d=\"%s\"\n",
__FILE__, msr.errNumber, msr.pErrStr );
if ( ! makeSocket ( PORT_ANY, false, & this->sock ) ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
fprintf ( stderr, "%s: no client sock because \"%s\"\n",
__FILE__, sockErrBuf );
return false;
}
this->sock = msr.sock;
status = ::connect ( this->sock, &this->from.sa, sizeof ( this->from.sa ) );
if ( status < 0 ) {
int errnoCpy = SOCKERRNO;
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
fprintf ( stderr, "%s: unable to connect client sock because \"%s\"\n",
__FILE__, SOCKERRSTR ( errnoCpy ) );
__FILE__, sockErrBuf );
return false;
}
@@ -213,8 +196,10 @@ bool repeaterClient::sendConfirm () // X aCC 361
return false;
}
else {
fprintf ( stderr, "CA Repeater: confirm err was \"%s\"\n",
SOCKERRSTR (SOCKERRNO) );
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
debugPrintf ( ( "CA Repeater: confirm req err was \"%s\"\n", sockErrBuf) );
return false;
}
}
@@ -235,7 +220,9 @@ bool repeaterClient::sendMessage ( const void *pBuf, unsigned bufSize ) // X aCC
debugPrintf ( ("Client refused message %u\n", epicsNTOH16 ( this->from.ia.sin_port ) ) );
}
else {
debugPrintf ( ( "CA Repeater: UDP send err was \"%s\"\n", SOCKERRSTR (errnoCpy) ) );
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
debugPrintf ( ( "CA Repeater: UDP send err was \"%s\"\n", sockErrBuf) );
}
return false;
}
@@ -310,19 +297,20 @@ inline bool repeaterClient::identicalPort ( const osiSockAddr &fromIn )
bool repeaterClient::verify () // X aCC 361
{
makeSocketReturn msr;
msr = makeSocket ( this->port (), false );
if ( msr.sock != INVALID_SOCKET ) {
socket_close ( msr.sock );
SOCKET sock;
if ( ! makeSocket ( this->port (), false, & sock ) ) {
return false;
}
else {
/*
* win sock does not set SOCKERRNO when this fails
*/
if ( msr.errNumber != SOCK_EADDRINUSE ) {
fprintf ( stderr, "CA Repeater: bind test err was %d=\"%s\"\n",
msr.errNumber, msr.pErrStr );
if ( SOCKERRNO != SOCK_EADDRINUSE ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
fprintf ( stderr, "CA Repeater: bind test err was \"%s\"\n",
sockErrBuf );
}
return true;
}
@@ -383,9 +371,8 @@ static void fanOut ( const osiSockAddr & from, const void * pMsg,
static void register_new_client ( osiSockAddr & from,
tsFreeList < repeaterClient, 0x20 > & freeList )
{
int status;
bool newClient = false;
makeSocketReturn msr;
int status;
if ( from.sa.sa_family != AF_INET ) {
return;
@@ -399,13 +386,16 @@ static void register_new_client ( osiSockAddr & from,
static bool init = false;
if ( ! init ) {
msr = makeSocket ( PORT_ANY, true );
if ( msr.sock == INVALID_SOCKET ) {
fprintf ( stderr, "%s: Unable to create repeater bind test socket because %d=\"%s\"\n",
__FILE__, msr.errNumber, msr.pErrStr );
SOCKET sock;
if ( ! makeSocket ( PORT_ANY, true, & sock ) ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
fprintf ( stderr, "%s: Unable to create repeater bind test socket because \"%s\"\n",
__FILE__, sockErrBuf );
}
else {
testSock = msr.sock;
testSock = sock;
}
init = true;
}
@@ -507,7 +497,6 @@ void ca_repeater ()
SOCKET sock;
osiSockAddr from;
unsigned short port;
makeSocketReturn msr;
char * pBuf;
pBuf = new char [MAX_UDP_RECV];
@@ -516,26 +505,25 @@ void ca_repeater ()
port = envGetInetPortConfigParam ( & EPICS_CA_REPEATER_PORT,
static_cast <unsigned short> (CA_REPEATER_PORT) );
msr = makeSocket ( port, true );
if ( msr.sock == INVALID_SOCKET ) {
if ( ! makeSocket ( port, true, & sock ) ) {
/*
* test for server was already started
*/
if ( msr.errNumber == SOCK_EADDRINUSE ) {
if ( SOCKERRNO == SOCK_EADDRINUSE ) {
osiSockRelease ();
debugPrintf ( ( "CA Repeater: exiting because a repeater is already running\n" ) );
exit (0);
}
fprintf ( stderr, "%s: Unable to create repeater socket because %d=\"%s\" - fatal\n",
__FILE__, msr.errNumber, msr.pErrStr);
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
fprintf ( stderr, "%s: Unable to create repeater socket because \"%s\" - fatal\n",
__FILE__, sockErrBuf );
osiSockRelease ();
delete [] pBuf;
exit(0);
}
sock = msr.sock;
debugPrintf ( ( "CA Repeater: Attached and initialized\n" ) );
while ( true ) {
@@ -552,8 +540,11 @@ void ca_repeater ()
if ( errnoCpy == SOCK_ECONNRESET ) {
continue;
}
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
fprintf ( stderr, "CA Repeater: unexpected UDP recv err: %s\n",
SOCKERRSTR (errnoCpy) );
sockErrBuf );
continue;
}
+60 -20
View File
@@ -183,8 +183,11 @@ unsigned tcpiiu::sendBytes ( const void *pBuf,
localError != SOCK_ETIMEDOUT &&
localError != SOCK_ECONNABORTED &&
localError != SOCK_SHUTDOWN ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
this->cacRef.printf ( "CAC: unexpected TCP send error: %s\n",
SOCKERRSTR ( localError ) );
sockErrBuf );
}
this->cacRef.disconnectNotify ( *this );
@@ -251,8 +254,11 @@ unsigned tcpiiu::recvBytes ( void * pBuf, unsigned nBytesInBuf )
{
char name[64];
this->hostName ( name, sizeof ( name ) );
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
this->printf ( "Unexpected problem with circuit to CA server \"%s\" was \"%s\" - disconnecting\n",
name, SOCKERRSTR ( localErrno ) );
name, sockErrBuf );
}
this->cacRef.initiateAbortShutdown ( *this );
@@ -446,8 +452,11 @@ tcpiiu::tcpiiu ( cac & cac, callbackMutex & cbMutex, double connectionTimeout,
{
this->sock = socket ( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( this->sock == INVALID_SOCKET ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
this->printf ( "CAC: unable to create virtual circuit because \"%s\"\n",
SOCKERRSTR ( SOCKERRNO ) );
sockErrBuf );
cac.releaseSmallBufferTCP ( this->pCurData );
throw std::bad_alloc ();
}
@@ -456,16 +465,22 @@ tcpiiu::tcpiiu ( cac & cac, callbackMutex & cbMutex, double connectionTimeout,
int status = setsockopt ( this->sock, IPPROTO_TCP, TCP_NODELAY,
(char *) &flag, sizeof ( flag ) );
if ( status < 0 ) {
this->printf ("CAC: problems setting socket option TCP_NODELAY = \"%s\"\n",
SOCKERRSTR (SOCKERRNO));
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
this->printf ( "CAC: problems setting socket option TCP_NODELAY = \"%s\"\n",
sockErrBuf );
}
flag = true;
status = setsockopt ( this->sock , SOL_SOCKET, SO_KEEPALIVE,
( char * ) &flag, sizeof ( flag ) );
if ( status < 0 ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
this->printf ( "CAC: problems setting socket option SO_KEEPALIVE = \"%s\"\n",
SOCKERRSTR ( SOCKERRNO ) );
sockErrBuf );
}
// load message queue with messages informing server
@@ -489,15 +504,19 @@ tcpiiu::tcpiiu ( cac & cac, callbackMutex & cbMutex, double connectionTimeout,
status = setsockopt ( this->sock, SOL_SOCKET, SO_SNDBUF,
( char * ) &i, sizeof ( i ) );
if (status < 0) {
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
this->printf ("CAC: problems setting socket option SO_SNDBUF = \"%s\"\n",
SOCKERRSTR ( SOCKERRNO ) );
sockErrBuf );
}
i = MAX_MSG_SIZE;
status = setsockopt ( this->sock, SOL_SOCKET, SO_RCVBUF,
( char * ) &i, sizeof ( i ) );
if ( status < 0 ) {
this->printf ("CAC: problems setting socket option SO_RCVBUF = \"%s\"\n",
SOCKERRSTR (SOCKERRNO));
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
this->printf ( "CAC: problems setting socket option SO_RCVBUF = \"%s\"\n",
sockErrBuf );
}
}
# endif
@@ -509,8 +528,11 @@ tcpiiu::tcpiiu ( cac & cac, callbackMutex & cbMutex, double connectionTimeout,
( char * ) &nBytes, &sizeOfParameter );
if ( status < 0 || nBytes < 0 ||
sizeOfParameter != static_cast < int > ( sizeof ( nBytes ) ) ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
this->printf ("CAC: problems getting socket option SO_SNDBUF = \"%s\"\n",
SOCKERRSTR ( SOCKERRNO ) );
sockErrBuf );
}
else {
this->socketLibrarySendBufferSize = static_cast < unsigned > ( nBytes );
@@ -587,8 +609,11 @@ void tcpiiu::connect ()
break;
}
else {
this->printf ( "Unable to connect because %d=\"%s\"\n",
errnoCpy, SOCKERRSTR ( errnoCpy ) );
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
this->printf ( "Unable to connect because \"%s\"\n",
sockErrBuf );
this->cacRef.disconnectNotify ( *this );
break;
}
@@ -625,8 +650,11 @@ void tcpiiu::initiateAbortShutdown ( epicsGuard < callbackMutex > & cbGuard,
int status = setsockopt ( this->sock, SOL_SOCKET, SO_LINGER,
reinterpret_cast <char *> ( &tmpLinger ), sizeof (tmpLinger) );
if ( status != 0 ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ( "CAC TCP socket linger set error was %s\n",
SOCKERRSTR (SOCKERRNO) );
sockErrBuf );
}
this->discardingPendingData = true;
}
@@ -652,8 +680,11 @@ void tcpiiu::shutdown ( epicsGuard <cacMutex > & guard )
if ( oldState == iiucs_connected ) {
int status = ::shutdown ( this->sock, SHUT_RDWR );
if ( status ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ("CAC TCP socket shutdown error was %s\n",
SOCKERRSTR (SOCKERRNO) );
sockErrBuf );
}
}
@@ -664,8 +695,11 @@ void tcpiiu::shutdown ( epicsGuard <cacMutex > & guard )
//
int status = socket_close ( this->sock );
if ( status ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ("CAC TCP socket close error was %s\n",
SOCKERRSTR (SOCKERRNO) );
sockErrBuf );
}
//
@@ -686,8 +720,11 @@ tcpiiu::~tcpiiu ()
if ( this->state != this->iiucs_abort_shutdown ) {
int status = socket_close ( this->sock );
if ( status ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ("CAC TCP socket close error was %s\n",
SOCKERRSTR ( SOCKERRNO ) );
sockErrBuf );
}
}
@@ -1261,9 +1298,9 @@ const char * tcpiiu::pHostName () const
}
void tcpiiu::removeAllChannels (
epicsGuard < callbackMutex > & cbGuard,
epicsGuard < cacMutex > & guard,
cacDisconnectChannelPrivate & dcp )
epicsGuard < callbackMutex > & cbGuard,
epicsGuard < cacMutex > & guard,
cacDisconnectChannelPrivate & dcp )
{
epicsTime currentTime = epicsTime::getCurrent ();
while ( nciu *pChan = this->channelList.first() ) {
@@ -1389,8 +1426,11 @@ void tcpiiu::blockUntilBytesArePendingInOS ()
{
char name[64];
this->hostName ( name, sizeof ( name ) );
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
this->printf ( "Unexpected problem with circuit to CA server \"%s\" was \"%s\" - disconnecting\n",
name, SOCKERRSTR ( localErrno ) );
name, sockErrBuf );
}
this->cacRef.initiateAbortShutdown ( *this );
+35 -14
View File
@@ -105,16 +105,22 @@ udpiiu::udpiiu ( epicsTimerQueueActive & timerQueue, callbackMutex & cbMutex, ca
this->sock = socket ( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
if ( this->sock == INVALID_SOCKET ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
this->printf ("CAC: unable to create datagram socket because = \"%s\"\n",
SOCKERRSTR (SOCKERRNO));
sockErrBuf );
throwWithLocation ( noSocket () );
}
status = setsockopt ( this->sock, SOL_SOCKET, SO_BROADCAST,
(char *) &boolValue, sizeof ( boolValue ) );
if ( status < 0 ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
this->printf ("CAC: IP broadcasting enable failed because = \"%s\"\n",
SOCKERRSTR ( SOCKERRNO ) );
sockErrBuf );
}
#if 0
@@ -129,8 +135,10 @@ udpiiu::udpiiu ( epicsTimerQueueActive & timerQueue, callbackMutex & cbMutex, ca
status = setsockopt ( this->sock, SOL_SOCKET, SO_RCVBUF,
(char *)&size, sizeof (size) );
if (status<0) {
this->printf ("CAC: unable to set socket option SO_RCVBUF because \"%s\"\n",
SOCKERRSTR (SOCKERRNO));
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
this->printf ( "CAC: unable to set socket option SO_RCVBUF because \"%s\"\n",
sockErrBuf );
}
}
#endif
@@ -143,9 +151,12 @@ udpiiu::udpiiu ( epicsTimerQueueActive & timerQueue, callbackMutex & cbMutex, ca
addr.ia.sin_port = epicsHTON16 (PORT_ANY); // X aCC 818
status = bind (this->sock, &addr.sa, sizeof (addr) );
if ( status < 0 ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
socket_close (this->sock);
this->printf ("CAC: unable to bind to an unconstrained address because = \"%s\"\n",
SOCKERRSTR (SOCKERRNO));
this->printf ( "CAC: unable to bind to an unconstrained address because = \"%s\"\n",
sockErrBuf );
throwWithLocation ( noSocket () );
}
@@ -154,8 +165,11 @@ udpiiu::udpiiu ( epicsTimerQueueActive & timerQueue, callbackMutex & cbMutex, ca
osiSocklen_t saddr_length = sizeof ( tmpAddr );
status = getsockname ( this->sock, &tmpAddr.sa, &saddr_length );
if ( status < 0 ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
socket_close ( this->sock );
this->printf ( "CAC: getsockname () error was \"%s\"\n", SOCKERRSTR (SOCKERRNO) );
this->printf ( "CAC: getsockname () error was \"%s\"\n", sockErrBuf );
throwWithLocation ( noSocket () );
}
if ( tmpAddr.sa.sa_family != AF_INET) {
@@ -275,8 +289,11 @@ void udpiiu::recvMsg ( callbackMutex & cbMutex )
if ( errnoCpy == SOCK_ECONNRESET ) {
return;
}
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
this->printf ( "CAC: UDP recv error was \"%s\"\n",
SOCKERRSTR (errnoCpy) );
sockErrBuf );
}
else if ( status > 0 ) {
this->postMsg ( guard, src, this->recvBuf,
@@ -417,8 +434,11 @@ void epicsShareAPI caRepeaterRegistrationMessage (
if ( errnoCpy != SOCK_EINTR &&
errnoCpy != SOCK_ECONNREFUSED &&
errnoCpy != SOCK_ECONNRESET ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
fprintf ( stderr, "error sending registration message to CA repeater daemon was \"%s\"\n",
SOCKERRSTR ( errnoCpy ) );
sockErrBuf );
}
}
}
@@ -610,12 +630,12 @@ bool udpiiu::searchRespAction ( // X aCC 361
bool success;
if ( CA_V42 ( minorVersion ) ) {
success = this->cacRef.lookupChannelAndTransferToTCP
success = this->cacRef.transferChanToVirtCircuit
( cbLocker, msg.m_available, msg.m_cid, 0xffff,
0, minorVersion, serverAddr );
}
else {
success = this->cacRef.lookupChannelAndTransferToTCP
success = this->cacRef.transferChanToVirtCircuit
( cbLocker, msg.m_available, msg.m_cid, msg.m_dataType,
msg.m_count, minorVersion, serverAddr );
}
@@ -894,12 +914,13 @@ void udpiiu::datagramFlush ( const epicsTime & currentTime )
}
else {
char buf[64];
sockAddrToDottedIP ( &pNode->addr.sa, buf, sizeof ( buf ) );
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
this->printf (
"CAC: error = \"%s\" sending UDP msg to %s\n",
SOCKERRSTR ( localErrno ), buf);
sockErrBuf, buf);
break;
}
}
+28 -11
View File
@@ -128,8 +128,10 @@ casDGIntfIO::casDGIntfIO ( caServerI & serverIn, clientBufMemoryManager & memMgr
char buf[64];
int errnoCpy = SOCKERRNO;
ipAddrToA ( &serverAddr.ia, buf, sizeof ( buf ) );
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errPrintf ( S_cas_bindFail, __FILE__, __LINE__,
"- bind UDP IP addr=%s failed because %s", buf, SOCKERRSTR ( errnoCpy ) );
"- bind UDP IP addr=%s failed because %s", buf, sockErrBuf );
socket_close (this->sock);
throw S_cas_bindFail;
}
@@ -217,9 +219,11 @@ casDGIntfIO::casDGIntfIO ( caServerI & serverIn, clientBufMemoryManager & memMgr
char buf[64];
int errnoCpy = SOCKERRNO;
ipAddrToA ( & serverBCastAddr.ia, buf, sizeof ( buf ) );
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errPrintf ( S_cas_bindFail, __FILE__, __LINE__,
"- bind UDP IP addr=%s failed because %s",
buf, SOCKERRSTR ( errnoCpy ) );
buf, sockErrBuf );
socket_close ( this->sock );
socket_close ( this->bcastRecvSock );
throw S_cas_bindFail;
@@ -285,8 +289,10 @@ void casDGIntfIO::xSetNonBlocking()
status = socket_ioctl(this->sock, FIONBIO, &yes); // X aCC 392
if (status<0) {
errlogPrintf("%s:CAS: UDP non blocking IO set fail because \"%s\"\n",
__FILE__, SOCKERRSTR(SOCKERRNO));
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ( "%s:CAS: UDP non blocking IO set fail because \"%s\"\n",
__FILE__, sockErrBuf );
}
}
@@ -313,8 +319,9 @@ casDGIntfIO::osdRecv ( char * pBufIn, bufSizeT size, // X aCC 361
if ( status < 0 ) {
int errnoCpy = SOCKERRNO;
if ( errnoCpy != SOCK_EWOULDBLOCK ) {
errlogPrintf ( "CAS: UDP recv error was %s",
SOCKERRSTR ( errnoCpy ) );
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ( "CAS: UDP recv error was %s", sockErrBuf );
}
}
return casFillNone;
@@ -358,9 +365,11 @@ casDGIntfIO::osdSend ( const char * pBufIn, bufSizeT size, // X aCC 361
if ( errnoCpy != SOCK_EWOULDBLOCK ) {
char buf[64];
sockAddrToA ( & dest, buf, sizeof ( buf ) );
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf (
"CAS: UDP socket send to \"%s\" failed because \"%s\"\n",
buf, SOCKERRSTR(errnoCpy));
buf, sockErrBuf );
}
return outBufClient::flushNone;
}
@@ -374,8 +383,10 @@ bufSizeT casDGIntfIO::incomingBytesPresent () const // X aCC 361
status = socket_ioctl ( this->sock, FIONREAD, & nchars ); // X aCC 392
if ( status < 0 ) {
int localError = SOCKERRNO;
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ( "CAS: FIONREAD failed because \"%s\"\n",
SOCKERRSTR ( localError ) );
sockErrBuf );
return 0u;
}
else if ( nchars < 0 ) {
@@ -402,16 +413,20 @@ void casDGIntfIO::sendBeaconIO ( char & msg, unsigned length,
status = connect ( this->beaconSock, &pAddr->addr.sa, sizeof ( pAddr->addr.sa ) );
if (status<0) {
ipAddrToDottedIP ( & pAddr->addr.ia, buf, sizeof ( buf ) );
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ( "%s: CA beacon routing (connect to \"%s\") error was \"%s\"\n",
__FILE__, buf, SOCKERRSTR(SOCKERRNO));
__FILE__, buf, sockErrBuf );
}
else {
osiSockAddr sockAddr;
osiSocklen_t size = ( osiSocklen_t ) sizeof ( sockAddr.sa );
status = getsockname ( this->beaconSock, &sockAddr.sa, &size );
if ( status < 0 ) {
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ( "%s: CA beacon routing (getsockname) error was \"%s\"\n",
__FILE__, SOCKERRSTR(SOCKERRNO));
__FILE__, sockErrBuf );
}
else if ( sockAddr.sa.sa_family == AF_INET ) {
addrField = sockAddr.ia.sin_addr.s_addr;
@@ -419,8 +434,10 @@ void casDGIntfIO::sendBeaconIO ( char & msg, unsigned length,
status = send ( this->beaconSock, &msg, length, 0 );
if ( status < 0 ) {
ipAddrToA ( &pAddr->addr.ia, buf, sizeof(buf) );
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ( "%s: CA beacon (send to \"%s\") error was \"%s\"\n",
__FILE__, buf, SOCKERRSTR(SOCKERRNO));
__FILE__, buf, sockErrBuf );
}
else {
unsigned statusAsLength = static_cast < unsigned > ( status );
+27 -15
View File
@@ -51,7 +51,9 @@ casIntfIO::casIntfIO ( const caNetAddr & addrIn ) :
*/
this->sock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (this->sock==INVALID_SOCKET) {
printf("No socket error was %s\n", SOCKERRSTR(SOCKERRNO));
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
printf ( "No socket error was %s\n", sockErrBuf );
throw S_cas_noFD;
}
@@ -70,9 +72,11 @@ casIntfIO::casIntfIO ( const caNetAddr & addrIn ) :
SO_REUSEADDR,
(char *) &yes,
sizeof (yes));
if (status<0) {
errlogPrintf("CAS: server set SO_REUSEADDR failed? %s\n",
SOCKERRSTR(SOCKERRNO));
if ( status < 0 ) {
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ( "CAS: server set SO_REUSEADDR failed? %s\n",
sockErrBuf );
socket_close (this->sock);
throw S_cas_internal;
}
@@ -96,13 +100,13 @@ casIntfIO::casIntfIO ( const caNetAddr & addrIn ) :
}
if (status<0) {
char buf[64];
int errnoCpy = SOCKERRNO;
ipAddrToA (&this->addr, buf, sizeof(buf));
errPrintf(S_cas_bindFail,
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errPrintf ( S_cas_bindFail,
__FILE__, __LINE__,
"- bind TCP IP addr=%s failed because %s",
buf, SOCKERRSTR(errnoCpy));
buf, sockErrBuf );
socket_close (this->sock);
throw S_cas_bindFail;
}
@@ -118,8 +122,10 @@ casIntfIO::casIntfIO ( const caNetAddr & addrIn ) :
reinterpret_cast <sockaddr *> ( &this->addr ),
&addrSize );
if (status) {
errlogPrintf("CAS: getsockname() error %s\n",
SOCKERRSTR(SOCKERRNO));
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ( "CAS: getsockname() error %s\n",
sockErrBuf );
socket_close (this->sock);
throw S_cas_internal;
}
@@ -141,7 +147,9 @@ casIntfIO::casIntfIO ( const caNetAddr & addrIn ) :
status = listen(this->sock, caServerConnectPendQueueSize);
if(status < 0) {
errlogPrintf("CAS: listen() error %s\n", SOCKERRSTR(SOCKERRNO));
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ( "CAS: listen() error %s\n", sockErrBuf );
socket_close (this->sock);
throw S_cas_internal;
}
@@ -176,8 +184,10 @@ casStreamOS *casIntfIO::newStreamClient ( caServerI & cas,
if ( newSock == INVALID_SOCKET ) {
int errnoCpy = SOCKERRNO;
if ( errnoCpy != SOCK_EWOULDBLOCK && ! oneMsgFlag ) {
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ( "CAS: %s accept error \"%s\"\n",
__FILE__,SOCKERRSTR ( errnoCpy ) );
__FILE__, sockErrBuf );
oneMsgFlag = true;
}
return NULL;
@@ -217,10 +227,12 @@ void casIntfIO::setNonBlocking()
osiSockIoctl_t yes = true;
status = socket_ioctl(this->sock, FIONBIO, &yes); // X aCC 392
if (status<0) {
errlogPrintf(
if ( status < 0 ) {
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf (
"%s:CAS: server non blocking IO set fail because \"%s\"\n",
__FILE__, SOCKERRSTR(SOCKERRNO));
__FILE__, sockErrBuf );
}
}
+23 -12
View File
@@ -31,9 +31,11 @@ casStreamIO::casStreamIO ( caServerI & cas, clientBufMemoryManager & bufMgr,
status = setsockopt ( this->sock, IPPROTO_TCP, TCP_NODELAY,
( char * ) & yes, sizeof ( yes ) );
if ( status < 0 ) {
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf (
"CAS: %s TCP_NODELAY option set failed %s\n",
__FILE__, SOCKERRSTR(SOCKERRNO) );
__FILE__, sockErrBuf );
throw S_cas_internal;
}
@@ -44,9 +46,11 @@ casStreamIO::casStreamIO ( caServerI & cas, clientBufMemoryManager & bufMgr,
status = setsockopt ( sock, SOL_SOCKET, SO_KEEPALIVE,
(char *) & yes, sizeof ( yes ) );
if (status<0) {
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf (
"CAS: %s SO_KEEPALIVE option set failed %s\n",
__FILE__, SOCKERRSTR(SOCKERRNO) );
__FILE__, sockErrBuf );
throw S_cas_internal;
}
@@ -125,10 +129,11 @@ outBufClient::flushCondition casStreamIO::osdSend ( const char *pInBuf, bufSizeT
char buf[64];
ipAddrToA (&this->addr, buf, sizeof(buf));
errlogPrintf(
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf (
"CAS: TCP socket send to \"%s\" failed because \"%s\"\n",
buf, SOCKERRSTR(errnoCpy));
buf, sockErrBuf );
}
return outBufClient::flushDisconnect;
}
@@ -165,9 +170,11 @@ casStreamIO::osdRecv ( char * pInBuf, bufSizeT nBytes, // X aCC 361
myerrno != SOCK_EPIPE &&
myerrno != SOCK_ETIMEDOUT ) {
ipAddrToA (&this->addr, buf, sizeof(buf));
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf(
"CAS: client %s disconnected because \"%s\"\n",
buf, SOCKERRSTR(myerrno));
buf, sockErrBuf );
}
return casFillDisconnect;
}
@@ -185,8 +192,10 @@ void casStreamIO::forceDisconnect ()
this->sockHasBeenClosed = true;
int status = ::shutdown ( this->sock, SHUT_RDWR );
if ( status ) {
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ("CAC TCP socket shutdown error was %s\n",
SOCKERRSTR (SOCKERRNO) );
sockErrBuf );
}
socket_close ( this->sock );
// other wakeup will be required here when we
@@ -219,8 +228,10 @@ void casStreamIO::xSetNonBlocking()
this->blockingFlag = xIsntBlocking;
}
else {
errlogPrintf("%s:CAS: TCP non blocking IO set fail because \"%s\"\n",
__FILE__, SOCKERRSTR(SOCKERRNO));
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ( "%s:CAS: TCP non blocking IO set fail because \"%s\"\n",
__FILE__, sockErrBuf );
throw S_cas_internal;
}
}
@@ -247,11 +258,11 @@ bufSizeT casStreamIO::incomingBytesPresent () const // X aCC 361
localError != SOCK_ETIMEDOUT )
{
char buf[64];
int errnoCpy = SOCKERRNO;
ipAddrToA ( &this->addr, buf, sizeof(buf) );
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ("CAS: FIONREAD for %s failed because \"%s\"\n",
buf, SOCKERRSTR ( errnoCpy ) );
buf, sockErrBuf );
}
return 0u;
}
+6 -3
View File
@@ -183,10 +183,13 @@ epicsShareFunc void fdManager::process (double delay)
//
// print a message if its an unexpected error
//
if (errnoCpy != SOCK_EINTR) {
fprintf(stderr,
if ( errnoCpy != SOCK_EINTR ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
fprintf ( stderr,
"fdManager: select failed because \"%s\"\n",
SOCKERRSTR(errnoCpy));
sockErrBuf );
}
}
}
+27 -9
View File
@@ -274,10 +274,13 @@ LOCAL void logClientMakeSock (logClient *pClient)
/*
* allocate a socket
*/
pClient->sock = socket (AF_INET, SOCK_STREAM, 0);
if (pClient->sock == INVALID_SOCKET){
fprintf (stderr, "log client: no socket error %s\n",
SOCKERRSTR(SOCKERRNO));
pClient->sock = socket ( AF_INET, SOCK_STREAM, 0 );
if ( pClient->sock == INVALID_SOCKET ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
fprintf ( stderr, "log client: no socket error %s\n",
sockErrBuf );
epicsMutexUnlock (pClient->mutex);
return;
}
@@ -285,8 +288,11 @@ LOCAL void logClientMakeSock (logClient *pClient)
optval = TRUE;
status = socket_ioctl (pClient->sock, FIONBIO, &optval);
if (status<0) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
fprintf (stderr, "%s:%d ioctl FBIO client er %s\n",
__FILE__, __LINE__, SOCKERRSTR(SOCKERRNO));
__FILE__, __LINE__, sockErrBuf);
socket_close (pClient->sock);
pClient->sock = INVALID_SOCKET;
epicsMutexUnlock (pClient->mutex);
@@ -349,9 +355,12 @@ LOCAL void logClientConnect (logClient *pClient)
ipAddrToDottedIP (&pClient->addr, name, sizeof(name));
if (pClient->connectReset==0) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
fprintf (stderr,
"log client: Unable to connect to \"%s\" because %d=\"%s\"\n",
name, errnoCpy, SOCKERRSTR(errnoCpy));
name, errnoCpy, sockErrBuf);
}
logClientReset (pClient);
@@ -366,8 +375,11 @@ LOCAL void logClientConnect (logClient *pClient)
optval = FALSE;
status = socket_ioctl (pClient->sock, FIONBIO, &optval);
if (status<0) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
fprintf (stderr, "%s:%d ioctl FIONBIO log client error was \"%s\"\n",
__FILE__, __LINE__, SOCKERRSTR(SOCKERRNO));
__FILE__, __LINE__, sockErrBuf);
logClientReset (pClient);
return;
}
@@ -379,7 +391,10 @@ LOCAL void logClientConnect (logClient *pClient)
optval = TRUE;
status = setsockopt (pClient->sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&optval, sizeof(optval));
if (status<0) {
fprintf (stderr, "log client: unable to enable keepalive option because \"%s\"\n", SOCKERRSTR(SOCKERRNO));
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
fprintf (stderr, "log client: unable to enable keepalive option because \"%s\"\n", sockErrBuf);
}
/*
@@ -395,7 +410,10 @@ LOCAL void logClientConnect (logClient *pClient)
lingerval.l_linger = 60*5;
status = setsockopt (pClient->sock, SOL_SOCKET, SO_LINGER, (char *) &lingerval, sizeof(lingerval));
if (status<0) {
fprintf (stderr, "log client: unable to set linger options because \"%s\"\n", SOCKERRSTR(SOCKERRNO));
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
fprintf (stderr, "log client: unable to set linger options because \"%s\"\n", sockErrBuf);
}
}
-2
View File
@@ -48,8 +48,6 @@ typedef int osiSocklen_t;
#define FD_IN_FDSET(FD) ((FD)<FD_SETSIZE)
#define SOCKERRSTR(ERRNO_IN) (strerror(ERRNO_IN))
#define SOCK_EWOULDBLOCK EWOULDBLOCK
#define SOCK_ENOBUFS ENOBUFS
#define SOCK_ECONNRESET ECONNRESET
-2
View File
@@ -61,8 +61,6 @@ typedef socklen_t osiSocklen_t;
#define FD_IN_FDSET(FD) ((FD)<FD_SETSIZE)
#define SOCKERRSTR(ERRNO_IN) (strerror(ERRNO_IN))
#define SOCK_EWOULDBLOCK EWOULDBLOCK
#define SOCK_ENOBUFS ENOBUFS
#define SOCK_ECONNRESET ECONNRESET
-1
View File
@@ -40,7 +40,6 @@ extern "C" {
typedef int SOCKET;
#define INVALID_SOCKET (-1)
#define SOCKERRNO errno
#define SOCKERRSTR (strerror(errno))
#define socket_close(S) close(S)
#ifdef LYNXOS_RELEASE_2_4_0 /* only for LynxOS v2.4.0 */
-2
View File
@@ -48,8 +48,6 @@ typedef int osiSocklen_t;
#define FD_IN_FDSET(FD) ((FD)<FD_SETSIZE)
#define SOCKERRSTR(ERRNO_IN) (strerror(ERRNO_IN))
#define SOCK_EWOULDBLOCK EWOULDBLOCK
#define SOCK_ENOBUFS ENOBUFS
#define SOCK_ECONNRESET ECONNRESET
-5
View File
@@ -134,11 +134,6 @@ typedef int osiSocklen_t;
#else
# define SOCKERRNO errno /* UCX and others? */
#endif
/*
* This appears to work even on Multinet
*/
#define SOCKERRSTR(ERRNO_IN) (strerror(ERRNO_IN))
#define MAXHOSTNAMELEN 75
-5
View File
@@ -133,11 +133,6 @@ typedef int osiSockIoctl_t;
#else
# define SOCKERRNO errno /* UCX and others? */
#endif
/*
* This appears to work even on Multinet
*/
#define SOCKERRSTR(ERRNO_IN) (strerror(ERRNO_IN))
#define MAXHOSTNAMELEN 75
+26 -21
View File
@@ -168,34 +168,39 @@ epicsShareFunc int epicsShareAPI hostToIPAddr
/*
* convertSocketErrorToString()
*/
epicsShareFunc const char * epicsShareAPI convertSocketErrorToString (int errnoIn)
epicsShareFunc void epicsShareAPI convertSocketErrorToString (
char * pBuf, unsigned bufSize )
{
static char errString[128];
int theSockError = SOCKERRNO;
DWORD success;
if ( ! bufSize ) {
return;
}
/*
* unfortunately, this does not work ...
* and there is no obvious replacement ...
* this does not work on systems prior to W2K
*/
#if 0
DWORD W32status;
W32status = FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM,
success = FormatMessage (
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_MAX_WIDTH_MASK,
NULL,
errnoIn,
MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
errString,
sizeof(errString)/sizeof(errString[0]),
theSockError,
MAKELANGID ( LANG_NEUTRAL, SUBLANG_DEFAULT ), /* Default language */
pBuf,
bufSize,
NULL
);
if (W32status==0) {
sprintf (errString, "WIN32 Socket Library Error %d", errnoIn);
if ( ! success ) {
static const char * pFormat = "WINSOCK Error %.*d";
unsigned formatLength = strlen ( pFormat );
if ( bufSize > formatLength ) {
sprintf ( pBuf, pFormat,
bufSize - formatLength, theSockError );
}
else {
strncpy ( pBuf, "WINSOCK Error", bufSize );
pBuf [bufSize - 0] = '\0';
}
}
return errString;
#else
sprintf (errString, "WIN32 Socket Library Error %d", errnoIn);
return errString;
#endif
}
-1
View File
@@ -30,7 +30,6 @@ extern "C" {
#endif
#define SOCKERRNO WSAGetLastError()
#define SOCKERRSTR(ERRNO_IN) convertSocketErrorToString(ERRNO_IN)
#define socket_close(S) closesocket(S)
#define socket_ioctl(A,B,C) ioctlsocket(A,B,C)
-1
View File
@@ -43,7 +43,6 @@ struct ifafilt;
typedef int SOCKET;
#define INVALID_SOCKET (-1)
#define SOCKERRNO errno
#define SOCKERRSTR(ERRNO_IN) (strerror(ERRNO_IN))
#define socket_close(S) close(S)
#define socket_ioctl(A,B,C) ioctl(A,B,C)
typedef int osiSockIoctl_t;
-1
View File
@@ -38,7 +38,6 @@ extern "C" {
typedef int SOCKET;
#define INVALID_SOCKET (-1)
#define SOCKERRNO errno
#define SOCKERRSTR(ERRNO_IN) (strerror(ERRNO_IN))
#define socket_close(S) close(S)
#define socket_ioctl(A,B,C) ioctl(A,B,C)
typedef int osiSockIoctl_t;
+4 -1
View File
@@ -243,9 +243,12 @@ epicsShareFunc osiSockAddr epicsShareAPI osiLocalAddr (SOCKET socket)
ifconf.ifc_req = pIfreqList;
status = socket_ioctl ( socket, SIOCGIFCONF, &ifconf );
if ( status < 0 || ifconf.ifc_len == 0 ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf (
"osiLocalAddr(): SIOCGIFCONF ioctl failed because \"%s\"\n",
SOCKERRSTR (SOCKERRNO) );
sockErrBuf );
free ( pIfreqList );
return addr;
}
+15
View File
@@ -19,6 +19,7 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#define epicsExportSharedSymbols
#include "epicsThread.h"
@@ -114,4 +115,18 @@ epicsShareFunc int epicsShareAPI hostToIPAddr
return ret;
}
/*
* convertSocketErrorToString()
*/
epicsShareFunc void epicsShareAPI convertSocketErrorToString (
char * pBuf, unsigned bufSize )
{
if ( ! bufSize ) {
return;
}
strncpy ( pBuf, strerror ( SOCKERRNO ), bufSize );
pBuf[bufSize-1] = '\0';
}
-1
View File
@@ -41,7 +41,6 @@ extern "C" {
typedef int SOCKET;
#define INVALID_SOCKET (-1)
#define SOCKERRNO errno
#define SOCKERRSTR(ERRNO_IN) (strerror(ERRNO_IN))
#define socket_close(S) close(S)
#define socket_ioctl(A,B,C) ioctl(A,B,C)
typedef int osiSockIoctl_t;
-1
View File
@@ -42,7 +42,6 @@ extern "C" {
typedef int SOCKET;
#define INVALID_SOCKET (-1)
#define SOCKERRNO errno
#define SOCKERRSTR(ERRNO_IN) (strerror(ERRNO_IN))
#define socket_close(S) close(S)
#define socket_ioctl(A,B,C) ioctl(A,B,C)
typedef int osiSockIoctl_t;
-1
View File
@@ -42,7 +42,6 @@ extern "C" {
typedef int SOCKET;
#define INVALID_SOCKET (-1)
#define SOCKERRNO errno
#define SOCKERRSTR(ERRNO_IN) (strerror(ERRNO_IN))
#define socket_close(S) close(S)
#define socket_ioctl(A,B,C) ioctl(A,B,C)
typedef int osiSockIoctl_t;
-1
View File
@@ -111,7 +111,6 @@ int gethostname (char *name, int namelen);
typedef int SOCKET;
#define INVALID_SOCKET (-1)
#define SOCKERRNO errno
#define SOCKERRSTR(ERRNO_IN) (strerror(ERRNO_IN))
#define socket_close(S) close(S)
#define socket_ioctl(A,B,C) ioctl(A,B,C)
typedef int osiSockIoctl_t;
-1
View File
@@ -43,7 +43,6 @@ int sysClkRateGet(void);
typedef int SOCKET;
#define INVALID_SOCKET (-1)
#define SOCKERRNO errno
#define SOCKERRSTR(ERRNO_IN) (strerror(ERRNO_IN))
#define socket_close(S) close(S)
#ifndef SHUT_RDWR
# define SHUT_RDWR 2
+3 -1
View File
@@ -98,7 +98,9 @@ epicsShareFunc void epicsShareAPI osiSockRelease (void);
/*
* convert socket error number to a string
*/
epicsShareFunc const char * epicsShareAPI convertSocketErrorToString (int errnoIn);
epicsShareFunc void epicsShareAPI convertSocketErrorToString (
char * pBuf, unsigned bufSize );
#ifdef __cplusplus
}
+4 -1
View File
@@ -130,8 +130,11 @@ void camsgtask ( void *pParm )
*/
status = socket_ioctl (client->sock, FIONREAD, &nchars);
if (status < 0) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf("CAS: io ctl err - %s\n",
SOCKERRSTR(SOCKERRNO));
sockErrBuf);
cas_send_bs_msg(client, TRUE);
}
else if (nchars == 0){
+10 -8
View File
@@ -88,10 +88,12 @@ void cas_send_bs_msg ( struct client *pclient, int lock_needed )
anerrno!=SOCK_EPIPE&&
anerrno!=SOCK_ETIMEDOUT)||
CASDEBUG>2){
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf (
"CAS: TCP send to \"%s\" failed because \"%s\"\n",
buf, SOCKERRSTR(anerrno));
buf, sockErrBuf);
}
pclient->disconnect = TRUE;
pclient->send.stk = 0u;
@@ -156,16 +158,16 @@ void cas_send_dg_msg ( struct client * pclient )
}
}
else {
int anerrno = SOCKERRNO;
char buf[64];
char sockErrBuf[64];
char buf[128];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
ipAddrToDottedIP ( &pclient->addr, buf, sizeof(buf) );
errlogPrintf(
"CAS: UDP send to \"%s\" "
"failed because \"%s\"\n",
(int)buf,
(int)SOCKERRSTR(anerrno));
buf,
sockErrBuf);
}
pclient->send.stk = 0u;
+16 -5
View File
@@ -107,10 +107,12 @@ LOCAL void req_server (void *pParm)
status = setsockopt ( IOC_sock, SOL_SOCKET, SO_REUSEADDR,
(char *) &flag, sizeof (flag) );
if ( status < 0 ) {
int errnoCpy = SOCKERRNO;
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf (
"%s: set socket option SO_REUSEADDR failed because \"%s\"\n",
__FILE__, SOCKERRSTR (errnoCpy) );
__FILE__, sockErrBuf );
}
}
# endif
@@ -135,8 +137,11 @@ LOCAL void req_server (void *pParm)
(struct sockaddr *) &serverAddr, sizeof ( serverAddr ) );
}
if ( status < 0 ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ( "CAS: Socket bind error was \"%s\"\n",
SOCKERRSTR (SOCKERRNO) );
sockErrBuf );
epicsThreadSuspendSelf ();
}
portChange = 1;
@@ -149,8 +154,11 @@ LOCAL void req_server (void *pParm)
status = getsockname ( IOC_sock,
(struct sockaddr *)&serverAddr, &addrSize);
if ( status ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ( "CAS: getsockname() error %s\n",
SOCKERRSTR(SOCKERRNO) );
sockErrBuf );
epicsThreadSuspendSelf ();
}
@@ -189,8 +197,11 @@ LOCAL void req_server (void *pParm)
osiSocklen_t addLen = sizeof(sockAddr);
if ( ( clientSock = accept ( IOC_sock, &sockAddr, &addLen ) ) == INVALID_SOCKET ) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf("CAS: Client accept error was \"%s\"\n",
(int) SOCKERRSTR(SOCKERRNO));
sockErrBuf );
epicsThreadSleep(15.0);
continue;
}
+16 -6
View File
@@ -181,10 +181,12 @@ void cast_server(void *pParm)
status = setsockopt ( IOC_cast_sock, SOL_SOCKET, SO_REUSEADDR,
(char *) &flag, sizeof (flag) );
if ( status < 0 ) {
int errnoCpy = SOCKERRNO;
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf (
"%s: set socket option SO_REUSEADDR failed because \"%s\"\n",
__FILE__, SOCKERRSTR (errnoCpy) );
__FILE__, sockErrBuf );
}
}
@@ -196,7 +198,10 @@ void cast_server(void *pParm)
/* get server's Internet address */
if( bind(IOC_cast_sock, (struct sockaddr *)&sin, sizeof (sin)) < 0){
epicsPrintf ("CAS: UDP server port bind error was \"%s\"\n", SOCKERRSTR ( SOCKERRNO ) );
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
epicsPrintf ("CAS: UDP server port bind error was \"%s\"\n", sockErrBuf );
socket_close (IOC_cast_sock);
epicsThreadSuspendSelf ();
}
@@ -205,10 +210,12 @@ void cast_server(void *pParm)
status = setsockopt ( IOC_cast_sock, SOL_SOCKET, SO_REUSEADDR,
(char *)&flag, sizeof (flag) );
if ( status < 0 ) {
int errnoCpy = SOCKERRNO;
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf (
"%s: set socket option SO_REUSEADDR failed because \"%s\"\n",
__FILE__, SOCKERRSTR (errnoCpy) );
__FILE__, sockErrBuf );
}
tbs = epicsThreadHighestPriorityLevelBelow ( priorityOfSelf, &priorityOfBeacon );
@@ -252,8 +259,11 @@ void cast_server(void *pParm)
(struct sockaddr *)&new_recv_addr,
&recv_addr_size);
if (status<0) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
epicsPrintf ("CAS: UDP recv error (errno=%s)\n",
SOCKERRSTR(SOCKERRNO));
sockErrBuf);
epicsThreadSleep(1.0);
}
else {
+10 -3
View File
@@ -209,9 +209,12 @@ void rsrv_online_notify_task(void *pParm)
status = connect (sock, &pNode->addr.sa, sizeof(pNode->addr.sa));
if (status<0) {
char sockErrBuf[64];
convertSocketErrorToString (
sockErrBuf, sizeof ( sockErrBuf ) );
ipAddrToDottedIP (&pNode->addr.ia, buf, sizeof(buf));
errlogPrintf ( "%s: CA beacon routing (connect to \"%s\") error was \"%s\"\n",
__FILE__, buf, SOCKERRSTR(SOCKERRNO));
__FILE__, buf, sockErrBuf);
}
else {
struct sockaddr_in if_addr;
@@ -219,8 +222,10 @@ void rsrv_online_notify_task(void *pParm)
osiSocklen_t size = sizeof (if_addr);
status = getsockname (sock, (struct sockaddr *) &if_addr, &size);
if (status<0) {
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ( "%s: CA beacon routing (getsockname) error was \"%s\"\n",
__FILE__, SOCKERRSTR(SOCKERRNO));
__FILE__, sockErrBuf);
}
else if (if_addr.sin_family==AF_INET) {
msg.m_available = if_addr.sin_addr.s_addr;
@@ -228,9 +233,11 @@ void rsrv_online_notify_task(void *pParm)
status = send (sock, (char *)&msg, sizeof(msg), 0);
if (status < 0) {
char sockErrBuf[64];
ipAddrToDottedIP (&pNode->addr.ia, buf, sizeof(buf));
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ( "%s: CA beacon (send to \"%s\") error was \"%s\"\n",
__FILE__, buf, SOCKERRSTR(SOCKERRNO));
__FILE__, buf, sockErrBuf);
}
else {
assert (status == sizeof(msg));
+24 -8
View File
@@ -130,7 +130,9 @@ int main()
*/
pserver->sock = socket(AF_INET, SOCK_STREAM, 0);
if (pserver->sock==INVALID_SOCKET) {
fprintf(stderr, "iocLogServer: sock create err: %s\n", SOCKERRSTR(SOCKERRNO));
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
fprintf(stderr, "iocLogServer: sock create err: %s\n", sockErrBuf);
return IOCLS_ERROR;
}
@@ -149,7 +151,9 @@ int main()
(char *) &optval,
sizeof(optval));
if(status<0){
fprintf(stderr, "iocLogServer: setsockopt err %s\n", SOCKERRSTR(SOCKERRNO));
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
fprintf(stderr, "iocLogServer: setsockopt err %s\n", sockErrBuf);
return IOCLS_ERROR;
}
# endif
@@ -164,7 +168,9 @@ int main()
(struct sockaddr *)&serverAddr,
sizeof (serverAddr) );
if (status<0) {
fprintf(stderr, "iocLogServer: bind err: %s\n", SOCKERRSTR(SOCKERRNO) );
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
fprintf(stderr, "iocLogServer: bind err: %s\n", sockErrBuf );
fprintf (stderr,
"iocLogServer: a server is already installed on port %u?\n",
(unsigned)ioc_log_port);
@@ -174,7 +180,9 @@ int main()
/* listen and accept new connections */
status = listen(pserver->sock, 10);
if (status<0) {
fprintf(stderr, "iocLogServer: listen err %s\n", SOCKERRSTR(SOCKERRNO));
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
fprintf(stderr, "iocLogServer: listen err %s\n", sockErrBuf);
return IOCLS_ERROR;
}
@@ -188,7 +196,9 @@ int main()
FIONBIO,
&optval);
if(status<0){
fprintf(stderr, "iocLogServer: ioctl FIONBIO err %s\n", SOCKERRSTR(SOCKERRNO));
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
fprintf(stderr, "iocLogServer: ioctl FIONBIO err %s\n", sockErrBuf);
return IOCLS_ERROR;
}
@@ -463,8 +473,10 @@ static void acceptNewClient ( void *pParam )
FIONBIO,
&optval);
if(status<0){
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
fprintf(stderr, "%s:%d ioctl FBIO client er %s\n",
__FILE__, __LINE__, SOCKERRSTR(SOCKERRNO));
__FILE__, __LINE__, sockErrBuf);
socket_close(pclient->insock);
free(pclient);
return;
@@ -509,8 +521,10 @@ static void acceptNewClient ( void *pParam )
# define SOCKET_SHUTDOWN_WRITE_SIDE 1
status = shutdown(pclient->insock, SOCKET_SHUTDOWN_WRITE_SIDE);
if(status<0){
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
fprintf (stderr, "%s:%d shutdown err %s\n", __FILE__, __LINE__,
SOCKERRSTR(SOCKERRNO));
sockErrBuf);
socket_close(pclient->insock);
free(pclient);
@@ -564,10 +578,12 @@ static void readFromClient(void *pParam)
errnoCpy != SOCK_EPIPE &&
errnoCpy != SOCK_ETIMEDOUT
) {
char sockErrBuf[64];
convertSocketErrorToString ( sockErrBuf, sizeof ( sockErrBuf ) );
fprintf(stderr,
"%s:%d socket=%d size=%d read error=%s\n",
__FILE__, __LINE__, pclient->insock,
size, SOCKERRSTR(errnoCpy));
size, sockErrBuf);
}
}
/*