{-# LINE1"Network/Socket/Options.hsc"#-}{-# LANGUAGE CPP #-}{-# LANGUAGE DeriveDataTypeable #-}#include "HsNetDef.h"
moduleNetwork.Socket.Options(SocketOption (..),isSupportedSocketOption ,getSocketType ,getSocketOption ,setSocketOption ,c_getsockopt ,c_setsockopt )whereimportForeign.Marshal.Alloc(alloca)importForeign.Marshal.Utils(with)importNetwork.Socket.Imports importNetwork.Socket.Internal importNetwork.Socket.Types ------------------------------------------------------------------------------- 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 =Debug -- ^ SO_DEBUG|ReuseAddr -- ^ SO_REUSEADDR|Type -- ^ SO_TYPE|SoError -- ^ SO_ERROR|DontRoute -- ^ SO_DONTROUTE|Broadcast -- ^ SO_BROADCAST|SendBuffer -- ^ SO_SNDBUF|RecvBuffer -- ^ SO_RCVBUF|KeepAlive -- ^ SO_KEEPALIVE|OOBInline -- ^ SO_OOBINLINE|TimeToLive -- ^ IP_TTL|MaxSegment -- ^ TCP_MAXSEG|NoDelay -- ^ TCP_NODELAY|Cork -- ^ TCP_CORK|Linger -- ^ SO_LINGER: timeout in seconds, 0 means disabling/disabled.|ReusePort -- ^ SO_REUSEPORT|RecvLowWater -- ^ SO_RCVLOWAT|SendLowWater -- ^ SO_SNDLOWAT|RecvTimeOut -- ^ SO_RCVTIMEO: this does not work at this moment.|SendTimeOut -- ^ SO_SNDTIMEO: this does not work at this moment.|UseLoopBack -- ^ SO_USELOOPBACK|UserTimeout -- ^ TCP_USER_TIMEOUT|IPv6Only -- ^ IPV6_V6ONLY: don't use this on OpenBSD.|CustomSockOpt (CInt,CInt)deriving(Show,Typeable)-- | Does the 'SocketOption' exist on this system?isSupportedSocketOption::SocketOption ->BoolisSupportedSocketOption =isJust.packSocketOption -- | Get the 'SocketType' of an active socket.---- Since: 3.0.1.0getSocketType::Socket ->IOSocketType getSocketType s =(fromMaybeNoSocketType .unpackSocketType .fromIntegral)<$>getSocketOption s Type -- | For a socket option, return Just (level, value) where level is the-- corresponding C option level constant (e.g. SOL_SOCKET) and value is-- the option constant itself (e.g. SO_DEBUG)-- If either constant does not exist, return Nothing.packSocketOption::SocketOption ->Maybe(CInt,CInt)packSocketOption so =-- The Just here is a hack to disable GHC's overlapping pattern detection:-- the problem is if all constants are present, the fallback pattern is-- redundant, but if they aren't then it isn't. Hence we introduce an-- extra pattern (Nothing) that can't possibly happen, so that the-- fallback is always (in principle) necessary.-- I feel a little bad for including this, but such are the sacrifices we-- make while working with CPP - excluding the fallback pattern correctly-- would be a serious nuisance.-- (NB: comments elsewhere in this file refer to this one)caseJustso of{-# LINE86"Network/Socket/Options.hsc"#-}{-# LINE87"Network/Socket/Options.hsc"#-}JustDebug->Just((1),(1)){-# LINE88"Network/Socket/Options.hsc"#-}{-# LINE89"Network/Socket/Options.hsc"#-}{-# LINE90"Network/Socket/Options.hsc"#-}JustReuseAddr->Just((1),(2)){-# LINE91"Network/Socket/Options.hsc"#-}{-# LINE92"Network/Socket/Options.hsc"#-}{-# LINE93"Network/Socket/Options.hsc"#-}JustType->Just((1),(3)){-# LINE94"Network/Socket/Options.hsc"#-}{-# LINE95"Network/Socket/Options.hsc"#-}{-# LINE96"Network/Socket/Options.hsc"#-}JustSoError->Just((1),(4)){-# LINE97"Network/Socket/Options.hsc"#-}{-# LINE98"Network/Socket/Options.hsc"#-}{-# LINE99"Network/Socket/Options.hsc"#-}JustDontRoute->Just((1),(5)){-# LINE100"Network/Socket/Options.hsc"#-}{-# LINE101"Network/Socket/Options.hsc"#-}{-# LINE102"Network/Socket/Options.hsc"#-}JustBroadcast->Just((1),(6)){-# LINE103"Network/Socket/Options.hsc"#-}{-# LINE104"Network/Socket/Options.hsc"#-}{-# LINE105"Network/Socket/Options.hsc"#-}JustSendBuffer->Just((1),(7)){-# LINE106"Network/Socket/Options.hsc"#-}{-# LINE107"Network/Socket/Options.hsc"#-}{-# LINE108"Network/Socket/Options.hsc"#-}JustRecvBuffer->Just((1),(8)){-# LINE109"Network/Socket/Options.hsc"#-}{-# LINE110"Network/Socket/Options.hsc"#-}{-# LINE111"Network/Socket/Options.hsc"#-}JustKeepAlive->Just((1),(9)){-# LINE112"Network/Socket/Options.hsc"#-}{-# LINE113"Network/Socket/Options.hsc"#-}{-# LINE114"Network/Socket/Options.hsc"#-}JustOOBInline->Just((1),(10)){-# LINE115"Network/Socket/Options.hsc"#-}{-# LINE116"Network/Socket/Options.hsc"#-}{-# LINE117"Network/Socket/Options.hsc"#-}JustLinger->Just((1),(13)){-# LINE118"Network/Socket/Options.hsc"#-}{-# LINE119"Network/Socket/Options.hsc"#-}{-# LINE120"Network/Socket/Options.hsc"#-}JustReusePort->Just((1),(15)){-# LINE121"Network/Socket/Options.hsc"#-}{-# LINE122"Network/Socket/Options.hsc"#-}{-# LINE123"Network/Socket/Options.hsc"#-}JustRecvLowWater->Just((1),(18)){-# LINE124"Network/Socket/Options.hsc"#-}{-# LINE125"Network/Socket/Options.hsc"#-}{-# LINE126"Network/Socket/Options.hsc"#-}JustSendLowWater->Just((1),(19)){-# LINE127"Network/Socket/Options.hsc"#-}{-# LINE128"Network/Socket/Options.hsc"#-}{-# LINE129"Network/Socket/Options.hsc"#-}JustRecvTimeOut->Just((1),(20)){-# LINE130"Network/Socket/Options.hsc"#-}{-# LINE131"Network/Socket/Options.hsc"#-}{-# LINE132"Network/Socket/Options.hsc"#-}JustSendTimeOut->Just((1),(21)){-# LINE133"Network/Socket/Options.hsc"#-}{-# LINE134"Network/Socket/Options.hsc"#-}{-# LINE137"Network/Socket/Options.hsc"#-}{-# LINE138"Network/Socket/Options.hsc"#-}{-# LINE139"Network/Socket/Options.hsc"#-}{-# LINE140"Network/Socket/Options.hsc"#-}JustTimeToLive->Just((0),(2)){-# LINE141"Network/Socket/Options.hsc"#-}{-# LINE142"Network/Socket/Options.hsc"#-}{-# LINE143"Network/Socket/Options.hsc"#-}{-# LINE144"Network/Socket/Options.hsc"#-}{-# LINE145"Network/Socket/Options.hsc"#-}JustMaxSegment->Just((6),(2)){-# LINE146"Network/Socket/Options.hsc"#-}{-# LINE147"Network/Socket/Options.hsc"#-}{-# LINE148"Network/Socket/Options.hsc"#-}JustNoDelay->Just((6),(1)){-# LINE149"Network/Socket/Options.hsc"#-}{-# LINE150"Network/Socket/Options.hsc"#-}{-# LINE151"Network/Socket/Options.hsc"#-}JustUserTimeout->Just((6),(18)){-# LINE152"Network/Socket/Options.hsc"#-}{-# LINE153"Network/Socket/Options.hsc"#-}{-# LINE154"Network/Socket/Options.hsc"#-}JustCork->Just((6),(3)){-# LINE155"Network/Socket/Options.hsc"#-}{-# LINE156"Network/Socket/Options.hsc"#-}{-# LINE157"Network/Socket/Options.hsc"#-}{-# LINE158"Network/Socket/Options.hsc"#-}{-# LINE159"Network/Socket/Options.hsc"#-}JustIPv6Only->Just((41),(26)){-# LINE160"Network/Socket/Options.hsc"#-}{-# LINE161"Network/Socket/Options.hsc"#-}{-# LINE162"Network/Socket/Options.hsc"#-}Just(CustomSockOptopt)->Justopt_->Nothing-- | Return the option level and option value if they exist,-- otherwise throw an error that begins "Network.Socket." ++ the String-- parameterpackSocketOption'::String->SocketOption->IO(CInt,CInt)packSocketOption'callerso=maybeerrreturn(packSocketOptionso)whereerr=ioError.userError.concat$["Network.Socket.",caller,": socket option ",showso," unsupported on this system"]{-# LINE175"Network/Socket/Options.hsc"#-}dataStructLinger=StructLingerCIntCIntinstanceStorableStructLingerwheresizeOf_=(8){-# LINE179"Network/Socket/Options.hsc"#-}alignment_=alignment(undefined::CInt)peekp=doonoff<-((\hsc_ptr->peekByteOffhsc_ptr0))p{-# LINE183"Network/Socket/Options.hsc"#-}linger<-((\hsc_ptr->peekByteOffhsc_ptr4))p{-# LINE184"Network/Socket/Options.hsc"#-}return$StructLingeronofflingerpokep(StructLingeronofflinger)=do((\hsc_ptr->pokeByteOffhsc_ptr0))ponoff{-# LINE188"Network/Socket/Options.hsc"#-}((\hsc_ptr->pokeByteOffhsc_ptr4))plinger{-# LINE189"Network/Socket/Options.hsc"#-}{-# LINE190"Network/Socket/Options.hsc"#-}-- | 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(){-# LINE198"Network/Socket/Options.hsc"#-}setSocketOptionsLingerv=do(level,opt)<-packSocketOption'"setSocketOption"Lingerletarg=ifv==0thenStructLinger00elseStructLinger1(fromIntegralv)witharg$\ptr_arg->void$doletptr=ptr_arg::PtrStructLingersz=fromIntegral$sizeOf(undefined::StructLinger)withFdSockets$\fd->throwSocketErrorIfMinus1_"Network.Socket.setSocketOption"$c_setsockoptfdleveloptptrsz{-# LINE208"Network/Socket/Options.hsc"#-}setSocketOptionssov=do(level,opt)<-packSocketOption'"setSocketOption"sowith(fromIntegralv)$\ptr_v->void$doletptr=ptr_v::PtrCIntsz=fromIntegral$sizeOf(undefined::CInt)withFdSockets$\fd->throwSocketErrorIfMinus1_"Network.Socket.setSocketOption"$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{-# LINE223"Network/Socket/Options.hsc"#-}getSocketOptionsLinger=do(level,opt)<-packSocketOption'"getSocketOption"Lingeralloca$\ptr_v->doletptr=ptr_v::PtrStructLingersz=fromIntegral$sizeOf(undefined::StructLinger)withFdSockets$\fd->withsz$\ptr_sz->dothrowSocketErrorIfMinus1Retry_"Network.Socket.getSocketOption"$c_getsockoptfdleveloptptrptr_szStructLingeronofflinger<-peekptrreturn$fromIntegral$ifonoff==0then0elselinger{-# LINE234"Network/Socket/Options.hsc"#-}getSocketOptionsso=do(level,opt)<-packSocketOption'"getSocketOption"soalloca$\ptr_v->doletptr=ptr_v::PtrCIntsz=fromIntegral$sizeOf(undefined::CInt)withFdSockets$\fd->withsz$\ptr_sz->dothrowSocketErrorIfMinus1Retry_"Network.Socket.getSocketOption"$c_getsockoptfdleveloptptrptr_szfromIntegral<$>peekptrforeignimportCALLCONVunsafe"getsockopt"c_getsockopt::CInt->CInt->CInt->Ptra->PtrCInt->IOCIntforeignimportCALLCONVunsafe"setsockopt"c_setsockopt::CInt->CInt->CInt->Ptra->CInt->IOCInt

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