This is Unofficial EPICS BASE Doxygen Site
iocLogServer.c File Reference
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <limits.h>
#include <time.h>
#include "dbDefs.h"
#include "epicsAssert.h"
#include "fdmgr.h"
#include "envDefs.h"
#include "osiSock.h"
#include "epicsStdio.h"
+ Include dependency graph for iocLogServer.c:

Go to the source code of this file.

Classes

struct  iocLogClient
 
struct  ioc_log_server
 

Macros

#define IOCLS_ERROR   (-1)
 
#define IOCLS_OK   0
 
#define NITEMS   1
 

Functions

int main (void)
 

Macro Definition Documentation

#define IOCLS_ERROR   (-1)

Definition at line 62 of file iocLogServer.c.

#define IOCLS_OK   0

Definition at line 63 of file iocLogServer.c.

#define NITEMS   1

Definition at line 522 of file iocLogServer.c.

Function Documentation

int main ( void  )

Definition at line 90 of file iocLogServer.c.

91 {
92  struct sockaddr_in serverAddr; /* server's address */
93  struct timeval timeout;
94  int status;
95  struct ioc_log_server *pserver;
96 
97  osiSockIoctl_t optval;
98 
99  status = getConfig();
100  if (status<0) {
101  fprintf(stderr, "iocLogServer: EPICS environment underspecified\n");
102  fprintf(stderr, "iocLogServer: failed to initialize\n");
103  return IOCLS_ERROR;
104  }
105 
106  pserver = (struct ioc_log_server *)
107  calloc(1, sizeof *pserver);
108  if (!pserver) {
109  fprintf(stderr, "iocLogServer: %s\n", strerror(errno));
110  return IOCLS_ERROR;
111  }
112 
113  pserver->pfdctx = (void *) fdmgr_init();
114  if (!pserver->pfdctx) {
115  fprintf(stderr, "iocLogServer: %s\n", strerror(errno));
116  return IOCLS_ERROR;
117  }
118 
119  /*
120  * Open the socket. Use ARPA Internet address format and stream
121  * sockets. Format described in <sys/socket.h>.
122  */
123  pserver->sock = epicsSocketCreate(AF_INET, SOCK_STREAM, 0);
124  if (pserver->sock == INVALID_SOCKET) {
125  char sockErrBuf[64];
126  epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) );
127  fprintf(stderr, "iocLogServer: sock create err: %s\n", sockErrBuf);
128  free(pserver);
129  return IOCLS_ERROR;
130  }
131 
133 
134  /* Zero the sock_addr structure */
135  memset((void *)&serverAddr, 0, sizeof serverAddr);
136  serverAddr.sin_family = AF_INET;
137  serverAddr.sin_port = htons(ioc_log_port);
138 
139  /* get server's Internet address */
140  status = bind ( pserver->sock,
141  (struct sockaddr *)&serverAddr,
142  sizeof (serverAddr) );
143  if (status < 0) {
144  char sockErrBuf[64];
145  epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) );
146  fprintf(stderr, "iocLogServer: bind err: %s\n", sockErrBuf );
147  fprintf (stderr,
148  "iocLogServer: a server is already installed on port %u?\n",
149  (unsigned)ioc_log_port);
150  return IOCLS_ERROR;
151  }
152 
153  /* listen and accept new connections */
154  status = listen(pserver->sock, 10);
155  if (status < 0) {
156  char sockErrBuf[64];
157  epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) );
158  fprintf(stderr, "iocLogServer: listen err %s\n", sockErrBuf);
159  return IOCLS_ERROR;
160  }
161 
162  /*
163  * Set non blocking IO
164  * to prevent dead locks
165  */
166  optval = TRUE;
167  status = socket_ioctl(
168  pserver->sock,
169  FIONBIO,
170  &optval);
171  if (status < 0){
172  char sockErrBuf[64];
173  epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) );
174  fprintf(stderr, "iocLogServer: ioctl FIONBIO err %s\n", sockErrBuf);
175  return IOCLS_ERROR;
176  }
177 
178 # ifdef UNIX
179  status = setupSIGHUP(pserver);
180  if (status < 0) {
181  return IOCLS_ERROR;
182  }
183 # endif
184 
185  status = openLogFile(pserver);
186  if (status < 0) {
187  fprintf(stderr,
188  "File access problems to `%s' because `%s'\n",
189  ioc_log_file_name,
190  strerror(errno));
191  return IOCLS_ERROR;
192  }
193 
194  status = fdmgr_add_callback(
195  pserver->pfdctx,
196  pserver->sock,
197  fdi_read,
198  acceptNewClient,
199  pserver);
200  if (status < 0) {
201  fprintf(stderr,
202  "iocLogServer: failed to add read callback\n");
203  return IOCLS_ERROR;
204  }
205 
206 
207  while (TRUE) {
208  timeout.tv_sec = 60; /* 1 min */
209  timeout.tv_usec = 0;
210  fdmgr_pend_event(pserver->pfdctx, &timeout);
211  fflush(pserver->poutfile);
212  }
213 }
double timeout
Definition: pvutils.cpp:25
LIBCOM_API int epicsStdCall fdmgr_pend_event(fdctx *pfdctx, struct timeval *ptimeout)
Definition: fdmgr.cpp:298
#define INVALID_SOCKET
Definition: osdSock.h:32
pvd::Status status
Definition: fdmgr.h:33
void epicsSocketConvertErrnoToString(char *pBuf, unsigned bufSize)
#define socket_ioctl(A, B, C)
Definition: osdSock.h:34
LIBCOM_API SOCKET epicsStdCall epicsSocketCreate(int domain, int type, int protocol)
Definition: osdSock.c:71
int osiSockIoctl_t
Definition: osdSock.h:35
LIBCOM_API void epicsStdCall epicsSocketEnableAddressReuseDuringTimeWaitState(SOCKET s)
BSD and SRV5 Unix timestamp.
Definition: epicsTime.h:52
LIBCOM_API int epicsStdCall fdmgr_add_callback(fdctx *pfdctx, SOCKET fd, enum fdi_type fdi, pCallBackFDMgr pFunc, void *pParam)
Definition: fdmgr.cpp:229
LIBCOM_API fdctx *epicsStdCall fdmgr_init(void)
Definition: fdmgr.cpp:156
#define TRUE
Definition: dbDefs.h:27
#define stderr
Definition: epicsStdio.h:32
#define IOCLS_ERROR
Definition: iocLogServer.c:62