fis-gtm/sr_unix_gnp/cmj_setupfd.c

87 lines
2.9 KiB
C
Raw Normal View History

/****************************************************************
* *
* Copyright 2001, 2009 Fidelity Information Services, Inc *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#include "mdef.h"
#include "cmidef.h"
#include "gtm_socket.h"
#include "gtm_fcntl.h"
#ifdef __sparc
#define BSD_COMP
#endif
#include <sys/ioctl.h>
#include "gtm_inet.h"
#ifndef __MVS__
#include <netinet/tcp.h>
#endif
#include <errno.h>
#include "eintr_wrappers.h"
#ifndef GTCM_MIN_TCP_SNDBUFLEN
#define GTCM_MIN_TCP_SNDBUFLEN (64 * 1024) /* accommodate the longest message possible with 2-byte message length */
#endif
#ifndef GTCM_MIN_TCP_RCVBUFLEN
#define GTCM_MIN_TCP_RCVBUFLEN (64 * 1024) /* accommodate the longest message possible with 2-byte message length */
#endif
GBLREF uint4 process_id;
cmi_status_t cmj_setupfd(int fd)
{
int rval, buflen, snd_buflen, rcv_buflen;
long lpid = (long)process_id;
int on = 1;
GTM_SOCKLEN_TYPE optlen;
FCNTL3(fd, F_SETFL, O_NONBLOCK, rval);
if (-1 == rval)
return (cmi_status_t)errno;
FCNTL3(fd, F_SETOWN, lpid, rval);
if (-1 == rval)
return (cmi_status_t)errno;
#ifdef F_SETSIG
FCNTL3(fd, F_SETSIG, (long)SIGIO, rval);
if (-1 == rval)
return (cmi_status_t)errno;
#endif
rval = setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE,
(const void *)&on, SIZEOF(on));
if (rval < 0)
return (cmi_status_t)errno;
#ifdef TCP_NODELAY
/* z/OS only does setsockop on SOL and IP */
rval = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY,
(const void *)&on, SIZEOF(on));
if (rval < 0)
return (cmi_status_t)errno;
#endif
#ifndef GTCM_KEEP_DEFAULT_BUFLEN /* if you want to test with system allocated default buflen, define this and rebuild */
optlen = SIZEOF(buflen);
if (-1 == (rval = getsockopt(fd, SOL_SOCKET, SO_SNDBUF, (void *)&snd_buflen, (GTM_SOCKLEN_TYPE *)&optlen)) ||
-1 == (rval = getsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void *)&rcv_buflen, (GTM_SOCKLEN_TYPE *)&optlen)))
return (cmi_status_t)errno;
CMI_DPRINT(("Current buffer sizes for fd %d are send : %d, recv : %d\n", fd, snd_buflen, rcv_buflen));
if (GTCM_MIN_TCP_SNDBUFLEN > snd_buflen)
{
buflen = GTCM_MIN_TCP_SNDBUFLEN; /* increase send buflen to avoid breaking large messages in chunks */
if (-1 == (rval = setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (void *)&buflen, optlen)))
return (cmi_status_t)errno;
CMI_DPRINT(("Send buffer size for fd %d now %d\n", fd, buflen));
}
if (GTCM_MIN_TCP_RCVBUFLEN > rcv_buflen)
{
buflen = GTCM_MIN_TCP_RCVBUFLEN; /* increase recv buflen to avoid having to assemble smaller chunks */
if (-1 == (rval = setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void *)&buflen, optlen)))
return (cmi_status_t)errno;
CMI_DPRINT(("Recv buffer size for fd %d now %d\n", fd, buflen));
}
#endif
return SS_NORMAL;
}