diff options
Diffstat (limited to 'streams.c')
-rw-r--r-- | streams.c | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/streams.c b/streams.c new file mode 100644 index 0000000..585fe90 --- /dev/null +++ b/streams.c @@ -0,0 +1,147 @@ +/* $Xorg: streams.c,v 1.4 2001/02/09 02:05:40 xorgcvs Exp $ */ +/* + +Copyright 1988, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * xdm - display manager daemon + * Author: Keith Packard, MIT X Consortium + * + * streams.c - Support for STREAMS + */ + +#include "dm.h" + +#ifdef XDMCP +#ifdef STREAMSCONN + +#include <fcntl.h> +#include <tiuser.h> +#include <netconfig.h> +#include <netdir.h> + +extern int xdmcpFd; +extern int chooserFd; + +extern FD_TYPE WellKnownSocketsMask; +extern int WellKnownSocketsMax; + +CreateWellKnownSockets () +{ + struct t_bind bind_addr; + struct netconfig *nconf; + struct nd_hostserv service; + struct nd_addrlist *servaddrs; + char *name, *localHostname(); + char bindbuf[15]; + int it; + + if (request_port == 0) + return; + Debug ("creating UDP stream %d\n", request_port); + + nconf = getnetconfigent("udp"); + if (!nconf) { + t_error("getnetconfigent udp"); + return; + } + + xdmcpFd = t_open(nconf->nc_device, O_RDWR, NULL); + if (xdmcpFd == -1) { + LogError ("XDMCP stream creation failed\n"); + t_error ("CreateWellKnownSockets(xdmcpFd): t_open failed"); + return; + } + name = localHostname (); + registerHostname (name, strlen (name)); + RegisterCloseOnFork (xdmcpFd); + + service.h_host = HOST_SELF; + sprintf(bindbuf, "%d", request_port); + service.h_serv = bindbuf; + netdir_getbyname(nconf, &service, &servaddrs); + freenetconfigent(nconf); + + bind_addr.qlen = 5; + bind_addr.addr.buf = servaddrs->n_addrs[0].buf; + bind_addr.addr.len = servaddrs->n_addrs[0].len; + bind_addr.addr.maxlen = servaddrs->n_addrs[0].len; + it = t_bind(xdmcpFd, &bind_addr, &bind_addr); + netdir_free((char *)servaddrs, ND_ADDRLIST); + if (it < 0) + { + LogError ("error binding STREAMS address %d\n", request_port); + t_error("CreateWellKNowSocket(xdmcpFd): t_bind failed"); + t_close (xdmcpFd); + xdmcpFd = -1; + return; + } + WellKnownSocketsMax = xdmcpFd; + FD_SET (xdmcpFd, &WellKnownSocketsMask); + + chooserFd = t_open ("/dev/tcp", O_RDWR, NULL); + Debug ("Created chooser fd %d\n", chooserFd); + if (chooserFd == -1) + { + LogError ("chooser stream creation failed\n"); + t_error("CreateWellKnowSockets(chooserFd): t_open failed"); + return; + } + bind_addr.qlen = 5; + bind_addr.addr.len = 0; + bind_addr.addr.maxlen = 0; + if( t_bind( chooserFd, &bind_addr, NULL ) < 0 ) + { + t_error("CreateWellKnowSockets(chooserFd): t_bind failed"); + } + + if (chooserFd > WellKnownSocketsMax) + WellKnownSocketsMax = chooserFd; + FD_SET (chooserFd, &WellKnownSocketsMask); +} + +GetChooserAddr (addr, lenp) + char *addr; /* return */ + int *lenp; /* size of addr, returned as amt used */ +{ + struct netbuf nbuf; + int retval; + + nbuf.buf = addr; + nbuf.len = *lenp; + nbuf.maxlen = *lenp; + retval = t_getname (chooserFd, &nbuf, LOCALNAME); + if (retval < 0) { + if (debugLevel > 0) + t_error("t_getname on chooser fd"); + } + *lenp = nbuf.len; + return retval; +} + +#endif /* STREAMSCONN */ +#endif /* XDMCP */ |