mirror of
https://github.com/reactos/reactos.git
synced 2024-08-20 18:35:32 +00:00
204 lines
4 KiB
C
204 lines
4 KiB
C
#include "syshdrs.h"
|
|
|
|
#ifndef SO_RCVBUF
|
|
int
|
|
GetSocketBufSize(int UNUSED(sockfd), size_t *const rsize, size_t *const ssize)
|
|
{
|
|
LIBSIO_USE_VAR(sockfd);
|
|
if (ssize != NULL)
|
|
*ssize = 0;
|
|
if (rsize != NULL)
|
|
*rsize = 0;
|
|
return (-1);
|
|
} /* GetSocketBufSize */
|
|
#else
|
|
int
|
|
GetSocketBufSize(int sockfd, size_t *const rsize, size_t *const ssize)
|
|
{
|
|
int rc = -1;
|
|
int opt;
|
|
int optsize;
|
|
|
|
if (ssize != NULL) {
|
|
opt = 0;
|
|
optsize = sizeof(opt);
|
|
rc = getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (char *) &opt, &optsize);
|
|
if (rc == 0)
|
|
*ssize = (size_t) opt;
|
|
else
|
|
*ssize = 0;
|
|
}
|
|
if (rsize != NULL) {
|
|
opt = 0;
|
|
optsize = sizeof(opt);
|
|
rc = getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (char *) &opt, &optsize);
|
|
if (rc == 0)
|
|
*rsize = (size_t) opt;
|
|
else
|
|
*rsize = 0;
|
|
}
|
|
return (rc);
|
|
} /* GetSocketBufSize */
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef SO_RCVBUF
|
|
int
|
|
SetSocketBufSize(int UNUSED(sockfd), size_t UNUSED(rsize), size_t UNUSED(ssize))
|
|
{
|
|
LIBSIO_USE_VAR(sockfd);
|
|
LIBSIO_USE_VAR(rsize);
|
|
LIBSIO_USE_VAR(ssize);
|
|
return (-1);
|
|
} /* SetSocketBufSize */
|
|
#else
|
|
int
|
|
SetSocketBufSize(int sockfd, size_t rsize, size_t ssize)
|
|
{
|
|
int rc = -1;
|
|
int opt;
|
|
int optsize;
|
|
|
|
if (ssize > 0) {
|
|
opt = (int) ssize;
|
|
optsize = sizeof(opt);
|
|
rc = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (const char *) &opt, optsize);
|
|
if (rc < 0)
|
|
return (rc);
|
|
}
|
|
if (rsize > 0) {
|
|
opt = (int) rsize;
|
|
optsize = sizeof(opt);
|
|
rc = setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (const char *) &opt, optsize);
|
|
if (rc < 0)
|
|
return (rc);
|
|
}
|
|
return (0);
|
|
} /* SetSocketBufSize */
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef TCP_NODELAY
|
|
int
|
|
GetSocketNagleAlgorithm(const int UNUSED(fd))
|
|
{
|
|
LIBSIO_USE_VAR(fd);
|
|
return (-1);
|
|
} /* GetSocketNagleAlgorithm */
|
|
#else
|
|
int
|
|
GetSocketNagleAlgorithm(const int fd)
|
|
{
|
|
int optsize;
|
|
int opt;
|
|
|
|
opt = -2;
|
|
optsize = (int) sizeof(opt);
|
|
if (getsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *) &opt, &optsize) < 0)
|
|
return (-1);
|
|
return (opt);
|
|
} /* GetSocketNagleAlgorithm */
|
|
#endif /* TCP_NODELAY */
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef TCP_NODELAY
|
|
int
|
|
SetSocketNagleAlgorithm(const int UNUSED(fd), const int UNUSED(onoff))
|
|
{
|
|
LIBSIO_USE_VAR(fd);
|
|
LIBSIO_USE_VAR(onoff);
|
|
return (-1);
|
|
} /* SetSocketNagleAlgorithm */
|
|
#else
|
|
int
|
|
SetSocketNagleAlgorithm(const int fd, const int onoff)
|
|
{
|
|
int optsize;
|
|
int opt;
|
|
|
|
opt = onoff;
|
|
optsize = (int) sizeof(opt);
|
|
return (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *) &opt, optsize));
|
|
} /* SetSocketNagleAlgorithm */
|
|
#endif /* TCP_NODELAY */
|
|
|
|
|
|
|
|
#ifndef SO_LINGER
|
|
int
|
|
GetSocketLinger(const int UNUSED(fd), int *const UNUSED(lingertime))
|
|
{
|
|
LIBSIO_USE_VAR(fd);
|
|
LIBSIO_USE_VAR(lingertime);
|
|
return (-1);
|
|
} /* GetSocketLinger */
|
|
#else
|
|
int
|
|
GetSocketLinger(const int fd, int *const lingertime)
|
|
{
|
|
int optsize;
|
|
struct linger opt;
|
|
|
|
optsize = (int) sizeof(opt);
|
|
opt.l_onoff = 0;
|
|
opt.l_linger = 0;
|
|
if (getsockopt(fd, SOL_SOCKET, SO_LINGER, (char *) &opt, &optsize) < 0)
|
|
return (-1);
|
|
if (lingertime != NULL)
|
|
*lingertime = opt.l_linger;
|
|
return (opt.l_onoff);
|
|
} /* GetSocketLinger */
|
|
#endif /* SO_LINGER */
|
|
|
|
|
|
|
|
#ifndef SO_LINGER
|
|
int
|
|
SetSocketLinger(const int UNUSED(fd), const int UNUSED(l_onoff), const int UNUSED(l_linger))
|
|
{
|
|
LIBSIO_USE_VAR(fd);
|
|
LIBSIO_USE_VAR(l_onoff);
|
|
LIBSIO_USE_VAR(l_linger);
|
|
return (-1);
|
|
} /* SetSocketLinger */
|
|
#else
|
|
int
|
|
SetSocketLinger(const int fd, const int l_onoff, const int l_linger)
|
|
{
|
|
struct linger opt;
|
|
int optsize;
|
|
/*
|
|
* From hpux:
|
|
*
|
|
* Structure used for manipulating linger option.
|
|
*
|
|
* if l_onoff == 0:
|
|
* close(2) returns immediately; any buffered data is sent later
|
|
* (default)
|
|
*
|
|
* if l_onoff != 0:
|
|
* if l_linger == 0, close(2) returns after discarding any unsent data
|
|
* if l_linger != 0, close(2) does not return until buffered data is sent
|
|
*/
|
|
#if 0
|
|
struct linger {
|
|
int l_onoff; /* 0 = do not wait to send data */
|
|
/* non-0 = see l_linger */
|
|
int l_linger; /* 0 = discard unsent data */
|
|
/* non-0 = wait to send data */
|
|
};
|
|
#endif
|
|
opt.l_onoff = l_onoff;
|
|
opt.l_linger = l_linger;
|
|
optsize = (int) sizeof(opt);
|
|
return (setsockopt(fd, SOL_SOCKET, SO_LINGER, (char *) &opt, optsize));
|
|
} /* SetSocketLinger */
|
|
#endif /* SO_LINGER */
|