This is Unofficial EPICS BASE Doxygen Site
osiSock.c
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2002 The University of Chicago, as Operator of Argonne
3 * National Laboratory.
4 * Copyright (c) 2002 The Regents of the University of California, as
5 * Operator of Los Alamos National Laboratory.
6 * EPICS BASE Versions 3.13.7
7 * and higher are distributed subject to a Software License Agreement found
8 * in file LICENSE that is included with this distribution.
9 \*************************************************************************/
10 
11 /*
12  * socket support library generic code
13  *
14  * 7-1-97 -joh-
15  */
16 
17 #include <stdio.h>
18 #include <string.h>
19 
20 #include "epicsAssert.h"
21 #include "epicsSignal.h"
22 #include "epicsStdio.h"
23 #include "osiSock.h"
24 
25 #define nDigitsDottedIP 4u
26 #define chunkSize 8u
27 
28 #define makeMask(NBITS) ( ( 1u << ( (unsigned) NBITS) ) - 1u )
29 
30 /*
31  * sockAddrAreIdentical()
32  * (returns true if addresses are identical)
33  */
34 int epicsStdCall sockAddrAreIdentical
35  ( const osiSockAddr *plhs, const osiSockAddr *prhs )
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 }
56 
57 /*
58  * sockAddrToA()
59  * (convert socket address to ASCII host name)
60  */
61 unsigned epicsStdCall sockAddrToA (
62  const struct sockaddr * paddr, char * pBuf, unsigned bufSize )
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 }
87 
88 /*
89  * ipAddrToA()
90  * (convert IP address to ASCII host name)
91  */
92 unsigned epicsStdCall ipAddrToA (
93  const struct sockaddr_in * paddr, char * pBuf, unsigned bufSize )
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 }
114 
115 /*
116  * sockAddrToDottedIP ()
117  */
118 unsigned epicsStdCall sockAddrToDottedIP (
119  const struct sockaddr * paddr, char * pBuf, unsigned bufSize )
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 }
140 
141 /*
142  * ipAddrToDottedIP ()
143  */
144 unsigned epicsStdCall ipAddrToDottedIP (
145  const struct sockaddr_in *paddr, char *pBuf, unsigned bufSize )
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 }
188 
unsigned epicsStdCall sockAddrToDottedIP(const struct sockaddr *paddr, char *pBuf, unsigned bufSize)
Definition: osiSock.c:118
pvd::Status status
An EPICS-specific replacement for ANSI C&#39;s assert.
int i
Definition: scan.c:967
struct sockaddr sa
Definition: osiSock.h:158
#define chunkSize
Definition: osiSock.c:26
struct sockaddr_in ia
Definition: osiSock.h:157
#define nDigitsDottedIP
Definition: osiSock.c:25
#define makeMask(NBITS)
Definition: osiSock.c:28
bucket ** plhs
Definition: reader.c:37
unsigned epicsStdCall sockAddrToA(const struct sockaddr *paddr, char *pBuf, unsigned bufSize)
Definition: osiSock.c:61
unsigned epicsStdCall ipAddrToA(const struct sockaddr_in *paddr, char *pBuf, unsigned bufSize)
Definition: osiSock.c:92
OS-independent routines for ignoring Posix signals.
LIBCOM_API unsigned epicsStdCall ipAddrToHostName(const struct in_addr *pAddr, char *pBuf, unsigned bufSize)
Definition: osdSock.c:136
int epicsStdCall sockAddrAreIdentical(const osiSockAddr *plhs, const osiSockAddr *prhs)
Definition: osiSock.c:35
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