removed
This commit is contained in:
parent
e0c1f7884b
commit
5d95538733
1 changed files with 0 additions and 95 deletions
|
@ -1,95 +0,0 @@
|
||||||
[[!comment format=mdwn
|
|
||||||
username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw"
|
|
||||||
nickname="dxtrish"
|
|
||||||
subject="comment 11"
|
|
||||||
date="2014-02-08T19:16:24Z"
|
|
||||||
content="""
|
|
||||||
I honestly have no idea why that move works because
|
|
||||||
|
|
||||||
% ls -lh /usr/lib|grep -E '(gsasl|xml2|gnutls|idn)'
|
|
||||||
|
|
||||||
returns nothing. But couldn't those symbols already be in the other libraries considering, from what I've read at least, haskell stuff are statically compiled by default?
|
|
||||||
|
|
||||||
Anyway, you are completely right that this happened when I try to use XMPP. The reason I was looking in the wrong place to begin with was because the webapp spit out the error messsage. I have redirected my attention to the network library and the xmpp library.
|
|
||||||
|
|
||||||
But I might have found something interesting in the network library. Keep in mind that I just learned a little today, so do correct me if I'm wrong.
|
|
||||||
|
|
||||||
Looking at http://hackage.haskell.org/package/network-2.2.1.8/docs/src/Network-Socket.html I found:
|
|
||||||
setSocketOption :: Socket
|
|
||||||
-> SocketOption -- Option Name
|
|
||||||
-> Int -- Option Value
|
|
||||||
-> IO ()
|
|
||||||
setSocketOption (MkSocket s _ _ _ _) so v = do
|
|
||||||
with (fromIntegral v) $ \ptr_v -> do
|
|
||||||
throwErrnoIfMinus1_ \"setSocketOption\" $
|
|
||||||
c_setsockopt s (socketOptLevel so) (packSocketOption so) ptr_v
|
|
||||||
(fromIntegral (sizeOf v))
|
|
||||||
return ()
|
|
||||||
|
|
||||||
Everything here looks good. So I decided to take a look at SocketOption, socketOptLevel and packSocketOption.
|
|
||||||
data SocketOption
|
|
||||||
= DummySocketOption__
|
|
||||||
| 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 -}
|
|
||||||
| Linger {- SO_LINGER -}
|
|
||||||
| RecvLowWater {- SO_RCVLOWAT -}
|
|
||||||
| SendLowWater {- SO_SNDLOWAT -}
|
|
||||||
| RecvTimeOut {- SO_RCVTIMEO -}
|
|
||||||
| SendTimeOut {- SO_SNDTIMEO -}
|
|
||||||
|
|
||||||
socketOptLevel :: SocketOption -> CInt
|
|
||||||
socketOptLevel so =
|
|
||||||
case so of
|
|
||||||
TimeToLive -> 0
|
|
||||||
MaxSegment -> 6
|
|
||||||
NoDelay -> 6
|
|
||||||
_ -> 1
|
|
||||||
|
|
||||||
packSocketOption :: SocketOption -> CInt
|
|
||||||
packSocketOption so =
|
|
||||||
case so of
|
|
||||||
Debug -> 1
|
|
||||||
ReuseAddr -> 2
|
|
||||||
Type -> 3
|
|
||||||
SoError -> 4
|
|
||||||
DontRoute -> 5
|
|
||||||
Broadcast -> 6
|
|
||||||
SendBuffer -> 7
|
|
||||||
RecvBuffer -> 8
|
|
||||||
KeepAlive -> 9
|
|
||||||
OOBInline -> 10
|
|
||||||
TimeToLive -> 2
|
|
||||||
MaxSegment -> 2
|
|
||||||
NoDelay -> 1
|
|
||||||
Linger -> 13
|
|
||||||
RecvLowWater -> 18
|
|
||||||
SendLowWater -> 19
|
|
||||||
RecvTimeOut -> 20
|
|
||||||
SendTimeOut -> 21
|
|
||||||
|
|
||||||
Everything looks good so I thought long and hard about this. Then, by chance, I just looked at the man page for setsockopt() and it mentioned SOL_SOCKET and I was like \"Hmm...\"
|
|
||||||
|
|
||||||
% grep -R SOL_SOCKET /usr/include
|
|
||||||
/usr/include/openssl/e_os.h:#define ioctlsocket(a,b,c) setsockopt((a),SOL_SOCKET,(b),(c),sizeof(*(c)))
|
|
||||||
/usr/include/sys/socket.h:#define SOL_SOCKET 0xffff /* options for socket level */
|
|
||||||
/usr/include/sys/socket.h:/* Read using getsockopt() with SOL_SOCKET, SO_PEERCRED */
|
|
||||||
|
|
||||||
Wat?
|
|
||||||
|
|
||||||
#define SOL_SOCKET 0xffff
|
|
||||||
|
|
||||||
Going back to the Haskell code above I realized that SetSocketOption will NEVER feed 0xffff as level to setsockopt() because socketOptLevel returns 1 unless optname is TimeToLive, MaxSegment or NoDelay.
|
|
||||||
|
|
||||||
Am I way off?
|
|
||||||
"""]]
|
|
Loading…
Add table
Add a link
Reference in a new issue