diff options
Diffstat (limited to 'otherlibs/unix/sockopt.c')
-rw-r--r-- | otherlibs/unix/sockopt.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/otherlibs/unix/sockopt.c b/otherlibs/unix/sockopt.c new file mode 100644 index 000000000..50dd84875 --- /dev/null +++ b/otherlibs/unix/sockopt.c @@ -0,0 +1,52 @@ +/***********************************************************************/ +/* */ +/* Caml Special Light */ +/* */ +/* Xavier Leroy, projet Cristal, INRIA Rocquencourt */ +/* */ +/* Copyright 1995 Institut National de Recherche en Informatique et */ +/* Automatique. Distributed only by permission. */ +/* */ +/***********************************************************************/ + +/* $Id$ */ + +#include <mlvalues.h> +#include "unix.h" + +#ifdef HAS_SOCKETS + +#include <sys/types.h> +#include <sys/socket.h> + +static int sockopt[] = { + SO_DEBUG, SO_BROADCAST, SO_REUSEADDR, SO_KEEPALIVE, + SO_DONTROUTE, SO_OOBINLINE }; + +value unix_getsockopt(socket, option) + value socket, option; +{ + int optval, optsize; + optsize = sizeof(optval); + if (getsockopt(Int_val(socket), SOL_SOCKET, sockopt[Int_val(option)], + &optval, &optval) == -1) + uerror("getsockopt", Nothing); + return Val_int(optval); +} + +value unix_setsockopt(socket, option, status) + value socket, option, status; +{ + int optval = Int_val(status); + if (setsockopt(Int_val(socket), SOL_SOCKET, sockopt[Int_val(option)], + &optval, sizeof(optval)) == -1) + uerror("setsockopt", Nothing); + return Val_unit; +} + +#else + +value unix_getsockopt() { invalid_argument("getsockopt not implemented"); } +value unix_setsockopt() { invalid_argument("setsockopt not implemented"); } + +#endif |