diff -Pur xdm.orig/choose.c xdm/choose.c
--- xdm.orig/choose.c	Sat Jan 18 07:02:19 1997
+++ xdm/choose.c	Thu Sep 10 00:01:41 1998
@@ -232,6 +232,17 @@
 	    result_len = 8;
 	}
 	break;
+    case AF_UNIX:
+	{
+            struct sockaddr_un *un=(struct sockaddr_un *)addr_buf;
+	    result_buf[0] = netfamily >> 8;
+	    result_buf[1] = netfamily & 0xFF;
+	    FormatBytes (result_buf, 2, buf, len);
+	    if (strlen(un->sun_path)>=1020) return 0;
+	    strcpy(buf+4, un->sun_path);
+	    return 1;
+	}
+	break;
 #ifdef AF_DECnet
     case AF_DECnet:
 	break;
diff -Pur xdm.orig/chooser.c xdm/chooser.c
--- xdm.orig/chooser.c	Sat Jan 18 07:02:20 1997
+++ xdm/chooser.c	Thu Sep 10 00:09:29 1998
@@ -87,6 +87,7 @@
 #include    <socket.h>
 #endif
 #include    <netinet/in.h>
+#include    <sys/un.h>
 #else /* MINIX */
 #include <net/hton.h>
 #include <net/netlib.h>
@@ -155,6 +156,7 @@
 Widget	    toplevel, label, viewport, paned, list, box, cancel, acceptit, ping;
 
 static void	CvtStringToARRAY8();
