]> git.openfabrics.org - ~shefty/librdmacm.git/commitdiff
rsocket: Succeed SO_LINGER socket option
authorSean Hefty <sean.hefty@intel.com>
Fri, 6 Apr 2012 22:40:10 +0000 (15:40 -0700)
committerSean Hefty <sean.hefty@intel.com>
Mon, 16 Apr 2012 18:23:40 +0000 (11:23 -0700)
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 <sean.hefty@intel.com>
src/rsocket.c

index 2dab3b71d630ad9ca4848181035f553542c08ad7..7cfa631661efa8d2cdc0be6ab01e20896480bf22 100644 (file)
@@ -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);