3
3
{-# LANGUAGE ScopedTypeVariables #-}
4
4
{-# LANGUAGE RecordWildCards #-}
5
5
{-# LANGUAGE ViewPatterns #-}
6
+ {-# LANGUAGE GADTs #-}
6
7
7
8
#include "HsNet.h"
8
9
##include "HsNetDef.h"
@@ -25,6 +26,8 @@ module Network.Socket.Options (
25
26
, setSocketOption
26
27
, getSockOpt
27
28
, setSockOpt
29
+ , SocketOptValue (.. )
30
+ , setSocketOptValue
28
31
, StructLinger (.. )
29
32
, SocketTimeout (.. )
30
33
) where
@@ -408,6 +411,22 @@ setSockOpt s (SockOpt level opt) v = do
408
411
throwSocketErrorIfMinus1_ " Network.Socket.setSockOpt" $
409
412
c_setsockopt fd level opt ptr sz
410
413
414
+ -- | Set a socket option value
415
+ --
416
+ -- The existential 'SocketOptValue' enables things like:
417
+ --
418
+ -- @
419
+ -- mapM_ (uncurry $ 'setSocketOptValue' sock) [
420
+ -- ('NoDelay', 'SocketOptValue' @Int 1)
421
+ -- , ('Linger', 'SocketOptValue' ('StructLinger' 1 0))
422
+ -- ]
423
+ -- @
424
+ setSocketOptValue :: Socket
425
+ -> SocketOption
426
+ -> SocketOptValue
427
+ -> IO ()
428
+ setSocketOptValue s opt (SocketOptValue v) = setSockOpt s opt v
429
+
411
430
----------------------------------------------------------------
412
431
413
432
-- | Get a socket option that gives an 'Int' value.
@@ -456,8 +475,8 @@ getSocketType s = unpackSocketType <$> getSockOpt s Type
456
475
{-# COMPLETE CustomSockOpt #-}
457
476
#endif
458
477
#ifdef SO_LINGER
459
- -- | Low level 'SO_LINBER' option value, which can be used with 'setSockOpt'.
460
- --
478
+ -- | Low level @SO_LINGER@ option value, which can be used with 'setSockOpt' or
479
+ -- @'setSocketOptValue' . 'SocketOptValue'@.
461
480
data StructLinger = StructLinger {
462
481
-- | Set the linger option on.
463
482
sl_onoff :: CInt ,
@@ -481,6 +500,13 @@ instance Storable StructLinger where
481
500
(# poke struct linger, l_linger) p linger
482
501
#endif
483
502
503
+ -- | A type that can hold any 'Storable' socket option value (e.g.
504
+ -- 'StructLinger' and 'CInt')
505
+ --
506
+ -- See 'setSocketOptValue'
507
+ data SocketOptValue where
508
+ SocketOptValue :: Storable a => a -> SocketOptValue
509
+
484
510
----------------------------------------------------------------
485
511
486
512
-- | Timeout in microseconds.
0 commit comments