{-# LINE 1 "Network/Socket/Options.hsc" #-}{-# LANGUAGE CPP #-}{-# LANGUAGE PatternSynonyms #-}{-# LANGUAGE ScopedTypeVariables #-}{-# LANGUAGE RecordWildCards #-}{-# LANGUAGE ViewPatterns #-} #include "HsNetDef.h" moduleNetwork.Socket.Options(SocketOption(SockOpt,UnsupportedSocketOption,Debug,ReuseAddr,SoDomain,Type,SoProtocol,SoError,DontRoute,Broadcast,SendBuffer,RecvBuffer,KeepAlive,OOBInline,TimeToLive,MaxSegment,NoDelay,Cork,Linger,ReusePort,RecvLowWater,SendLowWater,RecvTimeOut,SendTimeOut,UseLoopBack,UserTimeout,IPv6Only,RecvIPv4TTL,RecvIPv4TOS,RecvIPv4PktInfo,RecvIPv6HopLimit,RecvIPv6TClass,RecvIPv6PktInfo,CustomSockOpt),isSupportedSocketOption,whenSupported,getSocketType,getSocketOption,setSocketOption,getSockOpt,setSockOpt,StructLinger(..))whereimportqualifiedText.ReadasPimportForeign.Marshal.Alloc(alloca)importForeign.Marshal.Utils(with)importNetwork.Socket.ImportsimportNetwork.Socket.InternalimportNetwork.Socket.TypesimportNetwork.Socket.ReadShow------------------------------------------------------------------------------- Socket Properties-- | Socket options for use with 'setSocketOption' and 'getSocketOption'.---- The existence of a constructor does not imply that the relevant option-- is supported on your system: see 'isSupportedSocketOption'dataSocketOption=SockOpt{-# LINE 50 "Network/Socket/Options.hsc" #-}!CInt-- ^ Option Level!CInt-- ^ Option Name{-# LINE 56 "Network/Socket/Options.hsc" #-}deriving(Eq)-- | Does the 'SocketOption' exist on this system?isSupportedSocketOption::SocketOption->BoolisSupportedSocketOptionopt=opt/=SockOpt(-1)(-1)-- | Get the 'SocketType' of an active socket.---- Since: 3.0.1.0getSocketType::Socket->IOSocketTypegetSocketTypes=unpackSocketType<$>getSockOptsTypepatternUnsupportedSocketOption::SocketOptionpatternUnsupportedSocketOption=SockOpt(-1)(-1){-# LINE 72 "Network/Socket/Options.hsc" #-}-- | SO_DEBUGpatternDebug::SocketOption{-# LINE 75 "Network/Socket/Options.hsc" #-}patternDebug=SockOpt(1)(1){-# LINE 76 "Network/Socket/Options.hsc" #-}{-# LINE 79 "Network/Socket/Options.hsc" #-}-- | SO_REUSEADDRpatternReuseAddr::SocketOption{-# LINE 82 "Network/Socket/Options.hsc" #-}patternReuseAddr=SockOpt(1)(2){-# LINE 83 "Network/Socket/Options.hsc" #-}{-# LINE 86 "Network/Socket/Options.hsc" #-}-- | SO_DOMAIN, read-onlypatternSoDomain::SocketOption{-# LINE 90 "Network/Socket/Options.hsc" #-}patternSoDomain=SockOpt(1)(39){-# LINE 91 "Network/Socket/Options.hsc" #-}{-# LINE 94 "Network/Socket/Options.hsc" #-}-- | SO_TYPE, read-onlypatternType::SocketOption{-# LINE 98 "Network/Socket/Options.hsc" #-}patternType=SockOpt(1)(3){-# LINE 99 "Network/Socket/Options.hsc" #-}{-# LINE 102 "Network/Socket/Options.hsc" #-}-- | SO_PROTOCOL, read-onlypatternSoProtocol::SocketOption{-# LINE 106 "Network/Socket/Options.hsc" #-}patternSoProtocol=SockOpt(1)(38){-# LINE 107 "Network/Socket/Options.hsc" #-}{-# LINE 110 "Network/Socket/Options.hsc" #-}-- | SO_ERRORpatternSoError::SocketOption{-# LINE 114 "Network/Socket/Options.hsc" #-}patternSoError=SockOpt(1)(4){-# LINE 115 "Network/Socket/Options.hsc" #-}{-# LINE 118 "Network/Socket/Options.hsc" #-}-- | SO_DONTROUTEpatternDontRoute::SocketOption{-# LINE 121 "Network/Socket/Options.hsc" #-}patternDontRoute=SockOpt(1)(5){-# LINE 122 "Network/Socket/Options.hsc" #-}{-# LINE 125 "Network/Socket/Options.hsc" #-}-- | SO_BROADCASTpatternBroadcast::SocketOption{-# LINE 128 "Network/Socket/Options.hsc" #-}patternBroadcast=SockOpt(1)(6){-# LINE 129 "Network/Socket/Options.hsc" #-}{-# LINE 132 "Network/Socket/Options.hsc" #-}-- | SO_SNDBUFpatternSendBuffer::SocketOption{-# LINE 135 "Network/Socket/Options.hsc" #-}patternSendBuffer=SockOpt(1)(7){-# LINE 136 "Network/Socket/Options.hsc" #-}{-# LINE 139 "Network/Socket/Options.hsc" #-}-- | SO_RCVBUFpatternRecvBuffer::SocketOption{-# LINE 142 "Network/Socket/Options.hsc" #-}patternRecvBuffer=SockOpt(1)(8){-# LINE 143 "Network/Socket/Options.hsc" #-}{-# LINE 146 "Network/Socket/Options.hsc" #-}-- | SO_KEEPALIVEpatternKeepAlive::SocketOption{-# LINE 149 "Network/Socket/Options.hsc" #-}patternKeepAlive=SockOpt(1)(9){-# LINE 150 "Network/Socket/Options.hsc" #-}{-# LINE 153 "Network/Socket/Options.hsc" #-}-- | SO_OOBINLINEpatternOOBInline::SocketOption{-# LINE 156 "Network/Socket/Options.hsc" #-}patternOOBInline=SockOpt(1)(10){-# LINE 157 "Network/Socket/Options.hsc" #-}{-# LINE 160 "Network/Socket/Options.hsc" #-}-- | SO_LINGER: timeout in seconds, 0 means disabling/disabled.patternLinger::SocketOption{-# LINE 163 "Network/Socket/Options.hsc" #-}patternLinger=SockOpt(1)(13){-# LINE 164 "Network/Socket/Options.hsc" #-}{-# LINE 167 "Network/Socket/Options.hsc" #-}-- | SO_REUSEPORTpatternReusePort::SocketOption{-# LINE 170 "Network/Socket/Options.hsc" #-}patternReusePort=SockOpt(1)(15){-# LINE 171 "Network/Socket/Options.hsc" #-}{-# LINE 174 "Network/Socket/Options.hsc" #-}-- | SO_RCVLOWATpatternRecvLowWater::SocketOption{-# LINE 177 "Network/Socket/Options.hsc" #-}patternRecvLowWater=SockOpt(1)(18){-# LINE 178 "Network/Socket/Options.hsc" #-}{-# LINE 181 "Network/Socket/Options.hsc" #-}-- | SO_SNDLOWATpatternSendLowWater::SocketOption{-# LINE 184 "Network/Socket/Options.hsc" #-}patternSendLowWater=SockOpt(1)(19){-# LINE 185 "Network/Socket/Options.hsc" #-}{-# LINE 188 "Network/Socket/Options.hsc" #-}-- | SO_RCVTIMEO: this does not work at this moment.patternRecvTimeOut::SocketOption{-# LINE 191 "Network/Socket/Options.hsc" #-}patternRecvTimeOut=SockOpt(1)(20){-# LINE 192 "Network/Socket/Options.hsc" #-}{-# LINE 195 "Network/Socket/Options.hsc" #-}-- | SO_SNDTIMEO: this does not work at this moment.patternSendTimeOut::SocketOption{-# LINE 198 "Network/Socket/Options.hsc" #-}patternSendTimeOut=SockOpt(1)(21){-# LINE 199 "Network/Socket/Options.hsc" #-}{-# LINE 202 "Network/Socket/Options.hsc" #-}-- | SO_USELOOPBACKpatternUseLoopBack::SocketOption{-# LINE 207 "Network/Socket/Options.hsc" #-}patternUseLoopBack=SockOpt(-1)(-1){-# LINE 209 "Network/Socket/Options.hsc" #-}{-# LINE 210 "Network/Socket/Options.hsc" #-}{-# LINE 212 "Network/Socket/Options.hsc" #-}-- | TCP_MAXSEGpatternMaxSegment::SocketOption{-# LINE 215 "Network/Socket/Options.hsc" #-}patternMaxSegment=SockOpt(6)(2){-# LINE 216 "Network/Socket/Options.hsc" #-}{-# LINE 219 "Network/Socket/Options.hsc" #-}-- | TCP_NODELAYpatternNoDelay::SocketOption{-# LINE 222 "Network/Socket/Options.hsc" #-}patternNoDelay=SockOpt(6)(1){-# LINE 223 "Network/Socket/Options.hsc" #-}{-# LINE 226 "Network/Socket/Options.hsc" #-}-- | TCP_USER_TIMEOUTpatternUserTimeout::SocketOption{-# LINE 229 "Network/Socket/Options.hsc" #-}patternUserTimeout=SockOpt(6)(18){-# LINE 230 "Network/Socket/Options.hsc" #-}{-# LINE 233 "Network/Socket/Options.hsc" #-}-- | TCP_CORKpatternCork::SocketOption{-# LINE 236 "Network/Socket/Options.hsc" #-}patternCork=SockOpt(6)(3){-# LINE 237 "Network/Socket/Options.hsc" #-}{-# LINE 240 "Network/Socket/Options.hsc" #-}{-# LINE 241 "Network/Socket/Options.hsc" #-}{-# LINE 243 "Network/Socket/Options.hsc" #-}-- | IP_TTLpatternTimeToLive::SocketOption{-# LINE 246 "Network/Socket/Options.hsc" #-}patternTimeToLive=SockOpt(0)(2){-# LINE 247 "Network/Socket/Options.hsc" #-}{-# LINE 250 "Network/Socket/Options.hsc" #-}-- | Receiving IPv4 TTL.patternRecvIPv4TTL::SocketOption{-# LINE 253 "Network/Socket/Options.hsc" #-}patternRecvIPv4TTL=SockOpt(0)(12){-# LINE 254 "Network/Socket/Options.hsc" #-}{-# LINE 257 "Network/Socket/Options.hsc" #-}-- | Receiving IPv4 TOS.patternRecvIPv4TOS::SocketOption{-# LINE 260 "Network/Socket/Options.hsc" #-}patternRecvIPv4TOS=SockOpt(0)(13){-# LINE 261 "Network/Socket/Options.hsc" #-}{-# LINE 264 "Network/Socket/Options.hsc" #-}-- | Receiving IP_PKTINFO (struct in_pktinfo).patternRecvIPv4PktInfo::SocketOption{-# LINE 269 "Network/Socket/Options.hsc" #-}patternRecvIPv4PktInfo=SockOpt(0)(8){-# LINE 270 "Network/Socket/Options.hsc" #-}{-# LINE 273 "Network/Socket/Options.hsc" #-}{-# LINE 274 "Network/Socket/Options.hsc" #-}{-# LINE 276 "Network/Socket/Options.hsc" #-}-- | IPV6_V6ONLY: don't use this on OpenBSD.patternIPv6Only::SocketOption{-# LINE 279 "Network/Socket/Options.hsc" #-}patternIPv6Only=SockOpt(41)(26){-# LINE 280 "Network/Socket/Options.hsc" #-}{-# LINE 283 "Network/Socket/Options.hsc" #-}-- | Receiving IPv6 hop limit.patternRecvIPv6HopLimit::SocketOption{-# LINE 286 "Network/Socket/Options.hsc" #-}patternRecvIPv6HopLimit=SockOpt(41)(51){-# LINE 287 "Network/Socket/Options.hsc" #-}{-# LINE 290 "Network/Socket/Options.hsc" #-}-- | Receiving IPv6 traffic class.patternRecvIPv6TClass::SocketOption{-# LINE 293 "Network/Socket/Options.hsc" #-}patternRecvIPv6TClass=SockOpt(41)(66){-# LINE 294 "Network/Socket/Options.hsc" #-}{-# LINE 297 "Network/Socket/Options.hsc" #-}-- | Receiving IPV6_PKTINFO (struct in6_pktinfo).patternRecvIPv6PktInfo::SocketOption{-# LINE 300 "Network/Socket/Options.hsc" #-}patternRecvIPv6PktInfo=SockOpt(41)(49){-# LINE 301 "Network/Socket/Options.hsc" #-}{-# LINE 306 "Network/Socket/Options.hsc" #-}{-# LINE 307 "Network/Socket/Options.hsc" #-}patternCustomSockOpt::(CInt,CInt)->SocketOptionpatternCustomSockOptxy<-((\(SockOptxy)->(x,y))->xy)whereCustomSockOpt(x,y)=SockOptxy{-# LINE 314 "Network/Socket/Options.hsc" #-}{-# COMPLETECustomSockOpt#-}{-# LINE 316 "Network/Socket/Options.hsc" #-}{-# LINE 317 "Network/Socket/Options.hsc" #-}-- | Low level 'SO_LINBER' option value, which can be used with 'setSockOpt'.--dataStructLinger=StructLinger{-- | Set the linger option on.sl_onoff::CInt,-- | Linger timeout.sl_linger::CInt}deriving(Eq,Ord,Show)instanceStorableStructLingerwheresizeOf_=(8){-# LINE 330 "Network/Socket/Options.hsc" #-}alignment_=alignment(0::CInt)peekp=doonoff<-((\hsc_ptr->peekByteOffhsc_ptr0))p{-# LINE 334 "Network/Socket/Options.hsc" #-}linger<-((\hsc_ptr->peekByteOffhsc_ptr4))p{-# LINE 335 "Network/Socket/Options.hsc" #-}return$StructLingeronofflingerpokep(StructLingeronofflinger)=do((\hsc_ptr->pokeByteOffhsc_ptr0))ponoff{-# LINE 339 "Network/Socket/Options.hsc" #-}((\hsc_ptr->pokeByteOffhsc_ptr4))plinger{-# LINE 340 "Network/Socket/Options.hsc" #-}{-# LINE 341 "Network/Socket/Options.hsc" #-}-- | Execute the given action only when the specified socket option is-- supported. Any return value is ignored.whenSupported::SocketOption->IOa->IO()whenSupportedsaction|isSupportedSocketOptions=action>>return()|otherwise=return()-- | Set a socket option that expects an Int value.-- There is currently no API to set e.g. the timeval socket optionssetSocketOption::Socket->SocketOption-- Option Name->Int-- Option Value->IO(){-# LINE 356 "Network/Socket/Options.hsc" #-}setSocketOptionsso@Lingerv=doletarg=ifv==0thenStructLinger00elseStructLinger1(fromIntegralv)setSockOptssoarg{-# LINE 360 "Network/Socket/Options.hsc" #-}setSocketOptionssav=setSockOptssa(fromIntegralv::CInt)-- | Set a socket option.setSockOpt::Storablea=>Socket->SocketOption->a->IO()setSockOpts(SockOptlevelopt)v=dowithv$\ptr->void$doletsz=fromIntegral$sizeOfvwithFdSockets$\fd->throwSocketErrorIfMinus1_"Network.Socket.setSockOpt"$c_setsockoptfdleveloptptrsz-- | Get a socket option that gives an Int value.-- There is currently no API to get e.g. the timeval socket optionsgetSocketOption::Socket->SocketOption-- Option Name->IOInt-- Option Value{-# LINE 381 "Network/Socket/Options.hsc" #-}getSocketOptionsso@Linger=doStructLingeronofflinger<-getSockOptssoreturn$fromIntegral$ifonoff==0then0elselinger{-# LINE 385 "Network/Socket/Options.hsc" #-}getSocketOptionsso=don::CInt<-getSockOptssoreturn$fromIntegraln-- | Get a socket option.getSockOpt::foralla.Storablea=>Socket->SocketOption-- Option Name->IOa-- Option ValuegetSockOpts(SockOptlevelopt)=doalloca$\ptr->doletsz=fromIntegral$sizeOf(undefined::a)withFdSockets$\fd->withsz$\ptr_sz->dothrowSocketErrorIfMinus1Retry_"Network.Socket.getSockOpt"$c_getsockoptfdleveloptptrptr_szpeekptrsocketOptionBijection::BijectionSocketOptionStringsocketOptionBijection=[(UnsupportedSocketOption,"UnsupportedSocketOption"),(Debug,"Debug"),(ReuseAddr,"ReuseAddr"),(SoDomain,"SoDomain"),(Type,"Type"),(SoProtocol,"SoProtocol"),(SoError,"SoError"),(DontRoute,"DontRoute"),(Broadcast,"Broadcast"),(SendBuffer,"SendBuffer"),(RecvBuffer,"RecvBuffer"),(KeepAlive,"KeepAlive"),(OOBInline,"OOBInline"),(Linger,"Linger"),(ReusePort,"ReusePort"),(RecvLowWater,"RecvLowWater"),(SendLowWater,"SendLowWater"),(RecvTimeOut,"RecvTimeOut"),(SendTimeOut,"SendTimeOut"),(UseLoopBack,"UseLoopBack"),(MaxSegment,"MaxSegment"),(NoDelay,"NoDelay"),(UserTimeout,"UserTimeout"),(Cork,"Cork"),(TimeToLive,"TimeToLive"),(RecvIPv4TTL,"RecvIPv4TTL"),(RecvIPv4TOS,"RecvIPv4TOS"),(RecvIPv4PktInfo,"RecvIPv4PktInfo"),(IPv6Only,"IPv6Only"),(RecvIPv6HopLimit,"RecvIPv6HopLimit"),(RecvIPv6TClass,"RecvIPv6TClass"),(RecvIPv6PktInfo,"RecvIPv6PktInfo")]instanceShowSocketOptionwhereshowsPrec=bijectiveShowsocketOptionBijectiondefwheredefname="SockOpt"unwrap=\(CustomSockOptnm)->nmdef=defShowdefnameunwrapshowIntIntinstanceReadSocketOptionwherereadPrec=bijectiveReadsocketOptionBijectiondefwheredefname="SockOpt"def=defReaddefnameCustomSockOptreadIntIntforeignimportCALLCONVunsafe"getsockopt"c_getsockopt::CInt->CInt->CInt->Ptra->PtrCInt->IOCIntforeignimportCALLCONVunsafe"setsockopt"c_setsockopt::CInt->CInt->CInt->Ptra->CInt->IOCInt