xfstrans.c revision ce6676db
1bbe1b32bSmrg/* 2bbe1b32bSmrg * Copyright © 2003 Keith Packard 3bbe1b32bSmrg * 4bbe1b32bSmrg * Permission to use, copy, modify, distribute, and sell this software and its 5bbe1b32bSmrg * documentation for any purpose is hereby granted without fee, provided that 6bbe1b32bSmrg * the above copyright notice appear in all copies and that both that 7bbe1b32bSmrg * copyright notice and this permission notice appear in supporting 8bbe1b32bSmrg * documentation, and that the name of Keith Packard not be used in 9bbe1b32bSmrg * advertising or publicity pertaining to distribution of the software without 10bbe1b32bSmrg * specific, written prior permission. Keith Packard makes no 11bbe1b32bSmrg * representations about the suitability of this software for any purpose. It 12bbe1b32bSmrg * is provided "as is" without express or implied warranty. 13bbe1b32bSmrg * 14bbe1b32bSmrg * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15bbe1b32bSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16bbe1b32bSmrg * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17bbe1b32bSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18bbe1b32bSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19bbe1b32bSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 20bbe1b32bSmrg * PERFORMANCE OF THIS SOFTWARE. 21bbe1b32bSmrg */ 22bbe1b32bSmrg 23bbe1b32bSmrg#include <xfs-config.h> 24bbe1b32bSmrg 25ce6676dbSmrg#define FONT_t 1 26ce6676dbSmrg#define TRANS_REOPEN 1 27ce6676dbSmrg#define TRANS_SERVER 1 28bbe1b32bSmrg 29bbe1b32bSmrg#include <X11/Xtrans/transport.c> 30ce6676dbSmrg 31ce6676dbSmrg#ifdef XFS_INETD 32ce6676dbSmrg/* xfs special handling for listen socket passed from inetd */ 33ce6676dbSmrg#include "misc.h" 34ce6676dbSmrg 35ce6676dbSmrgOldListenRec * 36ce6676dbSmrgTRANS(GetInetdListenInfo) (int fd) 37ce6676dbSmrg{ 38ce6676dbSmrg char *port = "0"; 39ce6676dbSmrg XtransConnInfo inetdCI; 40ce6676dbSmrg OldListenRec *old_listen; 41ce6676dbSmrg int portnum; 42ce6676dbSmrg 43ce6676dbSmrg /* Create a XtransConnInfo struct for this connection */ 44ce6676dbSmrg inetdCI = TRANS(ReopenCOTSServer)(TRANS_SOCKET_TCP_INDEX, fd, port); 45ce6676dbSmrg 46ce6676dbSmrg /* Fill in correct address/portnum */ 47ce6676dbSmrg TRANS(SocketINETGetAddr)(inetdCI); 48ce6676dbSmrg#ifdef AF_INET6 49ce6676dbSmrg if ( ((struct sockaddr *)(inetdCI->addr))->sa_family == AF_INET6 ) 50ce6676dbSmrg portnum = ntohs(((struct sockaddr_in6 *)(inetdCI->addr))->sin6_port); 51ce6676dbSmrg else 52ce6676dbSmrg#endif 53ce6676dbSmrg portnum = ntohs(((struct sockaddr_in *)(inetdCI->addr))->sin_port); 54ce6676dbSmrg inetdCI->port = xalloc(6); /* Base 10 integer <= 65535 + trailing NUL */ 55ce6676dbSmrg snprintf(inetdCI->port, 6, "%d", portnum); 56ce6676dbSmrg 57ce6676dbSmrg /* Do the socket setup that xtrans normally takes care of in 58ce6676dbSmrg * TRANS(SocketOpen) && TRANS(SocketCreateListener) 59ce6676dbSmrg */ 60ce6676dbSmrg { 61ce6676dbSmrg /* 62ce6676dbSmrg * turn off TCP coalescence for INET sockets 63ce6676dbSmrg */ 64ce6676dbSmrg 65ce6676dbSmrg int tmp = 1; 66ce6676dbSmrg setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, 67ce6676dbSmrg (char *) &tmp, sizeof (int)); 68ce6676dbSmrg } 69ce6676dbSmrg#ifdef SO_DONTLINGER 70ce6676dbSmrg setsockopt (fd, SOL_SOCKET, SO_DONTLINGER, NULL, 0); 71ce6676dbSmrg#else 72ce6676dbSmrg# ifdef SO_LINGER 73ce6676dbSmrg { 74ce6676dbSmrg static int linger[2] = { 0, 0 }; 75ce6676dbSmrg setsockopt (fd, SOL_SOCKET, SO_LINGER, 76ce6676dbSmrg (char *) linger, sizeof (linger)); 77ce6676dbSmrg } 78ce6676dbSmrg# endif 79ce6676dbSmrg#endif 80ce6676dbSmrg 81ce6676dbSmrg if (listen (fd, BACKLOG) < 0) 82ce6676dbSmrg { 83ce6676dbSmrg FatalError("listen() failed on inetd socket: %s\n", 84ce6676dbSmrg strerror(errno)); 85ce6676dbSmrg } 86ce6676dbSmrg 87ce6676dbSmrg /* Pass the inetd socket back through the connection setup code 88ce6676dbSmrg * the same way as a cloned listening port 89ce6676dbSmrg */ 90ce6676dbSmrg old_listen = malloc (sizeof (OldListenRec)); 91ce6676dbSmrg if (old_listen != NULL) { 92ce6676dbSmrg TRANS(GetReopenInfo)(inetdCI, &(old_listen->trans_id), 93ce6676dbSmrg &(old_listen->fd), &port); 94ce6676dbSmrg 95ce6676dbSmrg old_listen->portnum = portnum; 96ce6676dbSmrg } 97ce6676dbSmrg 98ce6676dbSmrg return old_listen; 99ce6676dbSmrg} 100ce6676dbSmrg#endif /* XFS_INETD */ 101