{-# LINE 1 "Network/Socket/Options.hsc" #-}{-# LANGUAGE CPP #-}{-# LANGUAGE PatternSynonyms #-}{-# LANGUAGE ScopedTypeVariables #-}{-# LANGUAGE RecordWildCards #-}{-# LANGUAGE ViewPatterns #-}{-# LANGUAGE GADTs #-}
#include "HsNetDef.h"
moduleNetwork.Socket.Options(SocketOption(SockOpt,UnsupportedSocketOption,AcceptConn,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 ,SockOptValue(..),setSockOptValue,StructLinger(..),SocketTimeout(..))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 56 "Network/Socket/Options.hsc" #-}CInt-- ^ Option LevelCInt-- ^ Option Name{-# LINE 62 "Network/Socket/Options.hsc" #-}deriving(Eq)----------------------------------------------------------------socketOptionBijection::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=defReaddefnameCustomSockOptreadIntInt----------------------------------------------------------------patternUnsupportedSocketOption::SocketOptionpatternUnsupportedSocketOption=SockOpt(-1)(-1)-- | Does the 'SocketOption' exist on this system?isSupportedSocketOption::SocketOption->BoolisSupportedSocketOptionopt=opt/=SockOpt(-1)(-1)-- | 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()----------------------------------------------------------------{-# LINE 135 "Network/Socket/Options.hsc" #-}-- | SO_ACCEPTCONN, read-onlypatternAcceptConn::SocketOption{-# LINE 138 "Network/Socket/Options.hsc" #-}patternAcceptConn=SockOpt(1)(30){-# LINE 139 "Network/Socket/Options.hsc" #-}{-# LINE 142 "Network/Socket/Options.hsc" #-}-- | SO_DEBUGpatternDebug::SocketOption{-# LINE 145 "Network/Socket/Options.hsc" #-}patternDebug=SockOpt(1)(1){-# LINE 146 "Network/Socket/Options.hsc" #-}{-# LINE 149 "Network/Socket/Options.hsc" #-}-- | SO_REUSEADDRpatternReuseAddr::SocketOption{-# LINE 152 "Network/Socket/Options.hsc" #-}patternReuseAddr=SockOpt(1)(2){-# LINE 153 "Network/Socket/Options.hsc" #-}{-# LINE 156 "Network/Socket/Options.hsc" #-}-- | SO_DOMAIN, read-onlypatternSoDomain::SocketOption{-# LINE 160 "Network/Socket/Options.hsc" #-}patternSoDomain=SockOpt(1)(39){-# LINE 161 "Network/Socket/Options.hsc" #-}{-# LINE 164 "Network/Socket/Options.hsc" #-}-- | SO_TYPE, read-onlypatternType::SocketOption{-# LINE 168 "Network/Socket/Options.hsc" #-}patternType=SockOpt(1)(3){-# LINE 169 "Network/Socket/Options.hsc" #-}{-# LINE 172 "Network/Socket/Options.hsc" #-}-- | SO_PROTOCOL, read-onlypatternSoProtocol::SocketOption{-# LINE 176 "Network/Socket/Options.hsc" #-}patternSoProtocol=SockOpt(1)(38){-# LINE 177 "Network/Socket/Options.hsc" #-}{-# LINE 180 "Network/Socket/Options.hsc" #-}-- | SO_ERRORpatternSoError::SocketOption{-# LINE 184 "Network/Socket/Options.hsc" #-}patternSoError=SockOpt(1)(4){-# LINE 185 "Network/Socket/Options.hsc" #-}{-# LINE 188 "Network/Socket/Options.hsc" #-}-- | SO_DONTROUTEpatternDontRoute::SocketOption{-# LINE 191 "Network/Socket/Options.hsc" #-}patternDontRoute=SockOpt(1)(5){-# LINE 192 "Network/Socket/Options.hsc" #-}{-# LINE 195 "Network/Socket/Options.hsc" #-}-- | SO_BROADCASTpatternBroadcast::SocketOption{-# LINE 198 "Network/Socket/Options.hsc" #-}patternBroadcast=SockOpt(1)(6){-# LINE 199 "Network/Socket/Options.hsc" #-}{-# LINE 202 "Network/Socket/Options.hsc" #-}-- | SO_SNDBUFpatternSendBuffer::SocketOption{-# LINE 205 "Network/Socket/Options.hsc" #-}patternSendBuffer=SockOpt(1)(7){-# LINE 206 "Network/Socket/Options.hsc" #-}{-# LINE 209 "Network/Socket/Options.hsc" #-}-- | SO_RCVBUFpatternRecvBuffer::SocketOption{-# LINE 212 "Network/Socket/Options.hsc" #-}patternRecvBuffer=SockOpt(1)(8){-# LINE 213 "Network/Socket/Options.hsc" #-}{-# LINE 216 "Network/Socket/Options.hsc" #-}-- | SO_KEEPALIVEpatternKeepAlive::SocketOption{-# LINE 219 "Network/Socket/Options.hsc" #-}patternKeepAlive=SockOpt(1)(9){-# LINE 220 "Network/Socket/Options.hsc" #-}{-# LINE 223 "Network/Socket/Options.hsc" #-}-- | SO_OOBINLINEpatternOOBInline::SocketOption{-# LINE 226 "Network/Socket/Options.hsc" #-}patternOOBInline=SockOpt(1)(10){-# LINE 227 "Network/Socket/Options.hsc" #-}{-# LINE 230 "Network/Socket/Options.hsc" #-}-- | SO_LINGER: timeout in seconds, 0 means disabling/disabled.patternLinger::SocketOption{-# LINE 233 "Network/Socket/Options.hsc" #-}patternLinger=SockOpt(1)(13){-# LINE 234 "Network/Socket/Options.hsc" #-}{-# LINE 237 "Network/Socket/Options.hsc" #-}-- | SO_REUSEPORTpatternReusePort::SocketOption{-# LINE 240 "Network/Socket/Options.hsc" #-}patternReusePort=SockOpt(1)(15){-# LINE 241 "Network/Socket/Options.hsc" #-}{-# LINE 244 "Network/Socket/Options.hsc" #-}-- | SO_RCVLOWATpatternRecvLowWater::SocketOption{-# LINE 247 "Network/Socket/Options.hsc" #-}patternRecvLowWater=SockOpt(1)(18){-# LINE 248 "Network/Socket/Options.hsc" #-}{-# LINE 251 "Network/Socket/Options.hsc" #-}-- | SO_SNDLOWATpatternSendLowWater::SocketOption{-# LINE 254 "Network/Socket/Options.hsc" #-}patternSendLowWater=SockOpt(1)(19){-# LINE 255 "Network/Socket/Options.hsc" #-}{-# LINE 258 "Network/Socket/Options.hsc" #-}-- | SO_RCVTIMEO: timeout in microseconds. This option is not useful-- in the normal case where sockets are non-blocking.patternRecvTimeOut::SocketOption{-# LINE 262 "Network/Socket/Options.hsc" #-}patternRecvTimeOut=SockOpt(1)(20){-# LINE 263 "Network/Socket/Options.hsc" #-}{-# LINE 266 "Network/Socket/Options.hsc" #-}-- | SO_SNDTIMEO: timeout in microseconds. This option is not useful-- in the normal case where sockets are non-blocking.patternSendTimeOut::SocketOption{-# LINE 270 "Network/Socket/Options.hsc" #-}patternSendTimeOut=SockOpt(1)(21){-# LINE 271 "Network/Socket/Options.hsc" #-}{-# LINE 274 "Network/Socket/Options.hsc" #-}-- | SO_USELOOPBACKpatternUseLoopBack::SocketOption{-# LINE 279 "Network/Socket/Options.hsc" #-}patternUseLoopBack=SockOpt(-1)(-1){-# LINE 281 "Network/Socket/Options.hsc" #-}{-# LINE 282 "Network/Socket/Options.hsc" #-}{-# LINE 284 "Network/Socket/Options.hsc" #-}-- | TCP_MAXSEGpatternMaxSegment::SocketOption{-# LINE 287 "Network/Socket/Options.hsc" #-}patternMaxSegment=SockOpt(6)(2){-# LINE 288 "Network/Socket/Options.hsc" #-}{-# LINE 291 "Network/Socket/Options.hsc" #-}-- | TCP_NODELAYpatternNoDelay::SocketOption{-# LINE 294 "Network/Socket/Options.hsc" #-}patternNoDelay=SockOpt(6)(1){-# LINE 295 "Network/Socket/Options.hsc" #-}{-# LINE 298 "Network/Socket/Options.hsc" #-}-- | TCP_USER_TIMEOUTpatternUserTimeout::SocketOption{-# LINE 301 "Network/Socket/Options.hsc" #-}patternUserTimeout=SockOpt(6)(18){-# LINE 302 "Network/Socket/Options.hsc" #-}{-# LINE 305 "Network/Socket/Options.hsc" #-}-- | TCP_CORKpatternCork::SocketOption{-# LINE 308 "Network/Socket/Options.hsc" #-}patternCork=SockOpt(6)(3){-# LINE 309 "Network/Socket/Options.hsc" #-}{-# LINE 312 "Network/Socket/Options.hsc" #-}{-# LINE 313 "Network/Socket/Options.hsc" #-}{-# LINE 315 "Network/Socket/Options.hsc" #-}-- | IP_TTLpatternTimeToLive::SocketOption{-# LINE 318 "Network/Socket/Options.hsc" #-}patternTimeToLive=SockOpt(0)(2){-# LINE 319 "Network/Socket/Options.hsc" #-}{-# LINE 322 "Network/Socket/Options.hsc" #-}-- | Receiving IPv4 TTL.patternRecvIPv4TTL::SocketOption{-# LINE 325 "Network/Socket/Options.hsc" #-}patternRecvIPv4TTL=SockOpt(0)(12){-# LINE 326 "Network/Socket/Options.hsc" #-}{-# LINE 329 "Network/Socket/Options.hsc" #-}-- | Receiving IPv4 TOS.patternRecvIPv4TOS::SocketOption{-# LINE 332 "Network/Socket/Options.hsc" #-}patternRecvIPv4TOS=SockOpt(0)(13){-# LINE 333 "Network/Socket/Options.hsc" #-}{-# LINE 336 "Network/Socket/Options.hsc" #-}-- | Receiving IP_PKTINFO (struct in_pktinfo).patternRecvIPv4PktInfo::SocketOption{-# LINE 341 "Network/Socket/Options.hsc" #-}patternRecvIPv4PktInfo=SockOpt(0)(8){-# LINE 342 "Network/Socket/Options.hsc" #-}{-# LINE 345 "Network/Socket/Options.hsc" #-}{-# LINE 346 "Network/Socket/Options.hsc" #-}{-# LINE 348 "Network/Socket/Options.hsc" #-}-- | IPV6_V6ONLY: don't use this on OpenBSD.patternIPv6Only::SocketOption{-# LINE 351 "Network/Socket/Options.hsc" #-}patternIPv6Only=SockOpt(41)(26){-# LINE 352 "Network/Socket/Options.hsc" #-}{-# LINE 355 "Network/Socket/Options.hsc" #-}-- | Receiving IPv6 hop limit.patternRecvIPv6HopLimit::SocketOption{-# LINE 358 "Network/Socket/Options.hsc" #-}patternRecvIPv6HopLimit=SockOpt(41)(51){-# LINE 359 "Network/Socket/Options.hsc" #-}{-# LINE 362 "Network/Socket/Options.hsc" #-}-- | Receiving IPv6 traffic class.patternRecvIPv6TClass::SocketOption{-# LINE 365 "Network/Socket/Options.hsc" #-}patternRecvIPv6TClass=SockOpt(41)(66){-# LINE 366 "Network/Socket/Options.hsc" #-}{-# LINE 369 "Network/Socket/Options.hsc" #-}-- | Receiving IPV6_PKTINFO (struct in6_pktinfo).patternRecvIPv6PktInfo::SocketOption{-# LINE 372 "Network/Socket/Options.hsc" #-}patternRecvIPv6PktInfo=SockOpt(41)(49){-# LINE 373 "Network/Socket/Options.hsc" #-}{-# LINE 378 "Network/Socket/Options.hsc" #-}{-# LINE 379 "Network/Socket/Options.hsc" #-}patternCustomSockOpt::(CInt,CInt)->SocketOptionpatternCustomSockOptxy<-((\(SockOptxy)->(x,y))->xy)whereCustomSockOpt(x,y)=SockOptxy------------------------------------------------------------------ | Set a socket option that expects an 'Int' value.setSocketOption::Socket->SocketOption-- Option Name->Int-- Option Value->IO(){-# LINE 393 "Network/Socket/Options.hsc" #-}setSocketOptionsso@Lingerv=doletarg=ifv==0thenStructLinger00elseStructLinger1(fromIntegralv)setSockOptssoarg{-# LINE 397 "Network/Socket/Options.hsc" #-}setSocketOptionsso@RecvTimeOutv=setSockOptsso$SocketTimeout$fromIntegralvsetSocketOptionsso@SendTimeOutv=setSockOptsso$SocketTimeout$fromIntegralvsetSocketOptionssav=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-- | Set a socket option value---- The existential 'SockOptValue' enables things like:---- @-- mapM_ (uncurry $ 'setSockOptValue' sock) [-- ('NoDelay', 'SockOptValue' @Int 1)-- , ('Linger', 'SockOptValue' ('StructLinger' 1 0))-- ]-- @setSockOptValue::Socket->SocketOption->SockOptValue->IO()setSockOptValuesopt(SockOptValuev)=setSockOptsoptv------------------------------------------------------------------ | Get a socket option that gives an 'Int' value.getSocketOption::Socket->SocketOption-- Option Name->IOInt-- Option Value{-# LINE 437 "Network/Socket/Options.hsc" #-}getSocketOptionsso@Linger=doStructLingeronofflinger<-getSockOptssoreturn$fromIntegral$ifonoff==0then0elselinger{-# LINE 441 "Network/Socket/Options.hsc" #-}getSocketOptionsso@RecvTimeOut=doSocketTimeoutto<-getSockOptssoreturn$fromIntegraltogetSocketOptionsso@SendTimeOut=doSocketTimeoutto<-getSockOptssoreturn$fromIntegraltogetSocketOptionsso=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_szpeekptr------------------------------------------------------------------ | Get the 'SocketType' of an active socket.---- Since: 3.0.1.0getSocketType::Socket->IOSocketTypegetSocketTypes=unpackSocketType<$>getSockOptsType----------------------------------------------------------------{-# LINE 475 "Network/Socket/Options.hsc" #-}{-# COMPLETECustomSockOpt#-}{-# LINE 477 "Network/Socket/Options.hsc" #-}{-# LINE 478 "Network/Socket/Options.hsc" #-}-- | Low level @SO_LINGER@ option value, which can be used with 'setSockOpt' or-- @'setSockOptValue' . 'SockOptValue'@.dataStructLinger=StructLinger{-- | Set the linger option on.sl_onoff::CInt,-- | Linger timeout.sl_linger::CInt}deriving(Eq,Ord,Show)instanceStorableStructLingerwheresizeOf~_=(8){-# LINE 491 "Network/Socket/Options.hsc" #-}alignment~_=alignment(0::CInt)peekp=doonoff<-((\hsc_ptr->peekByteOffhsc_ptr0))p{-# LINE 495 "Network/Socket/Options.hsc" #-}linger<-((\hsc_ptr->peekByteOffhsc_ptr4))p{-# LINE 496 "Network/Socket/Options.hsc" #-}return$StructLingeronofflingerpokep(StructLingeronofflinger)=do((\hsc_ptr->pokeByteOffhsc_ptr0))ponoff{-# LINE 500 "Network/Socket/Options.hsc" #-}((\hsc_ptr->pokeByteOffhsc_ptr4))plinger{-# LINE 501 "Network/Socket/Options.hsc" #-}{-# LINE 502 "Network/Socket/Options.hsc" #-}-- | A type that can hold any 'Storable' socket option value (e.g.-- 'StructLinger' and 'CInt')---- See 'setSocOptValue'dataSockOptValuewhereSockOptValue::Storablea=>a->SockOptValue------------------------------------------------------------------ | Timeout in microseconds.-- This will be converted into struct timeval on Unix and-- DWORD (as milliseconds) on Windows.newtypeSocketTimeout=SocketTimeoutWord32deriving(Eq,Ord,Show){-# LINE 526 "Network/Socket/Options.hsc" #-}instanceStorableSocketTimeoutwheresizeOf~_=((16)){-# LINE 528 "Network/Socket/Options.hsc" #-}alignment~_=(8){-# LINE 529 "Network/Socket/Options.hsc" #-}peekptr=dosec<-((\hsc_ptr->peekByteOffhsc_ptr0))ptr{-# LINE 531 "Network/Socket/Options.hsc" #-}usec<-((\hsc_ptr->peekByteOffhsc_ptr8))ptr{-# LINE 532 "Network/Socket/Options.hsc" #-}return$SocketTimeout(sec*1000000+usec)pokeptr(SocketTimeoutto)=dolet(sec,usec)=to`divMod`1000000((\hsc_ptr->pokeByteOffhsc_ptr0))ptrsec{-# LINE 536 "Network/Socket/Options.hsc" #-}((\hsc_ptr->pokeByteOffhsc_ptr8))ptrusec{-# LINE 537 "Network/Socket/Options.hsc" #-}{-# LINE 538 "Network/Socket/Options.hsc" #-}----------------------------------------------------------------foreignimportCALLCONVunsafe"getsockopt"c_getsockopt::CInt->CInt->CInt->Ptra->PtrCInt->IOCIntforeignimportCALLCONVunsafe"setsockopt"c_setsockopt::CInt->CInt->CInt->Ptra->CInt->IOCInt

AltStyle によって変換されたページ (->オリジナル) /