1 #define I_ERRNO
2 #define I_SYS
3 #define I_IOCTL
4 #define I_STRING
5 #define I_SOCKET
6
7 #include "includes.h"
8 #include <signal.h>
9
10 char *local_x = "/tmp/.X11-unix/X0";
11
12 int display_num = 9;
13 int debug = 0;
14
xc_connect_server(int dummy)15 int xc_connect_server(int dummy) {
16 int s;
17 signal(SIGPIPE, SIG_IGN);
18 if ((s = connect_server(0)) < 0)
19 return -1;
20 if(getenv("XSERVERPATH")) local_x=getenv("XSERVERPATH");
21 if (send_command(s, C_SOCKET, 0, "%s", local_x)<0)
22 return -1;
23
24 send_command(s, C_DUMB, 1, 0);
25
26 return s;
27 }
28
29
main(int argc,char * argv[])30 void main(int argc, char *argv[]) {
31 int s;
32 char *home;
33 char *display;
34 int svs[1];
35 #ifdef UNIX_SOCKET
36 char unix_sock[110];
37 #endif
38
39 setbuf(stderr, 0);
40 display = getenv("DISPLAY");
41
42 #ifdef UNIX_SOCKET
43 if (!display || display[0] != ':' || !display[1])
44 display = ":9";
45
46 sprintf(unix_sock,"/tmp/.X11-unix");
47 mkdir(unix_sock, 0700);
48 strcat(unix_sock, "/X");
49 strcat(unix_sock, display+1);
50
51 if ((s = bind_unix(unix_sock)) < 0) {
52 exit(1);
53 }
54
55 #else /* if a TCP socket.. */
56 /* Try and work out what display we */
57 /* should get by default. */
58 if (!display || !display[0]) { /* is there a DISPLAY set?? */
59 display_num = 9; /* No. Just pick 9 by default */
60 } else {
61 home = strchr(display,':'); /* Yes. Find out what display number. */
62 if (home) /* if we could work it out.. */
63 display_num = atoi(home+1); /* then grab the number. */
64 if (display_num < 1) /* if the number is invalid, */
65 display_num = 9; /* just default. */
66 }
67
68 while (( s = bind_tcp(6000 + display_num)) == -2) {
69 if (display_num > 100) {
70 printf("Unable to bind socket\n");
71 exit(1);
72 break;
73 }
74 ++display_num;
75 }
76
77 fprintf(stderr, "Xconn bound to screen %d\n", display_num);
78 printf(":%d\n", display_num);
79
80 #endif
81 svs[0] = s;
82 do_connect(1, svs, xc_connect_server); /* Never exits. */
83 }
84