thread safe socket error to string function
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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';
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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 {
|
||||
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
}
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user