A new user interface for you! Read more...

File xdm-tolerant-hostname-changes.diff of Package xdm

--- xdm/auth.c.orig	2011-09-25 09:35:47.000000000 +0200
+++ xdm/auth.c	2014-07-18 14:55:03.244300844 +0200
@@ -767,7 +767,7 @@ writeAddr (
 }
 
 static void
-DefineLocal (FILE *file, Xauth *auth)
+DefineLocal (FILE *file, Xauth *auth, char **pLocalAddress)
 {
 	char	displayname[100];
 	int	len = _XGetHostname (displayname, sizeof(displayname));
@@ -803,6 +803,9 @@ DefineLocal (FILE *file, Xauth *auth)
 #endif
 
 	writeAddr (FamilyLocal, len, displayname, file, auth);
+
+        if (pLocalAddress)
+           *pLocalAddress = strdup(displayname);
 }
 
 #ifdef HAVE_GETIFADDRS
@@ -1236,7 +1239,7 @@ setAuthNumber (Xauth *auth, char *name)
 }
 
 static void
-writeLocalAuth (FILE *file, Xauth *auth, char *name)
+writeLocalAuth (FILE *file, Xauth *auth, char *name, char **pLocalAddress)
 {
     int	fd;
 
@@ -1263,13 +1266,13 @@ writeLocalAuth (FILE *file, Xauth *auth,
     DefineSelf (fd, file, auth);
     close (fd);
 #endif
-    DefineLocal (file, auth);
+    DefineLocal (file, auth, pLocalAddress);
 }
 
 #ifdef XDMCP
 
 static void
-writeRemoteAuth (FILE *file, Xauth *auth, XdmcpNetaddr peer, int peerlen, char *name)
+writeRemoteAuth (FILE *file, Xauth *auth, XdmcpNetaddr peer, int peerlen, char *name, char **pLocalAddress)
 {
     int	    family = FamilyLocal;
     char    *addr;
@@ -1288,7 +1291,7 @@ writeRemoteAuth (FILE *file, Xauth *auth
     }
     else
     {
-	writeLocalAuth (file, auth, name);
+	writeLocalAuth (file, auth, name, pLocalAddress);
     }
 }
 
@@ -1312,6 +1315,7 @@ SetUserAuthorization (struct display *d,
 #ifdef HAVE_MKSTEMP
     int		fd;
 #endif
+    char	*localAddress = NULL;
 
     Debug ("SetUserAuthorization\n");
     auths = d->authorizations;
@@ -1404,10 +1408,10 @@ SetUserAuthorization (struct display *d,
 	    {
 		magicCookie = i;
 		if (d->displayType.location == Local)
-		    writeLocalAuth (new, auths[i], d->name);
+		    writeLocalAuth (new, auths[i], d->name, &localAddress);
 #ifdef XDMCP
 		else
-		    writeRemoteAuth (new, auths[i], d->peer, d->peerlen, d->name);
+		    writeRemoteAuth (new, auths[i], d->peer, d->peerlen, d->name, &localAddress);
 #endif
 		break;
 	    }
@@ -1425,10 +1429,10 @@ SetUserAuthorization (struct display *d,
 		    !strncmp (auths[i]->name, "MIT-KERBEROS-5", 14))
 		    auths[i]->data_length = 0;
 		if (d->displayType.location == Local)
-		    writeLocalAuth (new, auths[i], d->name);
+		    writeLocalAuth (new, auths[i], d->name, &localAddress);
 #ifdef XDMCP
 		else
-		    writeRemoteAuth (new, auths[i], d->peer, d->peerlen, d->name);
+		    writeRemoteAuth (new, auths[i], d->peer, d->peerlen, d->name, &localAddress);
 #endif
 		auths[i]->data_length = data_len;
 	    }
@@ -1473,6 +1477,12 @@ SetUserAuthorization (struct display *d,
 	    verify->systemEnviron = setEnv (verify->systemEnviron,
 				    "XAUTHORITY", envname);
 	}
+	if (localAddress) {
+	    verify->userEnviron = setEnv (verify->userEnviron,
+				    "XAUTHLOCALHOSTNAME",localAddress);
+	    free(localAddress);
+	}
+	
 	XauUnlockAuth (name);
 	if (envname)
 	    chown (envname, verify->uid, verify->gid);
@@ -1511,10 +1521,10 @@ RemoveUserAuthorization (struct display
 	for (i = 0; i < d->authNum; i++)
 	{
 	    if (d->displayType.location == Local)
-		writeLocalAuth (new, auths[i], d->name);
+		writeLocalAuth (new, auths[i], d->name, NULL);
 #ifdef XDMCP
 	    else
-		writeRemoteAuth (new, auths[i], d->peer, d->peerlen, d->name);
+		writeRemoteAuth (new, auths[i], d->peer, d->peerlen, d->name, NULL);
 #endif
 	}
 	doWrite = 1;