librnr  1.14.5
RoadNarrows Robotics Common Library 1
sockset.c File Reference

Socket Sets services definitions. More...

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include "rnr/rnrconfig.h"
#include "rnr/sock.h"
#include "rnr/sockset.h"
#include "rnr/log.h"
#include "rnr/new.h"

Go to the source code of this file.

Classes

struct  sockset_t
 Socket Set Structure. More...
 

Functions

static void fdset_nowarn (int fd, fd_set *pset)
 FD_SET() wrapper with no annoying warnings. More...
 
static void fdclr_nowarn (int fd, fd_set *pset)
 FD_CLR() wrapper with no annoying warnings. More...
 
static int fdisset_nowarn (int fd, fd_set *pset)
 FD_ISSET() wrapper with no annoying warnings. More...
 
static ushort_t ntohs_nowarn (ushort_t huShort)
 ntohs() wrapper with no annoying warnings. More...
 
static ushort_t htons_nowarn (ushort_t huShort)
 htons() wrapper with no annoying warnings. More...
 
static int SockSetFindHighestSd (SockSet_T *pSockSet)
 Find the highest socket descriptor number in the Active subset. More...
 
static int SockSetChkSd (Socket_T *pSocket)
 Check if socket is open and within valid range. More...
 
SockSet_TSockSetNew ()
 Allocate a new SockSet. More...
 
void SockSetDelete (SockSet_T *pSockSet)
 Delete an allocated SockSet. More...
 
int SockSetAdd (SockSet_T *pSockSet, Socket_T *pSocket, bool_t bActivateRead, bool_t bActivateWrite)
 Add a Socket to a SockSet. More...
 
int SockSetRemove (SockSet_T *pSockSet, Socket_T *pSocket)
 Remove Socket from SockSet. More...
 
int SockSetActivate (SockSet_T *pSockSet, Socket_T *pSocket, bool_t bActivateRead, bool_t bActivateWrite)
 Activate Socket read/write operations in SockSet. More...
 
int SockSetPutOnHold (SockSet_T *pSockSet, Socket_T *pSocket, bool_t bHoldRead, bool_t bHoldWrite)
 Put Socket read/write operations in SockSet on hold. More...
 
int SockSetSelect (SockSet_T *pSockSet, struct timeval *pTimeOut)
 Perform select() on SockSet's Active sets. More...
 
Socket_TSockSetIterFirst (SockSet_T *pSockSet, int eSet, int eIO, SockSetIter_T *pIter)
 Start iteration of Sockets in the given set in SockSet. More...
 
Socket_TSockSetIterNext (SockSetIter_T *pIter)
 Next Socket in iteration over the initialized socket set of SockSet. More...
 

Detailed Description

Socket Sets services definitions.

LastChangedDate
2010-05-03 13:38:47 -0600 (Mon, 03 May 2010)
Rev
362

A socket set is composed of three open socket read/write subsets:

Active SD's (socked descriptors) active for read/write I/O.
OnHold SD's managed but are on hold (not select()'ed).
Select The select() working subset. The Active subset is copied into the Select set and passed into select(). On select()'s return, the Select set is the subset SD's with I/O events.
Note
These socket functions were inspired by the camserv socket.c functions written by Jon Travis (jtrav.nosp@m.is@p.nosp@m.00p.o.nosp@m.rg)
Author
Robin Knight (robin.nosp@m..kni.nosp@m.ght@r.nosp@m.oadn.nosp@m.arrow.nosp@m.s.co.nosp@m.m)

Definition in file sockset.c.

Function Documentation

static void fdclr_nowarn ( int  fd,
fd_set *  pset 
)
inlinestatic

FD_CLR() wrapper with no annoying warnings.

Parameters
fdFile descriptor to add to set.
psetPointer to fd set.

Definition at line 107 of file sockset.c.

Referenced by SockSetActivate(), SockSetPutOnHold(), and SockSetRemove().

108 {
109  FD_CLR(fd, pset);
110 }
static int fdisset_nowarn ( int  fd,
fd_set *  pset 
)
inlinestatic

FD_ISSET() wrapper with no annoying warnings.

Parameters
fdFile descriptor to add to set.
psetPointer to fd set.
Returns
Returusn non-zero if set, else zero.

Definition at line 118 of file sockset.c.

