Index: /trunk/Ohana/src/kapa2/src/CheckPipe.c
===================================================================
--- /trunk/Ohana/src/kapa2/src/CheckPipe.c	(revision 13898)
+++ /trunk/Ohana/src/kapa2/src/CheckPipe.c	(revision 13899)
@@ -7,6 +7,11 @@
 
 // we can supply a port here, with only small changes
-void InitPipe () {
-  InitSocket = KapaServerInit (&Address);
+void InitPipe (char *namedSocket) {
+
+  if (namedSocket == NULL) {
+    InitSocket = KapaServerInit (&Address);
+  } else {
+    sock = KapaWaitNamedSocket (namedSocket);
+  }
   return;
 }
Index: /trunk/Ohana/src/kapa2/src/Layout.c
===================================================================
--- /trunk/Ohana/src/kapa2/src/Layout.c	(revision 13898)
+++ /trunk/Ohana/src/kapa2/src/Layout.c	(revision 13899)
@@ -6,6 +6,15 @@
   int N;
   Section *section;
+  char *namedSocket;
+  
+  if ((N = get_argument (argc, argv, "-socket"))) { 
+    remove_argument (N, &argc, argv);
+    namedSocket = argv[N];
+    remove_argument (N, &argc, argv);
+  }
 
-  InitPipe();
+  // if we specify a named socket, wait until we are contacted
+  // otherwise, open an INET sock and check occasionally for requests
+  InitPipe (namedSocket);
 
   ACTIVE_CURSOR = FALSE;
Index: /trunk/Ohana/src/libkapa/include/kapa.h
===================================================================
--- /trunk/Ohana/src/libkapa/include/kapa.h	(revision 13898)
+++ /trunk/Ohana/src/libkapa/include/kapa.h	(revision 13899)
@@ -227,4 +227,6 @@
 int KapaDefineValidIP (char *ipstring);
 int KapaClientSocket (char *hostname);
+int KapaOpenNamedSocket (char *kapa_exec, char *name);
+int KapaWaitNamedSocket (char *sockpath);
 
 /* define Kapa names for shared functions */
Index: /trunk/Ohana/src/libkapa/src/KapaOpen.c
===================================================================
--- /trunk/Ohana/src/libkapa/src/KapaOpen.c	(revision 13898)
+++ /trunk/Ohana/src/libkapa/src/KapaOpen.c	(revision 13899)
@@ -243,2 +243,73 @@
   return (sock);
 }
+
+/* start socketed connection (UNIX Socket) */
+int KapaOpenNamedSocket (char *kapa_exec, char *name) {
+
+  int InitSocket, status;
+  struct sockaddr_un Address;
+  socklen_t AddressLength;
+  char temp[128], socket_name[64];
+  int Ntry, fd;
+
+  sprintf (socket_name, "/tmp/Kapa.XXXXXX");
+  if ((fd = mkstemp (socket_name)) == -1) {
+    fprintf (stderr, "error starting kapa\n");
+    return (-1);
+  }
+  close (fd);
+  unlink (socket_name);
+
+  strcpy (Address.sun_path, socket_name); 
+  Address.sun_family = AF_UNIX; 
+  InitSocket = socket (AF_UNIX, SOCK_STREAM, 0); 
+  status = bind (InitSocket, (struct sockaddr *) &Address, sizeof (Address));
+  status = listen (InitSocket, 1);
+  
+  if (name == NULL) {
+    sprintf (temp, "%s -socket %s &", kapa_exec, socket_name);
+  } else {
+    sprintf (temp, "%s -socket %s -name %s &", kapa_exec, socket_name, name);
+  }
+  system (temp);
+
+  AddressLength =  sizeof (Address);
+  fcntl (InitSocket, F_SETFL, O_NONBLOCK); 
+
+# define NTRY 500
+  Ntry = 0;
+  while (Ntry < NTRY) {
+    fd = accept (InitSocket, (struct sockaddr *)&Address, &AddressLength);
+    if (fd != -1) break;
+    if (errno != EAGAIN) break;
+    usleep (10000);
+    Ntry ++;
+  }
+
+  if (fd < 0) return (-1);
+
+  // the client uses a BLOCKing socket by default
+  fcntl (fd, F_SETFL, !O_NONBLOCK); 
+  return (fd);
+}
+
+// wait for the initiating process to connect to the socket
+int KapaWaitNamedSocket (char *sockpath) {
+
+  int sock, status;
+  struct sockaddr_un Address;
+
+  strcpy (Address.sun_path, sockpath);
+  Address.sun_family = AF_UNIX;
+  sock = socket (AF_UNIX, SOCK_STREAM, 0);
+  status = connect (sock, (struct sockaddr *) &Address, sizeof (Address));
+  if (status < 0) {
+    fprintf (stderr, "unsuccessful connection: %d\n", status);
+    exit (0);
+  }
+
+  // the server uses an unblocked socket
+  fcntl (sock, F_SETFL, O_NONBLOCK);  
+  unlink (sockpath);
+  return (sock);
+}
