This is Unofficial EPICS BASE Doxygen Site
osiSock.c File Reference
#include <stdio.h>
#include <string.h>
#include "epicsAssert.h"
#include "epicsSignal.h"
#include "epicsStdio.h"
#include "osiSock.h"
+ Include dependency graph for osiSock.c:

Go to the source code of this file.

Macros

#define nDigitsDottedIP   4u
 
#define chunkSize   8u
 
#define makeMask(NBITS)   ( ( 1u << ( (unsigned) NBITS) ) - 1u )
 

Functions

int epicsStdCall sockAddrAreIdentical (const osiSockAddr *plhs, const osiSockAddr *prhs)
 
unsigned epicsStdCall sockAddrToA (const struct sockaddr *paddr, char *pBuf, unsigned bufSize)
 
unsigned epicsStdCall ipAddrToA (const struct sockaddr_in *paddr, char *pBuf, unsigned bufSize)
 
unsigned epicsStdCall sockAddrToDottedIP (const struct sockaddr *paddr, char *pBuf, unsigned bufSize)
 
unsigned epicsStdCall ipAddrToDottedIP (const struct sockaddr_in *paddr, char *pBuf, unsigned bufSize)
 

Macro Definition Documentation

#define chunkSize   8u

Definition at line 26 of file osiSock.c.

#define makeMask (   NBITS)    ( ( 1u << ( (unsigned) NBITS) ) - 1u )

Definition at line 28 of file osiSock.c.

#define nDigitsDottedIP   4u

Definition at line 25 of file osiSock.c.

Function Documentation

unsigned epicsStdCall ipAddrToA ( const struct sockaddr_in *  paddr,
char *  pBuf,
unsigned  bufSize 
)

Definition at line 92 of file osiSock.c.

