slib/mp_rpc_server: TIRPC: force a listen() call on the server socket
authorJon Trulson <jon@radscan.com>
Mon, 2 Jul 2018 01:19:24 +0000 (01:19 +0000)
committerJon Trulson <jon@radscan.com>
Mon, 2 Jul 2018 01:45:09 +0000 (19:45 -0600)
With earlier versions of RPC and TIRPC it seems that svctcp_create()
calles listen() on the socket (as seen by debugger and strace).
Tooltalk expects this behavior.

However, with newer systems (ArchLinux 5/18+ and similar bleeding edge
versions of SuSE's equivalent: Tumbleweed), this behavior seems to
have changed.

ttsession goes into an infinite loop trying to accept() a connection
in the TIRPC library (via svc_getreqset()).

It appears listen() is no longer called on the socket when it is
created via svctcp_create().  The hack in this commit, always causes
listen() to be called on the socket, and seems to resolve the problem.

But it is a hack I think.  I don't know if this is the correct
behavior of svctcp_create() or we were just lucky before.

cde/lib/tt/slib/Imakefile
cde/lib/tt/slib/mp_rpc_server.C

index cd713a2b9c8613142bb4c5648d4263497404748e..dba66d1d731946f565cfa38a689dc33d7f880ac5 100644 (file)
@@ -14,9 +14,10 @@ DEPEND_DEFINES = $(CXXDEPENDINCLUDES) $(DEPENDDEFINES)
 
 #include "../tooltalk.tmpl"
 
-DEFINES = 
+DEFINES = $(TIRPC_DEFINES)
 INCLUDES = $(TIRPCINC) -I. -I../lib
 
+
 SRCS = \
 mp_ce_attrs.C          mp_observer.C              mp_observer_utils.C  \
 mp_otype.C             mp_otype_utils.C           mp_ptype.C           \
index 37336f65e2fac73c74bf5adf843143faf46768da..1fe1aab299d6d010f2e4ca6f7479154e7b97d25b 100644 (file)
@@ -158,9 +158,32 @@ init(void (*service_fn)(struct svc_req *, SVCXPRT *))
                _tt_syslog(0, LOG_ERR, "setsockopt(SO_SNDBUF): %m");
        }
        _transp = svctcp_create(_socket, buffersize, buffersize);
+
        if (_transp == (SVCXPRT *)0) {
                return(0);
        }
+
+#if defined(OPT_TIRPC)
+        /* JET: HACK WARNING 7/1/18
+         *
+         * With earlier versions of RPC and TIRPC it seems that
+         * svctcp_create() calles listen() on the socket (as seen by
+         * debugger and strace).  This is the expected behavior in TT.
+         *
+         * However, with newer systems (ArchLinux 5/18+ and similar
+         * bleeding edge versions of SuSE's equivalent: Tumbleweed),
+         * this behavior seems to have changed.
+         *
+         * ttsession goes into an infinite loop trying to accept() a
+         * connection in the TIRPC library.  It appears listen() is no
+         * longer called on the socket via svctcp_create().  The hack
+         * below, always causes listen() to be called on the socket.
+         * We do not care if it fails, or is called twice on the same
+         * socket.
+         */
+        listen(_socket, 5);
+#endif
+
        if (   !svc_register(_transp, _program, _version,
                             (SERVICE_FN_TYPE)service_fn, IPPROTO_TCP)
            || !svc_register(_transp, _program, 1,