References PRAGMA_IGNORED, and PRAGMA_WARNING.

Referenced by SockSetFindHighestSd(), and SockSetIterNext().

119 {
120  return FD_ISSET(fd, pset);
121 }
static void fdset_nowarn ( int  fd,
fd_set *  pset 
)
inlinestatic

FD_SET() wrapper with no annoying warnings.

Parameters
fdFile descriptor to add to set.
psetPointer to fd set.

Definition at line 97 of file sockset.c.

Referenced by SockSetActivate(), SockSetAdd(), and SockSetPutOnHold().

98 {
99  FD_SET(fd, pset);
100 }
static ushort_t htons_nowarn ( ushort_t  huShort)
inlinestatic

htons() wrapper with no annoying warnings.

Parameters
huShortUnsigned short integer.
Returns
Network byte order.

Definition at line 140 of file sockset.c.

References PRAGMA_WARNING.

141 {
142  return htons(huShort);
143 }
static ushort_t ntohs_nowarn ( ushort_t  huShort)
inlinestatic

ntohs() wrapper with no annoying warnings.

Parameters
huShortUnsigned short integer.
Returns
Host byte order.

Definition at line 130 of file sockset.c.

131 {
132  return ntohs(huShort);
133 }
int SockSetActivate ( SockSet_T pSockSet,
Socket_T pSocket,
bool_t  bActivateRead,
bool_t  bActivateWrite 
)

Activate Socket read/write operations in SockSet.

Socket is already part of the SockSet.

Parameters
pSockSetPointer to SockSet.
pSocketPointer to Socket.
bActivateReadDo [not] add to active read set.
bActivateWriteDo [not] add to active write set.
Returns
Returns OK(0) on success, ≤ 0 on error.

Definition at line 377 of file sockset.c.

References CHKPTR, fdclr_nowarn(), fdset_nowarn(), sockset_t::m_sdHighest, sockset_t::m_sdSetActive, sockset_t::m_sdSetOnHold, OK, SOCK_IO_READ, SOCK_IO_WRITE, SOCK_RC_EBADSOCK, SockSetChkSd(), and SockSetFindHighestSd().

381 {
382  int sd; // socket descriptor
383 
384  CHKPTR(pSockSet, SOCK_RC_EBADSOCK);
385 
386  // Check data and return socket descriptor
387  if( (sd = SockSetChkSd(pSocket)) < 0 )
388  {
389  return sd;
390  }
391 
392  if( bActivateRead )
393  {
394  fdclr_nowarn(sd, &(pSockSet->m_sdSetOnHold[SOCK_IO_READ]));
395  fdset_nowarn(sd, &(pSockSet->m_sdSetActive[SOCK_IO_READ]));
396  if( sd > pSockSet->m_sdHighest )
397  {
398  pSockSet->m_sdHighest = sd;
399  }
400  }
401 
402  if( bActivateWrite )
403  {
404  fdclr_nowarn(sd, &(pSockSet->m_sdSetOnHold[SOCK_IO_WRITE]));
405  fdset_nowarn(sd, &(pSockSet->m_sdSetActive[SOCK_IO_WRITE]));
406  if( sd > pSockSet->m_sdHighest )
407  {
408  pSockSet->m_sdHighest = sd;
409  }
410  }
411 
412  pSockSet->m_sdHighest = SockSetFindHighestSd(pSockSet);
413 
414  return OK;
415 }
#define SOCK_IO_READ
read index
Definition: sock.h:130
fd_set m_sdSetActive[SOCK_IO_NUMOF]
active socket descriptor set
Definition: sockset.c:153
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define OK
Okay.
Definition: rnrconfig.h:301
static void fdclr_nowarn(int fd, fd_set *pset)
FD_CLR() wrapper with no annoying warnings.
Definition: sockset.c:107
static int SockSetChkSd(Socket_T *pSocket)
Check if socket is open and within valid range.
Definition: sockset.c:194
fd_set m_sdSetOnHold[SOCK_IO_NUMOF]
on-hold socket descriptor set
Definition: sockset.c:154
#define SOCK_RC_EBADSOCK
socket is bad
Definition: sock.h:122
static void fdset_nowarn(int fd, fd_set *pset)
FD_SET() wrapper with no annoying warnings.
Definition: sockset.c:97
int m_sdHighest
highest socket descriptor value
Definition: sockset.c:151
#define SOCK_IO_WRITE
write index
Definition: sock.h:131
static int SockSetFindHighestSd(SockSet_T *pSockSet)
Find the highest socket descriptor number in the Active subset.
Definition: sockset.c:165
int SockSetAdd ( SockSet_T pSockSet,
Socket_T pSocket,
bool_t  bActivateRead,
bool_t  bActivateWrite 
)

