mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-02-15 04:32:24 +00:00
slib/mp_rpc_server: TIRPC: force a listen() call on the server socket
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.
This commit is contained in:
parent
eb811f26f8
commit
dc7807b13b
2 changed files with 25 additions and 1 deletions
|
@ -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 \
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue