version 1.140, 2001/10/10 22:18:47 |
version 1.141, 2001/11/29 21:10:51 |
|
|
|
|
/* |
/* |
* Creates an internet domain socket for listening for X11 connections. |
* Creates an internet domain socket for listening for X11 connections. |
* Returns a suitable value for the DISPLAY variable, or NULL if an error |
* Returns a suitable display number for the DISPLAY variable, or -1 if |
* occurs. |
* an error occurs. |
*/ |
*/ |
char * |
int |
x11_create_display_inet(int screen_number, int x11_display_offset) |
x11_create_display_inet(int x11_display_offset, int gateway_ports) |
{ |
{ |
int display_number, sock; |
int display_number, sock; |
u_short port; |
u_short port; |
struct addrinfo hints, *ai, *aitop; |
struct addrinfo hints, *ai, *aitop; |
char strport[NI_MAXSERV]; |
char strport[NI_MAXSERV]; |
int gaierr, n, num_socks = 0, socks[NUM_SOCKS]; |
int gaierr, n, num_socks = 0, socks[NUM_SOCKS]; |
char display[512]; |
|
char hostname[MAXHOSTNAMELEN]; |
|
|
|
for (display_number = x11_display_offset; |
for (display_number = x11_display_offset; |
display_number < MAX_DISPLAYS; |
display_number < MAX_DISPLAYS; |
|
|
port = 6000 + display_number; |
port = 6000 + display_number; |
memset(&hints, 0, sizeof(hints)); |
memset(&hints, 0, sizeof(hints)); |
hints.ai_family = IPv4or6; |
hints.ai_family = IPv4or6; |
hints.ai_flags = AI_PASSIVE; /* XXX loopback only ? */ |
hints.ai_flags = gateway_ports ? AI_PASSIVE : 0; |
hints.ai_socktype = SOCK_STREAM; |
hints.ai_socktype = SOCK_STREAM; |
snprintf(strport, sizeof strport, "%d", port); |
snprintf(strport, sizeof strport, "%d", port); |
if ((gaierr = getaddrinfo(NULL, strport, &hints, &aitop)) != 0) { |
if ((gaierr = getaddrinfo(NULL, strport, &hints, &aitop)) != 0) { |
error("getaddrinfo: %.100s", gai_strerror(gaierr)); |
error("getaddrinfo: %.100s", gai_strerror(gaierr)); |
return NULL; |
return -1; |
} |
} |
for (ai = aitop; ai; ai = ai->ai_next) { |
for (ai = aitop; ai; ai = ai->ai_next) { |
if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6) |
if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6) |
|
|
sock = socket(ai->ai_family, SOCK_STREAM, 0); |
sock = socket(ai->ai_family, SOCK_STREAM, 0); |
if (sock < 0) { |
if (sock < 0) { |
error("socket: %.100s", strerror(errno)); |
error("socket: %.100s", strerror(errno)); |
return NULL; |
return -1; |
} |
} |
if (bind(sock, ai->ai_addr, ai->ai_addrlen) < 0) { |
if (bind(sock, ai->ai_addr, ai->ai_addrlen) < 0) { |
debug("bind port %d: %.100s", port, strerror(errno)); |
debug("bind port %d: %.100s", port, strerror(errno)); |
|
|
} |
} |
if (display_number >= MAX_DISPLAYS) { |
if (display_number >= MAX_DISPLAYS) { |
error("Failed to allocate internet-domain X11 display socket."); |
error("Failed to allocate internet-domain X11 display socket."); |
return NULL; |
return -1; |
} |
} |
/* Start listening for connections on the socket. */ |
/* Start listening for connections on the socket. */ |
for (n = 0; n < num_socks; n++) { |
for (n = 0; n < num_socks; n++) { |
|
|
error("listen: %.100s", strerror(errno)); |
error("listen: %.100s", strerror(errno)); |
shutdown(sock, SHUT_RDWR); |
shutdown(sock, SHUT_RDWR); |
close(sock); |
close(sock); |
return NULL; |
return -1; |
} |
} |
} |
} |
|
|
/* Set up a suitable value for the DISPLAY variable. */ |
|
if (gethostname(hostname, sizeof(hostname)) < 0) |
|
fatal("gethostname: %.100s", strerror(errno)); |
|
snprintf(display, sizeof display, "%.400s:%d.%d", hostname, |
|
display_number, screen_number); |
|
|
|
/* Allocate a channel for each socket. */ |
/* Allocate a channel for each socket. */ |
for (n = 0; n < num_socks; n++) { |
for (n = 0; n < num_socks; n++) { |
sock = socks[n]; |
sock = socks[n]; |
|
|
0, xstrdup("X11 inet listener"), 1); |
0, xstrdup("X11 inet listener"), 1); |
} |
} |
|
|
/* Return a suitable value for the DISPLAY environment variable. */ |
/* Return the display number for the DISPLAY environment variable. */ |
return xstrdup(display); |
return display_number; |
} |
} |
|
|
#ifndef X_UNIX_PATH |
#ifndef X_UNIX_PATH |