Add a Socket to a SockSet.

Socket is added to either the on-hold or active socket set, depending on the given boolean value.

Parameters
pSockSetPointer to SockSet.
pSocketPointer to Socket.
bActivateReadDo [not] add to active read set.
bActivateWriteDo [not] add to active write set.
Returns
Returns OK(0) on success, ≤ 0 on error.

Definition at line 272 of file sockset.c.

References _TBOOL, _TPTR, _TSTR, CHKPTR, fdset_nowarn(), LOGDIAG4CALL, sockset_t::m_pSocket, sockset_t::m_sdHighest, sockset_t::m_sdSetActive, sockset_t::m_sdSetOnHold, OK, SOCK_IO_READ, SOCK_IO_WRITE, SOCK_RC_EBADSOCK, SocketAttrGetLocalName(), and SockSetChkSd().

276 {
277  int sd; // socket descriptor
278 
279  CHKPTR(pSockSet, SOCK_RC_EBADSOCK);
280 
281  // Check data and return socket descriptor
282  if( (sd = SockSetChkSd(pSocket)) < 0 )
283  {
284  return sd;
285  }
286 
287  LOGDIAG4CALL(_TPTR(pSockSet), _TSTR(SocketAttrGetLocalName(pSocket)),
288  _TBOOL(bActivateRead), _TBOOL(bActivateWrite));
289 
290  //
291  // Add sd to appropriate read socket descriptor set
292  //
293  if( bActivateRead ) // place read in the active set
294  {
295  fdset_nowarn(sd, &(pSockSet->m_sdSetActive[SOCK_IO_READ]));
296  if( pSockSet->m_sdHighest < sd )
297  {
298  pSockSet->m_sdHighest = sd;
299  }
300  }
301  else // place read in the on-hold set
302  {
303  fdset_nowarn(sd, &(pSockSet->m_sdSetOnHold[SOCK_IO_READ]));
304  }
305 
306  //
307  // Add sd to appropriate write socket descriptor set
308  //
309  if( bActivateWrite ) // place write in the active set
310  {
311  fdset_nowarn(sd, &(pSockSet->m_sdSetActive[SOCK_IO_WRITE]));
312  if( pSockSet->m_sdHighest < sd )
313  {
314  pSockSet->m_sdHighest = sd;
315  }
316  }
317  else // place write in the on-hold set
318  {
319  fdset_nowarn(sd, &(pSockSet->m_sdSetOnHold[SOCK_IO_WRITE]));
320  }
321 
322  // add socket
323  pSockSet->m_pSocket[sd] = pSocket;
324 
325  return OK;
326 }
#define SOCK_IO_READ
read index
Definition: sock.h:130
fd_set m_sdSetActive[SOCK_IO_NUMOF]
active socket descriptor set
Definition: sockset.c:153
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
const char * SocketAttrGetLocalName(Socket_T *pSocket)
Get Socket local name.
Definition: sock.c:632
#define OK
Okay.
Definition: rnrconfig.h:301
Socket_T * m_pSocket[FD_SETSIZE]
associated sockets
Definition: sockset.c:155
static int SockSetChkSd(Socket_T *pSocket)
Check if socket is open and within valid range.
Definition: sockset.c:194
fd_set m_sdSetOnHold[SOCK_IO_NUMOF]
on-hold socket descriptor set
Definition: sockset.c:154
#define SOCK_RC_EBADSOCK
socket is bad
Definition: sock.h:122
#define _TBOOL(var)
boolean
Definition: log.h:588
#define _TSTR(var)
string variable
Definition: log.h:578
static void fdset_nowarn(int fd, fd_set *pset)
FD_SET() wrapper with no annoying warnings.
Definition: sockset.c:97
#define _TPTR(var)
pointer
Definition: log.h:587
#define LOGDIAG4CALL(...)
Standard Diagnostic Level 4 function call tracing.
Definition: log.h:442
int m_sdHighest
highest socket descriptor value
Definition: sockset.c:151
#define SOCK_IO_WRITE
write index
Definition: sock.h:131
static int SockSetChkSd ( Socket_T pSocket)
static