+static void	CvtStringToARRAY8b();
 
 static struct _app_resources {
     ARRAY8Ptr   xdmAddress;
@@ -165,9 +167,10 @@
 #define offset(field) XtOffsetOf(struct _app_resources, field)
 
 #define XtRARRAY8   "ARRAY8"
+#define XtRARRAY8b  "ARRAY8b"
 
 static XtResource  resources[] = {
-    {"xdmAddress",	"XdmAddress",  XtRARRAY8,	sizeof (ARRAY8Ptr),
+    {"xdmAddress",	"XdmAddress",  XtRARRAY8b,	sizeof (ARRAY8Ptr),
 	offset (xdmAddress),	    XtRString,	NULL },
     {"clientAddress",	"ClientAddress",  XtRARRAY8,	sizeof (ARRAY8Ptr),
 	offset (clientAddress),	    XtRString,	NULL },
@@ -947,6 +950,8 @@
 {
     if (app_resources.xdmAddress)
     {
+	int		un_len;
+	struct sockaddr_un  un_addr;
 	struct sockaddr_in  in_addr;
 	struct sockaddr	*addr;
 	int		family;
@@ -977,6 +982,19 @@
 	    addr = (struct sockaddr *) &in_addr;
 	    len = sizeof (in_addr);
 	    break;
+	case AF_UNIX:
+	    un_addr.sun_family = family;
+	    un_len=app_resources.xdmAddress->length-2;
+	    if (un_len>=sizeof(un_addr.sun_path))
+	    {
+               fprintf (stderr, "Socket name too long\n");
+	       exit (REMANAGE_DISPLAY);
+	    }
+	    memcpy(un_addr.sun_path, xdm+2, un_len);
+	    un_addr.sun_path[un_len]=0;
+	    addr = (struct sockaddr *) &un_addr;
+            len=offsetof(struct sockaddr_un, sun_path) + un_len+1;
+	    break;
 	}
 #if defined(STREAMSCONN)
 	if ((fd = t_open ("/dev/tcp", O_RDWR, NULL)) == -1)
@@ -1033,7 +1051,8 @@
 	    exit (REMANAGE_DISPLAY);
 	}
 #else /* !MINIX */
-	if ((fd = socket (family, SOCK_STREAM, 0)) == -1)
+	fd = socket (family, SOCK_STREAM, 0);
+	if (fd == -1)
 	{
 	    fprintf (stderr, "Cannot create response socket\n");
 	    exit (REMANAGE_DISPLAY);
@@ -1173,6 +1192,7 @@
     toplevel = XtInitialize (argv[0], "Chooser", options, XtNumber(options), &argc, argv);
 
     XtAddConverter(XtRString, XtRARRAY8, CvtStringToARRAY8, NULL, 0);
+    XtAddConverter(XtRString, XtRARRAY8b, CvtStringToARRAY8b, NULL, 0);
 
     XtGetApplicationResources (toplevel, (XtPointer) &app_resources, resources,
 			       XtNumber (resources), NULL, (Cardinal) 0);
@@ -1260,6 +1280,36 @@
     else
     {
 	FromHex (s, (char *) dest->data, len);
+    }
+    toVal->addr = (caddr_t) &dest;
+    toVal->size = sizeof (ARRAY8Ptr);
+}
+
+static void
+CvtStringToARRAY8b (args, num_args, fromVal, toVal)
+    XrmValuePtr	args;
+    Cardinal	*num_args;
+    XrmValuePtr	fromVal;
+    XrmValuePtr	toVal;
+{
+    static ARRAY8Ptr	dest;
+    char	*s;
+    int		len;
+
+    len = fromVal->size;
+    s = (char *) fromVal->addr;
+    if (len<4 || memcmp(s, "0001", 4))
+    {
+      CvtStringToARRAY8 (args, num_args, fromVal, toVal);
+      return;
+    }
+    dest = (ARRAY8Ptr) XtMalloc (sizeof (ARRAY8));
+    if (!XdmcpAllocARRAY8 (dest, len-2))
+	XtStringConversionWarning ((char *) fromVal->addr, XtRARRAY8);
+    else
+    {
+	FromHex (s, (char *) dest->data, 4);
+	memcpy((char *)dest->data+2, s+4, len);
     }
     toVal->addr = (caddr_t) &dest;
     toVal->size = sizeof (ARRAY8Ptr);
diff -Pur xdm.orig/dm.h xdm/dm.h
--- xdm.orig/dm.h	Mon Dec  9 11:57:14 1996
+++ xdm/dm.h	Wed Sep  9 23:07:28 1998
@@ -309,6 +309,7 @@
 extern char	*randomFile;
 extern char	*greeterLib;
 extern int	choiceTimeout;	/* chooser choice timeout */
+extern char	*chooserSocket;
 
 extern struct display	*FindDisplayByName (),
 			*FindDisplayBySessionID (),
diff -Pur xdm.orig/resource.c xdm/resource.c
--- xdm.orig/resource.c	Sat May 10 08:03:03 1997
+++ xdm/resource.c	Wed Sep  9 22:25:23 1998
@@ -60,6 +60,7 @@
 char	*randomFile;
 char	*greeterLib;
 int	choiceTimeout;	/* chooser choice timeout */
+char	*chooserSocket;
 
 # define DM_STRING	0
 # define DM_INT		1
@@ -124,6 +125,9 @@
 #ifndef DEF_GREETER_LIB
 #define DEF_GREETER_LIB "/X11/lib/X11/xdm/libXdmGreet.so"
 #endif
+#ifndef DEF_CHOOSERSOCK
+#define DEF_CHOOSERSOCK "/usr/lib/X11/xdm/sockdir/chooser"
+#endif
 #else
 /* unfortunately I have to declare all of them, because there is a limit
  * in argument size in OS/2
@@ -224,6 +228,8 @@
 				"15",
 "sourceAddress","SourceAddress",DM_BOOL,	(char **) &sourceAddress,
 				"false",
+"chooserSocket","chooserSocket",DM_STRING,	&chooserSocket,
+				DEF_CHOOSERSOCK,
 };
 
 # define NUM_DM_RESOURCES	(sizeof DmResources / sizeof DmResources[0])
diff -Pur xdm.orig/socket.c xdm/socket.c
--- xdm.orig/socket.c	Sat Jan 18 07:02:24 1997
+++ xdm/socket.c	Thu Sep 10 21:40:28 1998
@@ -167,7 +167,7 @@
     	tcp_device= TCP_DEVICE;
     chooserFd = open(tcp_device, O_RDWR);
 #else
-    chooserFd = socket (AF_INET, SOCK_STREAM, 0);
+    chooserFd = socket (PF_UNIX, SOCK_STREAM, 0);
 #endif
     Debug ("Created chooser socket %d\n", chooserFd);
     if (chooserFd == -1)
@@ -204,7 +204,43 @@
     ref.ref_int= chooserFd;
     nbio_setcallback(chooserFd, ASIO_IOCTL, tcp_listen_cb, ref);
 #else
+   {
+       struct sockaddr_un sock;
+       int len, size;
+       sock.sun_family = AF_UNIX;
+       len=strlen(chooserSocket);
+       if (len>=sizeof(sock.sun_path))
+       {
+	  LogError ("Chooser socket name too long: %s\n", chooserSocket);
+	  close(chooserFd);
+	  chooserFd=-1;
+	  return;
+       }
+       strcpy(sock.sun_path, chooserSocket);
+       size=offsetof(struct sockaddr_un, sun_path) + len+1;
+       if (unlink(chooserSocket))
+       {
+	 if (errno!=ENOENT)
+	 {
+           LogError ("chooser socket(%s) bind: %s\n", 
+		   chooserSocket, strerror(errno));
+	   close(chooserFd);
+	   chooserFd=-1;
+	   return;
+	 }
+       }
+       if (bind(chooserFd, (struct sockaddr *)&sock, size) < 0)
+       {
+          LogError ("chooser socket(%s) bind: %s\n", 
+		  chooserSocket, strerror(errno));
+	  close(chooserFd);
+	  chooserFd=-1;
+	  return;
+       }
+    }
+    Debug ("Bound chooser socket to %s\n", chooserSocket);
     listen (chooserFd, 5);
+    RegisterCloseOnFork (chooserFd);
 #endif
     if (chooserFd > WellKnownSocketsMax)
 	WellKnownSocketsMax = chooserFd;
@@ -212,6 +248,7 @@
 }
 
 #ifndef MINIX
+#if 0
 GetChooserAddr (addr, lenp)
     char	*addr;
     int		*lenp;
@@ -226,6 +263,21 @@
     *lenp = len;
     return 0;
 }
+#else
+GetChooserAddr (addr, lenp)
+    char	*addr;
+    int		*lenp;
+{
+    struct sockaddr_un	un_addr;
+
+    un_addr.sun_family = AF_UNIX;
+    /* Bounds check done in CreateWellKnownSockets */
+    strcpy(un_addr.sun_path, chooserSocket); 
+    *lenp=offsetof(struct sockaddr_un, sun_path) + strlen(chooserSocket)+1;
+    memmove ( addr, (char *) &un_addr, *lenp);
+    return 0;
+}
+#endif
 #else /* MINIX */
 GetChooserAddr (addr, lenp)
     char	*addr;