94 {
95  unsigned len = ipAddrToHostName (
96  & paddr->sin_addr, pBuf, bufSize );
97  if ( len == 0 ) {
98  len = ipAddrToDottedIP ( paddr, pBuf, bufSize );
99  }
100  else {
101  unsigned reducedSize = bufSize - len;
102  int status = epicsSnprintf (
103  &pBuf[len], reducedSize, ":%hu",
104  ntohs (paddr->sin_port) );
105  if ( status > 0 ) {
106  unsigned portSize = (unsigned) status;
107  if ( portSize < reducedSize ) {
108  len += portSize;
109  }
110  }
111  }
112  return len;
113 }
pvd::Status status
LIBCOM_API unsigned epicsStdCall ipAddrToHostName(const struct in_addr *pAddr, char *pBuf, unsigned bufSize)
Definition: osdSock.c:136
LIBCOM_API int epicsStdCall epicsSnprintf(char *str, size_t size, const char *format,...) EPICS_PRINTF_STYLE(3
unsigned epicsStdCall ipAddrToDottedIP(const struct sockaddr_in *paddr, char *pBuf, unsigned bufSize)
Definition: osiSock.c:144
unsigned epicsStdCall ipAddrToDottedIP ( const struct sockaddr_in *  paddr,
char *  pBuf,
unsigned  bufSize 
)

Definition at line 144 of file osiSock.c.

146 {
147  static const char * pErrStr = "<IPA>";
148  unsigned chunk[nDigitsDottedIP];
149  unsigned addr = ntohl ( paddr->sin_addr.s_addr );
150  unsigned strLen;
151  unsigned i;
152  int status;
153 
154  if ( bufSize == 0u ) {
155  return 0u;
156  }
157 
158  for ( i = 0; i < nDigitsDottedIP; i++ ) {
159  chunk[i] = addr & makeMask ( chunkSize );
160  addr >>= chunkSize;
161  }
162 
163  /*
164  * inet_ntoa() isnt used because it isnt thread safe
165  * (and the replacements are not standardized)
166  */
167  status = epicsSnprintf (
168  pBuf, bufSize, "%u.%u.%u.%u:%hu",
169  chunk[3], chunk[2], chunk[1], chunk[0],
170  ntohs ( paddr->sin_port ) );
171  if ( status > 0 ) {
172  strLen = ( unsigned ) status;
173  if ( strLen < bufSize - 1 ) {
174  return strLen;
175  }
176  }
177  strLen = strlen ( pErrStr );
178  if ( strLen < bufSize ) {
179  strcpy ( pBuf, pErrStr );
180  return strLen;
181  }
182  else {
183  strncpy ( pBuf, pErrStr, bufSize );
184  pBuf[bufSize-1] = '\0';
185  return bufSize - 1u;
186  }
187 }
pvd::Status status
int i
Definition: scan.c:967
#define chunkSize
Definition: osiSock.c:26
#define nDigitsDottedIP
Definition: osiSock.c:25
#define makeMask(NBITS)
Definition: osiSock.c:28
LIBCOM_API int epicsStdCall epicsSnprintf(char *str, size_t size, const char *format,...) EPICS_PRINTF_STYLE(3
int epicsStdCall sockAddrAreIdentical ( const osiSockAddr plhs,
const osiSockAddr prhs 
)

Definition at line 35 of file osiSock.c.

36 {
37  int match;
38 
39  if ( plhs->sa.sa_family != prhs->sa.sa_family ) {
40  match = 0;
41  }
42  else if ( plhs->sa.sa_family != AF_INET ) {
43  match = 0;
44  }
45  else if ( plhs->ia.sin_addr.s_addr != prhs->ia.sin_addr.s_addr ) {
46  match = 0;
47  }
48  else if ( plhs->ia.sin_port != prhs->ia.sin_port ) {
49  match = 0;
50  }
51  else {
52  match = 1;
53  }
54  return match;
55 }
struct sockaddr sa
Definition: osiSock.h:158
struct sockaddr_in ia
Definition: osiSock.h:157
unsigned epicsStdCall sockAddrToA ( const struct sockaddr *  paddr,
char *  pBuf,
unsigned  bufSize 
)

Definition at line 61 of file osiSock.c.

63 {
64  if ( bufSize < 1 ) {
65  return 0;
66  }
67 
68  if ( paddr->sa_family != AF_INET ) {
69  static const char * pErrStr = "<Ukn Addr Type>";
70  unsigned len = strlen ( pErrStr );
71  if ( len < bufSize ) {
72  strcpy ( pBuf, pErrStr );
73  return len;
74  }
75  else {
76  strncpy ( pBuf, "<Ukn Addr Type>", bufSize-1 );
77  pBuf[bufSize-1] = '\0';
78  return bufSize-1;
79  }
80  }
81  else {
82  const struct sockaddr_in * paddr_in =
83  (const struct sockaddr_in *) paddr;
84  return ipAddrToA ( paddr_in, pBuf, bufSize );
85  }
86 }
unsigned epicsStdCall ipAddrToA(const struct sockaddr_in *paddr, char *pBuf, unsigned bufSize)
Definition: osiSock.c:92
unsigned epicsStdCall sockAddrToDottedIP ( const struct sockaddr *  paddr,
char *  pBuf,
unsigned  bufSize 
)

Definition at line 118 of file osiSock.c.

120 {
121  if ( paddr->sa_family != AF_INET ) {
122  const char * pErrStr = "<Ukn Addr Type>";
123  unsigned errStrLen = strlen ( pErrStr );
124  if ( errStrLen < bufSize ) {
125  strcpy ( pBuf, pErrStr );
126  return errStrLen;
127  }
128  else {
129  unsigned reducedSize = bufSize - 1u;
130  strncpy ( pBuf, pErrStr, reducedSize );
131  pBuf[reducedSize] = '\0';
132  return reducedSize;
133  }
134  }
135  else {
136  const struct sockaddr_in *paddr_in = ( const struct sockaddr_in * ) paddr;
137  return ipAddrToDottedIP ( paddr_in, pBuf, bufSize );
138  }
139 }
unsigned epicsStdCall ipAddrToDottedIP(const struct sockaddr_in *paddr, char *pBuf, unsigned bufSize)
Definition: osiSock.c:144