Check if socket is open and within valid range.

Parameters
pSocketPointer to socket.
Returns
Returns socket descriptor if valid.
Otherwise the appropriate socket return code < 0 is returned.

Definition at line 194 of file sockset.c.

References CHKPTR, LOGERROR, SOCK_RC_EBADSD, SOCK_RC_EBADSOCK, SocketAttrGetLocalName(), SocketAttrGetSd(), and SocketStateIsOpen().

Referenced by SockSetActivate(), SockSetAdd(), SockSetPutOnHold(), and SockSetRemove().

195 {
196  int sd; // socket descriptor
197 
198  CHKPTR(pSocket, SOCK_RC_EBADSOCK);
199 
200  // this socket isn't open
201  if( !SocketStateIsOpen(pSocket) )
202  {
203  LOGERROR("Socket not open");
204  return SOCK_RC_EBADSD;
205  }
206 
207  sd = SocketAttrGetSd(pSocket);
208 
209  if( sd >= FD_SETSIZE )
210  {
211  LOGERROR("Socket '%s' descriptor %d > %d: too big",
212  SocketAttrGetLocalName(pSocket), sd, FD_SETSIZE);
213  return SOCK_RC_EBADSD;
214  }
215 
216  return sd;
217 }
int SocketAttrGetSd(Socket_T *pSocket)
Get Socket socket (file) descriptor.
Definition: sock.c:735
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define SOCK_RC_EBADSD
bad/closed socket descriptor
Definition: sock.h:124
const char * SocketAttrGetLocalName(Socket_T *pSocket)
Get Socket local name.
Definition: sock.c:632
#define LOGERROR(fmt,...)
Standard Error logging.
Definition: log.h:488
bool_t SocketStateIsOpen(Socket_T *pSocket)
Check if Socket is open.
Definition: sock.c:888
#define SOCK_RC_EBADSOCK
socket is bad
Definition: sock.h:122
void SockSetDelete ( SockSet_T pSockSet)

Delete an allocated SockSet.

Parameters
pSockSetPointer to SockSet.

Definition at line 250 of file sockset.c.

References NULL.

251 {
252  if( pSockSet == NULL )
253  {
254  return;
255  }
256  delete(pSockSet);
257 }
#define NULL
null pointer
Definition: rnrconfig.h:199
static int SockSetFindHighestSd ( SockSet_T pSockSet)
static

Find the highest socket descriptor number in the Active subset.

Parameters
pSockSetPointer to socket set.
Returns
Highest socket descriptor. -1 if none found.

Definition at line 165 of file sockset.c.

References fdisset_nowarn(), sockset_t::m_sdHighest, sockset_t::m_sdSetActive, SOCK_IO_READ, and SOCK_IO_WRITE.

Referenced by SockSetActivate(), SockSetPutOnHold(), and SockSetRemove().

166 {
167  int sd;
168  int sdHighest;
169 
170  for(sd=0, sdHighest=-1; sd <= pSockSet->m_sdHighest; ++sd)
171  {
172  if( fdisset_nowarn(sd, &(pSockSet->m_sdSetActive[SOCK_IO_READ]))
173  || fdisset_nowarn(sd, &(pSockSet->m_sdSetActive[SOCK_IO_WRITE])) )
174  {
175  if( sd > sdHighest )
176  {
177  sdHighest = sd;
178  }
179  }
180  }
181 
182  return sdHighest;
183 }
#define SOCK_IO_READ
read index
Definition: sock.h:130
fd_set m_sdSetActive[SOCK_IO_NUMOF]
active socket descriptor set
Definition: sockset.c:153
static int fdisset_nowarn(int fd, fd_set *pset)
FD_ISSET() wrapper with no annoying warnings.
Definition: sockset.c:118
int m_sdHighest
highest socket descriptor value
Definition: sockset.c:151
#define SOCK_IO_WRITE
write index
Definition: sock.h:131
Socket_T* SockSetIterFirst ( SockSet_T pSockSet,
int  eSet,
int  eIO,
SockSetIter_T pIter 
)

Start iteration of Sockets in the given set in SockSet.

Parameters
pSockSetPointer to SockSet.
eSetOne of: SOCK_SET_ONHOLD SOCK_SET_ACTIVE SOCK_SET_SELECTED.
eIOOne of: SOCK_IO_READ SOCK_IO_WRITE.
pIterSockSet interator.
Returns
Pointer to first Socket if found, else NULL.

Definition at line 548 of file sockset.c.

References CHKPTR, SockSetIter_T::m_eIO, SockSetIter_T::m_eSet, SockSetIter_T::m_pSockSet, SockSetIter_T::m_sdCur, SockSetIter_T::m_sdSet, sockset_t::m_sdSetActive, sockset_t::m_sdSetOnHold, sockset_t::m_sdSetSelect, NULL, SOCK_CHK_IO, SOCK_SET_ACTIVE, SOCK_SET_CHK_SET, SOCK_SET_ONHOLD, SOCK_SET_SELECTED, and SockSetIterNext().

552 {
553  CHKPTR(pSockSet, NULL);
554  SOCK_SET_CHK_SET(eSet, NULL);
555  SOCK_CHK_IO(eIO, NULL);
556  CHKPTR(pIter, NULL);
557 
558  pIter->m_pSockSet = pSockSet;
559  pIter->m_eSet = eSet;
560  pIter->m_eIO = eIO;
561  pIter->m_sdCur = -1;
562 
563  switch(eSet)
564  {
565  case SOCK_SET_ONHOLD:
566  pIter->m_sdSet = pSockSet->m_sdSetOnHold[eIO];
567  break;
568  case SOCK_SET_ACTIVE:
569  pIter->m_sdSet = pSockSet->m_sdSetActive[eIO];
570  break;
571  case SOCK_SET_SELECTED:
572  default:
573  pIter->m_sdSet = pSockSet->m_sdSetSelect[eIO];
574  break;
575  }
576 
577  return SockSetIterNext(pIter);
578 }
int m_sdCur
current iterator position
Definition: sockset.h:56
#define SOCK_SET_CHK_SET(set,...)
Check socket set enum.
Definition: sockset.h:72
fd_set m_sdSetActive[SOCK_IO_NUMOF]
active socket descriptor set
Definition: sockset.c:153
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
#define SOCK_SET_ACTIVE
active socket descriptor set
Definition: sockset.h:64
Socket_T * SockSetIterNext(SockSetIter_T *pIter)
Next Socket in iteration over the initialized socket set of SockSet.
Definition: sockset.c:587
fd_set m_sdSetOnHold[SOCK_IO_NUMOF]
on-hold socket descriptor set
Definition: sockset.c:154
#define SOCK_SET_SELECTED
post select() selected socket desc. set
Definition: sockset.h:65
#define SOCK_SET_ONHOLD
on-hold socket descriptor set
Definition: sockset.h:63
SockSet_T * m_pSockSet
socket set
Definition: sockset.h:53
#define SOCK_CHK_IO(io,...)
Check I/O index.
Definition: sock.h:138
int m_eIO
which read/write subset to iterate over
Definition: sockset.h:55
fd_set m_sdSet
set to iterate over
Definition: sockset.h:57
fd_set m_sdSetSelect[SOCK_IO_NUMOF]
select socket descriptor set
Definition: sockset.c:152
int m_eSet
which socket set to iterate over
Definition: sockset.h:54
Socket_T* SockSetIterNext ( SockSetIter_T pIter)

Next Socket in iteration over the initialized socket set of SockSet.

Parameters
pIterSockSet interator.
Returns
Pointer to next Socket if found, else NULL.

Definition at line 587 of file sockset.c.

References CHKPTR, fdisset_nowarn(), sockset_t::m_pSocket, SockSetIter_T::m_pSockSet, SockSetIter_T::m_sdCur, SockSetIter_T::m_sdSet, and NULL.

Referenced by SockSetIterFirst().

