{-# LINE 1 "Network/Socket/Posix/Cmsg.hsc" #-}{-# LANGUAGE AllowAmbiguousTypes #-}{-# LANGUAGE CPP #-}{-# LANGUAGE GeneralizedNewtypeDeriving #-}{-# LANGUAGE PatternSynonyms #-}{-# LANGUAGE RecordWildCards #-}{-# LANGUAGE ScopedTypeVariables #-}{-# LANGUAGE TypeApplications #-}moduleNetwork.Socket.Posix.CmsgwhereimportData.ByteString.InternalimportForeign.ForeignPtrimportSystem.IO.Unsafe(unsafeDupablePerformIO)importSystem.Posix.Types(Fd(..))importNetwork.Socket.ImportsimportNetwork.Socket.TypesimportNetwork.Socket.ReadShowimportqualifiedText.ReadasP-- | Control message (ancillary data) including a pair of level and type.dataCmsg=Cmsg{cmsgId::!CmsgId,cmsgData::!ByteString}deriving(Eq,Show)------------------------------------------------------------------ | Identifier of control message (ancillary data).dataCmsgId=CmsgId{cmsgLevel::!CInt,cmsgType::!CInt}deriving(Eq)-- | Unsupported identifierpatternUnsupportedCmsgId::CmsgIdpatternUnsupportedCmsgId=CmsgId(-1)(-1)-- | The identifier for 'IPv4TTL'.patternCmsgIdIPv4TTL::CmsgId{-# LINE 50 "Network/Socket/Posix/Cmsg.hsc" #-}patternCmsgIdIPv4TTL=CmsgId(0)(2){-# LINE 51 "Network/Socket/Posix/Cmsg.hsc" #-}{-# LINE 52 "Network/Socket/Posix/Cmsg.hsc" #-}-- | The identifier for 'IPv6HopLimit'.patternCmsgIdIPv6HopLimit::CmsgIdpatternCmsgIdIPv6HopLimit=CmsgId(41)(52){-# LINE 56 "Network/Socket/Posix/Cmsg.hsc" #-}-- | The identifier for 'IPv4TOS'.patternCmsgIdIPv4TOS::CmsgId{-# LINE 62 "Network/Socket/Posix/Cmsg.hsc" #-}patternCmsgIdIPv4TOS=CmsgId(0)(1){-# LINE 63 "Network/Socket/Posix/Cmsg.hsc" #-}{-# LINE 64 "Network/Socket/Posix/Cmsg.hsc" #-}-- | The identifier for 'IPv6TClass'.patternCmsgIdIPv6TClass::CmsgIdpatternCmsgIdIPv6TClass=CmsgId(41)(67){-# LINE 68 "Network/Socket/Posix/Cmsg.hsc" #-}-- | The identifier for 'IPv4PktInfo'.patternCmsgIdIPv4PktInfo::CmsgId{-# LINE 72 "Network/Socket/Posix/Cmsg.hsc" #-}patternCmsgIdIPv4PktInfo=CmsgId(0)(8){-# LINE 73 "Network/Socket/Posix/Cmsg.hsc" #-}{-# LINE 76 "Network/Socket/Posix/Cmsg.hsc" #-}-- | The identifier for 'IPv6PktInfo'.patternCmsgIdIPv6PktInfo::CmsgId{-# LINE 80 "Network/Socket/Posix/Cmsg.hsc" #-}patternCmsgIdIPv6PktInfo=CmsgId(41)(50){-# LINE 81 "Network/Socket/Posix/Cmsg.hsc" #-}{-# LINE 84 "Network/Socket/Posix/Cmsg.hsc" #-}-- | The identifier for 'Fd'.patternCmsgIdFd::CmsgIdpatternCmsgIdFd=CmsgId(1)(1){-# LINE 88 "Network/Socket/Posix/Cmsg.hsc" #-}------------------------------------------------------------------ | Locate a control message of the given type in a list of control-- messages. The following shows an example usage:---- > (lookupCmsg CmsgIdIPv4TOS cmsgs >>= decodeCmsg) :: Maybe IPv4TOSlookupCmsg::CmsgId->[Cmsg]->MaybeCmsglookupCmsgcidcmsgs=find(\cmsg->cmsgIdcmsg==cid)cmsgs-- | Filtering control message.filterCmsg::CmsgId->[Cmsg]->[Cmsg]filterCmsgcidcmsgs=filter(\cmsg->cmsgIdcmsg==cid)cmsgs------------------------------------------------------------------ | Control message type class.-- Each control message type has a numeric 'CmsgId' and a 'Storable'-- data representation.classStorablea=>ControlMessageawherecontrolMessageId::CmsgIdencodeCmsg::foralla.ControlMessagea=>a->CmsgencodeCmsgx=unsafeDupablePerformIO$dobs<-createsiz$\p0->doletp=castPtrp0pokepxletcmsid=controlMessageId@areturn$Cmsgcmsidbswheresiz=sizeOfxdecodeCmsg::foralla.(ControlMessagea,Storablea)=>Cmsg->MaybeadecodeCmsg(Cmsgcmsid(PSfptrofflen))|cid/=cmsid=Nothing|len<siz=Nothing|otherwise=unsafeDupablePerformIO$withForeignPtrfptr$\p0->doletp=castPtr(p0`plusPtr`off)Just<$>peekpwherecid=controlMessageId@asiz=sizeOf(undefined::a)------------------------------------------------------------------ | Time to live of IPv4.{-# LINE 137 "Network/Socket/Posix/Cmsg.hsc" #-}newtypeIPv4TTL=IPv4TTLCIntderiving(Eq,Show,Storable){-# LINE 139 "Network/Socket/Posix/Cmsg.hsc" #-}instanceControlMessageIPv4TTLwherecontrolMessageId=CmsgIdIPv4TTL------------------------------------------------------------------ | Hop limit of IPv6.newtypeIPv6HopLimit=IPv6HopLimitCIntderiving(Eq,Show,Storable)instanceControlMessageIPv6HopLimitwherecontrolMessageId=CmsgIdIPv6HopLimit------------------------------------------------------------------ | TOS of IPv4.newtypeIPv4TOS=IPv4TOSCCharderiving(Eq,Show,Storable)instanceControlMessageIPv4TOSwherecontrolMessageId=CmsgIdIPv4TOS------------------------------------------------------------------ | Traffic class of IPv6.newtypeIPv6TClass=IPv6TClassCIntderiving(Eq,Show,Storable)instanceControlMessageIPv6TClasswherecontrolMessageId=CmsgIdIPv6TClass------------------------------------------------------------------ | Network interface ID and local IPv4 address.dataIPv4PktInfo=IPv4PktInfoIntHostAddressHostAddressderiving(Eq)instanceShowIPv4PktInfowhereshow(IPv4PktInfonsaha)="IPv4PktInfo "++shown++" "++show(hostAddressToTuplesa)++" "++show(hostAddressToTupleha)instanceControlMessageIPv4PktInfowherecontrolMessageId=CmsgIdIPv4PktInfoinstanceStorableIPv4PktInfowhere{-# LINE 180 "Network/Socket/Posix/Cmsg.hsc" #-}sizeOf_=((12)){-# LINE 181 "Network/Socket/Posix/Cmsg.hsc" #-}alignment_=alignment(0::CInt)pokep(IPv4PktInfonsaha)=do((\hsc_ptr->pokeByteOffhsc_ptr0))p(fromIntegraln::CInt){-# LINE 184 "Network/Socket/Posix/Cmsg.hsc" #-}((\hsc_ptr->pokeByteOffhsc_ptr4))psa{-# LINE 185 "Network/Socket/Posix/Cmsg.hsc" #-}((\hsc_ptr->pokeByteOffhsc_ptr8))pha{-# LINE 186 "Network/Socket/Posix/Cmsg.hsc" #-}peekp=don<-((\hsc_ptr->peekByteOffhsc_ptr0))p{-# LINE 188 "Network/Socket/Posix/Cmsg.hsc" #-}sa<-((\hsc_ptr->peekByteOffhsc_ptr4))p{-# LINE 189 "Network/Socket/Posix/Cmsg.hsc" #-}ha<-((\hsc_ptr->peekByteOffhsc_ptr8))p{-# LINE 190 "Network/Socket/Posix/Cmsg.hsc" #-}return$IPv4PktInfonsaha{-# LINE 197 "Network/Socket/Posix/Cmsg.hsc" #-}------------------------------------------------------------------ | Network interface ID and local IPv4 address.dataIPv6PktInfo=IPv6PktInfoIntHostAddress6deriving(Eq)instanceShowIPv6PktInfowhereshow(IPv6PktInfonha6)="IPv6PktInfo "++shown++" "++show(hostAddress6ToTupleha6)instanceControlMessageIPv6PktInfowherecontrolMessageId=CmsgIdIPv6PktInfoinstanceStorableIPv6PktInfowhere{-# LINE 211 "Network/Socket/Posix/Cmsg.hsc" #-}sizeOf_=((20)){-# LINE 212 "Network/Socket/Posix/Cmsg.hsc" #-}alignment_=alignment(0::CInt)pokep(IPv6PktInfonha6)=do((\hsc_ptr->pokeByteOffhsc_ptr16))p(fromIntegraln::CInt){-# LINE 215 "Network/Socket/Posix/Cmsg.hsc" #-}((\hsc_ptr->pokeByteOffhsc_ptr0))p(In6Addrha6){-# LINE 216 "Network/Socket/Posix/Cmsg.hsc" #-}peekp=doIn6Addrha6<-((\hsc_ptr->peekByteOffhsc_ptr0))p{-# LINE 218 "Network/Socket/Posix/Cmsg.hsc" #-}n::CInt<-((\hsc_ptr->peekByteOffhsc_ptr16))p{-# LINE 219 "Network/Socket/Posix/Cmsg.hsc" #-}return$IPv6PktInfo(fromIntegraln)ha6{-# LINE 226 "Network/Socket/Posix/Cmsg.hsc" #-}----------------------------------------------------------------instanceControlMessageFdwherecontrolMessageId=CmsgIdFdcmsgIdBijection::BijectionCmsgIdStringcmsgIdBijection=[(UnsupportedCmsgId,"UnsupportedCmsgId"),(CmsgIdIPv4TTL,"CmsgIdIPv4TTL"),(CmsgIdIPv6HopLimit,"CmsgIdIPv6HopLimit"),(CmsgIdIPv4TOS,"CmsgIdIPv4TOS"),(CmsgIdIPv6TClass,"CmsgIdIPv6TClass"),(CmsgIdIPv4PktInfo,"CmsgIdIPv4PktInfo"),(CmsgIdIPv6PktInfo,"CmsgIdIPv6PktInfo"),(CmsgIdFd,"CmsgIdFd")]instanceShowCmsgIdwhereshowsPrec=bijectiveShowcmsgIdBijectiondefwheredefname="CmsgId"unId=\(CmsgIdlt)->(l,t)def=defShowdefnameunIdshowIntIntinstanceReadCmsgIdwherereadPrec=bijectiveReadcmsgIdBijectiondefwheredefname="CmsgId"def=defReaddefname(uncurryCmsgId)readIntInt