summaryrefslogtreecommitdiffstats
path: root/otherlibs/win32unix/sockopt.c
diff options
context:
space:
mode:
authorXavier Leroy <xavier.leroy@inria.fr>2001-07-27 12:52:05 +0000
committerXavier Leroy <xavier.leroy@inria.fr>2001-07-27 12:52:05 +0000
commitc3525c86a8cafcd2271f2b71bed409b234b06e25 (patch)
tree2b27f04a8f1d78908ece3cafc3b215e75a260554 /otherlibs/win32unix/sockopt.c
parent452f5458def21004fc449ed9e12c89def86fe47a (diff)
MAJ pour version 3.02
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@3601 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'otherlibs/win32unix/sockopt.c')
-rw-r--r--otherlibs/win32unix/sockopt.c134
1 files changed, 119 insertions, 15 deletions
diff --git a/otherlibs/win32unix/sockopt.c b/otherlibs/win32unix/sockopt.c
index 79ec7122f..4e77c09d5 100644
--- a/otherlibs/win32unix/sockopt.c
+++ b/otherlibs/win32unix/sockopt.c
@@ -17,28 +17,132 @@
#include <winsock.h>
#include <sys/types.h>
-static int sockopt[] = {
- SO_DEBUG, SO_BROADCAST, SO_REUSEADDR, SO_KEEPALIVE,
- SO_DONTROUTE, SO_OOBINLINE };
+static int sockopt_bool[] = {
+ SO_DEBUG, SO_BROADCAST, SO_REUSEADDR, SO_KEEPALIVE,
+ SO_DONTROUTE, SO_OOBINLINE, SO_ACCEPTCONN };
-value unix_getsockopt(socket, option) /* ML */
- value socket, option;
+static int sockopt_int[] = {
+ SO_SNDBUF, SO_RCVBUF, SO_ERROR, SO_TYPE, SO_RCVLOWAT, SO_SNDLOWAT };
+
+static int sockopt_optint[] = { SO_LINGER };
+
+static int sockopt_float[] = { SO_RCVTIMEO, SO_SNDTIMEO };
+
+value getsockopt_int(int *sockopt, value socket, value level, value option)
{
- int optval, optsize;
+ int optval;
+ int optsize;
+
optsize = sizeof(optval);
- if (getsockopt((SOCKET) Handle_val(socket), SOL_SOCKET,
- sockopt[Int_val(option)], (char *) &optval, &optsize) == -1)
- unix_error(WSAGetLastError(), "getsockopt", Nothing);
+ if (getsockopt(Int_val(socket), Int_val(level), sockopt[Int_val(option)],
+ (void *) &optval, &optsize) == -1)
+ uerror("getsockopt", Nothing);
return Val_int(optval);
}
-value unix_setsockopt(socket, option, status) /* ML */
- value socket, option, status;
+value setsockopt_int(int *sockopt, value socket, value level,
+ value option, value status)
{
int optval = Int_val(status);
- if (setsockopt((SOCKET) Handle_val(socket), SOL_SOCKET,
- sockopt[Int_val(option)],
- (char *) &optval, sizeof(optval)) == -1)
- unix_error(WSAGetLastError(), "setsockopt", Nothing);
+ if (setsockopt(Int_val(socket), Int_val(level), sockopt[Int_val(option)],
+ (void *) &optval, sizeof(optval)) == -1)
+ uerror("setsockopt", Nothing);
+ return Val_unit;
+}
+
+value unix_getsockopt_bool(value socket, value option) { /* ML */
+ return getsockopt_int(sockopt_bool, socket, Val_int(SOL_SOCKET), option);
+}
+
+value unix_setsockopt_bool(value socket, value option, value status) /* ML */
+{
+ return setsockopt_int(sockopt_bool, socket, Val_int(SOL_SOCKET), option, status);
+}
+
+value unix_getsockopt_int(value socket, value option) { /* ML */
+ return getsockopt_int(sockopt_int, socket, Val_int(SOL_SOCKET), option);
+}
+
+value unix_setsockopt_int(value socket, value option, value status) /* ML */
+{
+ return setsockopt_int(sockopt_int, socket, Val_int(SOL_SOCKET), option, status);
+}
+
+value getsockopt_optint(int *sockopt, value socket, value level, value option)
+{
+ struct linger optval;
+ int optsize;
+ value res = Val_int(0); /* None */
+
+ optsize = sizeof(optval);
+ if (getsockopt(Int_val(socket), Int_val(level), sockopt[Int_val(option)],
+ (void *) &optval, &optsize) == -1)
+ uerror("getsockopt_optint", Nothing);
+ if (optval.l_onoff != 0) {
+ res = alloc_small(1, 0);
+ Field(res, 0) = Val_int(optval.l_linger);
+ }
+ return res;
+}
+
+value setsockopt_optint(int *sockopt, value socket, value level,
+ value option, value status)
+{
+ struct linger optval;
+
+ optval.l_onoff = Is_block (status);
+ if (optval.l_onoff)
+ optval.l_linger = Int_val (Field (status, 0));
+ if (setsockopt(Int_val(socket), Int_val(level), sockopt[Int_val(option)],
+ (void *) &optval, sizeof(optval)) == -1)
+ uerror("setsockopt_optint", Nothing);
return Val_unit;
}
+
+value unix_getsockopt_optint(value socket, value option) /* ML */
+{
+ return getsockopt_optint(sockopt_optint, socket, Val_int(SOL_SOCKET), option);
+}
+
+value unix_setsockopt_optint(value socket, value option, value status) /* ML */
+{
+ return setsockopt_optint(sockopt_optint, socket, Val_int(SOL_SOCKET), option, status);
+}
+
+value getsockopt_float(int *sockopt, value socket, value level, value option)
+{
+ struct timeval tv;
+ int optsize;
+
+ optsize = sizeof(tv);
+ if (getsockopt(Int_val(socket), Int_val(level), sockopt[Int_val(option)],
+ (void *) &tv, &optsize) == -1)
+ uerror("getsockopt_float", Nothing);
+ return copy_double((double) tv.tv_sec + (double) tv.tv_usec / 1e6);
+}
+
+value setsockopt_float(int *sockopt, value socket, value level,
+ value option, value status)
+{
+ struct timeval tv;
+ double tv_f;
+
+ tv_f = Double_val(status);
+ tv.tv_sec = (int)tv_f;
+ tv.tv_usec = (int) (1e6 * (tv_f - tv.tv_sec));
+ if (setsockopt(Int_val(socket), Int_val(level), sockopt[Int_val(option)],
+ (void *) &tv, sizeof(tv)) == -1)
+ uerror("setsockopt_float", Nothing);
+ return Val_unit;
+}
+
+value unix_getsockopt_float(value socket, value option) /* ML */
+{
+ return getsockopt_float(sockopt_float, socket, Val_int(SOL_SOCKET), option);
+}
+
+value unix_setsockopt_float(value socket, value option, value status) /* ML */
+{
+ return setsockopt_float(sockopt_float, socket, Val_int(SOL_SOCKET), option, status);
+}
+