588 {
589  int sd;
590 
591  CHKPTR(pIter, NULL);
592  CHKPTR(pIter->m_pSockSet, NULL);
593 
594  for(sd = pIter->m_sdCur + 1; sd <= pIter->m_pSockSet->m_sdHighest; ++sd)
595  {
596  if( fdisset_nowarn(sd, &(pIter->m_sdSet)) )
597  {
598  pIter->m_sdCur = sd;
599  return pIter->m_pSockSet->m_pSocket[sd];
600  }
601  }
602 
603  // no more selected sockets found
604  pIter->m_sdCur = sd;
605 
606  return NULL;
607 }
int m_sdCur
current iterator position
Definition: sockset.h:56
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
static int fdisset_nowarn(int fd, fd_set *pset)
FD_ISSET() wrapper with no annoying warnings.
Definition: sockset.c:118
Socket_T * m_pSocket[FD_SETSIZE]
associated sockets
Definition: sockset.c:155
SockSet_T * m_pSockSet
socket set
Definition: sockset.h:53
fd_set m_sdSet
set to iterate over
Definition: sockset.h:57
SockSet_T* SockSetNew ( )

Allocate a new SockSet.

Returns
Pointer to allocated SockSet.

Definition at line 229 of file sockset.c.

References sockset_t::m_sdHighest, sockset_t::m_sdSetActive, sockset_t::m_sdSetOnHold, sockset_t::m_sdSetSelect, NEW, SOCK_IO_READ, and SOCK_IO_WRITE.

230 {
231  SockSet_T *pSockSet = NEW(SockSet_T);
232 
233  pSockSet->m_sdHighest = -1;
234 
235  FD_ZERO(&(pSockSet->m_sdSetSelect[SOCK_IO_READ]));
236  FD_ZERO(&(pSockSet->m_sdSetSelect[SOCK_IO_WRITE]));
237  FD_ZERO(&(pSockSet->m_sdSetActive[SOCK_IO_READ]));
238  FD_ZERO(&(pSockSet->m_sdSetActive[SOCK_IO_WRITE]));
239  FD_ZERO(&(pSockSet->m_sdSetOnHold[SOCK_IO_READ]));
240  FD_ZERO(&(pSockSet->m_sdSetOnHold[SOCK_IO_WRITE]));
241 
242  return pSockSet;
243 }
#define SOCK_IO_READ
read index
Definition: sock.h:130
fd_set m_sdSetActive[SOCK_IO_NUMOF]
active socket descriptor set
Definition: sockset.c:153
Socket Set Structure.
Definition: sockset.c:149
fd_set m_sdSetOnHold[SOCK_IO_NUMOF]
on-hold socket descriptor set
Definition: sockset.c:154
#define NEW(T)
Allocate new type.
Definition: new.h:49
fd_set m_sdSetSelect[SOCK_IO_NUMOF]
select socket descriptor set
Definition: sockset.c:152
int m_sdHighest
highest socket descriptor value
Definition: sockset.c:151
#define SOCK_IO_WRITE
write index
Definition: sock.h:131
int SockSetPutOnHold ( SockSet_T pSockSet,
Socket_T pSocket,
bool_t  bHoldRead,
bool_t  bHoldWrite 
)

Put Socket read/write operations in SockSet on hold.

Socket is already part of the SockSet.

Parameters
pSockSetPointer to SockSet.
pSocketPointer to Socket.
bHoldReadDo [not] add to hold read set.
bHoldWriteDo [not] add to hold write set.
Returns
Returns OK(0) on success, ≤ 0 on error.

Definition at line 429 of file sockset.c.

References CHKPTR, fdclr_nowarn(), fdset_nowarn(), sockset_t::m_sdHighest, sockset_t::m_sdSetActive, sockset_t::m_sdSetOnHold, OK, SOCK_IO_READ, SOCK_IO_WRITE, SOCK_RC_EBADSOCK, SockSetChkSd(), and SockSetFindHighestSd().

