Index: dm.c =================================================================== RCS file: /cvs/xorg/app/xdm/dm.c,v retrieving revision 1.4 diff -u -p -r1.4 dm.c --- dm.c 2 Jun 2006 23:14:36 -0000 1.4 +++ dm.c 25 Aug 2006 23:28:02 -0000 @@ -68,7 +68,9 @@ from The Open Group. # include # include # include +# include # include +# include #ifndef F_TLOCK #ifndef X_NOT_POSIX @@ -621,6 +623,78 @@ StartDisplays (void) ForEachDisplay (CheckDisplayStatus); } +static void +SetWindowPath(struct display *d) +{ + /* setting WINDOWPATH for clients */ + Atom prop; + Atom actualtype; + int actualformat; + unsigned long nitems; + unsigned long bytes_after; + unsigned char *buf; + const char *windowpath; + char *newwindowpath; + unsigned long num; + char nums[10]; + int numn; + + prop = XInternAtom(d->dpy, "XFree86_VT", False); + if (prop == None) { + fprintf(stderr, "no XFree86_VT atom\n"); + return; + } + if (XGetWindowProperty(d->dpy, DefaultRootWindow(d->dpy), prop, 0, 1, + False, AnyPropertyType, &actualtype, &actualformat, + &nitems, &bytes_after, &buf)) { + fprintf(stderr, "no XFree86_VT property\n"); + return; + } + if (nitems != 1) { + fprintf(stderr, "%lu items in XFree86_VT property!\n", nitems); + XFree(buf); + return; + } + switch (actualtype) { + case XA_CARDINAL: + case XA_INTEGER: + case XA_WINDOW: + switch (actualformat) { + case 8: + num = (*(uint8_t *)(void *)buf); + break; + case 16: + num = (*(uint16_t *)(void *)buf); + break; + case 32: + num = (*(uint32_t *)(void *)buf); + break; + default: + fprintf(stderr, "format %d in XFree86_VT property!\n", actualformat); + XFree(buf); + return; + } + break; + default: + fprintf(stderr, "type %lx in XFree86_VT property!\n", actualtype); + XFree(buf); + return; + } + XFree(buf); + windowpath = getenv("WINDOWPATH"); + numn = snprintf(nums, sizeof(nums), "%lu", num); + if (!windowpath) { + newwindowpath = malloc(numn + 1); + sprintf(newwindowpath, "%s", nums); + } else { + newwindowpath = malloc(strlen(windowpath) + 1 + numn + 1); + sprintf(newwindowpath, "%s:%s", windowpath, nums); + } + if (d->windowPath) + free(d->windowPath); + d->windowPath = newwindowpath; +} + void StartDisplay (struct display *d) { @@ -676,6 +750,7 @@ StartDisplay (struct display *d) SetAuthorization (d); if (!WaitForServer (d)) exit (OPENFAILED_DISPLAY); + SetWindowPath(d); #ifdef XDMCP if (d->useChooser) RunChooser (d); Index: dm.h =================================================================== RCS file: /cvs/xorg/app/xdm/dm.h,v retrieving revision 1.6 diff -u -p -r1.6 dm.h --- dm.h 3 Jun 2006 01:01:21 -0000 1.6 +++ dm.h 25 Aug 2006 23:28:02 -0000 @@ -242,6 +242,8 @@ struct display { /* Hack for making "Willing to manage" configurable */ char *willing; /* "Willing to manage" program */ + Display *dpy; /* Display */ + char *windowPath; /* path to server "window" */ }; #ifdef XDMCP Index: server.c =================================================================== RCS file: /cvs/xorg/app/xdm/server.c,v retrieving revision 1.3 diff -u -p -r1.3 server.c --- server.c 2 Jun 2006 23:14:36 -0000 1.3 +++ server.c 25 Aug 2006 23:28:02 -0000 @@ -51,8 +51,6 @@ static int receivedUsr1; static int serverPause (unsigned t, int serverPid); -static Display *dpy; - /* ARGSUSED */ static SIGVAL CatchUsr1 (int n) @@ -304,7 +302,7 @@ WaitForServer (struct display *d) Debug ("Before XOpenDisplay(%s)\n", d->name); errno = 0; (void) XSetIOErrorHandler (openErrorHandler); - dpy = XOpenDisplay (d->name); + d->dpy = XOpenDisplay (d->name); #ifdef STREAMSCONN { /* For some reason, the next XOpenDisplay we do is @@ -320,13 +318,13 @@ WaitForServer (struct display *d) (void) Signal (SIGALRM, SIG_DFL); (void) XSetIOErrorHandler ((int (*)(Display *)) 0); Debug ("After XOpenDisplay(%s)\n", d->name); - if (dpy) { + if (d->dpy) { #ifdef XDMCP if (d->displayType.location == Foreign) - GetRemoteAddress (d, ConnectionNumber (dpy)); + GetRemoteAddress (d, ConnectionNumber (d->dpy)); #endif - RegisterCloseOnFork (ConnectionNumber (dpy)); - (void) fcntl (ConnectionNumber (dpy), F_SETFD, 0); + RegisterCloseOnFork (ConnectionNumber (d->dpy)); + (void) fcntl (ConnectionNumber (d->dpy), F_SETFD, 0); return 1; } else { Debug ("OpenDisplay failed %d (%s) on \"%s\"\n", @@ -349,8 +347,8 @@ WaitForServer (struct display *d) void ResetServer (struct display *d) { - if (dpy && d->displayType.origin != FromXDMCP) - pseudoReset (dpy); + if (d->dpy && d->displayType.origin != FromXDMCP) + pseudoReset (d->dpy); } static Jmp_buf pingTime; @@ -384,7 +382,7 @@ PingServer (struct display *d, Display * int oldAlarm; static Display *aDpy; - aDpy = (alternateDpy != NULL ? alternateDpy : dpy); + aDpy = (alternateDpy != NULL ? alternateDpy : d->dpy); oldError = XSetIOErrorHandler (PingLostIOErr); oldAlarm = alarm (0); oldSig = Signal (SIGALRM, PingLostSig); Index: session.c =================================================================== RCS file: /cvs/xorg/app/xdm/session.c,v retrieving revision 1.8 diff -u -p -r1.8 session.c --- session.c 20 Jun 2006 19:25:51 -0000 1.8 +++ session.c 25 Aug 2006 23:28:03 -0000 @@ -769,6 +769,10 @@ StartClient ( } #endif /* K5AUTH */ #endif /* !USE_PAM */ + + if (d->windowPath) + verify->userEnviron = setEnv(verify->userEnviron, "WINDOWPATH", d->windowPath); + if (passwd != NULL) bzero(passwd, strlen(passwd)); @@ -961,6 +965,8 @@ systemEnv (struct display *d, char *user env = setEnv (env, "SHELL", d->systemShell); if (d->authFile) env = setEnv (env, "XAUTHORITY", d->authFile); + if (d->windowPath) + env = setEnv (env, "WINDOWPATH", d->windowPath); return env; } Index: xdm.man.cpp =================================================================== RCS file: /cvs/xorg/app/xdm/xdm.man.cpp,v retrieving revision 1.5 diff -u -p -r1.5 xdm.man.cpp --- xdm.man.cpp 18 Oct 2005 02:12:17 -0000 1.5 +++ xdm.man.cpp 25 Aug 2006 23:28:03 -0000 @@ -1,4 +1,4 @@ -.\" $XdotOrg: app/xdm/xdm.man.cpp,v 1.5 2005-10-18 02:12:17 alanc Exp $ +.\" $XdotOrg: app/xdm/xdm.man.cpp,v 1.5 2005/10/18 02:12:17 alanc Exp $ .\" $Xorg: xdm.man,v 1.4 2001/02/09 02:05:41 xorgcvs Exp $ .\" Copyright 1988, 1994, 1998 The Open Group .\" @@ -1092,6 +1092,7 @@ the following environment variables are PATH the value of \fBDisplayManager.\fP\fIDISPLAY\fP\fB.systemPath\fP SHELL the value of \fBDisplayManager.\fP\fIDISPLAY\fP\fB.systemShell\fP XAUTHORITY may be set to an authority file + WINDOWPATH may be set to the "window path" leading to the X server .fi .PP @@ -1146,6 +1147,7 @@ the following environment variables are SHELL the user's default shell (from \fIgetpwnam\fP) XAUTHORITY may be set to a non-standard authority file KRB5CCNAME may be set to a Kerberos credentials cache name + WINDOWPATH may be set to the "window path" leading to the X server .fi .PP