#include "dm.h"
#include "dm_error.h"
#ifdef XDMCP
#ifndef STREAMSCONN
#include <errno.h>
#include "dm_socket.h"
#ifndef X_NO_SYS_UN
#ifndef Lynx
#include <sys/un.h>
#else
#include <un.h>
#endif
#endif
#include <netdb.h>
extern int xdmcpFd;
extern int chooserFd;
extern FD_TYPE WellKnownSocketsMask;
extern int WellKnownSocketsMax;
void
CreateWellKnownSockets (void)
{
struct sockaddr_in sock_addr;
char *name;
if (request_port == 0)
return;
Debug ("creating socket %d\n", request_port);
xdmcpFd = socket (AF_INET, SOCK_DGRAM, 0);
if (xdmcpFd == -1) {
LogError ("XDMCP socket creation failed, errno %d\n", errno);
return;
}
name = localHostname ();
registerHostname (name, strlen (name));
RegisterCloseOnFork (xdmcpFd);
bzero ((char *) &sock_addr, sizeof (sock_addr));
#ifdef BSD44SOCKETS
sock_addr.sin_len = sizeof(sock_addr);
#endif
sock_addr.sin_family = AF_INET;
sock_addr.sin_port = htons ((short) request_port);
sock_addr.sin_addr.s_addr = htonl (INADDR_ANY);
if (bind (xdmcpFd, (struct sockaddr *)&sock_addr, sizeof (sock_addr)) == -1)
{
LogError ("error %d binding socket address %d\n", errno, request_port);
close (xdmcpFd);
xdmcpFd = -1;
return;
}
WellKnownSocketsMax = xdmcpFd;
FD_SET (xdmcpFd, &WellKnownSocketsMask);
chooserFd = socket (AF_INET, SOCK_STREAM, 0);
Debug ("Created chooser socket %d\n", chooserFd);
if (chooserFd == -1)
{
LogError ("chooser socket creation failed, errno %d\n", errno);
return;
}
listen (chooserFd, 5);
if (chooserFd > WellKnownSocketsMax)
WellKnownSocketsMax = chooserFd;
FD_SET (chooserFd, &WellKnownSocketsMask);
}
int
GetChooserAddr (
char *addr,
int *lenp)
{
struct sockaddr_in in_addr;
int len;
len = sizeof in_addr;
if (getsockname (chooserFd, (struct sockaddr *)&in_addr, (void *)&len) < 0)
return -1;
Debug ("Chooser socket port: %d\n", ntohs(in_addr.sin_port));
memmove( addr, (char *) &in_addr, len);
*lenp = len;
return 0;
}
#endif
#endif