diff options
author | Xavier Leroy <xavier.leroy@inria.fr> | 2001-07-27 12:52:05 +0000 |
---|---|---|
committer | Xavier Leroy <xavier.leroy@inria.fr> | 2001-07-27 12:52:05 +0000 |
commit | c3525c86a8cafcd2271f2b71bed409b234b06e25 (patch) | |
tree | 2b27f04a8f1d78908ece3cafc3b215e75a260554 /otherlibs/win32unix/sockopt.c | |
parent | 452f5458def21004fc449ed9e12c89def86fe47a (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.c | 134 |
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); +} + |