@@ -36,7 +36,7 @@ data CmsgId = CmsgId {
36
36
37
37
-- | The identifier for 'IPv4TTL'.
38
38
pattern CmsgIdIPv4TTL :: CmsgId
39
- #if defined(darwin_HOST_OS)
39
+ #if defined(darwin_HOST_OS) || defined(freebsd_HOST_OS)
40
40
pattern CmsgIdIPv4TTL = CmsgId (# const IPPROTO_IP ) (# const IP_RECVTTL )
41
41
#else
42
42
pattern CmsgIdIPv4TTL = CmsgId (# const IPPROTO_IP ) (# const IP_TTL )
@@ -48,7 +48,7 @@ pattern CmsgIdIPv6HopLimit = CmsgId (#const IPPROTO_IPV6) (#const IPV6_HOPLIMIT)
48
48
49
49
-- | The identifier for 'IPv4TOS'.
50
50
pattern CmsgIdIPv4TOS :: CmsgId
51
- #if defined(darwin_HOST_OS)
51
+ #if defined(darwin_HOST_OS) || defined(freebsd_HOST_OS)
52
52
pattern CmsgIdIPv4TOS = CmsgId (# const IPPROTO_IP ) (# const IP_RECVTOS )
53
53
#else
54
54
pattern CmsgIdIPv4TOS = CmsgId (# const IPPROTO_IP ) (# const IP_TOS )
@@ -60,11 +60,19 @@ pattern CmsgIdIPv6TClass = CmsgId (#const IPPROTO_IPV6) (#const IPV6_TCLASS)
60
60
61
61
-- | The identifier for 'IPv4PktInfo'.
62
62
pattern CmsgIdIPv4PktInfo :: CmsgId
63
+ #if defined(IP_PKTINFO)
63
64
pattern CmsgIdIPv4PktInfo = CmsgId (# const IPPROTO_IP ) (# const IP_PKTINFO )
65
+ #else
66
+ pattern CmsgIdIPv4PktInfo = CmsgId (- 1 ) (- 1 )
67
+ #endif
64
68
65
69
-- | The identifier for 'IPv6PktInfo'.
66
70
pattern CmsgIdIPv6PktInfo :: CmsgId
71
+ #if defined(IPV6_PKTINFO)
67
72
pattern CmsgIdIPv6PktInfo = CmsgId (# const IPPROTO_IPV6 ) (# const IPV6_PKTINFO )
73
+ #else
74
+ pattern CmsgIdIPv6PktInfo = CmsgId (- 1 ) (- 1 )
75
+ #endif
68
76
69
77
-- | The identifier for 'Fd'.
70
78
pattern CmsgIdFd :: CmsgId
@@ -115,7 +123,7 @@ decodeCmsg (Cmsg cmsid (PS fptr off len))
115
123
----------------------------------------------------------------
116
124
117
125
-- | Time to live of IPv4.
118
- #if defined(darwin_HOST_OS)
126
+ #if defined(darwin_HOST_OS) || defined(freebsd_HOST_OS)
119
127
newtype IPv4TTL = IPv4TTL CChar deriving (Eq , Show , Storable )
120
128
#else
121
129
newtype IPv4TTL = IPv4TTL CInt deriving (Eq , Show , Storable )
@@ -160,6 +168,7 @@ instance ControlMessage IPv4PktInfo where
160
168
controlMessageId = CmsgIdIPv4PktInfo
161
169
162
170
instance Storable IPv4PktInfo where
171
+ #if defined (IP_PKTINFO)
163
172
sizeOf _ = (# size struct in_pktinfo)
164
173
alignment _ = alignment (undefined :: CInt )
165
174
poke p (IPv4PktInfo n sa ha) = do
@@ -171,6 +180,12 @@ instance Storable IPv4PktInfo where
171
180
sa <- (# peek struct in_pktinfo, ipi_spec_dst) p
172
181
ha <- (# peek struct in_pktinfo, ipi_addr) p
173
182
return $ IPv4PktInfo n sa ha
183
+ #else
184
+ sizeOf _ = 0
185
+ alignment _ = 1
186
+ poke _ _ = error " Unsupported control message type"
187
+ peek _ = error " Unsupported control message type"
188
+ #endif
174
189
175
190
----------------------------------------------------------------
176
191
@@ -184,6 +199,7 @@ instance ControlMessage IPv6PktInfo where
184
199
controlMessageId = CmsgIdIPv6PktInfo
185
200
186
201
instance Storable IPv6PktInfo where
202
+ #if defined (IPV6_PKTINFO)
187
203
sizeOf _ = (# size struct in6_pktinfo)
188
204
alignment _ = alignment (undefined :: CInt )
189
205
poke p (IPv6PktInfo n ha6) = do
@@ -193,6 +209,12 @@ instance Storable IPv6PktInfo where
193
209
In6Addr ha6 <- (# peek struct in6_pktinfo, ipi6_addr) p
194
210
n :: CInt <- (# peek struct in6_pktinfo, ipi6_ifindex) p
195
211
return $ IPv6PktInfo (fromIntegral n) ha6
212
+ #else
213
+ sizeOf _ = 0
214
+ alignment _ = 1
215
+ poke _ _ = error " Unsupported control message type"
216
+ peek _ = error " Unsupported control message type"
217
+ #endif
196
218
197
219
----------------------------------------------------------------
198
220
0 commit comments