433 {
434  int sd; // socket descriptor
435 
436  CHKPTR(pSockSet, SOCK_RC_EBADSOCK);
437 
438  // Check data and return socket descriptor
439  if( (sd = SockSetChkSd(pSocket)) < 0 )
440  {
441  return sd;
442  }
443 
444  if( bHoldRead )
445  {
446  fdclr_nowarn(sd, &(pSockSet->m_sdSetActive[SOCK_IO_READ]));
447  fdset_nowarn(sd, &(pSockSet->m_sdSetOnHold[SOCK_IO_READ]));
448  }
449 
450  if( bHoldWrite )
451  {
452  fdclr_nowarn(sd, &(pSockSet->m_sdSetActive[SOCK_IO_WRITE]));
453  fdset_nowarn(sd, &(pSockSet->m_sdSetOnHold[SOCK_IO_WRITE]));
454  }
455 
456  pSockSet->m_sdHighest = SockSetFindHighestSd(pSockSet);
457 
458  return OK;
459 }
#define SOCK_IO_READ
read index
Definition: sock.h:130
fd_set m_sdSetActive[SOCK_IO_NUMOF]
active socket descriptor set
Definition: sockset.c:153
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define OK
Okay.
Definition: rnrconfig.h:301
static void fdclr_nowarn(int fd, fd_set *pset)
FD_CLR() wrapper with no annoying warnings.
Definition: sockset.c:107
static int SockSetChkSd(Socket_T *pSocket)
Check if socket is open and within valid range.
Definition: sockset.c:194
fd_set m_sdSetOnHold[SOCK_IO_NUMOF]
on-hold socket descriptor set
Definition: sockset.c:154
#define SOCK_RC_EBADSOCK
socket is bad
Definition: sock.h:122
static void fdset_nowarn(int fd, fd_set *pset)
FD_SET() wrapper with no annoying warnings.
Definition: sockset.c:97
int m_sdHighest
highest socket descriptor value
Definition: sockset.c:151
#define SOCK_IO_WRITE
write index
Definition: sock.h:131
static int SockSetFindHighestSd(SockSet_T *pSockSet)
Find the highest socket descriptor number in the Active subset.
Definition: sockset.c:165
int SockSetRemove ( SockSet_T pSockSet,
Socket_T pSocket 
)

Remove Socket from SockSet.

Parameters
pSockSetPointer to SockSet.
pSocketPointer to Socket.
Returns
Returns OK(0) on success, ≤ 0 on error.

Definition at line 336 of file sockset.c.

References _TPTR, _TSTR, CHKPTR, fdclr_nowarn(), LOGDIAG4CALL, sockset_t::m_pSocket, sockset_t::m_sdHighest, sockset_t::m_sdSetActive, sockset_t::m_sdSetOnHold, NULL, OK, SOCK_IO_READ, SOCK_IO_WRITE, SOCK_RC_EBADSOCK, SocketAttrGetLocalName(), SockSetChkSd(), and SockSetFindHighestSd().

337 {
338  int sd; // socket descriptor
339 
340  CHKPTR(pSockSet, SOCK_RC_EBADSOCK);
341 
342  // Check data and return socket descriptor
343  if( (sd = SockSetChkSd(pSocket)) < 0 )
344  {
345  return sd;
346  }
347 
348  LOGDIAG4CALL(_TPTR(pSockSet), _TSTR(SocketAttrGetLocalName(pSocket)));
349 
350  // remove socket descriptor from all sets
351  fdclr_nowarn(sd, &(pSockSet->m_sdSetActive[SOCK_IO_READ]));
352  fdclr_nowarn(sd, &(pSockSet->m_sdSetOnHold[SOCK_IO_READ]));
353  fdclr_nowarn(sd, &(pSockSet->m_sdSetActive[SOCK_IO_WRITE]));
354  fdclr_nowarn(sd, &(pSockSet->m_sdSetOnHold[SOCK_IO_WRITE]));
355 
356  // remove socket
357  pSockSet->m_pSocket[sd] = NULL;
358 
359  // find new highest socket descriptor
360  pSockSet->m_sdHighest = SockSetFindHighestSd(pSockSet);
361 
362  return OK;
363 }
#define SOCK_IO_READ
read index
Definition: sock.h:130
fd_set m_sdSetActive[SOCK_IO_NUMOF]
active socket descriptor set
Definition: sockset.c:153
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
const char * SocketAttrGetLocalName(Socket_T *pSocket)
Get Socket local name.
Definition: sock.c:632
#define OK
Okay.
Definition: rnrconfig.h:301
#define NULL
null pointer
Definition: rnrconfig.h:199
Socket_T * m_pSocket[FD_SETSIZE]
associated sockets
Definition: sockset.c:155
static void fdclr_nowarn(int fd, fd_set *pset)
FD_CLR() wrapper with no annoying warnings.
Definition: sockset.c:107
static int SockSetChkSd(Socket_T *pSocket)
Check if socket is open and within valid range.
Definition: sockset.c:194
fd_set m_sdSetOnHold[SOCK_IO_NUMOF]
on-hold socket descriptor set
Definition: sockset.c:154
#define SOCK_RC_EBADSOCK
socket is bad
Definition: sock.h:122
#define _TSTR(var)
string variable
Definition: log.h:578
#define _TPTR(var)
pointer
Definition: log.h:587
#define LOGDIAG4CALL(...)
Standard Diagnostic Level 4 function call tracing.
Definition: log.h:442
int m_sdHighest
highest socket descriptor value
Definition: sockset.c:151
#define SOCK_IO_WRITE
write index
Definition: sock.h:131
static int SockSetFindHighestSd(SockSet_T *pSockSet)
Find the highest socket descriptor number in the Active subset.
Definition: sockset.c:165
int SockSetSelect ( SockSet_T pSockSet,
struct timeval *  pTimeOut 
)

