From be2701f40e57c583ed7ca4f37a3e9027be9170ad Mon Sep 17 00:00:00 2001 From: Sean Hefty Date: Fri, 6 Apr 2012 15:40:10 -0700 Subject: [PATCH] rsocket: Succeed SO_LINGER socket option Succeed calls to set the SO_LINGER socket option. We don't actually implement SO_LINGER semantics because we never place an rsocket into a timewait state. Unlike socket behavior, we do wait for all pending data to be transferred by the hardware. This is done so that the disconnect message can be sent over the rsocket connection. Signed-off-by: Sean Hefty --- src/rsocket.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/rsocket.c b/src/rsocket.c index 2dab3b71..7cfa6316 100644 --- a/src/rsocket.c +++ b/src/rsocket.c @@ -1656,6 +1656,11 @@ int rsetsockopt(int socket, int level, int optname, rs->sbuf_size = (*(uint32_t *) optval) << 1; ret = 0; break; + case SO_LINGER: + /* Invert value so default so_opt = 0 is on */ + opt_on = !((struct linger *) optval)->l_onoff; + ret = 0; + break; default: break; } @@ -1707,6 +1712,13 @@ int rgetsockopt(int socket, int level, int optname, *((int *) optval) = rs->sbuf_size; *optlen = sizeof(int); break; + case SO_LINGER: + /* Value is inverted so default so_opt = 0 is on */ + ((struct linger *) optval)->l_onoff = + !(rs->so_opts & (1 << optname)); + ((struct linger *) optval)->l_linger = 0; + *optlen = sizeof(struct linger); + break; case SO_ERROR: *((int *) optval) = rs->err; *optlen = sizeof(int); -- 2.46.0