Perform select() on SockSet's Active sets.

Parameters
pSockSetPointer to SockSet.
pTimeOutSelect time out.
Returns
On success, returns number of socket descriptors found in the active state.
On time out, returns 0.
On error, returns ≤ 0.

Definition at line 472 of file sockset.c.

References CHKPTR, LOGERROR, LOGSYSERROR, sockset_t::m_sdHighest, sockset_t::m_sdSetActive, sockset_t::m_sdSetSelect, NULL, SOCK_IO_READ, SOCK_IO_WRITE, SOCK_RC_EBADSOCK, SOCK_RC_EFAIL, and SOCK_RC_ESYSERR.

473 {
474  struct timeval tvSave = {0, 0}; // saved timeout value
475  int nSd; // number of socket descriptors selected
476  int nTries = 0; // number of tries when interrupted
477 
478  CHKPTR(pSockSet, SOCK_RC_EBADSOCK);
479 
480  // save timeout value - can get munged by select()
481  if( pTimeOut != NULL )
482  {
483  tvSave = *pTimeOut;
484  }
485 
486  //
487  // Try at most three times to select.
488  //
489  while(nTries++ < 3)
490  {
491  // build select read/write sets
492  pSockSet->m_sdSetSelect[SOCK_IO_READ] =
493  pSockSet->m_sdSetActive[SOCK_IO_READ];
494  pSockSet->m_sdSetSelect[SOCK_IO_WRITE] =
495  pSockSet->m_sdSetActive[SOCK_IO_WRITE];
496 
497  //
498  // Wait with timeout (optional) for read/write availability
499  //
500  nSd = select(pSockSet->m_sdHighest+1,
501  &(pSockSet->m_sdSetSelect[SOCK_IO_READ]),
502  &(pSockSet->m_sdSetSelect[SOCK_IO_WRITE]),
503  NULL,
504  pTimeOut);
505 
506  // restore mangled time out
507  if( pTimeOut != NULL )
508  {
509  *pTimeOut = tvSave;
510  }
511 
512  // system error occurred
513  if( nSd < 0 )
514  {
515  switch(errno)
516  {
517  case EINTR: // interrupted - try again
518  break;
519  default:
520  LOGSYSERROR("select()");
521  return SOCK_RC_ESYSERR;
522  }
523  }
524 
525  // read/write sets available or timeout
526  else
527  {
528  return nSd;
529  }
530  }
531 
532  LOGERROR("Failed %d times to select()", nTries);
533 
534  return SOCK_RC_EFAIL;
535 }
#define SOCK_IO_READ
read index
Definition: sock.h:130
#define SOCK_RC_EFAIL
general, unspecified error
Definition: sock.h:119
fd_set m_sdSetActive[SOCK_IO_NUMOF]
active socket descriptor set
Definition: sockset.c:153
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
#define LOGSYSERROR(fmt,...)
Standard System Error logging.
Definition: log.h:509
#define LOGERROR(fmt,...)
Standard Error logging.
Definition: log.h:488
#define SOCK_RC_EBADSOCK
socket is bad
Definition: sock.h:122
#define SOCK_RC_ESYSERR
system error occurred
Definition: sock.h:125
fd_set m_sdSetSelect[SOCK_IO_NUMOF]
select socket descriptor set
Definition: sockset.c:152
int m_sdHighest
highest socket descriptor value
Definition: sockset.c:151
#define SOCK_IO_WRITE
write index
Definition: sock.h:131