From 79d64f400391ce81b4eda73977cb40099256b348 Mon Sep 17 00:00:00 2001
From: William Joye <wjoye@cfa.harvard.edu>
Date: Thu, 26 Oct 2017 12:44:17 -0400
Subject: upgrade XPA

---
 xpa/.gitignore                           |   20 -
 xpa/BUGS                                 |   39 -
 xpa/INSTALL                              |  323 --
 xpa/LICENSE                              |   21 -
 xpa/Makefile.in                          |  558 --
 xpa/README                               |   43 -
 xpa/acl.c                                |  568 --
 xpa/aclocal.m4                           |    1 -
 xpa/client.c                             | 3057 ----------
 xpa/clipboard.c                          |  324 --
 xpa/command.c                            | 1217 ----
 xpa/conf.h.in                            |   96 -
 xpa/config.guess                         | 1495 -----
 xpa/config.sub                           | 1609 ------
 xpa/configure                            | 9061 ------------------------------
 xpa/configure.ac                         |  217 -
 xpa/copyright                            |   30 -
 xpa/ctest.c                              |  684 ---
 xpa/dns.c                                |   48 -
 xpa/doc/Makefile                         |   51 -
 xpa/doc/acl.html                         |  137 -
 xpa/doc/changelog.html                   |  806 ---
 xpa/doc/changes.html                     |   69 -
 xpa/doc/client.html                      |  898 ---
 xpa/doc/convert.html                     |  146 -
 xpa/doc/env.html                         |  371 --
 xpa/doc/examples.html                    |   64 -
 xpa/doc/help.html                        |  162 -
 xpa/doc/html2man                         |  258 -
 xpa/doc/html2ps.dbg                      |   94 -
 xpa/doc/inet.html                        |  260 -
 xpa/doc/info.html                        |  193 -
 xpa/doc/intro.html                       |  148 -
 xpa/doc/method.html                      |   90 -
 xpa/doc/name.html                        |   48 -
 xpa/doc/oom.html                         |   52 -
 xpa/doc/pod/xpa.pod                      |  399 --
 xpa/doc/pod/xpaaccess.pod                |  102 -
 xpa/doc/pod/xpaacl.pod                   |  145 -
 xpa/doc/pod/xpaatexit.pod                |   41 -
 xpa/doc/pod/xpachanges.pod               |  102 -
 xpa/doc/pod/xpacleanup.pod               |   47 -
 xpa/doc/pod/xpaclient.pod                |   95 -
 xpa/doc/pod/xpaclose.pod                 |   53 -
 xpa/doc/pod/xpacmdadd.pod                |   69 -
 xpa/doc/pod/xpacmddel.pod                |   43 -
 xpa/doc/pod/xpacmdnew.pod                |   90 -
 xpa/doc/pod/xpacode.pod                  |   73 -
 xpa/doc/pod/xpacommon.pod                |  266 -
 xpa/doc/pod/xpaconvert.pod               |  202 -
 xpa/doc/pod/xpaenv.pod                   |  517 --
 xpa/doc/pod/xpafree.pod                  |   49 -
 xpa/doc/pod/xpaget.pod                   |   67 -
 xpa/doc/pod/xpagetfd.pod                 |  133 -
 xpa/doc/pod/xpainet.pod                  |  285 -
 xpa/doc/pod/xpainfo.pod                  |   66 -
 xpa/doc/pod/xpainfonew.pod               |   92 -
 xpa/doc/pod/xpaintro.pod                 |  176 -
 xpa/doc/pod/xpamacros.pod                |   76 -
 xpa/doc/pod/xpamainloop.pod              |  108 -
 xpa/doc/pod/xpamb.pod                    |  249 -
 xpa/doc/pod/xpamethod.pod                |   99 -
 xpa/doc/pod/xpaname.pod                  |   56 -
 xpa/doc/pod/xpanew.pod                   |  243 -
 xpa/doc/pod/xpans.pod                    |  226 -
 xpa/doc/pod/xpanslookup.pod              |  126 -
 xpa/doc/pod/xpaoom.pod                   |   60 -
 xpa/doc/pod/xpaopen.pod                  |   69 -
 xpa/doc/pod/xpapoll.pod                  |   58 -
 xpa/doc/pod/xparace.pod                  |   89 -
 xpa/doc/pod/xpaserver.pod                |   96 -
 xpa/doc/pod/xpaset.pod                   |  115 -
 xpa/doc/pod/xpasetfd.pod                 |  113 -
 xpa/doc/pod/xpatcl.pod                   |  258 -
 xpa/doc/pod/xpatemplate.pod              |  120 -
 xpa/doc/pod/xpausers.pod                 |   76 -
 xpa/doc/pod/xpaxt.pod                    |   56 -
 xpa/doc/programs.html                    |  274 -
 xpa/doc/server.html                      |  833 ---
 xpa/doc/sman/xpa4.index                  |  Bin 535300 -> 0 bytes
 xpa/doc/sman/xpa4.index.prop             |  Bin 64856 -> 0 bytes
 xpa/doc/sman/xpa4.index.version          |    2 -
 xpa/doc/sman/xpa8.index                  |  Bin 950827 -> 0 bytes
 xpa/doc/sman/xpa8.index.prop             |  Bin 65041 -> 0 bytes
 xpa/doc/sman/xpa8.index.version          |    2 -
 xpa/doc/sman_conf.tmpl                   |   96 -
 xpa/doc/szlong.c                         |    8 -
 xpa/doc/tcl.html                         |  249 -
 xpa/doc/template.html                    |  112 -
 xpa/doc/users.html                       |   67 -
 xpa/doc/xpa.pdf                          |  Bin 215507 -> 0 bytes
 xpa/doc/xpa.ps                           | 5294 -----------------
 xpa/doc/xpamb.html                       |  197 -
 xpa/doc/xpans.html                       |  212 -
 xpa/doc/xt.html                          |   47 -
 xpa/find.c                               |  456 --
 xpa/find.h                               |   40 -
 xpa/gtkloop.c                            |  190 -
 xpa/install-sh                           |  276 -
 xpa/man/man1/xpaaccess.1                 |  198 -
 xpa/man/man1/xpachanges.1                |  180 -
 xpa/man/man1/xpaget.1                    |  164 -
 xpa/man/man1/xpainfo.1                   |  163 -
 xpa/man/man1/xpamb.1                     |  325 --
 xpa/man/man1/xpans.1                     |  331 --
 xpa/man/man1/xpaset.1                    |  217 -
 xpa/man/man3/xpaaccess.3                 |  233 -
 xpa/man/man3/xpaatexit.3                 |  149 -
 xpa/man/man3/xpacleanup.3                |  151 -
 xpa/man/man3/xpaclient.3                 |  206 -
 xpa/man/man3/xpaclose.3                  |  157 -
 xpa/man/man3/xpacmdadd.3                 |  174 -
 xpa/man/man3/xpacmddel.3                 |  147 -
 xpa/man/man3/xpacmdnew.3                 |  196 -
 xpa/man/man3/xpafree.3                   |  153 -
 xpa/man/man3/xpaget.3                    |  244 -
 xpa/man/man3/xpagetfd.3                  |  235 -
 xpa/man/man3/xpainfo.3                   |  213 -
 xpa/man/man3/xpainfonew.3                |  195 -
 xpa/man/man3/xpamacros.3                 |  180 -
 xpa/man/man3/xpamainloop.3               |  214 -
 xpa/man/man3/xpanew.3                    |  344 --
 xpa/man/man3/xpanslookup.3               |  232 -
 xpa/man/man3/xpaopen.3                   |  172 -
 xpa/man/man3/xpapoll.3                   |  163 -
 xpa/man/man3/xparace.3                   |  191 -
 xpa/man/man3/xpaserver.3                 |  205 -
 xpa/man/man3/xpaset.3                    |  236 -
 xpa/man/man3/xpasetfd.3                  |  214 -
 xpa/man/mann/xpa.n                       |  318 --
 xpa/man/mann/xpaacl.n                    |  251 -
 xpa/man/mann/xpacode.n                   |  181 -
 xpa/man/mann/xpacommon.n                 |  302 -
 xpa/man/mann/xpaconvert.n                |  267 -
 xpa/man/mann/xpaenv.n                    |  482 --
 xpa/man/mann/xpainet.n                   |  396 --
 xpa/man/mann/xpaintro.n                  |  250 -
 xpa/man/mann/xpamethod.n                 |  200 -
 xpa/man/mann/xpaname.n                   |  158 -
 xpa/man/mann/xpaoom.n                    |  166 -
 xpa/man/mann/xpatcl.n                    |  362 --
 xpa/man/mann/xpatemplate.n               |  232 -
 xpa/man/mann/xpausers.n                  |  186 -
 xpa/man/mann/xpaxt.n                     |  161 -
 xpa/mklib                                |  880 ---
 xpa/notes/osx.note                       |   38 -
 xpa/notes/winport.note                   |   81 -
 xpa/pkgIndex.tcl                         |   11 -
 xpa/port.c                               |  345 --
 xpa/prsetup.h                            |   58 -
 xpa/python/PythonXPA/README              |   25 -
 xpa/python/PythonXPA/client/XPAClient.py |   98 -
 xpa/python/PythonXPA/client/test_XPAC.py |  104 -
 xpa/python/PythonXPA/server/XPAServer.py |  125 -
 xpa/python/PythonXPA/server/test_XPAS.py |   91 -
 xpa/remote.c                             |  280 -
 xpa/rtest.c                              |  222 -
 xpa/saoconfig                            |  180 -
 xpa/stest.c                              |  729 ---
 xpa/tcl.c                                | 2773 ---------
 xpa/tcl.m4                               | 2464 --------
 xpa/tclloop.c                            |  391 --
 xpa/tcp.c                                |  223 -
 xpa/tcp.h                                |   24 -
 xpa/test.tcl                             |  261 -
 xpa/timedconn.c                          |  258 -
 xpa/timedconn.h                          |   24 -
 xpa/word.c                               | 1097 ----
 xpa/word.h                               |   59 -
 xpa/xalloc.c                             |  117 -
 xpa/xalloc.h                             |   51 -
 xpa/xlaunch.c                            |  657 ---
 xpa/xlaunch.h                            |   87 -
 xpa/xpa.c                                | 4712 ----------------
 xpa/xpa.h                                |  556 --
 xpa/xpa.pc.in                            |   10 -
 xpa/xpaaccess.c                          |  212 -
 xpa/xpaget.c                             |  225 -
 xpa/xpainfo.c                            |  219 -
 xpa/xpaio.c                              |  989 ----
 xpa/xpamb.c                              |  615 --
 xpa/xpans.c                              | 1935 -------
 xpa/xpap.h                               |  236 -
 xpa/xpaset.c                             |  239 -
 xpa/xpatests                             |   67 -
 xpa/xport.h                              |  142 -
 xpa/xtloop.c                             |  261 -
 187 files changed, 69283 deletions(-)
 delete mode 100644 xpa/.gitignore
 delete mode 100644 xpa/BUGS
 delete mode 100644 xpa/INSTALL
 delete mode 100644 xpa/LICENSE
 delete mode 100644 xpa/Makefile.in
 delete mode 100644 xpa/README
 delete mode 100644 xpa/acl.c
 delete mode 100644 xpa/aclocal.m4
 delete mode 100644 xpa/client.c
 delete mode 100644 xpa/clipboard.c
 delete mode 100644 xpa/command.c
 delete mode 100644 xpa/conf.h.in
 delete mode 100755 xpa/config.guess
 delete mode 100755 xpa/config.sub
 delete mode 100755 xpa/configure
 delete mode 100644 xpa/configure.ac
 delete mode 100644 xpa/copyright
 delete mode 100644 xpa/ctest.c
 delete mode 100644 xpa/dns.c
 delete mode 100644 xpa/doc/Makefile
 delete mode 100644 xpa/doc/acl.html
 delete mode 100644 xpa/doc/changelog.html
 delete mode 100644 xpa/doc/changes.html
 delete mode 100644 xpa/doc/client.html
 delete mode 100644 xpa/doc/convert.html
 delete mode 100644 xpa/doc/env.html
 delete mode 100644 xpa/doc/examples.html
 delete mode 100644 xpa/doc/help.html
 delete mode 100755 xpa/doc/html2man
 delete mode 100644 xpa/doc/html2ps.dbg
 delete mode 100644 xpa/doc/inet.html
 delete mode 100644 xpa/doc/info.html
 delete mode 100644 xpa/doc/intro.html
 delete mode 100644 xpa/doc/method.html
 delete mode 100644 xpa/doc/name.html
 delete mode 100644 xpa/doc/oom.html
 delete mode 100644 xpa/doc/pod/xpa.pod
 delete mode 100644 xpa/doc/pod/xpaaccess.pod
 delete mode 100644 xpa/doc/pod/xpaacl.pod
 delete mode 100644 xpa/doc/pod/xpaatexit.pod
 delete mode 100644 xpa/doc/pod/xpachanges.pod
 delete mode 100644 xpa/doc/pod/xpacleanup.pod
 delete mode 100644 xpa/doc/pod/xpaclient.pod
 delete mode 100644 xpa/doc/pod/xpaclose.pod
 delete mode 100644 xpa/doc/pod/xpacmdadd.pod
 delete mode 100644 xpa/doc/pod/xpacmddel.pod
 delete mode 100644 xpa/doc/pod/xpacmdnew.pod
 delete mode 100644 xpa/doc/pod/xpacode.pod
 delete mode 100644 xpa/doc/pod/xpacommon.pod
 delete mode 100644 xpa/doc/pod/xpaconvert.pod
 delete mode 100644 xpa/doc/pod/xpaenv.pod
 delete mode 100644 xpa/doc/pod/xpafree.pod
 delete mode 100644 xpa/doc/pod/xpaget.pod
 delete mode 100644 xpa/doc/pod/xpagetfd.pod
 delete mode 100644 xpa/doc/pod/xpainet.pod
 delete mode 100644 xpa/doc/pod/xpainfo.pod
 delete mode 100644 xpa/doc/pod/xpainfonew.pod
 delete mode 100644 xpa/doc/pod/xpaintro.pod
 delete mode 100644 xpa/doc/pod/xpamacros.pod
 delete mode 100644 xpa/doc/pod/xpamainloop.pod
 delete mode 100644 xpa/doc/pod/xpamb.pod
 delete mode 100644 xpa/doc/pod/xpamethod.pod
 delete mode 100644 xpa/doc/pod/xpaname.pod
 delete mode 100644 xpa/doc/pod/xpanew.pod
 delete mode 100644 xpa/doc/pod/xpans.pod
 delete mode 100644 xpa/doc/pod/xpanslookup.pod
 delete mode 100644 xpa/doc/pod/xpaoom.pod
 delete mode 100644 xpa/doc/pod/xpaopen.pod
 delete mode 100644 xpa/doc/pod/xpapoll.pod
 delete mode 100644 xpa/doc/pod/xparace.pod
 delete mode 100644 xpa/doc/pod/xpaserver.pod
 delete mode 100644 xpa/doc/pod/xpaset.pod
 delete mode 100644 xpa/doc/pod/xpasetfd.pod
 delete mode 100644 xpa/doc/pod/xpatcl.pod
 delete mode 100644 xpa/doc/pod/xpatemplate.pod
 delete mode 100644 xpa/doc/pod/xpausers.pod
 delete mode 100644 xpa/doc/pod/xpaxt.pod
 delete mode 100644 xpa/doc/programs.html
 delete mode 100644 xpa/doc/server.html
 delete mode 100644 xpa/doc/sman/xpa4.index
 delete mode 100644 xpa/doc/sman/xpa4.index.prop
 delete mode 100644 xpa/doc/sman/xpa4.index.version
 delete mode 100644 xpa/doc/sman/xpa8.index
 delete mode 100644 xpa/doc/sman/xpa8.index.prop
 delete mode 100644 xpa/doc/sman/xpa8.index.version
 delete mode 100644 xpa/doc/sman_conf.tmpl
 delete mode 100644 xpa/doc/szlong.c
 delete mode 100644 xpa/doc/tcl.html
 delete mode 100644 xpa/doc/template.html
 delete mode 100644 xpa/doc/users.html
 delete mode 100644 xpa/doc/xpa.pdf
 delete mode 100644 xpa/doc/xpa.ps
 delete mode 100644 xpa/doc/xpamb.html
 delete mode 100644 xpa/doc/xpans.html
 delete mode 100644 xpa/doc/xt.html
 delete mode 100644 xpa/find.c
 delete mode 100644 xpa/find.h
 delete mode 100644 xpa/gtkloop.c
 delete mode 100755 xpa/install-sh
 delete mode 100644 xpa/man/man1/xpaaccess.1
 delete mode 100644 xpa/man/man1/xpachanges.1
 delete mode 100644 xpa/man/man1/xpaget.1
 delete mode 100644 xpa/man/man1/xpainfo.1
 delete mode 100644 xpa/man/man1/xpamb.1
 delete mode 100644 xpa/man/man1/xpans.1
 delete mode 100644 xpa/man/man1/xpaset.1
 delete mode 100644 xpa/man/man3/xpaaccess.3
 delete mode 100644 xpa/man/man3/xpaatexit.3
 delete mode 100644 xpa/man/man3/xpacleanup.3
 delete mode 100644 xpa/man/man3/xpaclient.3
 delete mode 100644 xpa/man/man3/xpaclose.3
 delete mode 100644 xpa/man/man3/xpacmdadd.3
 delete mode 100644 xpa/man/man3/xpacmddel.3
 delete mode 100644 xpa/man/man3/xpacmdnew.3
 delete mode 100644 xpa/man/man3/xpafree.3
 delete mode 100644 xpa/man/man3/xpaget.3
 delete mode 100644 xpa/man/man3/xpagetfd.3
 delete mode 100644 xpa/man/man3/xpainfo.3
 delete mode 100644 xpa/man/man3/xpainfonew.3
 delete mode 100644 xpa/man/man3/xpamacros.3
 delete mode 100644 xpa/man/man3/xpamainloop.3
 delete mode 100644 xpa/man/man3/xpanew.3
 delete mode 100644 xpa/man/man3/xpanslookup.3
 delete mode 100644 xpa/man/man3/xpaopen.3
 delete mode 100644 xpa/man/man3/xpapoll.3
 delete mode 100644 xpa/man/man3/xparace.3
 delete mode 100644 xpa/man/man3/xpaserver.3
 delete mode 100644 xpa/man/man3/xpaset.3
 delete mode 100644 xpa/man/man3/xpasetfd.3
 delete mode 100644 xpa/man/mann/xpa.n
 delete mode 100644 xpa/man/mann/xpaacl.n
 delete mode 100644 xpa/man/mann/xpacode.n
 delete mode 100644 xpa/man/mann/xpacommon.n
 delete mode 100644 xpa/man/mann/xpaconvert.n
 delete mode 100644 xpa/man/mann/xpaenv.n
 delete mode 100644 xpa/man/mann/xpainet.n
 delete mode 100644 xpa/man/mann/xpaintro.n
 delete mode 100644 xpa/man/mann/xpamethod.n
 delete mode 100644 xpa/man/mann/xpaname.n
 delete mode 100644 xpa/man/mann/xpaoom.n
 delete mode 100644 xpa/man/mann/xpatcl.n
 delete mode 100644 xpa/man/mann/xpatemplate.n
 delete mode 100644 xpa/man/mann/xpausers.n
 delete mode 100644 xpa/man/mann/xpaxt.n
 delete mode 100755 xpa/mklib
 delete mode 100644 xpa/notes/osx.note
 delete mode 100644 xpa/notes/winport.note
 delete mode 100644 xpa/pkgIndex.tcl
 delete mode 100644 xpa/port.c
 delete mode 100644 xpa/prsetup.h
 delete mode 100644 xpa/python/PythonXPA/README
 delete mode 100644 xpa/python/PythonXPA/client/XPAClient.py
 delete mode 100755 xpa/python/PythonXPA/client/test_XPAC.py
 delete mode 100644 xpa/python/PythonXPA/server/XPAServer.py
 delete mode 100755 xpa/python/PythonXPA/server/test_XPAS.py
 delete mode 100644 xpa/remote.c
 delete mode 100644 xpa/rtest.c
 delete mode 100755 xpa/saoconfig
 delete mode 100644 xpa/stest.c
 delete mode 100644 xpa/tcl.c
 delete mode 100644 xpa/tcl.m4
 delete mode 100644 xpa/tclloop.c
 delete mode 100644 xpa/tcp.c
 delete mode 100644 xpa/tcp.h
 delete mode 100644 xpa/test.tcl
 delete mode 100644 xpa/timedconn.c
 delete mode 100644 xpa/timedconn.h
 delete mode 100644 xpa/word.c
 delete mode 100644 xpa/word.h
 delete mode 100644 xpa/xalloc.c
 delete mode 100644 xpa/xalloc.h
 delete mode 100644 xpa/xlaunch.c
 delete mode 100644 xpa/xlaunch.h
 delete mode 100644 xpa/xpa.c
 delete mode 100644 xpa/xpa.h
 delete mode 100644 xpa/xpa.pc.in
 delete mode 100644 xpa/xpaaccess.c
 delete mode 100644 xpa/xpaget.c
 delete mode 100644 xpa/xpainfo.c
 delete mode 100644 xpa/xpaio.c
 delete mode 100644 xpa/xpamb.c
 delete mode 100644 xpa/xpans.c
 delete mode 100644 xpa/xpap.h
 delete mode 100644 xpa/xpaset.c
 delete mode 100755 xpa/xpatests
 delete mode 100644 xpa/xport.h
 delete mode 100644 xpa/xtloop.c

diff --git a/xpa/.gitignore b/xpa/.gitignore
deleted file mode 100644
index aa5260e..0000000
--- a/xpa/.gitignore
+++ /dev/null
@@ -1,20 +0,0 @@
-*.[oa]
-*~
-*.so
-*.bak
-foo*
-Makefile
-a.out.dSYM/
-autom4te.cache/
-oxpa.h
-xpa.pc
-xpaaccess
-xpaget
-xpainfo
-xpamb
-xpans
-xpaset
-conf.h
-config.status
-config.cache
-config.log
diff --git a/xpa/BUGS b/xpa/BUGS
deleted file mode 100644
index 24b2a08..0000000
--- a/xpa/BUGS
+++ /dev/null
@@ -1,39 +0,0 @@
-using xpans as proxy for xpaset/xpaget (as in chandra-ed):
-
-Currently, when xpans is used as a proxy connection, an xpaset or
-xpaget command will return without waiting for the remote callback to
-complete. This is because xpans sets the mode of XPASetFd()/XPAGetFd()
-to "dofork=true", to ensure that the XPAClientLoopFork() in client.c
-is used. That routine does not wait for the callback to complete. Instead 
-it forks the callback and then "fakes" the completion. Using the forked
-loop and returning immediately prevents xpans from hanging during a long
-xpaget/xpaset callback.
-
-But starting with ds9 7.0, this causes problems: two successive xpaset calls
-which both process regions will hang the connection to ds9. For example,
-in chandra-ed's zhds9 script, a new region is generated by refinepos,
-then the old region is deleted and the new region is sent to ds9 for
-display:
-
-        # refinepos creates a new region ...
-        ${XPASET:-xpaset} -p $XPA regions deleteall
-        ${XPASET:-xpaset} $XPA regions < $OFILE
-
-This will hang the xpans connection to ds9, starting with ds9 7.0. Bill reports
-that the region parsing got slightly slower with 7.0 because he is creating
-a C++ object to pass to the lexer. Somehow that causes a race condition?
-
-To get around the problem, a delay is needed between the calls:
-
-        ${XPASET:-xpaset} -p $XPA regions deleteall
-	# this is needed to avoid a race condition, due to the fact that
-	# xpaset returns immediately when run via xpans proxy
-	sleep 1
-        ${XPASET:-xpaset} $XPA regions < $OFILE
-
-How can this be handled automatically? Ideally, one would like to
-fork() or create a thread at the "right" place in xpans to handle the
-xpaset/xpaget call so that it can wait for completion. But its unclear
-what that place is: the XPAHandler() is calling the send or receive
-callback and expects a status response, and how can fork() deal with that??
-
diff --git a/xpa/INSTALL b/xpa/INSTALL
deleted file mode 100644
index 5c50ba5..0000000
--- a/xpa/INSTALL
+++ /dev/null
@@ -1,323 +0,0 @@
-Quick Summary
-=============
-
-To build and install the XPA package, simply execute:
-
-	./configure		# site-specific configuration
-	make			# build the software
-	make install		# install it
-	make clean		# clean up unneeded temp files
-
-We strongly recommend that you install in a directory other than the
-default of /usr/local, so as not to require root access. To do this,
-configure for a different install directory:
-
-	./configure --prefix=<top_level_install_dir>
-e.g.,
-	./configure --prefix=/soft/saord
-
-Programs will be installed in /soft/saord/bin, libraries in /soft/saord/lib,
-include files in /soft/saord/include, and man pages in /soft/saord/man.
-Indeed, we do this at SAO and recommend it as a general rule, in order
-to keep SAORD software in one place that does not conflict with other
-installations. Note that you will need to add the bin directory to
-your path and the man directory to MANPATH.
-
-The build ("make") takes only a minute or so on modern machines.  To
-monitor its progress and/or check for errors, redirect output to a file
-and use the 'tail' command:
-
-	make >& foo.log &; tail -f foo.log		# csh
-or
-	make 1>foo.log 2>&1 &; tail -f foo.log		# sh, bash
-
-
-Details of Installation
-=======================
-
-   NB: These are generic installation instructions, modified for XPA.
-
-   The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation.  It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions.  Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, a file
-`config.cache' that saves the results of its tests to speed up
-reconfiguring, and a file `config.log' containing compiler output
-(useful mainly for debugging `configure').
-
-   If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release.  If at some point `config.cache'
-contains results you don't want to keep, you may remove or edit it.
-
-   The file `configure.in' is used to create `configure' by a program
-called `autoconf'.  You only need `configure.in' if you want to change
-it or regenerate `configure' using a newer version of `autoconf'.
-
-The simplest way to compile this package is:
-
-     `./configure' to configure the package for your system.  If you're
-     using `csh' on an old version of System V, you might need to type
-     `sh ./configure' instead to prevent `csh' from trying to execute
-     `configure' itself.
-
-     Running `configure' takes awhile.  While running, it prints some
-     messages telling which features it is checking for.
-
-  1. `cd' to the directory containing the package's source code and type
-    "./configure".  This runs a configuration script created by GNU
-    autoconf, which configures XPA for your system and creates a
-    Makefile.  The configure script allows you to customize the XPA
-    configuration for your site; for details on how you can do this,
-    type "./configure -help" or refer to the autoconf documentation (not
-    included here). The XPA "configure" script supports the following special
-    switch(es) in addition to the standard ones:
-
-        --enable-shared=yes|link
-
-				Build shared libraries in addition to the
-				default static library. There are two options:
-
-				If the value is "yes", shared libraries are
-				built but not used to link xpa programs.
-
-				If the value is "link", shared libraries are
-				used to link xpa programs. If therefore becomes
-				your responsibility to put the shared library
-				where it can be found (or use LD_LIBRARY_PATH).
-
-        --enable-threaded-xpans
-				Build xpans to support separate threads for
-				handling name server requests and xpa proxy
-				callbacks. This is recommended if you are going
-				to enable proxy handling in xpans (-P), since
-				XPA long callbacks via proxy can interfere
-				with the name server functions. (You still have
-				to start xpans with -P 2 to use 2 threads.)
-
-	--with-tcl=<dir>	
-				Force build Tcl support using parameters found
-				in <dir>/tclConfig.sh. Configure will look for
-				the Tcl config script in standard places and
-				will enable Tcl support if found. It will abort
-				if tclConfig.sh points to a non-existent tcl.h
-				file (some versions of Linux have shown this
-				behavior). Use this switch to override the
-				standard locations or to force a build even
-				if tcl.h is not found (e.g. if you are going to
-				install tcl as part of a larger build). With
-				Tcl support enabled you can execute:
-
-					make tclxpa
-
-				to generate the XPA package as a shared Tcl
-				object, loadable using Tcl "package require".
-				Contact us with problems -- its been a bear to
-				get this even half-way right.
-
-	--with-threads
-				If you are going to link XPA into a threaded
-				program, you need to specify --with-threads.
-				This add -D_REENTRANT to the compiler flags,
-				which tells gcc to use thread-safe versions of
-				global system variables such as errno. No code
-				changes are made to XPA. Please note that all 
-				XPA calls must be in a single thread: XPA is
-				not thread-safe in and of itself but does work
-				in threaded programs.
-
-	--with-gtk=<include_dir>	
-				Build with support for adding xpa to a gtk
-				loop. The specified include directory must 
-				contain the gtk directory which itself contains
-				gtk.h, e.g.:
-
-				    --with-gtk=/usr/local/include/gtk-1.2
-
-				which contains gtk/gtk.h
-
-    Standard options are listed below. the most important of which
-    are --exec-prefix and --prefix (to specify where to install), and
-    --x-includes=DIR and --x-libraries=DIR (for non-standard X installations).
-    We recommend --prefix be set to a directory that will hold saord software
-    (e.g., --prefix=/soft/saord) in order to make management of our software
-    easier.
-
-    NB: be sure to use only absolute path names (those starting with "/")
-    in the --prefix and --exec_prefix options. (The configure options we
-    use at SAO for various machines are given as examples in the script
-    file called "saoconfig" in this directory.)
-
-  2. Type `make' to compile the package.
-     This will create a library archive called libxpa.a. It also will create
-     the programs xpaget, xpaset, xpainfo, xpaaccess, xpans, and xpamb. It
-     also will create the libxpa.so shared object if requested using the
-     --enable-shared switch
-
-  3. You can build the libxpa.so shared library manually by executing:
-
-	make shlib
-
-     at this point. This will not contain Xt or Tcl routines. If Tcl support
-     has been enabled (see --with-tcl above), you can build a shared library
-     called libtclxpa.so that supports the tclxpa package (i.e. Tcl routines
-     are contained in it) by executing:
-
-	make tclxpa
-
-     This shared library will be loaded automatically with the Tcl command:
-
-        package require tclxpa 2.1
-
-     assuming, of course, that your shared library can be found by Tcl.
-
-  4. Type "make install" to install XPA's libraries and binaries in
-     standard places.  You'll need write permission on the installation
-     directories to do this.  The installation directories are
-     determined by the "configure" script and may be specified with
-     the --prefix and --exec_prefix options to "configure".  See the
-     Makefile for information on what directories were chosen; you
-     can override these choices by modifying the "prefix" and
-     "exec_prefix" variables in the Makefile.
-
-  5. There are .html help files in the doc directory. You can copy
-     these files to a more convenient location, if you like. We
-     did not automate this step because we did not know where to
-     copy these files by default. (NB: The help.html file is the
-     top level index file.)
-
-  6. You can remove the program binaries and object files from the
-     source code directory by typing `make clean'.  To also remove the
-     files that `configure' created (so you can compile the package for
-     a different kind of computer), type `make distclean'.  There is
-     also a `make maintainer-clean' target, but that is intended mainly
-     for the package's developers.  If you use it, you may have to get
-     all sorts of other programs in order to regenerate files that came
-     with the distribution.
-
-Compilers and Options
-=====================
-
-   Some systems require unusual options for compilation or linking that
-the `configure' script does not know about.  You can give `configure'
-initial values for variables by setting them in the environment:
-
-     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix 
-
-You also can use this facility to specify a compiler other than the default
-gcc (if it exists).
-
-Installation Names
-==================
-
-   By default, `make install' will install the package's files in
-`/usr/local/bin', `/usr/local/lib', etc.  You can specify an
-installation prefix other than `/usr/local' by giving `configure' the
-option `--prefix=PATH':
-
-e.g.,
-	./configure --prefix=/soft/saord
-
-Programs will be installed in /soft/saord/bin, libraries in /soft/saord/lib,
-and include files in /soft/saord/include. We recommend this as a general rule,
-in order to keep SAORD software in one place that does not conflict with other
-installations. Note that you will need to add the bin directory to your path.
-
-   You can specify separate installation prefixes for architecture-specific
-files and architecture-independent files.  If you give `configure' the option
-`--exec-prefix=PATH', the package will use PATH as the prefix for installing
-programs and libraries. Documentation and other data files will still use the
-regular prefix.
-
-   In addition, if you use an unusual directory layout you can give
-options like `--bindir=PATH' to specify different values for particular
-kinds of files.  Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.
-
-   If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-Optional Features
-=================
-
-   Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System).  The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
-   For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
-Specifying the System Type
-==========================
-
-   There may be some features `configure' can not figure out
-automatically, but needs to determine by the type of host the package
-will run on.  Usually `configure' can figure that out, but if it prints
-a message saying it can not guess the host type, give it the
-`--host=TYPE' option.  TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name with three fields:
-     CPU-COMPANY-SYSTEM
-
-See the file `config.sub' for the possible values of each field.  If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the host type.
-
-   If you are building compiler tools for cross-compiling, you can also
-use the `--target=TYPE' option to select the type of system they will
-produce code for and the `--build=TYPE' option to select the type of
-system on which you are compiling the package.
-
-Sharing Defaults
-================
-
-   If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists.  Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Operation Controls
-==================
-
-   `configure' recognizes the following options to control how it
-operates.
-
-`--cache-file=FILE'
-     Use and save the results of the tests in FILE instead of
-     `./config.cache'.  Set FILE to `/dev/null' to disable caching, for
-     debugging `configure'.
-
-`--help'
-     Print a summary of the options to `configure', and exit.
-
-`--quiet'
-`--silent'
-`-q'
-     Do not print messages saying which checks are being made.  To
-     suppress all normal output, redirect it to `/dev/null' (any error
-     messages will still be shown).
-
-`--srcdir=DIR'
-     Look for the package's source code in directory DIR.  Usually
-     `configure' can determine that directory automatically.
-
-`--version'
-     Print the version of Autoconf used to generate the `configure'
-     script, and exit.
-
-`configure' also accepts some other, not widely useful, options.
-
-If you have questions, please contact us at: saord@cfa.harvard.edu.
-
-							Eric Mandel
diff --git a/xpa/LICENSE b/xpa/LICENSE
deleted file mode 100644
index a9c1e78..0000000
--- a/xpa/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-XPA is distributed under the terms of The MIT License (MIT), reproduced below.
-
-Copyright (c) 2014-2016 Smithsonian Institution
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/xpa/Makefile.in b/xpa/Makefile.in
deleted file mode 100644
index 79c5fd9..0000000
--- a/xpa/Makefile.in
+++ /dev/null
@@ -1,558 +0,0 @@
-#
-# This file is a Makefile for XPA.  If it has the name "Makefile.in"
-# then it is a template for a Makefile;  to generate the actual Makefile,
-# run "./configure", which is a configuration script generated by the
-# "autoconf" program (constructs like "@foo@" will get replaced in the
-# actual Makefile.
-#
-
-PACKAGE = @PACKAGE_NAME@
-VERSION = @PACKAGE_VERSION@
-
-DISTNAME = xpa-${VERSION}
-DISTDIR = ../export/${DISTNAME}
-FTPDIR	= ../ftp
-
-#----------------------------------------------------------------
-# Things you can change to personalize the Makefile for your own
-# site (you can make these changes in either Makefile.in or
-# Makefile, but changes to Makefile will get lost if you re-run
-# the configuration script).
-#----------------------------------------------------------------
-
-# Default top-level directories in which to install architecture-
-# specific files (exec_prefix) and machine-independent files such
-# as scripts (prefix).  The values specified here may be overridden
-# at configure-time with the --exec-prefix and --prefix options
-# to the "configure" script.
-
-prefix =		@prefix@
-exec_prefix =		@exec_prefix@
-
-# The following definition can be set to non-null for special systems
-# like AFS with replication.  It allows the pathnames used for installation
-# to be different than those used for actually reference files at
-# run-time.  INSTALL_ROOT is prepended to $prefix and $exec_prefix
-# when installing files.
-INSTALL_ROOT =
-
-# Directory in which to install the .a or .so binary for the XPA library:
-LIB_INSTALL_DIR =	$(INSTALL_ROOT)$(exec_prefix)/lib
-
-# Directory in which to install the program wish:
-BIN_INSTALL_DIR =	$(INSTALL_ROOT)$(exec_prefix)/bin
-
-# Directory in which to install the include file xpa.h:
-INCLUDE_INSTALL_DIR =	$(INSTALL_ROOT)$(prefix)/include
-
-# Top-level directory for manual entries:
-MAN_INSTALL_DIR =	$(INSTALL_ROOT)$(prefix)/man
-
-# Top-level directory for share entries:
-MAN_SHARE_DIR =		$(INSTALL_ROOT)$(prefix)/share/xpa
-
-# Platform-specific X compiler flags (include file specifications)
-X_CFLAGS = 		@X_CFLAGS@
-# Platform-specific link directive for X libraries (-L specification)
-X_LIBS = 		@X_LIBS@
-# Platform-specific libraries that must go before -lXt
-X_PRE_LIBS = 		@X_PRE_LIBS@
-# Platform-specific libraries that must go after -lXt
-X_EXTRA_LIBS = 		@X_EXTRA_LIBS@
-
-# Platform-specific include files for Tcl
-TCL_CFLAGS = 		@TCL_CFLAGS@
-# Platform-specific libraries for Tcl
-TCL_LIBS = 		@TCL_LIBS@
-
-# Platform-specific include files for Gtk
-GTK_CFLAGS = 		@GTK_CFLAGS@
-# Platform-specific libraries for Gtk
-GTK_LIBS = 		@GTK_LIBS@
-
-# combine package cflags
-PKG_CFLAGS =	$(X_CFLAGS) $(TCL_CFLAGS) $(GTK_CFLAGS)
-
-# extra Libs required to link (e.g. socket libraries)
-LIBS =			@EXTRA_LIBS@
-
-# pthread lib needed to xpans
-TLIB =			@TLIB@
-
-# To change the compiler switches, for example to change from -O
-# to -g, change the following line:
-CFLAGS = 		@CFLAGS@
-
-# To add ld switches, change the following line:
-LDFLAGS =		@LDFLAGS@
-
-# Some versions of make, like SGI's, use the following variable to
-# determine which shell to use for executing commands:
-SHELL =			/bin/sh
-
-# if enabled-shared was specified, this will exand to "shlib" and trigger
-# building of the shared library
-DOSHARED =	@DOSHARED@
-
-# There are just too many different versions of "install" around;
-# better to use the install-sh script that comes with the distribution,
-# which is slower but guaranteed to work.
-
-INSTALL = 		@srcdir@/install-sh -c
-INSTALL_PROGRAM =	${INSTALL}
-INSTALL_DATA =		${INSTALL} -m 644
-
-#----------------------------------------------------------------
-# The information below is modified by the configure script when
-# Makefile is generated from Makefile.in.  You shouldn't normally
-# modify any of this stuff by hand.
-#----------------------------------------------------------------
-
-AC_FLAGS =		@DEFS@
-RANLIB =		@RANLIB@
-EXE =			@EXEEXT@
-
-#----------------------------------------------------------------
-# The information below should be usable as is.  The configure
-# script won't modify it and you shouldn't need to modify it
-# either.
-#----------------------------------------------------------------
-RM =		rm -f
-
-CC =		@CC@
-
-CC_SWITCHES =	-I. ${CFLAGS} ${AC_FLAGS}
-
-DEPEND_SWITCHES = -I. ${CFLAGS} ${PKG_CFLAGS} ${AC_FLAGS}
-
-SRCS =		xpa.c xpaio.c command.c acl.c remote.c clipboard.c port.c \
-		tcp.c client.c word.c xalloc.c find.c xlaunch.c timedconn.c \
-		tclloop.c tcl.c xtloop.c gtkloop.c \
-		xpaset.c xpaget.c xpainfo.c xpaaccess.c xpans.c xpamb.c
-
-BASE_OBJS =	xpa.o xpaio.o command.o acl.o remote.o clipboard.o port.o \
-		tcp.o client.o word.o xalloc.o find.o xlaunch.o timedconn.o
-
-TCL_OBJS =	tclloop.o tcl.o 
-
-XT_OBJS =	xtloop.o
-
-GTK_OBJS =	gtkloop.o
-
-INCL	=	xpa.h xpap.h
-
-# these are all the modules going into the "normal" xpa library
-LIBOBJS =	${BASE_OBJS} ${TCL_OBJS} ${XT_OBJS} ${GTK_OBJS}
-LIB =	libxpa.a
-
-# used in link line
-# LLIB=	$(LIB)
-LLIB=	@LLIB@
-
-PROGS =		xpaset xpaget xpainfo xpaaccess xpans xpamb
-
-TESTPROGS =	ctest stest rtest
-
-all:		xpa.h lib $(PROGS)
-
-testall:	$(TESTPROGS)
-
-All:		all testall
-
-install::	install-binaries 
-
-install::	$(DOSHARED)_install
-
-install::	install-man 
-
-install::	install-share
-
-install::	install-data
-
-lib:		$(LIB) $(DOSHARED)
-
-$(LIB):		$(LIBOBJS)
-		$(RM) $(LIB)
-		ar crv $(LIB) $(LIBOBJS)
-		$(RANLIB) $(LIB)
-
-shlib:		$(LIB)
-		@(rm -rf lib$(PACKAGE).tmp; mkdir lib$(PACKAGE).tmp; \
-		(cd lib$(PACKAGE).tmp && ar x ../lib$(PACKAGE).a); \
-		rm -f lib$(PACKAGE).tmp/xt*.o; \
-		rm -f lib$(PACKAGE).tmp/tcl*.o; \
-		CC='$(CC)' CXX=$(CXX) \
-		./mklib -o $(PACKAGE) lib$(PACKAGE).tmp/*.o; \
-		rm -rf lib$(PACKAGE).tmp)
-
-mingw-dll:	$(LIBOBJS)
-		$(CC)  -I. -DHAVE_CONFIG_H -shared port.c  tcp.c acl.c find.c \
-		remote.c timedconn.c client.c word.c xpaio.c clipboard.c \
-		xlaunch.c xalloc.c command.c xpa.c \
-		-Wl,--output-def,libxpa.def,--out-implib,libxpa_dll.a,-no-undefined,--enable-runtime-pseudo-reloc -o libxpa.dll \
-		-lwsock32
-
-tclxpa:		$(LIB)
-		@(rm -rf libtclxpa.tmp; mkdir libtclxpa.tmp; \
-		(cd libtclxpa.tmp && ar x ../lib$(PACKAGE).a); \
-		rm -f libtclxpa.tmp/xt*.o; \
-		CC='$(CC)' CXX=$(CXX) \
-		./mklib -o tclxpa libtclxpa.tmp/*.o $(TCL_LIBS); \
-		test -r libtclxpa.dylib && cp -p libtclxpa.dylib libtclxpa.so && echo "copying libtclxpa.dylib to libtclxpa.so"; \
-		rm -rf libtclxpa.tmp)
-
-diff:
-		-(for f in `ls *.c`;					\
-		    do							\
-			echo $$f;					\
-			diff /soft/saord/xpa-2.1.[0-9]*/$$f .;		\
-		    done);
-
-index:		$(LIB)
-		@(test -r pkgIndex.tcl && mv pkgIndex.tcl pkgIndex.tcl-old; \
-		echo "pkg_mkIndex -direct -verbose . libtclxpa.so; exit"| tclsh)
-
-xpaset:		$(LIB) xpaset.o
-		$(CC) $(LDFLAGS) xpaset.o -o xpaset $(LLIB) $(LIBS)
-
-xpaget:		$(LIB) xpaget.o
-		$(CC) $(LDFLAGS) xpaget.o -o xpaget $(LLIB) $(LIBS)
-
-xpainfo:	$(LIB) xpainfo.o
-		$(CC) $(LDFLAGS) xpainfo.o -o xpainfo $(LLIB) $(LIBS)
-
-xpaaccess:	$(LIB) xpaaccess.o
-		$(CC) $(LDFLAGS) xpaaccess.o -o xpaaccess $(LLIB) $(LIBS)
-
-xpans:		$(LIB) xpans.o
-		$(CC) $(LDFLAGS) xpans.o -o xpans $(LLIB) $(LIBS) $(TLIB)
-
-xpamb:		$(LIB) xpamb.o
-		$(CC) $(LDFLAGS) xpamb.o -o xpamb $(LLIB) $(LIBS)
-
-ctest:		$(LIB) ctest.o
-		$(CC) $(LDFLAGS) ctest.o -o ctest $(LLIB) $(LIBS)
-
-stest:		$(LIB) stest.o
-		$(CC) $(LDFLAGS) stest.o -o stest $(LIB) $(LIBS)
-
-rtest:		$(LIB) rtest.o
-		$(CC) $(LDFLAGS) rtest.o -o rtest $(LIB) $(LIBS)
-
-stestx:		$(LIB) stest.o
-		$(CC) $(LDFLAGS) stest.o -o stest $(LIB) \
-		$(X_LIBS) -lXt $(X_PRE_LIBS) -lXext -lX11 $(LIBS)
-
-# Smoke test: allows end-users to quickly discern basic usability
-smoke:  ctest stest
-	./stest smoke &
-	sleep 3
-	./ctest -e -b -l 1000 smoke
-	./xpaset -p smoke exit
-
-# Note: before running ranlib below, must cd to target directory because
-# some ranlibs write to current directory, and this might not always be
-# possible (e.g. if installing as root).
-
-# this nop-op gets executed if we are not building shared libraries
-_install:
-
-shlib_install:
-	@-(for i in `ls *.so* *.dylib *.sl 2>/dev/null` ; \
-	   do \
-	   if [ -h $$i ] ; then \
-		echo "Installing link $$i" ; \
-		tar cf - $$i | (cd $(LIB_INSTALL_DIR); tar xf -) ; \
-	   else \
-		echo "Installing $$i" ; \
-		$(INSTALL_DATA) $$i $(LIB_INSTALL_DIR)/$$i ; \
-		chmod 555 $(LIB_INSTALL_DIR)/$$i; \
-	   fi; \
-	   done;)
-
-install-binaries: $(LIB) $(PROGS)
-	@for i in $(LIB_INSTALL_DIR) $(INCLUDE_INSTALL_DIR) $(BIN_INSTALL_DIR) ; \
-	    do \
-	    if [ ! -d $$i ] ; then \
-		echo "Making directory $$i"; \
-		mkdir $$i; \
-		chmod 755 $$i; \
-		else true; \
-		fi; \
-	    done;
-	@echo "Installing $(LIB)";
-	@$(INSTALL_DATA) $(LIB) $(LIB_INSTALL_DIR)/$(LIB);
-	@(cd $(LIB_INSTALL_DIR); $(RANLIB) $(LIB));
-	@chmod 555 $(LIB_INSTALL_DIR)/$(LIB);
-	@echo "Installing xpa.h"
-	@$(INSTALL_DATA) xpa.h $(INCLUDE_INSTALL_DIR)/xpa.h
-	@echo "Installing prsetup.h"
-	@$(INSTALL_DATA) prsetup.h $(INCLUDE_INSTALL_DIR)/prsetup.h
-	@for i in $(PROGS) ; \
-	    do \
-	        echo "Installing $$i$(EXE)" ; \
-		$(INSTALL_PROGRAM) $$i$(EXE) $(BIN_INSTALL_DIR)/$$i$(EXE) ; \
-	    done;
-
-install-man:
-	@if [ ! -d $(MAN_INSTALL_DIR) ] ; then \
-	    echo "Making directory $(MAN_INSTALL_DIR)"; \
-	    mkdir $(MAN_INSTALL_DIR); \
-	    chmod 755 $(MAN_INSTALL_DIR); \
-	    else true; \
-	fi;
-	@-(for i in `ls ./man/man?/*.?` ; \
-	    do \
-		B=`basename $$i`; \
-		E=`echo $$i | awk -F. '{print $$NF}'`; \
-		M="$(MAN_INSTALL_DIR)/man$$E"; \
-		if [ ! -d $$M ] ; then \
-		    echo "Making directory $$M"; \
-		    mkdir $$M; \
-		    chmod 755 $$M; \
-		    else true; \
-		fi; \
-		echo "Installing $$B" ; \
-		$(INSTALL_DATA) $$i $$M/$$B; \
-	    done;)
-
-install-share:
-	@if [ ! -d $(MAN_SHARE_DIR) ] ; then \
-	    echo "Making directory $(MAN_SHARE_DIR)"; \
-	    mkdir -p $(MAN_SHARE_DIR); \
-	    chmod 755 $(MAN_SHARE_DIR); \
-	    else true; \
-	fi;
-	@-(for i in `ls ./doc/sman/xpa?.*` ; \
-	    do \
-		B=`basename $$i`; \
-		echo "Installing $$B" ; \
-		$(INSTALL_DATA) $$i $(MAN_SHARE_DIR)/$$B; \
-	    done;)
-
-install-data:	install-pkgconfig
-
-install-pkgconfig:
-		@-(mkdir -p $(LIB_INSTALL_DIR)/pkgconfig; \
-		echo "Installing xpa.pc" ; \
-		$(INSTALL_DATA) xpa.pc $(LIB_INSTALL_DIR)/pkgconfig;)
-
-Makefile:	Makefile.in
-		$(SHELL) config.status
-
-clean:
-		$(RM) *.a *.so *.so.* *.dylib *.o *.exe core \
-			errs *pure* .nfs* \
-			foo* *~ *.log \#* TAGS *.E a.out errors \
-			$(PROGS) $(TESTPROGS) \
-			gmon.out *.pg *.bak \
-			config.info config.log \
-			doc/*~ doc/*.bak man/*~
-		$(RM) -r autom4te.cache a.out.dSYM
-
-distclean:	clean
-		$(RM) Makefile config.status config.cache config.log conf.h \
-		xpa.pc
-
-maintainer-clean:: clean
-		$(RM) config.status config.cache config.log
-
-depend:
-		makedepend -- $(DEPEND_SWITCHES) -- $(SRCS)
-
-acl.o:		acl.c $(INCL)
-		$(CC) -c $(CC_SWITCHES) acl.c
-
-remote.o:	remote.c $(INCL)
-		$(CC) -c $(CC_SWITCHES) remote.c
-
-clipboard.o:	clipboard.c $(INCL)
-		$(CC) -c $(CC_SWITCHES) clipboard.c
-
-client.o:	client.c $(INCL)
-		$(CC) -c $(CC_SWITCHES) client.c
-
-command.o:	command.c $(INCL)
-		$(CC) -c $(CC_SWITCHES) command.c
-
-find.o:		find.c
-		$(CC) -c $(CC_SWITCHES) find.c
-
-xlaunch.o:	xlaunch.c
-		$(CC) -c $(CC_SWITCHES) xlaunch.c
-
-timedconn.o:	timedconn.c
-		$(CC) -c $(CC_SWITCHES) timedconn.c
-
-port.o:		port.c $(INCL)
-		$(CC) -c $(CC_SWITCHES) port.c
-
-tcl.o:		tcl.c $(INCL)
-		$(CC) -c $(CC_SWITCHES) $(TCL_CFLAGS) tcl.c
-
-tclloop.o:	tclloop.c $(INCL)
-		$(CC) -c $(CC_SWITCHES) $(TCL_CFLAGS) tclloop.c
-
-gtkloop.o:	gtkloop.c $(INCL)
-		$(CC) -c $(CC_SWITCHES) $(GTK_CFLAGS) gtkloop.c
-
-tcp.o:		tcp.c
-		$(CC) -c $(CC_SWITCHES) tcp.c
-
-word.o:		word.c
-		$(CC) -c $(CC_SWITCHES) word.c
-
-xalloc.o:	xalloc.c
-		$(CC) -c $(CC_SWITCHES) xalloc.c
-
-xpa.o:		xpa.c $(INCL)
-		$(CC) -c $(CC_SWITCHES) xpa.c
-
-xpaio.o:	xpaio.c $(INCL)
-		$(CC) -c $(CC_SWITCHES) xpaio.c
-
-xtloop.o:	xtloop.c $(INCL)
-		$(CC) -c $(CC_SWITCHES) $(X_CFLAGS) xtloop.c
-
-xpaaccess.o:	xpaaccess.c $(INCL)
-		$(CC) -c $(CC_SWITCHES) xpaaccess.c
-
-xpaget.o:	xpaget.c $(INCL)
-		$(CC) -c $(CC_SWITCHES) xpaget.c
-
-xpainfo.o:	xpainfo.c $(INCL)
-		$(CC) -c $(CC_SWITCHES) xpainfo.c
-
-xpans.o:	xpans.c $(INCL)
-		$(CC) -c $(CC_SWITCHES) xpans.c
-
-xpamb.o:	xpamb.c $(INCL)
-		$(CC) -c $(CC_SWITCHES) xpamb.c
-
-xpaset.o:	xpaset.c $(INCL)
-		$(CC) -c $(CC_SWITCHES) xpaset.c
-
-ctest.o:	ctest.c
-		$(CC) -c $(CC_SWITCHES) ctest.c
-
-stest.o:	stest.c
-		$(CC) -c $(CC_SWITCHES) $(X_CFLAGS) stest.c
-
-rtest.o:	rtest.c
-		$(CC) -c $(CC_SWITCHES) $(X_CFLAGS) rtest.c
-
-stestx.o:	stest.c
-		$(CC) -o stest.o -c $(CC_SWITCHES) $(X_CFLAGS) \
-		-DBUILD_WITH_XT stest.c
-
-strstr.o:	./compat/strstr.c
-		$(CC) -c $(CC_SWITCHES) -o strstr.o ./compat/strstr.c
-
-xpa.h:		configure.ac
-		@($(RM) -r oxpa.h; \
-		MAJOR=`echo "${VERSION}" | awk -F. '{print $$1}'`; \
-		MINOR=`echo "${VERSION}" | awk -F. '{print $$2}'`; \
-		PATCH=`echo "${VERSION}" | awk -F. '{print $$3}'`; \
-		sed "s/^#define XPA_VERSION.*/#define XPA_VERSION \"$(VERSION)\"/;s/^#define XPA_MAJOR_VERSION.*/#define XPA_MAJOR_VERSION $${MAJOR}/;s/^#define XPA_MINOR_VERSION.*/#define XPA_MINOR_VERSION $${MINOR}/;s/^#define XPA_PATCH_LEVEL.*/#define XPA_PATCH_LEVEL $${PATCH}/;" < xpa.h > nxpa.h; \
-		mv xpa.h oxpa.h; \
-		mv nxpa.h xpa.h)
-
-configure:	configure.ac
-		autoconf
-
-dist:   	configure
-		($(RM) -r $(DISTDIR); \
-		mkdir $(DISTDIR); \
-		cp -p *.[ch] *.tcl $(DISTDIR)/.; \
-		cp -p pkgIndex.tcl $(DISTDIR)/.; \
-		cp -p Makefile.in $(DISTDIR)/.; \
-		chmod 664 $(DISTDIR)/Makefile.in; \
-		cp -p conf.h.in $(DISTDIR)/.; \
-		chmod 664 $(DISTDIR)/conf.h.in; \
-		cp -p configure.ac $(DISTDIR)/.; \
-		chmod 644 $(DISTDIR)/configure.ac; \
-		cp -p  *.m4 $(DISTDIR)/.; \
-		chmod 644 $(DISTDIR)/*.m4; \
-		cp -p configure $(DISTDIR)/.; \
-		chmod 755 $(DISTDIR)/configure; \
-		cp -p config.sub config.guess $(DISTDIR)/.; \
-		chmod 755 $(DISTDIR)/config.sub $(DISTDIR)/config.guess; \
-		cp -p saoconfig $(DISTDIR)/.; \
-		chmod 755 $(DISTDIR)/saoconfig; \
-		cp -p mklib $(DISTDIR)/.; \
-		chmod 755 $(DISTDIR)/mklib; \
-		cp -p install-sh $(DISTDIR)/install-sh; \
-		chmod 755 $(DISTDIR)/install-sh; \
-		cp -p README INSTALL COPYING $(DISTDIR)/.; \
-		mkdir $(DISTDIR)/doc; \
-		cp -p ./doc/*.html $(DISTDIR)/doc/.; \
-		cp -p ./doc/*.ps ./doc/*.pdf $(DISTDIR)/doc/.; \
-		cp -p ./doc/Makefile $(DISTDIR)/doc/.; \
-		mkdir $(DISTDIR)/doc/sman; \
-		cp -p ./doc/sman/* $(DISTDIR)/doc/sman/.; \
-		mkdir $(DISTDIR)/man; \
-		cp -p -R ./man/* $(DISTDIR)/man/.)
-
-release:	dist
-		(cd $(DISTDIR); cd ..; \
-		tar cf - $(DISTNAME) | \
-		gzip -9 -c > $(FTPDIR)/$(DISTNAME).tar.gz)
-
-tar:
-		($(RM) config.cache; \
-		cd ..; \
-		tar cf - $(DISTNAME) | gzip -9 -c > $(DISTNAME).tar.gz)
-
-errcheck:
-		@-egrep 'error|warning' foo
-
-itar:
-		(cd doc/sman; \
-		tar cf - . | gzip -9 -c > ../../../$(DISTNAME)-iman.tar.gz)
-
-sman:
-		@(cd doc && $(MAKE) index)
-
-docs:
-		@(cd doc; $(MAKE))
-
-pure:		xpaset.pure xpaget.pure xpainfo.pure xpaaccess.pure \
-		xpans.pure xpamb.pure ctest.pure stest.pure rtest.pure
-
-xpaset.pure:	$(LIB) xpaset.o
-		purify $(CC) $(LDFLAGS) xpaset.o -o xpaset.pure \
-		$(LLIB) $(LIBS)
-
-xpaget.pure:	$(LIB) xpaget.o
-		purify $(CC) $(LDFLAGS) xpaget.o -o xpaget.pure \
-		$(LLIB) $(LIBS)
-
-xpainfo.pure:	$(LIB) xpainfo.o
-		purify $(CC) $(LDFLAGS) xpainfo.o -o xpainfo.pure \
-		$(LLIB) $(LIBS)
-
-xpaaccess.pure:	$(LIB) xpaaccess.o
-		purify $(CC) $(LDFLAGS) xpaaccess.o -o xpaaccess.pure \
-		$(LLIB) $(LIBS)
-
-xpans.pure:	$(LIB) xpans.o
-		purify $(CC) $(LDFLAGS) xpans.o -o xpans.pure \
-		$(LLIB) $(LIBS) $(TLIB)
-
-xpamb.pure:	$(LIB) xpamb.o
-		purify $(CC) $(LDFLAGS) xpamb.o -o xpamb.pure \
-		$(LLIB) $(LIBS)
-
-ctest.pure:	$(LIB) ctest.o
-		purify $(CC) $(LDFLAGS) ctest.o -o ctest.pure \
-		$(LLIB) $(LIBS)
-
-stest.pure:	$(LIB) stest.o
-		purify $(CC) $(LDFLAGS) stest.o -o stest.pure $(LIB) \
-		$(X_LIBS) -lXt $(X_PRE_LIBS) -lXext -lX11 $(LIBS)
-
-rtest.pure:	$(LIB) rtest.o
-		purify $(CC) $(LDFLAGS) rtest.o -o rtest.pure \
-		$(LLIB) $(LIBS)
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
diff --git a/xpa/README b/xpa/README
deleted file mode 100644
index 08a4bcb..0000000
--- a/xpa/README
+++ /dev/null
@@ -1,43 +0,0 @@
-This is the directory for XPA 2.0.
-
-The XPA messaging system provides seamless communication between many
-kinds of Unix programs, including X programs and Tcl/Tk programs.  It
-also provides an easy way for users to communicate with XPA-enabled
-programs by executing XPA client commands in the shell or by utilizing
-such commands in scripts.  Because XPA works both at the programming
-level and the shell level, it is a powerful tool for unifying any
-analysis environment: users and programmers have great flexibility in
-choosing the best level or levels at which to access XPA services, and
-client access can be extended or modified easily at any time.
-
-A program becomes an XPA-enabled server by defining named points of
-public access through which data and commands can be exchanged with
-other client programs (and users).  Using standard TCP sockets as a
-transport mechanism, XPA supports both single-point and broadcast
-messaging to and from these servers.  It supports direct communication
-between clients and servers, or indirect communication via an
-intermediate message bus emulation program. Host-based access control
-is implemented, as is as the ability to communicate with XPA servers
-across a network.
-
-XPA implements a layered interface that is designed to be useful both
-to software developers and to users.  The interface consists of a
-library of XPA client and server routines for use in C/C++ programs and
-a suite of high-level user programs built on top of these libraries.
-Using the XPA library, access points can be added to Tcl/Tk programs,
-Xt programs, or to Unix programs that use the XPA event loop or any
-event loop based on select().  Client access subroutines can be added
-to any Tcl/Tk, Xt, or Unix program. Client access also is supported at
-the command line via a suite of high-level programs.
-
-To build XPA, see the INSTALL instructions (which are based on
-standard instructions for building software using GNU configure).
-
-Documentation for XPA is contained in the doc subdirectory (where the
-help.html file is the top-level index).
-
-If you have questions, please contact us at: saord@cfa.harvard.edu.
-
-							Eric Mandel
-
-XPA is distributed under the terms of The MIT License.
diff --git a/xpa/acl.c b/xpa/acl.c
deleted file mode 100644
index 24b4489..0000000
--- a/xpa/acl.c
+++ /dev/null
@@ -1,568 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * acl.c -- xpa access control list management
- *
- */
-
-#include <xpap.h>
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- *			Private Routines
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/* this is the head of the global list -- too lazy to do anything more */
-static XACL aclhead=NULL;
-
-#ifdef ANSI_FUNC
-static XACL 
-XPAAclLookup (char *xclass, char *name, unsigned int ip, int exact)
-#else
-static XACL XPAAclLookup(xclass, name, ip, exact)
-     char *xclass;
-     char *name;
-     unsigned int ip;
-     int exact;
-#endif
-{
-  XACL cur;
-  /*  look for exact match */
-  for(cur=aclhead; cur!=NULL; cur=cur->next){
-    if( !strcmp(xclass, cur->xclass) 		&&
-	!strcmp(name, cur->name)   		&&
-	((cur->ip == 0) || (cur->ip == ip)) 	){
-      return(cur);
-    }
-  }
-  /* otherwise look for a template match (unless exact was specified) */
-  if( !exact ){
-    for(cur=aclhead; cur!=NULL; cur=cur->next){
-      if( tmatch(xclass, cur->xclass)		&&
-	  tmatch(name, cur->name) 		&&
-	  ((cur->ip == 0) || (cur->ip == ip)) 	){
-	return(cur);
-      }
-    }
-  }
-  return(NULL);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAAclParse
- *
- * Purpose:	parse acl list into components
- *
- * Returns:	0 on success, -1 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPAAclParse (char *lbuf, char *xclass, char *name, unsigned int *ip,
-	     char *acl, int len)
-#else
-static int XPAAclParse(lbuf, xclass, name, ip, acl, len)
-     char *lbuf;
-     char *xclass;
-     char *name;
-     unsigned int *ip;
-     char *acl;
-     int len;
-#endif
-{
-  char tbuf[SZ_LINE];
-  int lp=0;
-
-  /* class:name is required */
-  if( word(lbuf, tbuf, &lp) ){
-    XPAParseName(tbuf, xclass, name, len);
-  }
-  else
-    return(-1);
-
-  /* host is required but can be "*" for "all hosts" */
-  if( word(lbuf, tbuf, &lp) ){
-    if( !strcmp(tbuf, "*") )
-      *ip = 0;
-    else
-      *ip = gethostip(tbuf);
-  }
-  else
-    return(-1);
-
-  /* acl is required */
-  if( word(lbuf, tbuf, &lp) ){
-    if( !strcmp(tbuf, "+") )
-      strcpy(acl, XPA_ACLS);
-    else if( !strcmp(tbuf, "-") )
-      *acl = '\0';
-    else
-      strcpy(acl, tbuf);
-    return(0);
-  }
-  else
-    return(-1);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- *		Semi-Public Routines (used by command.c)
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAReceiveAcl
- *
- * Purpose:	add or modify the acl for this access point
- *
- * Returns:	0 for success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAReceiveAcl (void *client_data, void *call_data, char *paramlist,
-	       char *buf, size_t len)
-#else
-int XPAReceiveAcl(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     size_t len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  XPAComm comm;
-  int i;
-  int got;
-  char *s=NULL;
-  char lbuf[SZ_LINE];
-  char tbuf[SZ_LINE];
-
-  if( paramlist && *paramlist ){
-    s = paramlist;
-    while( isspace((int)*s) )
-      s++;
-    snprintf(tbuf, SZ_LINE, "%s:%s %s\n", xpa->xclass, xpa->name, s);
-    if( XPAAclEdit(tbuf) < 0 ){
-      snprintf(lbuf, SZ_LINE, "invalid acl: %s\n", tbuf);
-      XPAError(xpa, lbuf);
-      return(-1);
-    }
-  }
-  else{
-    while((XPAGets(xpa, xpa_datafd(xpa), lbuf, SZ_LINE, XPAShortTimeout())>0)&&
-	  *lbuf ){
-      snprintf(tbuf, SZ_LINE, "%s:%s %s\n", xpa->xclass, xpa->name, lbuf);
-      got = XPAAclEdit(tbuf);
-      if( got < 0 ){
-	snprintf(lbuf, SZ_LINE, "invalid acl: %s\n", tbuf);
-	XPAError(xpa, lbuf);
-	return(-1);
-      }
-    }
-  }
-
-  /* reset all acl flags for this xpa so acl is recalculated */
-  for(comm=xpa->commhead; comm!=NULL; comm=comm->next){
-    for(i=0; i<4; i++){
-      comm->acl[i] = -1;
-    }
-  }
-
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASendAcl
- *
- * Purpose:	return the acl for this access point
- *
- * Returns:	0 for success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPASendAcl (void *client_data, void *call_data, char *paramlist,
-	    char **buf, size_t *len)
-#else
-int XPASendAcl(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char **buf;
-     size_t *len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  XACL cur;
-  int got = 0;
-  char tbuf[SZ_LINE];
-
-  /* zero all flags */
-  for(cur=aclhead; cur!=NULL; cur=cur->next){
-    cur->flag = 0;
-  }
-  /* look for exact matches */
-  for(cur=aclhead; cur!=NULL; cur=cur->next){
-    if(!strcmp(xpa->xclass, cur->xclass) && !strcmp(xpa->name, cur->name)){
-      snprintf(tbuf, SZ_LINE, "%s:%s %s %s\n",
-	       cur->xclass, cur->name, getiphost(cur->ip), cur->acl);
-      send(xpa_datafd(xpa), tbuf, strlen(tbuf), 0);
-      cur->flag = 1;
-      got++;
-    }
-  }
-  /* look for template matches that we have not printed yet */
-  for(cur=aclhead; cur!=NULL; cur=cur->next){
-    if( cur->flag == 0 ){
-      if(tmatch(xpa->xclass, cur->xclass) && tmatch(xpa->name, cur->name)){
-	snprintf(tbuf, SZ_LINE, "%s:%s %s %s\n",
-		 cur->xclass, cur->name, getiphost(cur->ip), cur->acl);
-	send(xpa_datafd(xpa), tbuf, strlen(tbuf), 0);
-	got++;
-      }
-    }
-  }
-  /* zero all flags */
-  for(cur=aclhead; cur!=NULL; cur=cur->next){
-    cur->flag = 0;
-  }
-  if( got == 0 ){
-    send(xpa_datafd(xpa), "\n", 1, 0);
-  }
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- *			Public Routines
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAAclEdit
- *
- * Purpose:	add or modify acl entry in the xpa acl list
- *
- * Returns: 	0 on success, -1 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAAclEdit (char *lbuf)
-#else
-int XPAAclEdit(lbuf)
-     char *lbuf;
-#endif
-{
-  XACL cur;
-  char xclass[SZ_LINE];
-  char name[SZ_LINE];
-  char acl[SZ_LINE];
-  unsigned int ip;
-
-  if( XPAAclParse(lbuf, xclass, name, &ip, acl, SZ_LINE) < 0 )
-    return(-1);
-  if( ip == 0 )
-    return(-1);
-  cur = XPAAclLookup(xclass, name, ip, 1);
-  if( cur == NULL )
-    return(XPAAclAdd(lbuf));
-  else{
-    if( *acl == '\0' ){
-      XPAAclDel(cur);
-    }
-    else{
-      if( cur->acl )
-	xfree(cur->acl);
-      cur->acl = xstrdup(acl);
-    }
-    return(0);
-  }
-}
-
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAAclAdd
- *
- * Purpose:	add one acl entry to the xpa acl list
- *
- * Returns: 	0 on success, -1 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAAclAdd (char *lbuf)
-#else
-int XPAAclAdd(lbuf)
-     char *lbuf;
-#endif
-{
-  XACL xnew;
-  XACL cur;
-  char xclass[SZ_LINE];
-  char name[SZ_LINE];
-  char acl[SZ_LINE];
-  unsigned int ip;
-
-  /* allocate acl struct */
-  if( (xnew = (XACL)xcalloc(1, sizeof(XACLRec))) == NULL )
-    goto error;
-
-  /* parse info from line buffer */
-  if( XPAAclParse(lbuf, xclass, name, &ip, acl, SZ_LINE) < 0 )
-    goto error;
-
-  /* fill in the blanks */
-  xnew->xclass = xstrdup(xclass);
-  xnew->name = xstrdup(name);
-  xnew->ip = ip;
-  xnew->acl = xstrdup(acl);
-
-  /* add this acl to end of list of acl's */
-  if( aclhead == NULL ){
-    aclhead = xnew;
-  }
-  else{
-    for(cur=aclhead; cur->next!=NULL; cur=cur->next)
-      ;
-    cur->next = xnew;
-  }
-  return(0);
-
-error:
-  if( xnew )
-    xfree(xnew);
-  return(-1);
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * Routine: 	XPAAclDel
- *
- * Purpose: 	free up memory in the acl record structure
- *
- * Results:	0 on success, -1 for failure
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAAclDel (XACL acl)
-#else
-int XPAAclDel(acl)
-     XACL acl;
-#endif
-{
-  XACL cur;
-
-  if( acl == NULL )
-    return(-1);
-
-  /* remove from list of acl's */
-  if( aclhead ){
-    if( aclhead == acl ){
-      aclhead = aclhead->next;
-    }
-    else{
-      for(cur=aclhead; cur!=NULL; cur=cur->next){
-	if( cur->next == acl ){
-	  cur->next = (cur->next)->next;
-	  break;
-	}
-      }
-    }
-  }
-
-  /* free up string space */
-  if( acl->xclass ) xfree(acl->xclass);
-  if( acl->name )  xfree(acl->name);
-  if( acl->acl )   xfree(acl->acl);
-
-  /* free up record struct */
-  xfree((char *)acl);
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAAclFree
- *
- * Purpose:	
- *
- * Results:	1 on success, 0 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void 
-XPAAclFree (void)
-#else
-void XPAAclFree()
-#endif
-{
-  XACL cur, tacl;
-
-  for(cur=aclhead; cur!=NULL; ){
-    tacl = cur->next;
-    XPAAclDel(cur);
-    cur = tacl;
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAAclNew
- *
- * Purpose:	read or re-read the acl list
- *
- * Results:	number of lines in list (including default)
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAAclNew (char *aname, int flag)
-#else
-int XPAAclNew(aname, flag)
-     char *aname;
-     int flag;
-#endif
-{
-  int got=0;
-  char lbuf[SZ_LINE];
-  char hostname[SZ_LINE];
-  char *s;
-  char *obuf;
-  char *aclname=NULL;
-  char *aclpath=NULL;
-  char *defacl=NULL;
-  char *defcopy=NULL;
-  char *keywords[10];
-  char *values[10];
-  int nkeys;
-  FILE *fp=NULL;
-
-  /* if there is an old list, free it */
-  if( flag == 0 )
-    XPAAclFree();
-
-  /* get acl file name */
-  if( aname && *aname )
-    aclname = aname;
-  else if( (aclname=(char *)getenv("XPA_ACLFILE")) == NULL )
-    aclname = XPA_ACLFILE;
-
-  /* get the default acl */
-  if( (defacl=(char *)getenv("XPA_DEFACL")) == NULL )
-    defacl = XPA_DEFACL;
-
-  /* macro-expand it to deal with the host name */
-  gethost(hostname, SZ_LINE);
-  nkeys = 0;
-  keywords[0] = "host";  values[0] = hostname; nkeys++;
-
-  /* open the acl file */
-  if( (aclpath=(char *)Access(aclname, "r")) != NULL ){
-    if( (fp=fopen(aclpath, "r")) != NULL ){
-      while( fgets(lbuf, SZ_LINE, fp) ){
-	if( *lbuf == '#' ){
-	  continue;
-	}
-	if( (obuf=macro(lbuf, keywords, values, nkeys, NULL, NULL)) != NULL ){
-	  if( XPAAclAdd(obuf) == 0 )
-	    got++;
-	  xfree(obuf);
-	}
-      }
-      fclose(fp);
-    }
-    xfree(aclpath);
-  }
-
-  /* add default acl (it very likely was overridden in the file) */
-  defcopy=(char *)xstrdup(defacl);
-  for(s=(char *)strtok(defcopy,";"); s!=NULL; s=(char *)strtok(NULL,";")){
-    if( (obuf = macro(s, keywords, values, nkeys, NULL, NULL)) != NULL ){
-      if( XPAAclAdd(obuf) == 0 )
-	got++;
-      xfree(obuf);
-    }
-  }
-  if( defcopy) xfree(defcopy);
-
-  /* return the news */
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAAclCheck
- *
- * Purpose:	validate an acl for a given class, name, and host
- *
- * Results:	1 on success, 0 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAAclCheck (XPA xpa, unsigned int ip, char *acl)
-#else
-int XPAAclCheck(xpa, ip, acl)
-     XPA xpa;
-     unsigned int ip;
-     char *acl;
-#endif
-{
-  char *s;
-  XACL cur;
-
-  if( !(cur = XPAAclLookup(xpa->xclass, xpa->name, ip, 0)) )
-    return(0);
-  else if( cur->acl == NULL )
-    return(0);
-  else{
-    for(s=acl; *s; s++){
-      if( !strchr(cur->acl, *s) )
-	return(0);
-    }
-    return(1);
-  }
-}
diff --git a/xpa/aclocal.m4 b/xpa/aclocal.m4
deleted file mode 100644
index bc7540d..0000000
--- a/xpa/aclocal.m4
+++ /dev/null
@@ -1 +0,0 @@
-builtin(include,tcl.m4)
diff --git a/xpa/client.c b/xpa/client.c
deleted file mode 100644
index f70ff40..0000000
--- a/xpa/client.c
+++ /dev/null
@@ -1,3057 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-#include <xpap.h>
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- * 			Private Routines and Data
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/* this is the head of the global list of client xpas */
-static XPA xpaclienthead=NULL;
-
-static char errbuf[SZ_LINE];		/* holds current error message */
-static int id=0;			/* id of current command */
-
-#define DATA_CONNECT 1
-#define DATA_ACCEPT  2
-#define DATA_DATA    4
-
-/* use of a double fork() call is used to prevent zombies which happen
-   if fork is a child of xpans started by an XPA server (i.e., for some
-   reason, the SIGCHLD signal does not get sent to xpans parent)
-   See Stevens, Advanced Programming in te Unix Environment, p. 202 */
-#define USE_DOUBLE_FORK 1
-#ifndef USE_DOUBLE_FORK
-#ifdef ANSI_FUNC
-void sig_chld(int signo)
-#else
-#endif
-{
-  int stat;
-
-  while(waitpid(-1, &stat, WNOHANG) > 0){
-    ;
-  }
-  return;
-}                                                                              
-#endif
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	rdl
- *
- * Purpose:	read characters up a new-line
- *
- * Returns:	number of characters read
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-rdl (int fd, char *buf, size_t len)
-#else
-static int rdl(fd, buf, len)
-     int fd;
-     char *buf;
-     int len;
-#endif
-{
-  int i=0;
-  int got;
-
-  /* start out clean */
-  *buf = '\0';
-
-  /* make sure we have a valid channel */
-  if( fd < 0 )
-    return(-1);
-
-  /* grab characters up to a new-line or max len */
-  while( i < (len-1) ){
-    got = read(fd, &(buf[i]), 1);
-    if( got < 1 )
-      break;
-    else if( buf[i++] == '\n' )
-      break;
-  }
-  buf[i] = '\0';
-  return(i);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAProxyAccept
- *
- * Purpose:	accept a connection from an XPA proxy server
- *
- * Return:	fd of accepted connection or -1
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static
-int XPAProxyAccept(XPA xpa, char *method, char *xclass, char *name, int ifd, 
-		   unsigned int *rip, unsigned short *rport, char *rname)
-#else
-static
-int XPAProxyAccept(xpa, method, xclass, name, ifd, rip, rport, rname)
-     XPA xpa;
-     char *method;
-     char *xclass;
-     char *name;
-     int ifd;
-     unsigned int *rip;
-     unsigned short *rport;
-     char *rname;
-#endif
-{
-  int sock;
-  int got;
-  int oum;
-  int ofd;
-  int niter;
-  int swidth=FD_SETSIZE;
-  int keep_alive=1;
-  int reuse_addr=1;
-  unsigned int ip;
-  unsigned short port;
-  char tbuf[SZ_LINE];
-  char amethod[SZ_LINE];
-  char *tptr;
-  socklen_t slen;
-  struct sockaddr_in sock_in;
-#if HAVE_SYS_UN_H
-  struct sockaddr_un sock_un;
-#endif
-  struct timeval tv;
-  struct timeval *tvp;
-  fd_set readfds;
-
-  /* initialize results */
-  if( rip )   *rip = 0;
-  if( rport ) *rport = 0;
-  if( rname ) *rname = '\0';
-
-  switch(XPAMethod(method)){
-  case XPA_INET:
-    if( !XPAParseIpPort(method, &ip, &port) ){
-      goto error;
-    }
-    /* open a socket for data connections */
-    if( (sock = xsocket(AF_INET, SOCK_STREAM, 0)) < 0 ){
-      PERROR(("xpaaccept socket"));
-      goto error;
-    }
-    setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE,
-	       (char *)&keep_alive, sizeof(keep_alive));
-    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
-	       (char *)&reuse_addr, sizeof(reuse_addr));
-    memset((char *)&sock_in, 0, sizeof(sock_in));
-    sock_in.sin_family = AF_INET;
-    sock_in.sin_addr.s_addr = htonl(INADDR_ANY);
-    sock_in.sin_port = htons(port);
-    /* bind to the ip:port */
-    if( xbind(sock, (struct sockaddr *)&sock_in, sizeof(sock_in)) < 0 ){
-      PERROR(("xpaaccept bind"));
-      xclose(sock);
-      goto error;
-    }
-    snprintf(amethod, SZ_LINE, "%x:%d", ip, port);
-    break;
-#if HAVE_SYS_UN_H
-  case XPA_UNIX:
-    ip = 0;
-    port = 0;
-    /* get filename part, composed of class and name and unique id */
-    snprintf(tbuf, SZ_LINE, "%s_%s.%d", xclass, name, (int)time(NULL));
-    /* change "/" to "_" for filename */
-    for(tptr = tbuf; *tptr != '\0'; tptr++){
-      if( *tptr == '/' ) *tptr = '_';
-    }
-    /* create full pathname */
-    snprintf(amethod, SZ_LINE, "%s/%s", XPATmpdir(), tbuf);
-    /* delete old copy */
-    unlink (amethod);
-    /* open a socket and fill in socket information */
-    if( (sock = xsocket(AF_UNIX, SOCK_STREAM, 0)) < 0 ){
-      goto error;
-    }
-    setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE,
-	       (char *)&keep_alive, sizeof(keep_alive));
-    memset((char *)&sock_un, 0, sizeof(sock_un));
-    sock_un.sun_family = AF_UNIX;
-    strcpy(sock_un.sun_path, amethod);
-    /* unset umask so that everyone can read and write */
-    oum = umask(0);
-    /* bind to the file */
-    got = xbind(sock, (struct sockaddr *)&sock_un, sizeof(sock_un));
-    /* reset umask to previous */
-    umask(oum);
-    /* now check for bind error */
-    if( got < 0 ){
-      xclose(sock);
-      goto error;
-    }
-    break;
-#endif
-  default:
-    goto error;
-  }
-  
-  /* send port to client so they can connect */
-  /* first listen for the connection */
-  if( listen(sock, XPA_MAXLISTEN) < 0 ){
-    PERROR(("xpaaccept listen"));
-    xclose(sock);
-    goto error;
-  }
-  
-  /* and tell the client that we are listening */
-  snprintf(tbuf, SZ_LINE, "xpaaccept %s (%s:%s %s)\n", 
-	   amethod, xclass, name, method);
-  FPRINTF((stderr, "%sXPAProxyAccept: sending command to %d:\n%s",
-	   _sp, ifd, tbuf));
-  if( XPAPuts(NULL, ifd, tbuf, XPAShortTimeout()) <= 0 ){
-    PERROR(("client xpaaccept write"));
-    xclose(sock);
-    goto error;
-  }
-
-  /* we will iterate on xselect */
-  if( XPAShortTimeout() > 0 )
-    niter = XPAShortTimeout()*100;
-  else
-    niter = XPA_SHORT_TIMEOUT*100;
-again:
-  /* this has to be able to time out */
-  tv.tv_sec = 0;
-  tv.tv_usec = 10000;
-  tvp = &tv;
-  /* wait for this socket and XPA sockets */
-  FD_ZERO(&readfds);
-  FD_SET(sock, &readfds);
-  XPAAddSelect(NULL, &readfds);
-  /* wait for the connection */
-  got = xselect(swidth, &readfds, NULL, NULL, tvp);
-  /* process results of select */
-  if( got > 0 ){
-    if( !FD_ISSET(sock, &readfds)){
-      XPAProcessSelect(&readfds, 0);
-      goto again;
-    }
-    switch(XPAMethod(method)){
-    case XPA_INET:
-      while( 1 ){
-	slen = sizeof(struct sockaddr_in);
-	if((ofd=xaccept(sock, (struct sockaddr *)&sock_in, &slen)) >= 0){
-	  break;
-	}
-	else{
-	  if( xerrno == EINTR )
-	    continue;
-	  else{
-	    PERROR(("xpaaccept acccept"));
-	    xclose(sock);
-	    goto error;
-	  }
-	}
-      }
-      break;
-#if HAVE_SYS_UN_H
-    case XPA_UNIX:
-      while( 1 ){
-	slen = sizeof(struct sockaddr_un);
-	if((ofd=xaccept(sock, (struct sockaddr *)&sock_un, &slen)) >= 0){
-	  break;
-	}
-	else{
-	  if( xerrno == EINTR )
-	    continue;
-	  else{
-	    PERROR(("xpaaccept acccept"));
-	    xclose(sock);
-	    goto error;
-	  }
-	}
-      }
-      break;
-#endif
-    default:
-      xclose(sock);
-      goto error;
-    }
-  }
-  /* timeout? */
-  else if( got == 0 ){
-    if( --niter > 0 ){
-      goto again;
-    }
-    else{
-      xclose(sock);
-      FPRINTF((stderr, "%sXPAProxyAccept: select timed out\n", _sp));
-      goto error;
-    }
-  }
-  /* error */
-  else{
-    if( xerrno == EINTR ){
-      PERROR(("xpaaccept select"));
-      goto again;
-    }
-    else{
-      xclose(sock);
-      goto error;
-    }
-  }
-  /* done with listening */
-  xclose(sock);
-
-  /* fill in return information */
-  if( rip )   *rip = ip;
-  if( rport ) *rport = port;
-  if( rname ){
-    strncpy(rname, amethod, SZ_LINE-1);
-    rname[SZ_LINE-1] = '\0';
-  }
-  return(ofd);
-
-error:
-  return(-1);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAClientNewInput
- *
- * Purpose:	allocate a new input struct for reading data from stdin
- *
- * Return:	input struct, or NULL on error
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static XPAInput
-XPAClientNewInput(XPA xpa)
-#else
-static XPAInput XPAClientNewInput(xpa)
-    XPA xpa;
-#endif
-{
-  XPAInput xnew, inp;
-
-  /* allocate a new record */
-  if( (xnew=(XPAInput)xcalloc(1, sizeof(XPAInputRec))) == NULL ){
-    return(NULL);
-  }
-  /* allocate the data buffer */
-  xnew->buf = (char *)xmalloc(XPA_BIOSIZE);
-  /* this buffer starts (and currently ends) at the current byte count */
-  xnew->start = xpa->inpbytes;
-  xnew->end = xpa->inpbytes;
-  xnew->bytes = 0;
-
-  /* add this input to end of list of input's */
-  if( xpa->inphead == NULL ){
-    xpa->inphead = xnew;
-  }
-  else{
-    for(inp=xpa->inphead; inp->next!=NULL; inp=inp->next)
-      ;
-    inp->next = xnew;
-  }
-
-  /* return the record struct */
-  return(xnew);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAClientFreeInput
- *
- * Purpose:	free a input buffer once its been sent to all targets
- *
- * Return:	0 on success, -1 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void
-XPAClientFreeInput (XPA xpa, XPAInput inp)
-#else
-static void XPAClientFreeInput(xpa, inp)
-     XPA xpa;
-     XPAInput inp;
-#endif
-{
-  XPAInput cur;
-
-  if( !xpa || !inp )
-    return;
-
-  if( inp == xpa->inphead ){
-    xpa->inphead = inp->next;
-  }
-  else{
-    for(cur=xpa->inphead; cur!=NULL; cur=cur->next){
-      if( cur->next == inp ){
-	cur->next = inp->next;
-	break;
-      }
-    }
-  }
-
-  /* free current record */
-  if( inp != NULL ){ 
-    if( inp->buf != NULL )
-      xfree(inp->buf );
-    xfree(inp);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAClientFreeAllInputs
- *
- * Purpose:	free remaining input buffers
- *
- * Return:	0 on success, -1 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void
-XPAClientFreeAllInputs (XPA xpa)
-#else
-static void XPAClientFreeAllInputs(xpa)
-     XPA xpa;
-#endif
-{
-  XPAInput cur, tmp;
-
-  if( !xpa )
-    return;
-
-  for(cur=xpa->inphead; cur!=NULL; ){
-    tmp = cur->next;
-    XPAClientFreeInput(xpa, cur);
-    cur = tmp;
-  }
-  xpa->inpbytes = 0;
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAClientProcessInput
- *
- * Purpose:	read input from stdin and store in an input struct
- *
- * Return:	bytes read
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPAClientProcessInput(XPA xpa)
-#else
-static int XPAClientProcessInput(xpa)
-    XPA xpa;
-#endif
-{
-  static XPAInput cur=NULL;
-  int get, got;
-
-  /* set up next buffer, if necessary */
-  for(cur=xpa->inphead; cur!=NULL; cur=cur->next){
-    if( cur->bytes < XPA_BIOSIZE )
-      break;
-  }
-  if( cur == NULL ){
-    cur = XPAClientNewInput(xpa);
-  }
-
-  /* read data from stdin */
-  get = MIN(XPA_IOSIZE, XPA_BIOSIZE - cur->bytes);
-  if( isatty(xpa->ifd) ){
-    got = rdl(xpa->ifd, &(cur->buf[cur->bytes]), get);
-  }
-  else{
-    got = read(xpa->ifd, &(cur->buf[cur->bytes]), get);
-  }
-  switch(got){
-  case -1:
-    if( XPAVerbosity() ){
-      PERROR(("XPA client read"));
-    }
-    return(0);
-  case 0:
-    xpa->ifd = -1;
-    FPRINTF((stderr, "%sXPAClientProcessInput: signalling EOF\n", _sp));
-    break;
-  default:
-    break;
-  }
-  cur->bytes += got;
-  cur->end += got;
-  xpa->inpbytes +=  got;
-#ifdef FIXEDBYCYGWIN
-#if HAVE_CYGWIN
-  /* on non-NT Windows machines, Cygwin select() does not work once a pipe
-     gets EOF. It should show the fd ready for reading (and read 0 bytes),
-     but does not, so we have to hack a manual check */
-  /* GetVersion is a Windows call */
-  if( GetVersion() >= 0x80000000L ){
-    if( got < get ){
-      xpa->ifd = -1;
-    }
-  }
-#endif
-#endif
-
-  /* verify to stdout, if necessary */
-  if( xpa->client_mode & XPA_CLIENT_VERIFY ){
-    fwrite(&(cur->buf[cur->bytes-got]), sizeof(char), got, stdout);
-  }
-
-  /* return the number of bytes just read */
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAClientFree
- *
- * Purpose:	free a client record and remove from list
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-XPAClientFree (XPA xpa, XPAClient client)
-#else
-static void XPAClientFree(xpa, client)
-     XPA xpa;
-     XPAClient client;
-#endif
-{
-  XPAClient cur;
-
-  /* remove from list of xpa's */
-  if( xpa->clienthead ){
-    if( xpa->clienthead == client ){
-      xpa->clienthead = client->next;
-    }
-    else{
-      for(cur=xpa->clienthead; cur!=NULL; cur=cur->next){
-	if( cur->next == client ){
-	  cur->next = client->next;
-	  break;
-	}
-      }
-    }
-  }
-
-  if( client->cmdfd >= 0 ){
-#if HAVE_CYGWIN
-    shutdown(client->cmdfd, SHUT_RDWR);
-#endif
-    xclose(client->cmdfd);
-  }
-  if( client->datafd >= 0 ){
-#if HAVE_CYGWIN
-    shutdown(client->datafd, SHUT_RDWR);
-#endif
-    xclose(client->datafd);
-  }
-  if( client->dataname ){
-    unlink(client->dataname);
-    xfree(client->dataname);
-  }
-  if( client->method )
-    xfree(client->method);
-  if( client->info )
-    xfree(client->info);
-  if( client->xtemplate )
-    xfree(client->xtemplate);
-  if( client->xclass )
-    xfree(client->xclass);
-  if( client->name )
-    xfree(client->name);
-  if( client->id )
-    xfree(client->id);
-  /* xpaget's fd mode has an alloc'ed bufptr and lenptr */
-  if( (client->type == 'g') && (client->mode & XPA_CLIENT_FD) ){
-    if( client->bufptr && *(client->bufptr) )
-      xfree(*(client->bufptr));
-    if( client->bufptr )
-      xfree(client->bufptr);
-    if( client->lenptr )
-      xfree(client->lenptr);
-  }
-  xfree(client);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAClientDataSent
- *
- * Purpose:	data is sent, so close data channel and change status to
- *		signal that we are waiting for the server
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void
-XPAClientDataSent (XPA xpa, XPAClient client)
-#else
-static void XPAClientDataSent(xpa, client)
-     XPA xpa;
-     XPAClient client;
-#endif
-{
-  FPRINTF((stderr, "%sXPAClientDataSent: for cmd %d data %d\n", _sp,
-	   client->cmdfd, client->datafd));
-  /* close the data channel, which should trigger a result from the server */
-  if( client->datafd >= 0 ){
-#if HAVE_CYGWIN
-    shutdown(client->datafd, SHUT_RDWR);
-#endif
-    xclose(client->datafd);
-    client->datafd = -1;
-  }
-  /* we are now waiting for the server to complete the calllback */
-  client->status = XPA_CLIENT_WAITING;
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAClientEnd
- *
- * Purpose:	finish up with this client
- *
- * Returns:	error message or null
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static char *
-XPAClientEnd (XPA xpa, XPAClient client)
-#else
-static char *XPAClientEnd(xpa, client)
-     XPA xpa;
-     XPAClient client;
-#endif
-{
-  char *error=NULL;
-  char *eptr;
-
-  FPRINTF((stderr, "%sXPAClientEnd: for cmd %d data %d\n", _sp,
-	   client->cmdfd, client->datafd));
-  /* always read the status line -- if we are not ack'ing, we'll get an
-     OK from the server before the calllback and we can exit quickly */
-  /* don't do this if client is xpainfo and we're not ack'ing */
-  if( !((client->type == 'i') && !(client->mode & XPA_CLIENT_ACK)) ){
-retry:
-    if( XPAGets(NULL, client->cmdfd, errbuf, SZ_LINE, XPALongTimeout()) >0 ){
-      FPRINTF((stderr, "%sXPAClientEnd: read %s\n", _sp, errbuf));
-      eptr = errbuf;
-      /* this should never happen */
-      if( *eptr == '?' ){
-	snprintf(errbuf, SZ_LINE, 
-		 "XPA$WARNING: protocol mismatch - missing id\n%s", eptr);
-	error = NULL;
-      }
-      else{
-	/* make sure we are dealing with a proper message */
-	if( strncmp(eptr, client->id, strlen(client->id)) ){
-	  if( XPAVerbosity() > 1 ){
-	    fprintf(stderr,
-		    "XPA$WARNING: ignoring out of sync server message:\n");
-	    fprintf(stderr, "%s", errbuf);
-	  }
-	  goto retry;
-	}
-	/* go past id */
-	eptr += strlen(client->id);
-	while( isspace((int)*eptr) ) eptr++;
-	if( !strncmp(eptr, "XPA$OK", 6) ){
-	  error = NULL;
-	}
-	else{
-	  error = eptr;
-	}
-      }
-    }
-    else{
-      if( XPAVerbosity() > 1 ){
-	fprintf(stderr,
-		"XPA$WARNING: no reply from server callback (assuming OK)\n");
-      }
-      error = NULL;
-    }
-  }
-  else
-    error = NULL;
-
-  /* store the error return */
-  if( client->errptr )
-    *(client->errptr) = xstrdup(error);
-
-  /* remove this client if we are not meant to persist */
-  if( !xpa->persist ){
-    XPAClientFree(xpa, client);
-  }
-  /* otherwise mark as inactive */
-  else{
-    client->status = XPA_CLIENT_IDLE;
-    client->bytes = 0;
-  }
-
-  /* return error status */
-  return(error);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAClientNew
- *
- * Purpose:	allocate a new xpa client
- *
- * Returns:	xpa client struct
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static XPAClient 
-XPAClientNew (XPA xpa, char *mode, char *xtemplate, int type,
-	      char *xclass, char *name, char *method, char *info)
-#else
-static XPAClient XPAClientNew(xpa, mode, xtemplate, type,
-			      xclass, name, method, info)
-     XPA xpa;
-     char *mode;
-     char *xtemplate;
-     int type;
-     char *xclass;
-     char *name;
-     char *method;
-     char *info;
-#endif
-{
-  XPAClient xnew, client;
-  struct sockaddr_in sock_in;
-#if HAVE_SYS_UN_H
-  struct sockaddr_un sock_un;
-#endif
-  char xmode[SZ_LINE];
-  char tbuf[SZ_LINE];
-  char amethod[SZ_LINE];
-  char *s=NULL;
-  unsigned short port;
-  unsigned int ip=0;
-  int fd;
-  int pfd;
-  int tries=0;
-  int nsproxy=0;
-  int keep_alive=1;
-
-  FPRINTF((stderr, "%sXPAClientNew: entering with %s %s %s %s\n", _sp,
-	   xclass, name, method, info));
-
-  /* no errors as yet */
-  *errbuf = '\0';
-
-  /* look for reuse of xpans fd (used in conjunction with the xpans proxy) */
-  *xmode = '\0';
-  if( mode ){
-    strncpy(xmode, mode, SZ_LINE-1);
-    xmode[SZ_LINE-1] = '\0';
-  }
-  if( keyword(xmode, "nsproxy", tbuf, SZ_LINE) ){
-    nsproxy = 1;
-    pfd = strtol(tbuf, &s, 0);
-    fd = XPAProxyAccept(xpa, XPANSMethod(NULL,2),
-			xclass, name, pfd, &ip, &port, amethod);
-    /* make sure we got a valid int fd */
-    if( fd < 0 ){
-      snprintf(errbuf, SZ_LINE,
-	       "XPA$ERROR: no response from server on proxyaccept (%s:%s%s)\n",
-	       xclass, name, XPATimestamp());
-      FPRINTF((stderr, "%sXPAClientNew: %s", _sp, errbuf));
-      PERROR(("XPAClientNew"));
-      return(NULL);
-    }
-  }
-  /* normal usage: connect to server */
-  else{
-    switch(XPAMethod(method)){
-    case XPA_INET:
-again1:
-      if( !XPAParseIpPort(method, &ip, &port) )
-	return(NULL);
-      /* use $localhost over $host (we do not trust host to be correct) */
-      if( (ip == gethostip("$host")) && (tries == 0) )
-	ip = gethostip("$localhost");
-      /* connect to the server before we go further */
-      if( (fd = xsocket(AF_INET, SOCK_STREAM, 0)) < 0 ){
-	return(NULL);
-      }
-      setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE,
-		 (char *)&keep_alive, sizeof(keep_alive));
-      memset((char *)&sock_in, 0, sizeof(sock_in));
-      sock_in.sin_family = AF_INET;
-      sock_in.sin_addr.s_addr = htonl(ip);
-      sock_in.sin_port = htons(port);
-      /* make the connection with the server */
-      if( connect(fd, (struct sockaddr *)&sock_in, sizeof(sock_in)) <0 ){
-	xclose(fd);
-	/* if localhost doesn't work, make one try with the host ip */
-	/* we also try again just in case there was an odd error such
-	   as "permission denied", which we have seen once or twice */
-	if( tries < 2 ){
-	  tries++;
-	  goto again1;
-	}
-	/* give up */
-	else{
-	  snprintf(errbuf, SZ_LINE,
-		   "XPA$ERROR: no response from server on connect (%s:%s%s)\n",
-		   xclass, name, XPATimestamp());
-	  PERROR(("XPAClientNew"));
-	  return(NULL);
-	}
-      }
-      /* make sure we close on exec */
-      xfcntl(fd, F_SETFD, FD_CLOEXEC);
-      FPRINTF((stderr, "%sXPAClientNew: inet connect returns fd %d\n", 
-	       _sp, fd));
-      break;
-#if HAVE_SYS_UN_H
-    case XPA_UNIX:
-again2:
-      /* open a socket and fill in socket information */
-      if( (fd = xsocket(AF_UNIX, SOCK_STREAM, 0)) < 0 ){
-	return(NULL);
-      }
-      setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE,
-		 (char *)&keep_alive, sizeof(keep_alive));
-      memset((char *)&sock_un, 0, sizeof(sock_un));
-      sock_un.sun_family = AF_UNIX;
-      strcpy(sock_un.sun_path, method);
-      /* make the connection with the server */
-      if( connect(fd, (struct sockaddr *)&sock_un, sizeof(sock_un)) <0 ){
-	xclose(fd);
-	/* Unix sockets get ECONNREFUSED when the listen queue is full,
-	   so we try a few times to give the server a chance to recover */
-	if( (xerrno == ECONNREFUSED) && (tries < XPA_RETRIES) ){
-	  tries++;
-	  XPASleep(10);
-	  goto again2;
-	}
-	/* give up */
-	else{
-	  snprintf(errbuf, SZ_LINE,
-		   "XPA$ERROR: no response from server on connect (%s:%s%s)\n",
-		   xclass, name, XPATimestamp());
-	  PERROR(("XPAClientNew"));
-	  return(NULL);
-	}
-      }
-      /* make sure we close on exec */
-      xfcntl(fd, F_SETFD, FD_CLOEXEC);
-      FPRINTF((stderr, "%sXPAClientNew: unix connect returns fd %d\n",
-	       _sp, fd));
-      break;
-#endif
-    default:
-      return(NULL);
-    }
-    strncpy(amethod, method, SZ_LINE-1);
-    amethod[SZ_LINE-1] = '\0';
-  }
-
-  /* allocate new send record */
-  if( (xnew=(XPAClient)xcalloc(1, sizeof(XPAClientRec))) == NULL ){
-    xclose(fd);
-    return(NULL);
-  }
-
-  /* fill in the blanks */
-  xnew->xtemplate = xstrdup(xtemplate);
-  xnew->type = type;
-  xnew->cmdfd = fd;
-  xnew->datafd = -1;
-  xnew->xclass = xstrdup(xclass);
-  xnew->name = xstrdup(name);
-  xnew->method = xstrdup(amethod);
-  xnew->info = xstrdup(info);
-  xnew->ip = ip;
-  xnew->nsproxy = nsproxy;
-  xnew->status = XPA_CLIENT_ACTIVE;
-
-  /* now that we have a valid client, add to list */
-  if( xpa->clienthead == NULL ){
-    xpa->clienthead = xnew;
-  }
-  else{
-    for(client=xpa->clienthead; client->next!=NULL; client=client->next)
-      ;
-    client->next = xnew;
-  }
-  FPRINTF((stderr, "%sXPAClientNew: new fd %d\n", _sp, xnew->cmdfd));
-  /* return the good news */
-  return(xnew);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAClientAddSelect
- *
- * Purpose:	add one or more xpa client sockets to the select flags
- *
- * Return:	number of clients that were added to the select flags
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAClientAddSelect (XPA xpa, fd_set *readfdsptr, fd_set *writefdsptr)
-#else
-int XPAClientAddSelect(xpa, readfdsptr, writefdsptr)
-     XPA xpa;
-     fd_set *readfdsptr;
-     fd_set *writefdsptr;
-#endif
-{
-  XPAClient client;
-  int got=0;
-  int loop=0;
-
-  /* better have some place to set the flags */
-  if( readfdsptr == NULL )
-    return(0);
-
-  /* if no xpa is specified, do them all */
-  if( xpa == NULL ){
-    if( xpaclienthead == NULL ) return(0);
-    xpa = xpaclienthead;
-    loop = 1;
-  }
-
-loop:
-  /* set select flags for all clients */
-  for(client=xpa->clienthead; client!=NULL; client=client->next){
-    /* if this client is processing */
-    if( (client->status == XPA_CLIENT_PROCESSING) && (client->datafd >= 0) ){
-      if( client->type == 'g' ){
-	FPRINTF((stderr, "%sXPAClientAddSelect(get): adding fd %d\n", _sp,
-		 client->datafd));
-	FD_SET(client->datafd, readfdsptr);
-	got++;
-      }
-      else if( client->type == 's' ){
-	FPRINTF((stderr, "%sXPAClientAddSelect(set): adding fd %d\n", _sp,
-		 client->datafd));
-	FD_SET(client->datafd, writefdsptr);
-	got++;
-      }
-    }
-    /* if this client is waiting */
-    else if( (client->status == XPA_CLIENT_WAITING) && (client->cmdfd >= 0) ){
-      FPRINTF((stderr, "%sXPAClientAddSelect(waiting): adding fd %d\n", _sp,
-	       client->cmdfd));
-      FD_SET(client->cmdfd, readfdsptr);
-      got++;
-    }
-  }
-  /* loop if necessary */
-  if( loop && (xpa=xpa->next) ) goto loop;
-  /* return the news */
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAClientGet
- *
- * Purpose:	process an xpaget request for a given client
- *
- * Return:	0 on success, -1 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPAClientGet (XPA xpa, XPAClient client)
-#else
-static int XPAClientGet(xpa, client)
-     XPA xpa;
-     XPAClient client;
-#endif
-{
-  int status;
-  char tbuf[SZ_LINE];
-
-  /* allocate the first buffer, if necessary */
-  if( *(client->bufptr) == NULL ){
-    client->bufsize = XPA_IOSIZE;
-    *(client->bufptr) = (char *)xmalloc(client->bufsize);
-    *(client->lenptr) = 0;
-  }
-  if( (*(client->lenptr) + XPA_IOSIZE) > client->bufsize ){
-    client->bufsize += (XPA_IOSIZE*10);
-    *(client->bufptr) = (char *)xrealloc(*(client->bufptr), client->bufsize);
-  }
-
-  /* now retrieve the data from the server */
-  status = recv(client->datafd, *(client->bufptr) + *(client->lenptr),
-		XPA_IOSIZE, 0);
-  /* status < 0 means error */
-  switch(status){
-  /* error */
-  case -1:
-    /* socket would block */
-    if((xerrno == EINPROGRESS) || (xerrno == EWOULDBLOCK)){
-      return(0);
-    }
-    /* clean up after error */
-    if( *(client->bufptr) ){
-      xfree(*(client->bufptr));
-      *(client->bufptr) = NULL;
-      client->bufsize = 0;
-    }
-    *(client->lenptr) = 0;
-    XPAClientDataSent(xpa, client);
-#ifdef OLD
-    (void)XPAClientEnd(xpa, client);
-    /* we need to flag some sort of error, if nothing came across */
-    if( *(client->errptr) == NULL ){
-      *(client->errptr) = xstrdup(
-			  "XPA$ERROR: incomplete transmission from server\n");
-    }
-#endif
-    break;
-  /* eof */
-  case 0:
-    /* if we have multiple clients, we now need to write this one */
-    if( client->mode & XPA_CLIENT_FD ){
-      if( xpa->nclient > 1 ){
-	snprintf(tbuf, SZ_LINE, "XPA$BEGIN %s:%s %s\n",
-		 client->xclass, client->name, client->method);
-	write(client->fd, tbuf, strlen(tbuf));
-      }
-      write(client->fd, *(client->bufptr), *(client->lenptr));
-      if( xpa->nclient > 1 ){
-	snprintf(tbuf, SZ_LINE, "XPA$END   %s:%s %s\n",
-		 client->xclass, client->name, client->method);
-	write(client->fd, tbuf, strlen(tbuf));
-      }
-      /* we can free buf, since its not being passed back */
-      if( *(client->bufptr) ){
-	xfree(*(client->bufptr));
-	*(client->bufptr) = NULL;
-	client->bufsize = 0;
-      }
-    }
-    else{
-      /* set final buffer size and put a convenience null at the end */
-      if( *(client->bufptr) ){
-	client->bufsize = *(client->lenptr)+1;
-	*(client->bufptr) = (char *)xrealloc(*(client->bufptr),client->bufsize);
-	*(*(client->bufptr)+*(client->lenptr)) = '\0';
-      }
-    }
-    /* for all clients, we need to clean up */
-    XPAClientDataSent(xpa, client);
-#ifdef OLD
-    (void)XPAClientEnd(xpa, client);
-#endif
-    break;
-  /* status > 0: bytes read */
-  default:
-    *(client->lenptr) += status;
-    /* for single client fd mode, we write immediately -- this deals with
-       the important case of one client with a large amount of data */
-    if( (client->mode & XPA_CLIENT_FD) && (xpa->nclient == 1) ){
-      write(client->fd, *(client->bufptr), *(client->lenptr));
-      /* reset buf for next read */
-      if( *(client->bufptr) ) xfree(*(client->bufptr));
-      *(client->bufptr) = NULL;
-      *(client->lenptr) = 0;
-    }
-    break;
-  }
-  return(status);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAClientSet
- *
- * Purpose:	process an xpaset request for a given client
- *
- * Return:	0 on success, -1 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPAClientSet (XPA xpa, XPAClient client)
-#else
-static int XPAClientSet(xpa, client)
-     XPA xpa;
-     XPAClient client;
-#endif
-{
-  int status;
-  int left;
-  int got;
-  int len;
-  XPAInput inp;
-
-  if( client->mode & XPA_CLIENT_BUF ){
-    while( 1 ){
-      len = MIN(XPA_IOSIZE, client->len - client->bytes);
-      /* see if we have written it all */
-      if( len == 0 ){
-	status = 1;
-	goto done;
-      }
-      /* write the next chunk */
-      FPRINTF((stderr,
-	       "%sXPAClientSet: fd %d sending %lu bytes (%lu - %lu)\n", _sp,
-	       client->datafd, (unsigned long)len, 
-	       (unsigned long)client->len, (unsigned long)client->bytes));
-      got=send(client->datafd, &(client->buf[client->bytes]), len, 0);
-      if( got >= 0 ){
-	client->bytes += got;
-	if( XPALevelGet() >0 )
-	  return(got);
-      }
-      else{
-	PERROR(("XPAClientSet"));
-	/* check for error */
-	if( (xerrno != EWOULDBLOCK) && (xerrno != EAGAIN) ){
-	  status = -1;
-	  goto done;
-	}
-	/* write would block, so we return and wait the server */
-	else{
-	  return(0);
-	}
-      }
-    }
-  }
-  /* reading from stdin and writing to servers */
-  else{
-    /* find the input buf that contains the data we need */
-    for(inp=xpa->inphead; inp!=NULL; inp=inp->next){
-      if( (client->bytes >= inp->start) && (client->bytes < inp->end) ){
-	break;
-      }
-    }
-    /* if we can't find a buffer ... */
-    if( !inp ){
-      /*  ... and we have all the input, we are done */
-      if( xpa->ifd < 0 ){
-	FPRINTF((stderr, "%sXPAClientSet: all data read\n", _sp));
-	status = 1;
-	goto done;
-      }
-      /* ... but there is more input to come, return */
-      else{
-	return(0);
-      }
-    }
-    /* optimization: don't write a buffer until its full (or until eof) */
-    if( (xpa->ifd >=0) && (inp->bytes < XPA_BIOSIZE) ){
-      return(0);
-    }
-
-    /* write bytes until we would block or until end of this buffer, etc */
-    while( 1 ){
-      len = MIN(XPA_IOSIZE, inp->end - client->bytes);
-      FPRINTF((stderr, "%sXPAClientSet: has %lu=min(%d,(%lu-%lu)) [%d]\n",
-	       _sp, (unsigned long)len, XPA_IOSIZE, 
-	       (unsigned long)inp->end, (unsigned long)client->bytes, 
-	       client->status));
-      /* if we are done with this buffer, just return */
-      if( (client->status == XPA_CLIENT_PROCESSING) && (len <=0) ){
-	/* see if everyone else is done with this buffer as well,
-	   in which case we can free it */
-	left = 0;
-	for(client=xpa->clienthead; client!=NULL; client=client->next){
-	  if( (client->type != 's') || !(client->mode & XPA_CLIENT_FD) )
-	    continue;
-	  /* in order to be totally written out, the following must be true:
-	   * 1. send->bytes must be past the end of this buffer
-	   *  and
-	   * 2. this buffer must be filled or else we hit eof
-	   */
-	  FPRINTF((stderr,
-		   "%sXPAClientSet: %lu>=%lu && ((%lu>=%d) or %d<0)) .. ",
-		   _sp, client->bytes, (unsigned long)inp->end, 
-		   (unsigned long)inp->bytes, XPA_BIOSIZE, 
-		   xpa->ifd));
-	  if( (client->bytes >= inp->end) &&
-	      ((inp->bytes >= XPA_BIOSIZE) || (xpa->ifd < 0)) ){
-	    /* buffer complete written */
-	    FPRINTF((stderr, "%sEOF (%lu)\n", 
-		     _sp, (unsigned long)xpa->inpbytes));
-	    ;
-	  }
-	  else{
-	    FPRINTF((stderr, "%s\n", _sp));
-	    /* buffer not complete written */
-	    left++;
-	    break;
-	  }
-	}
-	/* if nothing is left, we can free this input struct */
-	if( !left ){
-	  XPAClientFreeInput(xpa, inp);
-	}
-	return(0);
-      }
-      /* write to the server */
-      FPRINTF((stderr,
-	       "%sXPAClientSet: fd %d sending %lu bytes (%lu):\n", _sp,
-	       client->datafd, 
-	       (unsigned long)len, (unsigned long)client->bytes));
-      got = send(client->datafd, &(inp->buf[client->bytes-inp->start]),len,0);
-      /* check for success */
-      if( got >= 0 ){
-	/* update the number of bytes we wrote */
-	client->bytes += got;
-	FPRINTF((stderr, "%sXPAClientSet: sent %lu bytes (total is %lu)\n",
-		_sp, (unsigned long)got, (unsigned long)client->bytes));
-	/* go back for more */
-	if( XPALevelGet() >0 )
-	  return(got);
-	else
-	  continue;
-      }
-      /* check for error */
-      else{
-	PERROR(("XPAClientSet"));
-	/* anything but a "would block" error is bad */
-	if( (xerrno != EWOULDBLOCK) && (xerrno != EAGAIN) ){
-	  status = -1;
-	  goto done;
-	}
-	/* write would block, so we return and wait the server */
-	else{
-	  FPRINTF((stderr, "%sXPAClientSet: waiting for more data\n", _sp));
-	  return(0);
-	}
-      }
-    }
-  }
-
-done:
-  XPAClientDataSent(xpa, client);
-#ifdef OLD
-  (void)XPAClientEnd(xpa, client);
-#endif
-  return(status);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAClientProcessSelect
- *
- * Purpose:	process xpas that have pending reads or writes
- *
- * Return:	number of xpas processed
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAClientProcessSelect (XPA xpa,
-			fd_set *readfdsptr, fd_set *writefdsptr, int maxreq)
-#else
-int XPAClientProcessSelect(xpa, readfdsptr, writefdsptr, maxreq)
-     XPA xpa;
-     fd_set *readfdsptr;
-     fd_set *writefdsptr;
-     int maxreq;
-#endif
-{
-  int got=0;
-  int loop=0;
-  XPAClient client;
-
-  /* <= 0 means do all of them */
-  if( maxreq < 0 ){
-    maxreq = 0;
-  }
-
-  /* if no xpa is specified, do them all */
-  if( xpa == NULL ){
-    if( xpaclienthead == NULL ) return(0);
-    xpa = xpaclienthead;
-    loop = 1;
-  }
-
-loop:
-  /* first process any new input before we write output */
-  if( xfd_isset_stdin(xpa->ifd, readfdsptr) ){
-    xfd_clr_stdin(xpa->ifd, readfdsptr);
-    XPAClientProcessInput(xpa);
-  }
-  /* look at all clients */
-again:
-  for(client=xpa->clienthead; client!=NULL; client=client->next){
-    /* if we are processing */
-    if( (client->status == XPA_CLIENT_PROCESSING) && (client->datafd>=0) ){
-      /* then handle new requests */
-      if((client->type == 'g') && FD_ISSET(client->datafd, readfdsptr)){
-	FD_CLR(client->datafd, readfdsptr);
-	XPAClientGet(xpa, client);
-	got++;
-	if( maxreq && (got >= maxreq) ) return(got);
-	goto again;
-      }
-      else if((client->type == 's') && FD_ISSET(client->datafd, writefdsptr)){
-	FD_CLR(client->datafd, writefdsptr);
-	/* if the return is > 0, we completed the send */
-	if( XPAClientSet(xpa, client) > 0 )
-	  got++;
-	if( maxreq && (got >= maxreq) ) return(got);
-	goto again;
-      }
-    }
-    /* if this client is waiting */
-    else if( (client->status == XPA_CLIENT_WAITING) && (client->cmdfd >= 0) ){
-      if( FD_ISSET(client->cmdfd, readfdsptr)){
-	FD_CLR(client->cmdfd, readfdsptr);
-	XPAClientEnd(xpa, client);
-	got++;
-	if( maxreq && (got >= maxreq) ) return(got);
-	goto again;
-      }
-    }
-  }
-  /* loop if necessary */
-  if( loop && (xpa=xpa->next) ) goto loop;
-  /* return the news */
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAClientLoop
- *
- * Purpose:	non-X programs event loop for handling XPA client events
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPAClientLoop (XPA xpa, int mode)
-#else
-static int XPAClientLoop(xpa, mode)
-     XPA xpa;
-     int mode;
-#endif
-{
-  int got=0;
-  int sgot;
-  int doxpa=1;
-  int ltimeout;
-  char *s=NULL;
-  fd_set readfds;
-  fd_set writefds;
-  static int width=0;
-  struct timeval tv;
-  struct timeval *tvp;
-
-  /* set width once */
-  if( width == 0 ){
-    width = FD_SETSIZE;
-  }
-  /* allow environment to turn off xpa server processing in client loop */
-  if( (s=getenv("XPA_CLIENT_DOXPA")) && isfalse(s) ){
-    doxpa = 0;
-  }
-  ltimeout = XPALongTimeout();
-  FD_ZERO(&readfds);
-  FD_ZERO(&writefds);
-  while( XPAClientAddSelect(xpa, &readfds, &writefds) ){
-    /* add other XPA's and process them as we process the client */
-    if( (mode & XPA_CLIENT_SEL_XPA) && doxpa ){
-      FPRINTF((stderr, "%sXPAClientLoop: will handle server reqs ...\n", _sp));
-      XPAAddSelect(NULL, &readfds);
-    }
-    /* hopefully, a server will respond in a finite amount of time */
-    if( ltimeout > 0 ){
-      tv.tv_sec = ltimeout;
-      tv.tv_usec = 0;
-      tvp = &tv;
-    }
-    /* wait forever, if necessary */
-    else{
-      tvp = NULL;
-    }
-    /* add stdin to select, if there is one */
-    if( xpa->ifd >= 0 ){
-      xfd_set_stdin(xpa->ifd, &readfds);
-#if HAVE_MINGW32
-      /* BUT: for windows, we can't add stdin to select and therefore we 
-	 must set a short timeout and look manually */
-      tv.tv_sec = 0;
-      tv.tv_usec = 10000;
-      /* this is the number of window iterations we will perform */
-      if( ltimeout > 0 )
-	ltimeout *= 100;
-      tvp = &tv;
-#endif
-    }
-    /* wait for a server to respond */
-    FPRINTF((stderr, "%sXPAClientLoop: waiting on select() ...\n", _sp));
-    sgot = xselect(width, &readfds, &writefds, NULL, tvp);
-    FPRINTF((stderr, "%sXPAClientLoop: select returns: %d\n", _sp, sgot));
-    /* error -- what should we do? */
-    if( sgot < 0 ){
-      if( xerrno == EINTR ){
-	FD_ZERO(&readfds);
-	FD_ZERO(&writefds);
-	continue;
-      }
-      if( XPAVerbosity() ){
-	perror("XPAClientLoop() select");
-      }
-      exit(1);
-    }
-    /* timed out -- no one responded */
-    else if( sgot == 0 ){
-#if HAVE_MINGW32
-      if( xpa->ifd >= 0 ){
-	if( ltimeout > 0 ){
-	  if( --ltimeout <= 0 )
-	    break;
-	}
-      }
-      else{
-	break;
-      }
-#else
-      break;
-#endif
-    }
-    else{
-      got += XPAClientProcessSelect(xpa, &readfds, &writefds, 0);
-      if( (mode & XPA_CLIENT_SEL_XPA) && doxpa ){
-	got += XPAProcessSelect(&readfds, 0);
-      }
-    }
-    FD_ZERO(&readfds);
-    FD_ZERO(&writefds);
-  }
-  return(got);
-}
-
-#if HAVE_MINGW32==0
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAClientLoopFork
- *
- * Purpose:	non-X programs forked event loop for handling XPA client events
- *
- * Returns:	number of clients "processed"
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPAClientLoopFork (XPA xpa, int mode)
-#else
-static int XPAClientLoopFork(xpa, mode)
-     XPA xpa;
-     int mode;
-#endif
-{
-  XPAClient client, tclient;
-  pid_t pid;
-  int got;
-  int fd[2];
-  char active=1;
-#ifndef USE_DOUBLE_FORK
-  struct sigaction act;
-  /* set up the signal handler to reap children (to avoid zombies) */
-  act.sa_handler = sig_chld;
-  sigemptyset(&act.sa_mask);
-  act.sa_flags = 0;
-#ifdef SA_RESTART
-  act.sa_flags |= SA_RESTART;
-#endif
-#ifdef SA_NOCLDWAIT
-  act.sa_flags |= SA_NOCLDWAIT;
-#endif
-  sigaction(SIGCHLD, &act, NULL);
-#endif
-
-  if( pipe(fd) < 0 ){
-    got = 0;
-  }
-  else if( (pid = fork()) < 0 ){
-    close(fd[0]);
-    close(fd[1]);
-    got=0;
-  }
-  else if( pid == 0 ){	/* child */
-    /* child write to parent that he is active */
-    close(fd[0]);
-    write(fd[1], &active, 1);
-    close(fd[1]);
-#ifdef USE_DOUBLE_FORK
-    /* second fork prevents zombies:
-       when child/parent exits, second child is inherited 
-       by init and thus is not a child of original parent */
-    if( (pid = fork()) >= 0 ){
-      /* child/parent exits */
-      if( pid > 0 )
-	exit(0);
-      /* new child goes on under init ... */
-    }
-#endif
-    /* enter the main loop and process */
-    XPAIOCallsXPA(0);
-    XPAClientLoop(xpa, mode);
-    exit(0);
-  } else {		/* parent */
-    /* parent waits for child to wake up */
-    close(fd[1]);
-    read(fd[0], &active, 1);
-    close(fd[0]);
-#ifdef USE_DOUBLE_FORK
-    /* for double fork, also wait for intermediate process to exit */
-    waitpid(pid, NULL, 0);
-#endif
-    /* fake end of clients */
-    for(got=0, client=xpa->clienthead; client!=NULL; ){
-      got++;
-      tclient = client->next;
-      if( (client->status == XPA_CLIENT_PROCESSING) && (client->datafd >=0) ){
-#if HAVE_CYGWIN
-	/* In Cygwin, we call shutdown (as well as close) to avoid Windows 
-	   problems.  The parent can't do this since the child is using the
-	   sockets, so we just close the sockets explicitly here */
-	xclose(client->datafd);
-	client->datafd = -1;
-	if( !xpa->persist ){
-	  xclose(client->cmdfd);
-	  client->cmdfd = -1;
-	}
-#endif
-	client->errptr = NULL;
-	/* remove this client if we are not meant to persist */
-	if( !xpa->persist ){
-	  XPAClientFree(xpa, client);
-	}
-	/* otherwise mark as inactive */
-	else{
-	  client->status = XPA_CLIENT_IDLE;
-	  client->bytes = 0;
-	}
-      }
-      client = tclient;
-    }
-  }
-  return(got);
-}
-#endif
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAClientConnect
- *
- * Purpose:	go to name service and get new names, merge with old,
- *		and connect to servers
- *
- * Returns:	number of connections
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPAClientConnect (XPA xpa, char *mode, char *xtemplate, int type)
-#else
-static int XPAClientConnect(xpa, mode, xtemplate, type)
-     XPA xpa;
-     char *mode;
-     char *xtemplate;
-     int type;
-#endif
-{
-  int i;
-  int n;
-  int got;
-  int lp=0;
-  int total=0;
-  char **xclasses;
-  char **names;
-  char **methods;
-  char **infos;
-  char xtype[2];
-  char xmode[SZ_LINE];
-  char tbuf[SZ_LINE];
-  char lbuf[SZ_LINE];
-  XPAClient client;
-
-  /* do some initialization */
-  XPAInitEnv();
-
-  /* make sure we have a target */
-  if( !xtemplate || !*xtemplate )
-    return(0);
-
-  /* make a string out of the type for the lookup */
-  xtype[0] = type;
-  xtype[1] = '\0';
-
-  /* reset the number of clients we are processing */
-  xpa->nclient = 0;
-
-  /* look for specific proxy info */
-  *xmode = '\0';
-  if( mode ){
-    strncpy(xmode, mode, SZ_LINE-1);
-    xmode[SZ_LINE-1] = '\0';
-  }
-  if( keyword(xmode, "ns", lbuf, SZ_LINE) ){
-    FPRINTF((stderr, "%sXPAClientConnect: using ns info: %s\n", _sp, lbuf));
-    newdtable("(),");
-    xclasses   = (char **)xmalloc(sizeof(char *));
-    names      = (char **)xmalloc(sizeof(char *));
-    methods    = (char **)xmalloc(sizeof(char *));
-    infos      = (char **)xmalloc(sizeof(char *));
-    if( word(lbuf, tbuf, &lp) )
-      xclasses[0] = xstrdup(tbuf);
-    if( word(lbuf, tbuf, &lp) )
-      names[0]   = xstrdup(tbuf);
-    if( word(lbuf, tbuf, &lp) )
-      methods[0] = xstrdup(tbuf);
-    infos[0] = xstrdup(XPA_DEF_CLIENT_INFO);
-    n = 1;
-    freedtable();
-  }
-  /* else ask xpans for access points matching the template */
-  else{
-    n = XPANSLookup(xpa, 
-		    xtemplate, xtype, &xclasses, &names, &methods, &infos);
-  }
-  /* mark existing clients who do not match this template */
-  for(got=0, client=xpa->clienthead; client !=NULL; client=client->next){
-    for(i=0; i<n; i++){
-      if( (client->type  == type)			&&
-	  (!strcmp(client->xclass, xclasses[i]))	&&
-	  (!strcmp(client->name,   names[i]))		&&
-	  (!strcmp(client->method, methods[i]))		&&
-	  (!strcmp(client->info,   infos[i]))		){
-	got++;
-      }
-    }
-    /* don't unmark if its a different type -- someone else might be active */
-    if( !got && (client->type == type) ){
-      client->status = XPA_CLIENT_IDLE;
-    }
-  }
-  /* add new clients for this type */
-  for(i=0; i<n; i++){
-    for(got=0, client=xpa->clienthead; client !=NULL; client=client->next){
-      if( (client->type  == type)			&&
-	  (!strcmp(client->xclass, xclasses[i]))	&&
-	  (!strcmp(client->name,   names[i]))		&&
-	  (!strcmp(client->method, methods[i]))		&&
-	  (!strcmp(client->info,   infos[i]))		){
-	/* might have to change the template */
-	if( strcmp(client->xtemplate, xtemplate) ){
-	  xfree(client->xtemplate);
-	  client->xtemplate = xstrdup(xtemplate);
-	}
-	client->status = XPA_CLIENT_ACTIVE;
-	got++;
-	total++;
-	FPRINTF((stderr, "%sXPAClientConnect: existing match: %s %s %s\n",
-		_sp, xclasses[i], names[i], methods[i]));
-	break;
-      }
-    }
-    if( !got ){
-      FPRINTF((stderr, "%sXPAClientConnect: calls XPAClientNew for %s:%s %s\n",
-	       _sp, xclasses[i], names[i], methods[i]));
-      if( XPAClientNew(xpa, mode, xtemplate, type,
-		       xclasses[i], names[i], methods[i], infos[i]) )
-	total++;
-    }
-    /* done with these strings */
-    xfree(xclasses[i]);
-    xfree(names[i]);
-    xfree(methods[i]);
-    xfree(infos[i]);
-  }
-  /* free up arrays alloc'ed by names server */
-  if( n > 0 ){
-    xfree(xclasses);
-    xfree(names);
-    xfree(methods);
-    xfree(infos);
-  }
-  return(total);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAClientStart
- *
- * Purpose:	send init string to server and perform other authentication
- *		tasks
- *
- * Returns:	0 if success, -1 otherwise
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPAClientStart (XPA xpa, XPAClient client, char *paramlist, char *mode)
-#else
-static int XPAClientStart(xpa, client, paramlist, mode)
-     XPA xpa;
-     XPAClient client;
-     char *paramlist;
-     char *mode;
-#endif
-{
-  int fd=0;
-  int lp=0;
-  int flags;
-  int tries=0;
-  int dmode=0;
-  int keep_alive=1;
-  unsigned int ip=0;
-  unsigned short port;
-  char tbuf[SZ_LINE];
-  char tbuf2[SZ_LINE];
-  char lbuf[SZ_LINE];
-  char *cmd=NULL;
-  char *method=NULL;
-  struct sockaddr_in sock_in;
-#if HAVE_SYS_UN_H
-  struct sockaddr_un sock_un;
-#endif
-
-  switch(client->type){
-  case 'a':
-    cmd = "xpaaccess";
-    break;
-  case 'g':
-    cmd = "xpaget";
-    break;
-  case 'i':
-    cmd = "xpainfo";
-    break;
-  case 's':
-    cmd = "xpaset";
-    break;
-  }
-
-  /* get mode flags */
-  XPAMode(mode, &(client->mode), "ack", XPA_CLIENT_ACK, 1);
-  if( client->type == 's' )
-    XPAMode(mode, &(xpa->client_mode), "verify", XPA_CLIENT_VERIFY, 0);
-  /* package up and send the initialization message */
-  strcpy(lbuf, cmd);
-  /* set and save the id value */
-  snprintf(tbuf, SZ_LINE, "%c%d", client->type, id++);
-  if( client->id ) xfree(client->id);
-  client->id = xstrdup(tbuf);
-  /* if we are using the xpans proxy, we will want to call
-     accept() (server calls connect()) for the data channel */
-  if( client->nsproxy )
-    strcat(lbuf, " -a");
-  /* set the value of the client big-endian-ness */
-  snprintf(tbuf, SZ_LINE, " -e %s", XPAEndian() ? "big" : "little");
-  strcat(lbuf, tbuf);
-  snprintf(tbuf, SZ_LINE, " -i %s", client->id);
-  strcat(lbuf, tbuf);
-  if( !(client->mode & XPA_CLIENT_ACK) )
-    strcat(lbuf, " -n");
-  if( strcmp(client->info, XPA_DEF_CLIENT_INFO) ){
-    snprintf(tbuf, SZ_LINE, " -p %s", client->info);
-    strcat(lbuf, tbuf);
-  }
-  snprintf(tbuf, SZ_LINE, " %s:%s", client->xclass, client->name);
-  strcat(lbuf, tbuf);
-  if( paramlist && *paramlist ){
-    strcat(lbuf, " ");
-    strncat(lbuf, paramlist, MAX(0,(int)(SZ_LINE-(int)strlen(lbuf)-2)));
-  }
-  strcat(lbuf, "\n");
-  FPRINTF((stderr, "%sXPAClientStart: fd %d sends:\n%s",
-	   _sp, client->cmdfd, lbuf));
-  if( XPAPuts(NULL, client->cmdfd, lbuf, XPAShortTimeout()) <= 0 ){
-    goto error;
-  }
-
-  /* if xpainfo and no ack'ing, we are basically done */
-  if( (client->type == 'i') && !(client->mode & XPA_CLIENT_ACK) ){
-    goto done;
-  }
-
-  /* authentication */
-retry:
-  lp = 0;
-  if( XPAGets(NULL, client->cmdfd, lbuf, SZ_LINE, XPAShortTimeout()) >0 ){
-    FPRINTF((stderr, "%sXPAClientStart: fd %d received cmd:\n%s", _sp,
-	     client->cmdfd, lbuf));
-    /* this should never happen */
-    if( !word(lbuf, tbuf, &lp) || (*tbuf == '?') ){
-      snprintf(errbuf, SZ_LINE,
-	       "XPA$WARNING: Protocol mismatch: id\n%s", lbuf);
-      goto error;
-    }
-    /* make sure we are dealing with a proper message */
-    if( strcmp(tbuf, client->id) ){
-      FPRINTF((stderr, "%sXPA$WARNING: ignoring out of sync message:\n", _sp));
-      FPRINTF((stderr, "%s", lbuf));
-      if( XPAVerbosity() > 1 ){
-	fprintf(stderr, "XPA$WARNING: ignoring out of sync server message:\n");
-	fprintf(stderr, "%s", lbuf);
-      }
-      goto retry;
-    }
-
-    /* this should never happen */
-    if( !word(lbuf, tbuf, &lp) ){
-      snprintf(errbuf, SZ_LINE, "XPA$WARNING: missing BUF request\n%s", lbuf);
-      goto error;
-    }
-    if( !strcmp(tbuf, "XPA$NODATA") || !strcmp(tbuf, "XPA$NOBUF") ){
-      xpa->nclient += 1;
-      goto started;
-    }
-    /* support 2.2 (DATA) and 2.0,2.1 (BUF) */
-    else if( !strcmp(tbuf, "XPA$DATA") || !strcmp(tbuf, "XPA$BUF") ){
-      if( !strcmp(tbuf, "XPA$DATA") ){
-	dmode |= DATA_DATA;
-	if( !word(lbuf, tbuf, &lp) ){
-	  snprintf(errbuf, SZ_LINE,
-		   "XPA$WARNING: missing DATA request type\n%s", lbuf);
-	  goto error;
-	}
-	if( !strcmp(tbuf, "connect") ){
-	  method = client->method;
-	  dmode |= DATA_CONNECT;
-	}
-	else if( !strcmp(tbuf, "accept") ){
-	  method = client->method;
-	  dmode |= DATA_ACCEPT;
-	}
-	else{
-	  snprintf(errbuf, SZ_LINE,
-		  "XPA$WARNING: invalid data connection request: %s (%s:%s)\n",
-		  tbuf, client->xclass, client->name);
-	  goto error;
-	}
-      }
-      else if( !strcmp(tbuf, "XPA$BUF") ){
-	if( !word(lbuf, tbuf, &lp) ){
-	  snprintf(errbuf, SZ_LINE,
-		   "XPA$ERROR: missing data buffer method (%s:%s%s)\n",
-		   client->xclass, client->name, XPATimestamp());
-	  goto error;
-	}
-	method = tbuf;
-	dmode |= DATA_CONNECT;
-      }
-      /* handle connect-type requests */
-      if( dmode & DATA_CONNECT ){
-	switch(XPAMethod(method)){
-	case XPA_INET:
-	  XPAParseIpPort(method, &ip, &port);
-	  /* connect to the server before we go further */
-	  if( (fd = xsocket(AF_INET, SOCK_STREAM, 0)) < 0 ){
-	    snprintf(errbuf, SZ_LINE,
-		     "XPA$ERROR: bad socket for data chan (%s:%s%s)\n",
-		     client->xclass, client->name, XPATimestamp());
-	    if( XPAVerbosity() ){
-	      perror("XPA client socket");
-	    }
-	    goto error;
-	  }
-	  setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE,
-		     (char *)&keep_alive, sizeof(keep_alive));
-	  memset((char *)&sock_in, 0, sizeof(sock_in));
-	  sock_in.sin_family = AF_INET;
-	  /* connect using the same ip we used for the command channel
-	     (i.e., could be localhost) */
-	  sock_in.sin_addr.s_addr = htonl(client->ip);
-	  sock_in.sin_port = htons(port);
-	  FPRINTF((stderr,
-		   "%sXPAClientStart: attempting dchan connect: %s\n",
-		   _sp, method));
-	  if( connect(fd, (struct sockaddr *)&sock_in, sizeof(sock_in)) < 0 ){
-	    PERROR(("dchan connect"));
-	    snprintf(errbuf, SZ_LINE,
-		   "XPA$ERROR: can't connect to data chan (%s:%s%s)\n",
-		   client->xclass, client->name, XPATimestamp());
-	    if( XPAVerbosity() ){
-	      perror("XPA client connect");
-	    }
-	    xclose(fd);
-	    goto error;
-	  }
-	  break;
-#if HAVE_SYS_UN_H
-	case XPA_UNIX:
-again:
-	  /* open a socket and fill in socket information */
-	  if( (fd = xsocket(AF_UNIX, SOCK_STREAM, 0)) < 0 ){
-	    snprintf(errbuf, SZ_LINE,
-		     "XPA$ERROR: bad socket for data chan (%s:%s%s)\n",
-		     client->xclass, client->name, XPATimestamp());
-	    if( XPAVerbosity() ){
-	      perror("XPA client socket");
-	    }
-	    goto error;
-	  }
-	  setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE,
-		     (char *)&keep_alive, sizeof(keep_alive));
-	  memset((char *)&sock_un, 0, sizeof(sock_un));
-	  sock_un.sun_family = AF_UNIX;
-	  strcpy(sock_un.sun_path, method);
-	  FPRINTF((stderr,
-		   "%sXPAClientStart: attempting dchan connect: %s\n",
-		   _sp, method));
-	  if( connect(fd, (struct sockaddr *)&sock_un, sizeof(sock_un)) < 0 ){
-	    PERROR(("dchan connect"));
-	    xclose(fd);
-	    if( (xerrno == ECONNREFUSED) && (tries < XPA_RETRIES) ){
-	      tries++;
-	      xclose(fd);
-	      XPASleep(10);
-	      goto again;
-	    }
-	    /* give up */
-	    else{
-	      snprintf(errbuf, SZ_LINE,
-		  "XPA$ERROR: can't connect to data chan (%s:%s%s)\n",
-		  client->xclass, client->name, XPATimestamp());
-	      if( XPAVerbosity() ){
-		perror("XPA client connect");
-	      }
-	      goto error;
-	    }
-	  }
-	  break;
-#endif
-	default:
-	  snprintf(errbuf, SZ_LINE,
-		   "XPA$ERROR: unknown connection method (%s:%s%s)\n",
-		   client->xclass, client->name, XPATimestamp());
-	  goto error;
-	}
-      }
-      /* handle "doaccept" requests */
-      else if( dmode & DATA_ACCEPT ){
-	fd = XPAProxyAccept(xpa, XPANSMethod(NULL,2),
-			    client->xclass, client->name, client->cmdfd,
-			    NULL, NULL, tbuf2);
-	if( fd < 0 ){
-	  snprintf(errbuf, SZ_LINE,
-		   "XPA$ERROR: can't connect to proxy server (%s:%s%s)\n",
-		   client->xclass, client->name, XPATimestamp());
-	  goto error;
-	}
-	else if( *tbuf2 ){
-	  client->dataname = xstrdup(tbuf2);
-	}
-      }
-
-      /* common code for either type of data connect request */
-      client->datafd = fd;
-      /* make sure we close on exec */
-      xfcntl(client->datafd, F_SETFD, FD_CLOEXEC);
-      /* for senders, set to no block mode */
-      if( client->type == 's' ){
-	/* save state and set in non-blocking mode */
-	xfcntl_nonblock(client->datafd, flags);
-      }
-      xpa->nclient += 1;
-      goto started;
-    }
-    /* handle error message */
-    else if( !strcmp(tbuf, "XPA$ERROR") ){
-      snprintf(errbuf, SZ_LINE, "%s", &lbuf[lp]);
-      goto error;
-    }
-    /* everything else is an error */
-    else{
-      snprintf(errbuf, SZ_LINE, "%s", &lbuf[lp]);
-      goto error;
-    }
-  }
-  else{
-    snprintf(errbuf, SZ_LINE,
-	   "XPA$ERROR: no response from server during handshake (%s:%s%s)\n",
-	   client->xclass, client->name, XPATimestamp());
-    goto error;
-  }
-
-error:
-  FPRINTF((stderr, "Error in XPAClientStart: %s", errbuf));
-  XPAClientFree(xpa, client);
-  return(-1);
-
-started:
-  /* it is necessary to add this this extra hack/ack between the
-     authentication ack and the error return (both from the server)
-     to avoid getting Nagle buffered. if we already did an accept,
-     however, we already sent a message and need not repeat it */
-  if( !(dmode & DATA_ACCEPT) ){
-    FPRINTF((stderr, "%sXPAClientStart: %d sending nagle\n",
-	     _sp, client->cmdfd));
-    XPAPuts(NULL, client->cmdfd, "xpanagle\n", XPAShortTimeout());
-  }
-
-  /* write a "data request" to the server on the data channel, supplying
-     the arguments to allow the server to find the associated command */
-  if( dmode & DATA_DATA ){
-    if( !word(lbuf, tbuf, &lp) )
-      strcpy(tbuf, "?");
-    if( !word(lbuf, tbuf2, &lp) )
-      strcpy(tbuf2, "?");
-    snprintf(lbuf, SZ_LINE, "xpadata -f %s %s\n", tbuf, tbuf2);
-    FPRINTF((stderr,
-	     "%sXPAClientStart: sending data channel %d request: %s", _sp,
-	     client->datafd, lbuf));
-    if( XPAPuts(NULL, client->datafd, lbuf, XPAShortTimeout()) <0 ){
-      snprintf(errbuf, SZ_LINE,
-	       "XPA$ERROR: unable to issue data request: %s (%s:%s%s)\n", 
-	       lbuf, client->xclass, client->name, XPATimestamp());
-      FPRINTF((stderr, "%sXPAClientStart: error returned is %s", _sp, errbuf));
-      goto error;
-    }
-  }
-
-done:
-  /* mark as active and started */
-  client->status = XPA_CLIENT_PROCESSING;
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- *			Public Routines
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/*
- *---------------------------------------------------------------------------
- *
- * Routine: 	XPAClientValid
- *
- * Purpose: 	see if the xpa client struct is valid
- *
- * Results:	1 on success, 0 for failure
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAClientValid (XPA xpa)
-#else
-int XPAClientValid(xpa)
-     XPA xpa;
-#endif
-{
-  return(_XPAValid(xpaclienthead, xpa, "c"));
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAOpen
- *
- * Purpose:	open a persistent XPA client connection
- *
- * Returns:	XPA struct on success
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-XPA 
-XPAOpen (char *mode)
-#else
-XPA XPAOpen(mode)
-     char *mode;
-#endif
-{
-  XPA xpa;
-
-  /* allocate xpa struct */
-  if( (xpa = (XPA)xcalloc(1, sizeof(XPARec))) == NULL )
-    return(NULL);
-  /* add version */
-  xpa->version = xstrdup(XPA_VERSION);
-  /* mark this as a client struct */
-  xpa->type = xstrdup("c");
-  /* mark as persistent so we don't destroy at the end of the transfer */
-  xpa->persist = 1;
-
-  /* add this xpa to end of list of client xpas */
-  XPAListAdd(&xpaclienthead, xpa);
-
-  return(xpa);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAClose
- *
- * Purpose:	close a persistent XPA client connection
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void 
-XPAClose (XPA xpa)
-#else
-void XPAClose(xpa)
-     XPA xpa;
-#endif
-{
-  XPAClient client, tclient;
-  NS ns, tns;
-
-  /* ignore struct if its not a client struct */
-  if( !XPAClientValid(xpa) )
-      return;
-
-  /* remove from list of client xpas */
-  XPAListDel(&xpaclienthead, xpa);
-
-  /* free each remaining client */
-  for(client=xpa->clienthead; client!=NULL; ){
-    tclient = client->next;
-    XPAClientFree(xpa, client);
-    client = tclient;
-  }
-
-  /* close down the name server and all of the remotes for this xpa */
-  for(ns=xpa->nshead; ns!=NULL; ){
-    tns = ns->next;
-    XPANSClose(xpa, ns);
-    ns = tns;
-  }
-
-  /* free string space */
-  if( xpa->version )
-    xfree(xpa->version);
-  if( xpa->type )
-    xfree(xpa->type);
-  if( xpa )
-    xfree(xpa);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAGet
- *
- * Purpose:	get XPA values
- *
- * Returns:	0 for success, -1 for failure
- *		len bytes of data returned in buf
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAGet (XPA xpa, char *xtemplate, char *paramlist, char *mode,
-	char **bufs, size_t *lens, char **names, char **messages, int n)
-#else
-int XPAGet(xpa, xtemplate, paramlist, mode, bufs, lens, names, messages, n)
-     XPA  xpa; 
-     char *xtemplate;
-     char *paramlist;
-     char *mode;
-     char **bufs;
-     size_t *lens;
-     char **names;
-     char **messages;
-     int n;
-#endif
-{
-  int i;
-  int oldmode=0;
-  int xmode=0;
-  int type='g';
-  int idef=1;
-  int got=0;
-  char tbuf[SZ_LINE];
-  XPAClient client, tclient;
-
-  FPRINTF((stderr, "%sXPAGet: starting\n", _sp));
-  /* if not persistent, we need a temp xpa struct;
-     (also ignore passed struct if its not a client struct) */
-  if( (xpa == NULL) || strcmp(xpa->type, "c")  ){
-    if( (xpa = XPAOpen(NULL)) == NULL )
-      return(-1);
-    /* mark this as not persistent */
-    xpa->persist = 0;
-  }
-  /* save xpa mode -- this call might override */
-  else{
-    /* make sure we have a valid client handle */
-    if( !XPAClientValid(xpa) ){
-      if( XPAVerbosity() ){
-	fprintf(stderr, "XPA$ERROR: invalid xpa client handle\n");
-      }
-      return(-1);
-    }
-    oldmode = xpa->client_mode;
-  }
-
-  /* these arrays are required */
-  if( (bufs == NULL) || (lens == NULL) ){
-    got = -1;
-    goto done;
-  }
-
-  /* flag that we don't read from stdin */
-  xpa->ifd = -1;
-
-  /* zero out the return buffers */
-  memset((char *)bufs,  0, ABS(n)*sizeof(char *));
-  memset((char *)lens,  0, ABS(n)*sizeof(size_t));
-  if( names != NULL )
-    memset((char *)names, 0, ABS(n)*sizeof(char *));
-  if( messages != NULL )
-    memset((char *)messages, 0, ABS(n)*sizeof(char *));
-
-  /* connect to clients and grab data */
-  if( XPAClientConnect(xpa, mode, xtemplate, type) >0 ){
-    /* retrieve data from n active clients */
-    for(client=xpa->clienthead; client!=NULL; ){
-      tclient = client->next;
-      if( (client->type == type) && (client->status != XPA_CLIENT_IDLE) &&
-	  (got<ABS(n)) ){
-	if( names != NULL ){
-	  snprintf(tbuf, SZ_LINE, "%s:%s %s",
-		   client->xclass, client->name, client->method);
-	  names[got] = xstrdup(tbuf);
-	}
-	if( XPAClientStart(xpa, client, paramlist, mode) >=0 ){
-	  /* we fill buffers */
-	  client->mode |= XPA_CLIENT_BUF;
-	  client->bufptr = &(bufs[got]);
-	  client->lenptr = &(lens[got]);
-	  if( names != NULL )
-	    client->nameptr = &(names[got]);
-	  if( messages != NULL )
-	    client->errptr = &(messages[got]);
-	}
-	else{
-	  if( messages != NULL )
-	    messages[got] = xstrdup(errbuf);
-	}
-	got++;
-      }
-      client = tclient;
-    }
-    /* if we have active clients */
-    if( got ){
-#if HAVE_MINGW32==0
-      /* check for loop modes */
-      XPAMode(mode, &xmode, "dofork", XPA_CLIENT_SEL_FORK, 0);
-      /* dofork implies don't do xpa */
-      if( xmode & XPA_CLIENT_SEL_FORK )
-	idef = 0;
-      XPAMode(mode, &xmode, "doxpa",  XPA_CLIENT_SEL_XPA, idef);
-      if( xmode & XPA_CLIENT_SEL_FORK ){
-	XPAClientLoopFork(xpa, xmode);
-      }
-      else{
-	/* enter the main loop and process */
-	XPAClientLoop(xpa, xmode);
-      }
-#else
-      XPAMode(mode, &xmode, "doxpa",  XPA_CLIENT_SEL_XPA, idef);
-      XPAClientLoop(xpa, xmode);
-#endif
-    }
-  }
-
-done:
-  /* look for clients who timed out */
-  for(i=0, client=xpa->clienthead; client!=NULL; client=client->next){
-    if( (client->type == type) && (client->status != XPA_CLIENT_IDLE) &&
-	(i<ABS(n)) ){
-      i++;
-      if( (client->status == XPA_CLIENT_PROCESSING) && ( messages != NULL) ){
-	snprintf(errbuf, SZ_LINE,
-		 "XPA$ERROR: no response from server callback (%s:%s%s)\n",
-		 client->xclass, client->name, XPATimestamp());
-	messages[i] = xstrdup(errbuf);
-      }
-    }
-  }
-  /* remove this xpa if we are not meant to persist */
-  if( xpa && !xpa->persist )
-    XPAClose(xpa);
-  /* restore xpa mode -- this call might override */
-  else
-    xpa->client_mode = oldmode;
-
-  /* return number of clients processes (including errors) */
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAGetFd
- *
- * Purpose:	get XPA values
- *
- * Returns:	0 for success, -1 for failure
- *		len bytes of data returned in buf
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAGetFd (XPA xpa, char *xtemplate, char *paramlist, char *mode,
-	      int *fds, char **names, char **messages, int n)
-#else
-int XPAGetFd(xpa, xtemplate, paramlist, mode, fds, names, messages, n)
-     XPA  xpa;
-     char *xtemplate;
-     char *paramlist;
-     int  *fds;
-     char *mode;
-     char **names;
-     char **messages;
-     int n;
-#endif
-{
-  int i;
-  int oldmode=0;
-  int xmode=0;
-  int got=0;
-  int type='g';
-  int idef=1;
-  char tbuf[SZ_LINE];
-  XPAClient client, tclient;
-
-  FPRINTF((stderr, "%sXPAGetFd: starting\n", _sp));
-  /* if not persistent, we need a temp xpa struct;
-     (also ignore passed struct if its not a client struct) */
-  if( (xpa == NULL) || strcmp(xpa->type, "c")  ){
-    if( (xpa = XPAOpen(NULL)) == NULL )
-      return(-1);
-    /* mark this as not persistent */
-    xpa->persist = 0;
-  }
-  /* save xpa mode -- this call might override */
-  else{
-    /* make sure we have a valid client handle */
-    if( !XPAClientValid(xpa) ){
-      if( XPAVerbosity() ){
-	fprintf(stderr, "XPA$ERROR: invalid xpa client handle\n");
-      }
-      return(-1);
-    }
-    oldmode = xpa->client_mode;
-  }
-
-  /* flag that we don't read from stdin */
-  xpa->ifd = -1;
-
-  /* zero out the return buffers */
-  if( names != NULL )
-    memset((char *)names, 0, ABS(n)*sizeof(char *));
-  if( messages != NULL )
-    memset((char *)messages, 0, ABS(n)*sizeof(char *));
-
-  /* connect to clients and grab data */
-  if( XPAClientConnect(xpa, mode, xtemplate, type) > 0 ){
-    /* retrieve data from n active clients */
-    for(client=xpa->clienthead; client!=NULL; ){
-      tclient = client->next;
-      if( (client->type == type) && (client->status != XPA_CLIENT_IDLE) &&
-	  (got<ABS(n)) ){
-	if( names != NULL ){
-	  snprintf(tbuf, SZ_LINE, "%s:%s %s",
-		   client->xclass, client->name, client->method);
-	  names[got] = xstrdup(tbuf);
-	}
-	if( XPAClientStart(xpa, client, paramlist, mode) >= 0 ){
-	  /* we write to an fd */
-	  client->mode |= XPA_CLIENT_FD;
-	  /* negative value => one channel for all clients */
-	  if( n < 0 )
-	    client->fd = fds[0];
-	  else
-	    client->fd = fds[got];
-	  client->bufptr = (char **)xcalloc(1, sizeof(char *));
-	  client->lenptr = (size_t *)xcalloc(1, sizeof(size_t));
-	  if( names != NULL )
-	    client->nameptr = &(names[got]);
-	  if( messages != NULL )
-	    client->errptr = &(messages[got]);
-	}
-	else{
-	  if( messages != NULL )
-	    messages[got] = xstrdup(errbuf);
-	}
-	got++;
-      }
-      client = tclient;
-    }
-    /* if we have active clients */
-    if( got ){
-#if HAVE_MINGW32==0
-      /* check for loop modes */
-      XPAMode(mode, &xmode, "dofork", XPA_CLIENT_SEL_FORK, 0);
-      /* dofork implies don't do xpa */
-      if( xmode & XPA_CLIENT_SEL_FORK )
-	idef = 0;
-      XPAMode(mode, &xmode, "doxpa",  XPA_CLIENT_SEL_XPA, idef);
-      if( xmode & XPA_CLIENT_SEL_FORK ){
-	XPAClientLoopFork(xpa, xmode);
-      }
-      else{
-	/* enter the main loop and process */
-	XPAClientLoop(xpa, xmode);
-      }
-#else
-      XPAMode(mode, &xmode, "doxpa",  XPA_CLIENT_SEL_XPA, idef);
-      XPAClientLoop(xpa, xmode);
-#endif
-    }
-  }
-  /* look for clients who timed out */
-  for(i=0, client=xpa->clienthead; client!=NULL; client=client->next){
-    if( (client->type == type) && (client->status != XPA_CLIENT_IDLE) &&
-	(i<ABS(n)) ){
-      i++;
-      if( (client->status == XPA_CLIENT_PROCESSING) && ( messages != NULL) ){
-	snprintf(errbuf, SZ_LINE,
-		 "XPA$ERROR: no response from server callback (%s:%s%s)\n",
-		 client->xclass, client->name, XPATimestamp());
-	messages[i] = xstrdup(errbuf);
-      }
-    }
-  }
-  /* remove this xpa if we are not meant to persist */
-  if( xpa && !xpa->persist )
-    XPAClose(xpa);
-  /* restore xpa mode -- this call might override */
-  else
-    xpa->client_mode = oldmode;
-
-  /* return number of clients processes (including errors) */
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASet
- *
- * Purpose:	set XPA values
- *
- * Returns:	0 for success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPASet (XPA xpa, char *xtemplate, char *paramlist, char *mode,
-	char *buf, size_t len, char **names, char **messages, int n)
-#else
-int XPASet(xpa, xtemplate, paramlist, mode, buf, len, names, messages, n)
-     XPA  xpa;
-     char *xtemplate;
-     char *paramlist;
-     char *mode;
-     char *buf;
-     size_t len;
-     char **names;
-     char **messages;
-     int n;
-#endif
-{
-  int i;
-  int oldmode=0;
-  int xmode=0;
-  int got=0;
-  int type='s';
-  int idef=1;
-  char tbuf[SZ_LINE];
-  XPAClient client, tclient;
-
-  FPRINTF((stderr, "%sXPASet: starting\n", _sp));
-  /* if not persistent, we need a temp xpa struct;
-     (also ignore passed struct if its not a client struct) */
-  if( (xpa == NULL) || strcmp(xpa->type, "c")  ){
-    if( (xpa = XPAOpen(NULL)) == NULL )
-      return(-1);
-    /* mark this as not persistent */
-    xpa->persist = 0;
-  }
-  /* save xpa mode -- this call might override */
-  else{
-    /* make sure we have a valid client handle */
-    if( !XPAClientValid(xpa) ){
-      if( XPAVerbosity() ){
-	fprintf(stderr, "XPA$ERROR: invalid xpa client handle\n");
-      }
-      return(-1);
-    }
-    oldmode = xpa->client_mode;
-  }
-
-  /* flag that we don't read from stdin */
-  xpa->ifd = -1;
-
-  /* zero out the return buffers */
-  if( names != NULL )
-    memset((char *)names, 0, ABS(n)*sizeof(char *));
-  if( messages != NULL )
-    memset((char *)messages, 0, ABS(n)*sizeof(char *));
-
-  /* connect to clients and grab data */
-  if( XPAClientConnect(xpa, mode, xtemplate, type) >0 ){
-    /* retrieve data from n active clients */
-    for(client=xpa->clienthead; client!=NULL; ){
-      tclient = client->next;
-      if( (client->type == type) && (client->status != XPA_CLIENT_IDLE) &&
-	  (got<ABS(n)) ){
-	if( names != NULL ){
-	  snprintf(tbuf, SZ_LINE, "%s:%s %s",
-		   client->xclass, client->name, client->method);
-	  names[got] = xstrdup(tbuf);
-	}
-	if( XPAClientStart(xpa, client, paramlist, mode) >= 0 ){
-	  /* we fill buffers */
-	  client->mode |= XPA_CLIENT_BUF;
-	  client->buf = buf;
-	  client->len = len;
-	  if( names != NULL )
-	    client->nameptr = &(names[got]);
-	  if( messages != NULL )
-	    client->errptr = &(messages[got]);
-	}
-	else{
-	  if( messages != NULL )
-	    messages[got] = xstrdup(errbuf);
-	}
-	got++;
-      }
-      client = tclient;
-    }
-    /* if we have active clients */
-    if( got ){
-#if HAVE_MINGW32==0
-      /* check for loop modes */
-      XPAMode(mode, &xmode, "dofork", XPA_CLIENT_SEL_FORK, 0);
-      /* dofork implies don't do xpa */
-      if( xmode & XPA_CLIENT_SEL_FORK )
-	idef = 0;
-      XPAMode(mode, &xmode, "doxpa",  XPA_CLIENT_SEL_XPA, idef);
-      if( xmode & XPA_CLIENT_SEL_FORK ){
-	XPAClientLoopFork(xpa, xmode);
-      }
-      else{
-	/* enter the main loop and process */
-	XPAClientLoop(xpa, xmode);
-      }
-#else
-      XPAMode(mode, &xmode, "doxpa",  XPA_CLIENT_SEL_XPA, idef);
-      XPAClientLoop(xpa, xmode);
-#endif
-    }
-  }
-  /* look for clients who timed out */
-  for(i=0, client=xpa->clienthead; client!=NULL; client=client->next){
-    if( (client->type == type) && (client->status != XPA_CLIENT_IDLE) &&
-	(i<ABS(n)) ){
-      i++;
-      if( (client->status == XPA_CLIENT_PROCESSING) && ( messages != NULL) ){
-	snprintf(errbuf, SZ_LINE,
-		 "XPA$ERROR: no response from server callback (%s:%s%s)\n",
-		 client->xclass, client->name, XPATimestamp());
-	messages[i] = xstrdup(errbuf);
-      }
-    }
-  }
-  /* remove this xpa if we are not meant to persist */
-  if( xpa && !xpa->persist )
-    XPAClose(xpa);
-  /* restore xpa mode -- this call might override */
-  else
-    xpa->client_mode = oldmode;
-
-  /* return number of clients processes (including errors) */
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASetFd
- *
- * Purpose:	set XPA values
- *
- * Returns:	0 for success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPASetFd (XPA xpa, char *xtemplate, char *paramlist, char *mode,
-	      int fd, char **names, char **messages, int n)
-#else
-int XPASetFd(xpa, xtemplate, paramlist, mode, fd, names, messages, n)
-     XPA  xpa;
-     char *xtemplate;
-     char *paramlist;
-     char *mode;
-     int fd;
-     char **names;
-     char **messages;
-     int n;
-#endif
-{
-  int i;
-  int oldmode=0;
-  int xmode=0;
-  int got=0;
-  int got2=0;
-  int type='s';
-  int idef=1;
-  int flags;
-  char *s;
-  char tbuf[SZ_LINE];
-  XPAClient client, tclient;
-
-  FPRINTF((stderr, "%sXPASetFd: starting\n", _sp));
-  /* if not persistent, we need a temp xpa struct;
-     (also ignore passed struct if its not a client struct) */
-  if( (xpa == NULL) || strcmp(xpa->type, "c")  ){
-    if( (xpa = XPAOpen(NULL)) == NULL )
-      return(-1);
-    /* mark this as not persistent */
-    xpa->persist = 0;
-  }
-  /* save xpa mode -- this call might override */
-  else{
-    /* make sure we have a valid client handle */
-    if( !XPAClientValid(xpa) ){
-      if( XPAVerbosity() ){
-	fprintf(stderr, "XPA$ERROR: invalid xpa client handle\n");
-      }
-      return(-1);
-    }
-    oldmode = xpa->client_mode;
-  }
-
-  /* Set non-blocking mode for the input fd, if its not a tty */
-  xpa->ifd = fd;
-  if( isatty(xpa->ifd) == 0 ){
-    /* save state and set in non-blocking mode */
-    xfcntl_nonblock(xpa->ifd, flags);
-  }
-  /* zero out the return buffers */
-  if( names != NULL )
-    memset((char *)names, 0, ABS(n)*sizeof(char *));
-  if( messages != NULL )
-    memset((char *)messages, 0, ABS(n)*sizeof(char *));
-
-  /* connect to clients and grab data */
-  if( XPAClientConnect(xpa, mode, xtemplate, type) >0 ){
-    /* open clients all at once */
-    for(client=xpa->clienthead; client!=NULL; ){
-      tclient = client->next;
-      if( (client->type == type) && (client->status != XPA_CLIENT_IDLE) &&
-	  (got<ABS(n)) ){
-	if( names != NULL ){
-	  snprintf(tbuf, SZ_LINE, "%s:%s %s",
-		   client->xclass, client->name, client->method);
-	  names[got] = xstrdup(tbuf);
-	}
-	if( XPAClientStart(xpa, client, paramlist, mode) >= 0 ){
-	  /* we fill buffers */
-	  client->mode |= XPA_CLIENT_FD;
-	  if( names != NULL )
-	    client->nameptr = &(names[got]);
-	  if( messages != NULL )
-	    client->errptr = &(messages[got]);
-	}
-	else{
-	  if( messages != NULL )
-	    messages[got] = xstrdup(errbuf);
-	}
-	got++;
-      }
-      client = tclient;
-    }
-    /* if we have active clients */
-    if( got ){
-      /* if fd is null, user did not want to send data, just the paramlist */
-      if( fd < 0 ){
-	for(client=xpa->clienthead; client!=NULL; ){
-	  tclient = client->next;
-	  if( (client->type == type) && (client->status != XPA_CLIENT_IDLE) &&
-	      (got<ABS(n)) ){
-	    XPAClientDataSent(xpa, client);
-	    s = XPAClientEnd(xpa, client);
-	    if( (messages != NULL) && (messages[got2] == NULL) )
-	      messages[got2] = xstrdup(s);
-	    got2++;
-	  }
-	  client = tclient;
-	}
-      }
-      else{
-#if HAVE_MINGW32==0
-	/* check for loop modes */
-	XPAMode(mode, &xmode, "dofork", XPA_CLIENT_SEL_FORK, 0);
-	/* dofork implies don't do xpa */
-	if( xmode & XPA_CLIENT_SEL_FORK )
-	  idef = 0;
-	XPAMode(mode, &xmode, "doxpa",  XPA_CLIENT_SEL_XPA, idef);
-	if( xmode & XPA_CLIENT_SEL_FORK ){
-	  XPAClientLoopFork(xpa, xmode);
-	}
-	else{
-	  /* enter the main loop and process */
-	  XPAClientLoop(xpa, xmode);
-	}
-#else
-	XPAMode(mode, &xmode, "doxpa",  XPA_CLIENT_SEL_XPA, idef);
-	XPAClientLoop(xpa, xmode);
-#endif
-      }
-    }
-  }
-  /* look for clients who timed out */
-  for(i=0, client=xpa->clienthead; client!=NULL; client=client->next){
-    if( (client->type == type) && (client->status != XPA_CLIENT_IDLE) &&
-	  (i<ABS(n)) ){
-      i++;
-      if( (client->status == XPA_CLIENT_PROCESSING) && ( messages != NULL) ){
-	snprintf(errbuf, SZ_LINE,
-		 "XPA$ERROR: no response from server callback (%s:%s%s)\n",
-		 client->xclass, client->name, XPATimestamp());
-	messages[i] = xstrdup(errbuf);
-      }
-    }
-  }
-  /* reset flags, if necessary */
-  if( xpa->ifd >=0 && (isatty(xpa->ifd) ==0) ){
-    xfcntl(xpa->ifd, F_SETFL, flags);
-  }
-  /* free all input structs */
-  XPAClientFreeAllInputs(xpa);
-  /* remove this xpa if we are not meant to persist */
-  if( xpa && !xpa->persist )
-    XPAClose(xpa);
-  /* restore xpa mode -- this call might override */
-  else
-    xpa->client_mode = oldmode;
-
-  /* return number of clients processes (including errors) */
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAInfo
- *
- * Purpose:	send XPA info
- *
- * Returns:	0 for success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAInfo (XPA xpa, char *xtemplate, char *paramlist, char *mode,
-	 char **names, char **messages, int n)
-#else
-int XPAInfo(xpa, xtemplate, paramlist, mode, names, messages, n)
-     XPA  xpa;
-     char *xtemplate;
-     char *paramlist;
-     char *mode;
-     char **names;
-     char **messages;
-     int n;
-#endif
-{
-  int i;
-  int oldmode=0;
-  int got=0;
-  char type='i';
-  char *s;
-  char tbuf[SZ_LINE];
-  XPAClient client, tclient;
-
-  /* if not persistent, we need a temp xpa struct;
-     (also ignore passed struct if its not a client struct) */
-  if( (xpa == NULL) || strcmp(xpa->type, "c")  ){
-    if( (xpa = XPAOpen(NULL)) == NULL )
-      return(-1);
-    /* mark this as not persistent */
-    xpa->persist = 0;
-  }
-  /* save xpa mode -- this call might override */
-  else{
-    /* make sure we have a valid client handle */
-    if( !XPAClientValid(xpa) ){
-      if( XPAVerbosity() ){
-	fprintf(stderr, "XPA$ERROR: invalid xpa client handle\n");
-      }
-      return(-1);
-    }
-    oldmode = xpa->client_mode;
-  }
-
-  /* flag that we don't read from stdin */
-  xpa->ifd = -1;
-
-  /* zero out the return buffers */
-  if( names != NULL )
-    memset((char *)names, 0, ABS(n)*sizeof(char *));
-  if( messages != NULL )
-    memset((char *)messages, 0, ABS(n)*sizeof(char *));
-
-  /* connect to clients and grab data */
-  if( XPAClientConnect(xpa, mode, xtemplate, type) >0 ){
-    /* retrieve data from n active clients */
-    for(client=xpa->clienthead; client!=NULL; ){
-      tclient = client->next;
-      if( (client->type == type) && (client->status != XPA_CLIENT_IDLE) &&
-	  (got<ABS(n)) ){
-	if( names != NULL ){
-	  snprintf(tbuf, SZ_LINE, "%s:%s %s",
-		   client->xclass, client->name, client->method);
-	  names[got] = xstrdup(tbuf);
-	}
-	if( XPAClientStart(xpa, client, paramlist, mode) >= 0 ){
-	  XPAClientDataSent(xpa, client);
-	  s = XPAClientEnd(xpa, client);
-	  if( (messages != NULL) && (messages[got] == NULL) )
-	    messages[got] = xstrdup(s);
-	}
-	else{
-	  if( (messages != NULL) && (messages[got] == NULL) )
-	    messages[got] = xstrdup(errbuf);
-	}
-	got++;
-      }
-      client = tclient;
-    }
-  }
-  /* look for clients who timed out */
-  for(i=0, client=xpa->clienthead; client!=NULL; client=client->next){
-    if( (client->type == type) && (client->status != XPA_CLIENT_IDLE) &&
-	(i<ABS(n)) ){
-      i++;
-      if( (client->status == XPA_CLIENT_PROCESSING) && ( messages != NULL) ){
-	snprintf(errbuf, SZ_LINE,
-		 "XPA$ERROR: no response from server callback (%s:%s%s)\n",
-		 client->xclass, client->name, XPATimestamp());
-	messages[i] = xstrdup(errbuf);
-      }
-    }
-  }
-  /* remove this xpa if we are not meant to persist */
-  if( xpa && !xpa->persist )
-    XPAClose(xpa);
-  /* restore xpa mode -- this call might override */
-  else
-    xpa->client_mode = oldmode;
-
-  /* return number of clients processes (including errors) */
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAAccess
- *
- * Purpose:	determine if XPA access point is available
- *
- * Returns:	0 for success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAAccess (XPA xpa, char *xtemplate, char *paramlist, char *mode,
-	   char **names, char **messages, int n)
-#else
-int XPAAccess(xpa, xtemplate, paramlist, mode, names, messages, n)
-     XPA  xpa; 
-     char *xtemplate;
-     char *paramlist;
-     char *mode;
-     char **names;
-     char **messages;
-     int n;
-#endif
-{
-  int i;
-  int oldmode=0;
-  int xmode=0;
-  int got=0;
-  int type='a';
-  char *s;
-  char *ind1, *ind2;
-  char tbuf[SZ_LINE];
-  XPAClient client, tclient;
-
-  /* if not persistent, we need a temp xpa struct;
-     (also ignore passed struct if its not a client struct) */
-  if( (xpa == NULL) || strcmp(xpa->type, "c")  ){
-    if( (xpa = XPAOpen(NULL)) == NULL )
-      return(-1);
-    /* mark this as not persistent */
-    xpa->persist = 0;
-  }
-  /* save xpa mode -- this call might override */
-  else{
-    /* make sure we have a valid client handle */
-    if( !XPAClientValid(xpa) ){
-      if( XPAVerbosity() ){
-	fprintf(stderr, "XPA$ERROR: invalid xpa client handle\n");
-      }
-      return(-1);
-    }
-    oldmode = xpa->client_mode;
-  }
-
-  /* flag that we don't read from stdin */
-  xpa->ifd = -1;
-
-  /* zero out the return buffers */
-  if( names != NULL )
-    memset((char *)names, 0, ABS(n)*sizeof(char *));
-  if( messages != NULL )
-    memset((char *)messages, 0, ABS(n)*sizeof(char *));
-
-  /* connect to clients and grab data */
-  if( XPAClientConnect(xpa, mode, xtemplate, type) >0 ){
-    /* retrieve data from n active clients */
-    for(client=xpa->clienthead; client!=NULL; ){
-      tclient = client->next;
-      if( (client->type == type) && (client->status != XPA_CLIENT_IDLE) &&
-	  (got<ABS(n)) ){
-	if( names != NULL ){
-	  snprintf(tbuf, SZ_LINE, "%s:%s %s",
-		   client->xclass, client->name, client->method);
-	  names[got] = xstrdup(tbuf);
-	}
-	if( XPAClientStart(xpa, client, paramlist, mode) >=0 ){
-	  XPAClientDataSent(xpa, client);
-	  s = XPAClientEnd(xpa, client);
-	  if( (messages != NULL) && (messages[got] == NULL) )
-	    messages[got] = xstrdup(s);
-	}
-	else{
-	  if( (messages != NULL) && (messages[got] == NULL) )
-	    messages[got] = xstrdup(errbuf);
-	}
-	/* might have to fix the name if was an explicit mach:port */
-	if( names && names[got] && *errbuf &&
-	    !strncmp(names[got], "?:?", 3) &&
-	    (ind1=strrchr(errbuf, '(')) && (ind2=strrchr(errbuf, ')')) ){
-	  ind1++;
-	  strncpy(tbuf, ind1, ind2-ind1);
-	  tbuf[ind2-ind1] = '\0';
-	  xfree(names[got]);
-	  names[got] = xstrdup(tbuf);
-	}
-	got++;
-      }
-      client = tclient;
-    }
-    /* if we have active clients */
-    if( got ){
-      /* check for loop modes */
-      XPAMode(mode, &xmode, "doxpa",  XPA_CLIENT_SEL_XPA, 1);
-      /* enter the main loop and process */
-      XPAClientLoop(xpa, xmode);
-    }
-  }
-  /* look for clients who timed out */
-  for(i=0, client=xpa->clienthead; client!=NULL; client=client->next){
-    if( (client->type == type) && (client->status != XPA_CLIENT_IDLE) &&
-	(i<ABS(n)) ){
-      i++;
-      if( (client->status == XPA_CLIENT_PROCESSING) && ( messages != NULL) ){
-	snprintf(errbuf, SZ_LINE,
-		 "XPA$ERROR: no response from server callback (%s:%s%s)\n",
-		 client->xclass, client->name, XPATimestamp());
-	messages[i] = xstrdup(errbuf);
-      }
-    }
-  }
-  /* remove this xpa if we are not meant to persist */
-  if( xpa && !xpa->persist )
-    XPAClose(xpa);
-  /* restore xpa mode -- this call might override */
-  else
-    xpa->client_mode = oldmode;
-
-  /* return number of clients processes (including errors) */
-  return(got);
-}
-
diff --git a/xpa/clipboard.c b/xpa/clipboard.c
deleted file mode 100644
index 68df675..0000000
--- a/xpa/clipboard.c
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * remote.c -- xpa access control list management
- *
- */
-
-#include <xpap.h>
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- *			Private Routines
- *
- *
- *----------------------------------------------------------------------------
- */
-
-#ifdef ANSI_FUNC
-static XPAClip
-ClipBoardNew(XPA xpa, char *name)
-#else
-static XPAClip ClipBoardNew(xpa, name)
-     XPA xpa;
-     char *name;
-#endif
-{
-  XPAClip cur, xnew;
-  if( (xnew = (XPAClip)xcalloc(1, sizeof(XPAClipRec))) == NULL )
-    return(NULL);
-
-  /* fill in record structure */
-  xnew->name = xstrdup(name);
-  xnew->ip = xpa->comm->cmdip;
-
-  /* add to the end of list */
-  if( xpa->cliphead == NULL ){
-    xpa->cliphead = xnew;
-  }
-  else{
-    for(cur=xpa->cliphead; cur->next!=NULL; cur=cur->next){
-      ;
-    }
-    cur->next = xnew;
-  }
-  return xnew;
-}
-
-#ifdef ANSI_FUNC
-static XPAClip
-ClipBoardLookup(XPA xpa, char *name)
-#else
-static XPAClip ClipBoardLookup(xpa, name)
-     XPA xpa;
-     char *name;
-#endif
-{
-  XPAClip cur;
-
-  /* look for reserved keywords that have callbacks */
-  for(cur=xpa->cliphead; cur!=NULL; cur=cur->next){
-    if( !strcmp(name, cur->name) && (xpa->comm->cmdip == cur->ip) ){
-      return(cur);
-    }
-  }
-  return NULL;
-}
-
-#ifdef ANSI_FUNC
-static int
-ClipBoardAdd(XPA xpa, char *name, char *paramlist, char *buf)
-#else
-static int
-ClipBoardAdd(xpa, name, paramlist, buf)
-     XPA xpa;
-     char *name;
-     char *paramlist;
-     char *buf;
-#endif
-{
-  XPAClip cur;
-  if( !(cur = ClipBoardLookup(xpa, name)) )
-    cur = ClipBoardNew(xpa, name);
-  if( !cur )
-    return -1;
-  if( cur->value )
-    xfree(cur->value);
-  cur->value = xstrdup(buf);
-  return 0;
-}
-
-#ifdef ANSI_FUNC
-static int
-ClipBoardAppend(XPA xpa, char *name, char *paramlist, char *buf)
-#else
-static int
-ClipBoardAppend(xpa, name, paramlist, buf)
-     XPA xpa;
-     char *name;
-     char *paramlist;
-     char *buf;
-#endif
-{
-  XPAClip cur;
-  if( !(cur = ClipBoardLookup(xpa, name)) )
-    cur = ClipBoardNew(xpa, name);
-  if( !cur )
-    return -1;
-  if( cur->value ){
-    if( (cur->value = (char *)xrealloc(cur->value, 
-				       strlen(cur->value)+strlen(buf)+1)) )
-      strcat(cur->value, buf);
-    else
-      return -1;
-  }
-  else{
-    cur->value = xstrdup(buf);
-  }
-  return 0;
-}
-
-#ifdef ANSI_FUNC
-static int
-ClipBoardDelete(XPA xpa, char *name, char *paramlist)
-#else
-static int
-ClipBoardDelete(xpa, name, paramlist)
-     XPA xpa;
-     char *name;
-     char *paramlist;
-#endif
-{
-  XPAClip cur;
-  if( (cur = ClipBoardLookup(xpa, name)) ){
-    ClipBoardFree(xpa, cur);
-    return 0;
-  }
-  else
-    return -1;
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- *		Semi-Public Routines (used by xpa.c and command.c)
- *
- *
- *----------------------------------------------------------------------------
- */
-
-#ifdef ANSI_FUNC
-int
-ClipBoardFree(XPA xpa, XPAClip clip)
-#else
-int ClipBoardFree(xpa, clip)
-     XPA xpa;
-     XPAClip clip;
-#endif
-{
-  XPAClip cur;
-
-  if( !clip )
-    return 0;
-  /* remove from list */
-  if( xpa->cliphead ){
-    if( xpa->cliphead == clip ){
-      xpa->cliphead = clip->next;
-    }
-    else{
-      for(cur=xpa->cliphead; cur!=NULL; cur=cur->next){
-	if( cur->next == clip ){
-	  cur->next = clip->next;
-	  break;
-	}
-      }
-    }
-  }
-  if( clip->name ) xfree(clip->name);
-  if( clip->value ) xfree(clip->value);
-  xfree(clip);
-  return 1;
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAReceiveClipboard
- *
- * Purpose:	add a new clipboard entry
- *
- * Returns:	xpa callback error codes
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAReceiveClipboard (void *client_data, void *call_data, char *paramlist,
-	       char *buf, size_t len)
-#else
-int XPAReceiveClipboard(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     size_t len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  char cmd[SZ_LINE];
-  char name[SZ_LINE];
-  char tbuf[SZ_LINE];
-  int lp=0;
-  int status = -1;
-
-  *cmd = '\0';
-  *name = '\0';
-  if( paramlist && *paramlist ){
-    if( !word(paramlist, cmd, &lp) || !word(paramlist, name, &lp) )
-      goto done;
-    /* lookup the command */
-    if( !strcmp(cmd, "add") ){
-      status = ClipBoardAdd(xpa, name, &paramlist[lp], buf);
-    }
-    else if( !strncmp(cmd, "app", 3) ){
-      status = ClipBoardAppend(xpa, name, &paramlist[lp], buf);
-    }
-    else if( !strncmp(cmd, "del", 3) ){
-      status = ClipBoardDelete(xpa, name, &paramlist[lp]);
-    }
-#ifdef LATER
-    else if( !strncmp(cmd, "loa", 3) ){
-      status = ClipBoardLoad(xpa, name, &paramlist[lp], buf);
-    }
-    else if( !strncmp(cmd, "sav", 3) ){
-      status = ClipBoardSave(xpa, name, &paramlist[lp]);
-    }
-#endif
-  }
-
-done:
-  if( status < 0 ){
-    if( !*cmd || !*name ){
-      XPAError(xpa, "XPA clipboard requires: add|append|delete name\n");
-    }
-    else{
-      snprintf(tbuf, SZ_LINE,
-	       "XPA clipboard invalid cmd or name: %s %s\n", cmd, name);
-      XPAError(xpa, tbuf);
-    }
-  }
-  return(status);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASendClipboard
- *
- * Purpose:	return clipboard information
- *
- * Returns:	0 for success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPASendClipboard (void *client_data, void *call_data, char *paramlist,
-	    char **buf, size_t *len)
-#else
-int XPASendClipboard(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char **buf;
-     size_t *len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  char name[SZ_LINE];
-  char tbuf[SZ_LINE];
-  int lp=0;
-  int status = -1;
-  XPAClip cur;
-
-  *name = '\0';
-  if( paramlist && *paramlist ){
-    if( !word(paramlist, name, &lp) )
-      goto done;
-    if( !(cur = ClipBoardLookup(xpa, name)) )
-      goto done;
-    if( cur->value ){
-      send(xpa_datafd(xpa), cur->value, strlen(cur->value), 0);
-      status =  0;
-    }
-  }
-
-done:
-  if( status < 0 ){
-    if( !*name ){
-      XPAError(xpa, "XPA clipboard requires: name\n");
-    }
-    else{
-      snprintf(tbuf, SZ_LINE, "XPA clipboard invalid name: %s\n", name);
-      XPAError(xpa, tbuf);
-    }
-  }
-  return(status);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- *			Public Routines
- *
- *
- *----------------------------------------------------------------------------
- */
-
diff --git a/xpa/command.c b/xpa/command.c
deleted file mode 100644
index 2ea182d..0000000
--- a/xpa/command.c
+++ /dev/null
@@ -1,1217 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-#include <xpap.h>
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- * 			Private Routines and Data
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/* this is the static xpa struct that holds the reserved commands */
-static XPA rxpa=NULL;
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPACmdParseNames
- *
- * Purpose:	massage a name string, changing multiple sequential spaces
- *		into a single space
- *
- * Returns:	new name, with spaces massaged (also number of spacess)
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static char *
-XPACmdParseNames(char *lbuf, int *ntokens)
-#else
-static char *XPACmdParseNames(lbuf, ntokens)
-     char *lbuf;
-     int *ntokens;
-#endif
-{
-  char tbuf[SZ_LINE];
-  int lp=0;
-  char *buf;
-
-  /* can't be larger than the original string */
-  buf = (char *)xmalloc(strlen(lbuf)+1);
-  *buf = '\0';
-  *ntokens = 0;
-
-  /* pick off each word, separating by a single space */
-  while( word(lbuf, tbuf, &lp)){
-    if( *buf != '\0' )
-      strcat(buf, " ");
-    strcat(buf, tbuf);
-    *ntokens += 1;
-  }
-
-  /* make the string the right size */
-  buf = (char *)xrealloc(buf, strlen(buf)+1);
-  return(buf);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAReceiveNSConnect
- *
- * Purpose:	reset and re-establish connection to name server
- *
- * Returns:	xpa callback error codes
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPAReceiveNSConnect (void *client_data, void *call_data, char *paramlist,
-	       char *buf, size_t len)
-#else
-static int XPAReceiveNSConnect(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     size_t len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  XPA txpa;
-  char tbuf[SZ_LINE];
-  int doall=0;
-  int lp=0;
-
-  if( paramlist && *paramlist ){
-    if( word(paramlist, tbuf, &lp) && !strcmp(tbuf, "-all") ){
-      doall = 1;
-    }
-  }
-  if( doall ){
-    for(txpa=XPAListHead(); txpa!=NULL; txpa=txpa->next){
-      XPANSAdd(txpa, NULL, NULL);
-    }
-  }
-  else{
-    XPANSAdd(xpa, NULL, NULL);
-  }
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAReceiveNSDisconnect
- *
- * Purpose:	break connection to name server
- *
- * Returns:	xpa callback error codes
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPAReceiveNSDisconnect (void *client_data, void *call_data, char *paramlist,
-	       char *buf, size_t len)
-#else
-static int XPAReceiveNSDisconnect(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     size_t len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  XPA txpa;
-  NS ns, tns;
-  char tbuf[SZ_LINE];
-  int doall=0;
-  int lp=0;
-
-  if( paramlist && *paramlist ){
-    if( word(paramlist, tbuf, &lp) && !strcmp(tbuf, "-all") ){
-      doall = 1;
-    }
-  }
-  if( doall ){
-    for(txpa=XPAListHead(); txpa!=NULL; txpa=txpa->next){
-      for(ns=txpa->nshead; ns!= NULL; ){
-	tns = ns->next;
-	XPANSClose(txpa, ns);
-	ns = tns;
-      }
-    }
-  }
-  else{
-    for(ns=xpa->nshead; ns!= NULL; ){
-      tns = ns->next;
-      XPANSClose(xpa, ns);
-      ns = tns;
-    }
-  }
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAReceiveEnv
- *
- * Purpose:	set an environment variable
- *
- * Returns:	xpa callback error codes
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPAReceiveEnv (void *client_data, void *call_data, char *paramlist,
-	       char *buf, size_t len)
-#else
-static int XPAReceiveEnv(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     size_t len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  char name[SZ_LINE];
-  char value[SZ_LINE];
-  char *tbuf;
-  int lp=0;
-
-  if( word(paramlist, name, &lp) ){
-    if( word(paramlist, value, &lp) ){
-      tbuf = (char *)xmalloc(strlen(name)+1+strlen(value)+1);
-      snprintf(tbuf, SZ_LINE, "%s=%s", name, value);
-      putenv(tbuf);
-      return(0);
-    }
-    else{
-      if( strchr(name, '=') != NULL ){
-	tbuf = xstrdup(name);
-	putenv(tbuf);
-	return(0);
-      }
-      else{
-	XPAError(xpa, "XPA setenv requires name and value pair\n");
-	return(-1);
-      }
-    }
-  }
-  else{
-    XPAError(xpa, "XPA setenv requires name and value pair\n");
-    return(-1);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASendEnv
- *
- * Purpose:	return an environment variable to client
- *
- * Returns:	xpa callback error codes
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPASendEnv (void *client_data, void *call_data, char *paramlist,
-	    char **buf, size_t *len)
-#else
-static int XPASendEnv(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char **buf;
-     size_t *len;
-#endif
-{
-  int tlen;
-  char *tbuf;
-  char *ebuf;
-
-  if( (ebuf = (char *)getenv(paramlist)) != NULL ){
-    tlen = strlen(ebuf)+2;
-    tbuf = (char *)xmalloc(tlen);
-    snprintf(tbuf, tlen, "%s\n", ebuf);
-    *buf = tbuf;
-    *len = strlen(tbuf);
-  }
-  else{
-    *buf = xstrdup("\n");
-    *len = 1;
-  }
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAReceiveReserved
- *
- * Purpose:	execute reserved command
- *
- * Returns:	xpa callback error codes
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPAReceiveReserved (void *client_data, void *call_data, char *paramlist,
-		    char *buf, size_t len)
-#else
-static int XPAReceiveReserved(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     size_t len;
-#endif
-{
-  char *cmd = (char *)client_data;
-  XPA xpa = (XPA)call_data;
-
-  if( !strcmp(cmd, "end") ){
-    xpa->comm->status |= XPA_STATUS_ENDBUF;
-    return(0);
-  }
-  else if( !strcmp(cmd, "exec") ){
-    xpa->comm->status |= XPA_STATUS_READBUF;
-    return(0);
-  }
-  else{
-    return(-1);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASendHelp
- *
- * Purpose:	send help strings
- *
- * Returns:	xpa callback error codes
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPASendHelp (void *client_data, void *call_data, char *paramlist,
-	     char **buf, size_t *len)
-#else
-static int XPASendHelp(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char **buf;
-     size_t *len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  XPACmd cmd;
-  int lp=0;
-  int slen;
-  char tbuf[SZ_LINE];
-  char lbuf[SZ_LINE];
-  char *sbuf;
-
-  if( !paramlist || !*paramlist ){
-    if( xpa->version != NULL ){
-      snprintf(lbuf, SZ_LINE, "XPA version: %s\n", xpa->version);
-      send(xpa_datafd(xpa), lbuf, strlen(lbuf), 0);
-    }
-  }
-  if( xpa->commands == NULL ){
-    if( xpa->help != NULL ){
-      slen = strlen(xpa->help)+SZ_LINE;
-      sbuf = (char *)xmalloc(slen);
-      snprintf(sbuf, slen, "%s\n", xpa->help);
-      send(xpa_datafd(xpa), sbuf, strlen(sbuf), 0);
-      xfree(sbuf);
-    }
-    else{
-      strcpy(lbuf, "\n");
-      send(xpa_datafd(xpa), lbuf, strlen(lbuf), 0);
-    }
-  }
-  else{
-    if( paramlist && *paramlist ){
-      while( word(paramlist, tbuf, &lp) ){
-	for(cmd=xpa->commands; cmd!=NULL; cmd=cmd->next){
-	  if( !strcmp(tbuf, cmd->name) ){
-	    if( cmd->help != NULL ){
-	      slen = strlen(cmd->name)+strlen(cmd->help)+SZ_LINE;
-	      sbuf = (char *)xmalloc(slen);
-	      snprintf(sbuf, slen, "%s:\t%s\n", cmd->name, cmd->help);
-	      send(xpa_datafd(xpa), sbuf, strlen(sbuf), 0);
-	      xfree(sbuf);
-	    }
-	    else{
-	      snprintf(lbuf, SZ_LINE, "%s:\t(no help available)\n", cmd->name);
-	      send(xpa_datafd(xpa), lbuf, strlen(lbuf), 0);
-	    }
-	  }
-	}
-      }
-    }
-    else{
-      for(cmd=xpa->commands; cmd!=NULL; cmd=cmd->next){
-	if( cmd->help != NULL ){
-	  slen = strlen(cmd->name)+strlen(cmd->help)+SZ_LINE;
-	  sbuf = (char *)xmalloc(slen);
-	  snprintf(sbuf, slen, "%s:\t%s\n", cmd->name, cmd->help);
-	  send(xpa_datafd(xpa), sbuf, strlen(sbuf), 0);
-	  xfree(sbuf);
-	}
-	else{
-	  snprintf(lbuf, SZ_LINE, "%s:\t(no help available)\n", cmd->name);
-	  send(xpa_datafd(xpa), lbuf, strlen(lbuf), 0);
-	}
-      }
-    }
-  }
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASendVersion
- *
- * Purpose:	send XPA version string
- *
- * Returns:	xpa callback error codes
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPASendVersion (void *client_data, void *call_data, char *paramlist,
-	     char **buf, size_t *len)
-#else
-static int XPASendVersion(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char **buf;
-     size_t *len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  char lbuf[SZ_LINE];
-
-  if( xpa->version != NULL )
-    snprintf(lbuf, SZ_LINE, "%s\n", xpa->version);
-  else
-    strcpy(lbuf, "\n");
-  send(xpa_datafd(xpa), lbuf, strlen(lbuf), 0);
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- * 			Semi-Public Routines and Data
- *
- *  		    These routines are used by XPAHandler and XPANew
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAInitReserved
- *
- * Purpose:	add the reserved commands to the reserved xpa struct
- *
- * Results:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void 
-XPAInitReserved (void)
-#else
-void XPAInitReserved()
-#endif
-{
-  if( !rxpa ){
-    if( (rxpa = (XPA)xcalloc(1, sizeof(struct xparec))) == NULL )
-      return;
-    /* XPACmdAdd requires that the callbacks be defined explicitly in rxpa */
-    rxpa->send_callback = XPASendCommands;
-    rxpa->receive_callback = XPAReceiveCommands;
-    /* add reserved commands */
-    XPACmdAdd(rxpa, "-acl",
-	  "\tget (set) the access control list\n\t\t  options: host type acl",
-	  XPASendAcl, NULL, NULL, XPAReceiveAcl, NULL, "fillbuf=false");
-    XPACmdAdd(rxpa, "-env",
-	  "\tget (set) an environment variable\n\t\t  options: name (value)",
-	  XPASendEnv, NULL, NULL, XPAReceiveEnv, NULL, NULL);
-    XPACmdAdd(rxpa, "-exec",
-	  "\texecute commands from buffer\n\t\t  options: none",
-	  NULL, NULL, NULL, XPAReceiveReserved, (void *)"exec", NULL);
-    XPACmdAdd(rxpa, "-help",
-	  "\treturn help string for specified XPA\n\t\t  options: cmd name (commands only)",
-	  XPASendHelp, NULL, NULL, NULL, NULL, NULL);
-    XPACmdAdd(rxpa, "-ltimeout",
-	  "\tget (set) long timeout\n\t\t  options: seconds|reset",
-	  XPASendLTimeout, NULL, NULL, XPAReceiveLTimeout, NULL, NULL);
-    XPACmdAdd(rxpa, "-nsconnect",
-	  "\tre-establish name server connection to this XPA\n\t\t  options: -all",
-	  NULL, NULL, NULL, XPAReceiveNSConnect, NULL, NULL);
-    XPACmdAdd(rxpa, "-nsdisconnect",
-	  "\tbreak name server connection to this XPA\n\t\t  options: -all",
-	  NULL, NULL, NULL, XPAReceiveNSDisconnect, NULL, NULL);
-    XPACmdAdd(rxpa, "-remote",
-	  "\tconnect to remote name service with specified acl \n\t\t  options: host:port +|-|acl -proxy",
-	  XPASendRemote, NULL, NULL, XPAReceiveRemote, NULL, "fillbuf=false");
-    XPACmdAdd(rxpa, "-clipboard",
-	  "\tset/get clipboard information \n\t\t  options: [cmd] name",
-	  XPASendClipboard, NULL, NULL, XPAReceiveClipboard, NULL, NULL);
-    XPACmdAdd(rxpa, "-stimeout",
-	  "\tget (set) short timeout\n\t\t  options: seconds|reset",
-	  XPASendSTimeout, NULL, NULL, XPAReceiveSTimeout, NULL, NULL);
-    XPACmdAdd(rxpa, "-version",
-	  "\treturn XPA version string\n\t\t  options: none",
-	  XPASendVersion, NULL, NULL, NULL, NULL, NULL);
-  }
-}
-
-#ifdef ANSI_FUNC
-void 
-XPAFreeReserved (void)
-#else
-void XPAFreeReserved()
-#endif
-{
-  XPACmd cmd, tcmd;
-  if( !rxpa ) return;
-  /* free reserved commands */
-  for(cmd=rxpa->commands; cmd!=NULL; ){
-    tcmd = cmd->next;
-    XPACmdDel(rxpa, cmd);
-    cmd = tcmd;
-  }
-  xfree(rxpa);
-  rxpa = NULL;
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPACmdLookupReserved
- *
- * Purpose:	lookup a reserved command name
- *
- * Results:	cmd struct or null
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-XPACmd 
-XPACmdLookupReserved (XPA xpa, char *lbuf, int *lp)
-#else
-XPACmd XPACmdLookupReserved(xpa, lbuf, lp)
-     XPA xpa;
-     char *lbuf;
-     int *lp;
-#endif
-{
-  XPACmd cmd;
-  int lp2=0;
-  char *lptr;
-  char name[SZ_LINE];
-
-  /* make sure we have something to work with */
-  if( (rxpa==NULL) || (lbuf==NULL) || (lbuf[*lp]=='\0') )
-    return(NULL);
-
-  /* this is where we start parsing */
-  lptr = &(lbuf[*lp]);
-
-  /* to simplify life, we assume reserved words are 1 token */
-  if( !word(lptr, name, &lp2) )
-    return(NULL);
-
-  /* look for reserved keywords that have callbacks */
-  for(cmd=rxpa->commands; cmd!=NULL; cmd=cmd->next){
-    if( !strcmp(name, cmd->name) ){
-      *lp += lp2;
-      return(cmd);
-    }
-  }
-
-  /* nothing, nowhere */
-  return(NULL);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPACmdLookup
- *
- * Purpose:	lookup a user-defined command name
- *
- * Results:	cmd struct or null
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-XPACmd 
-XPACmdLookup (XPA xpa, char *lbuf, int *lp)
-#else
-XPACmd XPACmdLookup(xpa, lbuf, lp)
-     XPA xpa;
-     char *lbuf;
-     int *lp;
-#endif
-{
-  XPACmd cmd;
-  int i;
-  int lp2;
-  int len, tlen;
-  char *lptr;
-  char tbuf[SZ_LINE];
-  char name[SZ_LINE];
-
-  /* make sure we have something to work with */
-  if( (xpa==NULL) || (lbuf==NULL) || (lbuf[*lp]=='\0') )
-    return(NULL);
-
-  /* this is where we start parsing */
-  lptr = &(lbuf[*lp]);
-
-  /* look up commands for this name */
-  for(cmd=xpa->commands; cmd!=NULL; cmd=cmd->next){
-    /* make up a name with the required number of tokens for this command */
-    *name = '\0';
-    lp2 = 0;
-    tlen = 0;
-    for(i=0; i<cmd->ntokens; i++){
-      if( word(lptr, tbuf, &lp2)){
-	len = strlen(tbuf)+1;
-	if( (tlen+len) <= (SZ_LINE-1) ){
-	  if( *name != '\0' )
-	    strcat(name, " ");
-	  strcat(name, tbuf);
-	  tlen += len;
-	}
-	/* not enough room */
-	else{
-	  *name = '\0';
-	  break;
-	}
-      }
-    }
-    /* we now have the name,  see if its what we want */
-    if( *name && !strcmp(cmd->name, name) ){
-      *lp += lp2;
-      return(cmd);
-    }
-  }
-
-  /* did not find the command in this xpa -- now look through reserved */
-  return(XPACmdLookupReserved(xpa, lbuf, lp));
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAReceiveCommands
- *
- * Purpose:	process a list of commands from xpaset
- *
- * Results:	number of commands processed
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAReceiveCommands (void *client_data, void *call_data, char *paramlist,
-		    char *buf, size_t len)
-#else
-int XPAReceiveCommands(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     size_t len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  XPACmd cmd;
-  int lp;
-  int savelp;
-  int plen;
-  int bgot;
-  int got=0;
-  int gotbuf=0;
-  int freebuf=1;
-  char lbuf[SZ_LINE];
-  char tbuf[SZ_LINE];
-  char tbuf1[SZ_LINE];
-
-  /* use ";" as a command separator (as well as \n) */
-  newdtable(";");
-
-  /* if we already have buf, there will be no need to get it */
-  if( buf )
-    gotbuf++;
-
-  /* if we have no paramlist, we read from the socket */
-  if( (xpa_datafd(xpa) >=0) && (!paramlist || (*paramlist == '\0')) ){
-    xpa->comm->status |= XPA_STATUS_READBUF;
-    XPAGets(xpa, xpa_datafd(xpa), lbuf, SZ_LINE, XPALongTimeout());
-    FPRINTF((stderr, "%sXPAReceiveCommands: read %s\n", _sp, lbuf));
-  }
-  else{
-    xpa->comm->status &= ~XPA_STATUS_READBUF;
-    nowhite(paramlist, lbuf);
-  }
-
-  /* we must have something to start with */
-  if( *lbuf == '\0' ){
-    XPAError(xpa, xpaMessbuf[XPA_RTN_NOCMD2]);
-    got = -1;
-    goto done;
-  }
-  
-  /* This look either executes the one set of commands in paramlist,
-     or reads one line at a time from the socket and executes commands.
-     In the latter case, each callback can read the socket as well */
-  while( 1 ){
-    FPRINTF((stderr, "%sXPAReceiveCommands: top of loop: %s\n", _sp, lbuf));
-    lp = 0;
-    while( lbuf[lp] != '\0' ){
-      if( (cmd = XPACmdLookup(xpa, lbuf, &lp)) == NULL ){
-	XPAError(xpa, xpaMessbuf[XPA_RTN_UNCMD]);
-	got = -1;
-	goto done;
-      }
-      /* reserved commands can only be called from the same host as the server,
-	 or from local (unix) sockets */
-      if( (cmd->xpa == rxpa) && 
-	  strcmp(cmd->name, "-help") && strcmp(cmd->name, "-version") ){
-	if( XPAMtype() == XPA_INET ){
-	  if( (!xpa->comm || !LOCALIP(xpa->comm->cmdip)) ){
-	    FPRINTF((stderr, "%sXPAReceiveCommands: rejecting reserved: %s\n",
-		    _sp, cmd->name));
-	    XPAError(xpa, xpaMessbuf[XPA_RTN_NOAUTH]);
-	    got = -1;
-	    goto done;
-	  }
-	}
-      }
-      FPRINTF((stderr, "%sXPAReceiveCommands: cmd->name: %s\n",
-	       _sp, cmd->name));
-      *tbuf = '\0';
-      if( (lastdelim() != ';') && (lastdelim() != '\n') ){
-	/* skip white space between command and params */
-	while( isspace((int)lbuf[lp]) )
-	  lp++;
-	/* here is where the params start */
-	savelp = lp;
-	/* look for command delimiter -- the end of the params */
-	while( word(lbuf, tbuf1, &lp) ){
-	  if( (lastdelim() == ';')  || (lastdelim() == '\n') ){
-	    break;
-	  }
-	  /* make sure a command-ending delim is not next */
-	  while( isspace((int)lbuf[lp]) )
-	    lp++;
-	  if( (lbuf[lp] == ';')  || (lbuf[lp] == '\n') ){
-	    break;
-	  }
-	}
-	/* get length of parameter list */
-	plen = lp - savelp;
-	/* but skip final delim */
-	if( (plen>0) && ((lastdelim() == ';')||(lastdelim() == '\n')) )
-	  plen--;
-	/* copy the params up to the command delimiter */
-	if( plen > 0 ){
-	  strncpy(tbuf, &(lbuf[savelp]), plen);
-	  tbuf[plen] = '\0';
-	}
-      }
-      /* execute the associated XPA callback */
-      if( cmd->receive_callback != NULL ){
-	/* get buf now, if its needed */
-	if( !gotbuf && (xpa_datafd(xpa) >= 0) &&
-	    (cmd->receive_mode & XPA_MODE_FILLBUF) ){
-	  /* read buf -- this buf will stay around for all commands */
-	  FPRINTF((stderr, "%sXPAReceiveCommands: at XPAGetBuf\n", _sp));
-	  bgot = XPAGetBuf(xpa, xpa_datafd(xpa), &buf, &len, -1);
-	  /* close the data channel */
-	  XPACloseData(xpa, xpa->comm);
-	  if( bgot >= 0 ){
-	    /* got the buffer */
-	    gotbuf++;
-	  }
-	  /* error getting buf */
-	  else{
-	    XPAError(xpa, xpaMessbuf[XPA_RTN_NODATA]);
-	    got = -1;
-	    goto done;
-	  }
-	}
-	got = (cmd->receive_callback)(cmd->receive_data, call_data,
-				      tbuf, buf, len);
-	/* if we don't want to free the buffer, mark it for saving */
-	if( (buf != NULL) && !(cmd->receive_mode & XPA_MODE_FREEBUF) ){
-	  freebuf=0;
-	}
-	if( got != 0 ){
-	  goto done;
-	}
-      }
-      else{
-	XPAError(xpa, xpaMessbuf[XPA_RTN_NOREC]);
-	got = -1;
-	goto done;
-      }
-    }
-    /* conditions for exiting the command loop: */
-    /* if we processed the END command, we are done */
-    if( xpa->comm->status & XPA_STATUS_ENDBUF )
-      break;
-    /* if we are not reading the data buffer, we are done */
-    if( !(xpa->comm->status & XPA_STATUS_READBUF) )
-      break;
-    /* if we got EOF or error reading the data buffer, we are done */
-    if( XPAGets(xpa, xpa_datafd(xpa), lbuf, SZ_LINE, XPALongTimeout()) <=0 )
-      break;
-  }
-
-done:
-  /* if no one wants buf, free it now */
-  if( freebuf )
-    xfree(buf);
-  /* restore last delimiter table */
-  freedtable();
-  /* return error code */
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASendCommands
- *
- * Purpose:	process a list of commands from xpaget
- *
- * Results:	number of commands processed (currently 0 or 1)
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPASendCommands (void *client_data, void *call_data, char *paramlist,
-		 char **buf, size_t *len)
-#else
-int XPASendCommands(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char **buf;
-     size_t *len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  XPACmd cmd;
-  char tbuf[SZ_LINE];
-  int lp=0;
-  int got=0;
-
-  /* return help as default */
-  if( *paramlist == '\0' ){
-    paramlist = "-help";
-  }
-
-  /* lookup the command and execute */
-  if( (cmd = XPACmdLookup(xpa, paramlist, &lp)) != NULL ){
-    /* reserved commands can only be called from the same host as the server,
-       or from local (unix) sockets */
-    if( (cmd->xpa == rxpa) && 
-	strcmp(cmd->name, "-help") && strcmp(cmd->name, "-version") ){
-	if( XPAMtype() == XPA_INET ){
-	  if( (!xpa->comm || !LOCALIP(xpa->comm->cmdip)) ){
-	    FPRINTF((stderr, "%sXPAReceiveCommands: rejecting reserved: %s\n",
-		    _sp, cmd->name));
-	    XPAError(xpa, xpaMessbuf[XPA_RTN_NOAUTH]);
-	    got = -1;
-	    goto done;
-	  }
-	}
-    }
-    /* execute the associated XPA send callback,
-       using the remaining command string as an argument */
-    strcpy(tbuf, &paramlist[lp]);
-    nocr(tbuf);
-    if( !strcmp(tbuf, "-help") ){
-      if( cmd->help != NULL )
-	snprintf(tbuf, SZ_LINE, "%s\n", cmd->help);
-      else
-	snprintf(tbuf, SZ_LINE, "\n");
-      send(xpa_datafd(xpa), tbuf, strlen(tbuf), 0);
-      got = 0;
-    }
-    else if( cmd->send_callback != NULL ){
-      got = (cmd->send_callback)(cmd->send_data, call_data,
-				 &paramlist[lp], buf, len);
-    }
-    else{
-      XPAError(xpa, xpaMessbuf[XPA_RTN_NOSEND]);
-      got = -1;
-      goto done;
-    }
-  }
-  else{
-    XPAError(xpa, xpaMessbuf[XPA_RTN_UNCMD]);
-    got = -1;
-    goto done;
-  }
-
-done:
-  /* return error code */
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- * 			Public Routines and Data
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPACmdNew
- *
- * Purpose:	define a named command access point 
- *
- * Results:	XPA struct or NULL
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-XPA 
-XPACmdNew (char *xclass, char *name)
-#else
-XPA XPACmdNew(xclass, name)
-     char *xclass;
-     char *name;
-#endif
-{
-  XPA xpa;
-  char tbuf[SZ_LINE];
-
-  /* we need a name */
-  if( (name == NULL) || (*name == '\0') )
-    return(NULL);
-
-  /* we need some valid class */
-  if( (xclass == NULL) || (*xclass == '\0') )
-    xclass = "*";
-
-  /* help string */
-  snprintf(tbuf, SZ_LINE, "XPA commands for %s:%s\n\t\t  options: see -help",
-	  xclass, name);
-
-  /* create a new XPA with command callbacks */
-  xpa = XPANew(xclass, name, tbuf,
-	       XPASendCommands, NULL, NULL,
-	       XPAReceiveCommands, NULL, "fillbuf=false");
-
-  /* return the good news */
-  return(xpa);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPACmdAdd
- *
- * Purpose:	add a command to a named command access point 
- *
- * Results:	0 on success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-XPACmd 
-XPACmdAdd (XPA xpa, char *name, char *help,
-	   SendCb send_callback, void *send_data, char *send_mode,
-	   ReceiveCb rec_callback, void *rec_data, char *rec_mode)
-#else
-XPACmd XPACmdAdd(xpa, name, help,
-		 send_callback, send_data, send_mode,
-		 rec_callback, rec_data, rec_mode)
-     XPA xpa;
-     char *name;
-     char *help;
-     SendCb send_callback;
-     void *send_data;
-     char *send_mode;
-     ReceiveCb rec_callback;
-     void *rec_data;
-     char *rec_mode;
-#endif
-{
-  XPACmd xnew;
-  XPACmd cur;
-  XPACmd prev;
-
-  /* make sure we have a valid command record */
-  if( !xpa || 
-      (xpa->send_callback != XPASendCommands)       || 
-      (xpa->receive_callback != XPAReceiveCommands) ){
-    return(NULL);
-  }
-
-  /* we need either a send or a receive or both */
-  if( (send_callback == NULL) && (rec_callback == NULL ) ){
-    return(NULL);
-  }
-
-  /* limit the size of the cmd name designation */
-  if( strlen(name) > XPA_NAMELEN ){
-    return(NULL);
-  }
-
-  /* allocate space for a new record */
-  xnew = (XPACmd)xcalloc(1, sizeof(struct xpacmdrec));
-
-  /* backlink to xpa */
-  xnew->xpa = xpa;
-
-  /* fill in the blanks */
-  xnew->name = XPACmdParseNames(name, &(xnew->ntokens));
-  xnew->help = xstrdup(help);
-
-  /* receive callback */
-  xnew->send_callback = send_callback;
-  xnew->send_data = send_data;
-  xnew->send_mode = XPA_DEF_MODE_SEND;
-  XPAMode(send_mode, &(xnew->send_mode), "freebuf", XPA_MODE_FREEBUF,1);
-  /* acl is a global mode */
-  XPAMode(send_mode, &(xpa->send_mode), "acl", XPA_MODE_ACL, 1);
-
-  /* receive callback */
-  xnew->receive_callback = rec_callback;
-  xnew->receive_data = rec_data;
-  /* process the mode string */
-  xnew->receive_mode = XPA_DEF_MODE_REC;
-  XPAMode(rec_mode, &(xnew->receive_mode), "usebuf", XPA_MODE_BUF,1);
-  XPAMode(rec_mode, &(xnew->receive_mode), "fillbuf", XPA_MODE_FILLBUF,1);
-  XPAMode(rec_mode, &(xnew->receive_mode), "freebuf", XPA_MODE_FREEBUF,1);
-  /* acl is a global mode */
-  XPAMode(rec_mode, &(xpa->receive_mode), "acl", XPA_MODE_ACL, 1);
-
-  /* enter into list, in alphabetical order */
-  if( xpa->commands == NULL  ){
-    xpa->commands = xnew;
-    return(xnew);
-  }
-  else{
-    for(prev=NULL, cur=xpa->commands; cur!=NULL; prev=cur, cur=cur->next){
-      /* if new name is an existing name, add it before */
-      if( strcmp(xnew->name,   cur->name) ==0 )
-	goto addname;
-      /* if existing name is a subset of new name, add it before */
-      else if( !strncmp(xnew->name, cur->name, strlen(cur->name)) )
-	goto addname;
-      /* if new name is a subset of existing name, add it after */
-      else if( !strncmp(xnew->name, cur->name, strlen(xnew->name)) )
-	continue;
-      /* if new name is lexically greater than existing name, add it after */
-      else if( strcmp(xnew->name,   cur->name) >0 )
-	continue;
-addname:
-      /* add the new name here and return */
-      if( prev == NULL ){
-	xpa->commands = xnew;
-	xnew->next = cur;
-	return(xnew);
-      }
-      else{
-	prev->next = xnew;
-	xnew->next = cur;
-	return(xnew);
-      }
-    }
-    /* if we are still here, we did not find a place to insert, i.e.,
-       we are at the end of the list */
-    prev->next = xnew;
-    return(xnew);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPACmdDel
- *
- * Purpose:	free a named command access point 
- *
- * Results:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int
-XPACmdDel (XPA xpa, XPACmd cmd)
-#else
-int XPACmdDel(xpa, cmd)
-     XPA xpa;
-     XPACmd cmd;
-#endif
-{
-  XPACmd cur;
-  int got=0;
-
-  /* gotta have something to free */
-  if( cmd == NULL )
-    return(-1);
-
-  /* remove from list of xpa's commands */
-  if( xpa && xpa->commands ){
-    if( xpa->commands == cmd ){
-      xpa->commands = cmd->next;
-      got++;
-    }
-    else{
-      for(cur=xpa->commands; cur!=NULL; cur=cur->next){
-	if( cur->next == cmd ){
-	  cur->next = cmd->next;
-	  got++;
-	  break;
-	}
-      }
-    }
-  }
-
-  /* free up space */
-  if( got ){
-    if( cmd->name )
-      xfree(cmd->name);
-    if( cmd->help )
-      xfree(cmd->help);
-    xfree(cmd);
-    return(0);
-  }
-  else{
-    return(-1);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPACmdInternalReceive
- *
- * Purpose:	internal execute of the receive callback for this command
- *
- * Results:	number of commands processed
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPACmdInternalReceive (void *client_data, void *call_data,
-		       char *paramlist, char *buf, size_t len)
-#else
-int XPACmdInternalReceive(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     size_t len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-
-  /* make sure we have something */
-  if( xpa == NULL )
-    return(-1);
-  /* make the call */
-  return(XPAReceiveCommands(client_data, xpa, paramlist, buf, len));
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPACmdInternalSend
- *
- * Purpose:	internal execute of the send callback for this command
- *
- * Results:	number of commands processed (currently 0 or 1)
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPACmdInternalSend (void *client_data, void *call_data,
-		    char *paramlist, char **buf, size_t *len)
-#else
-int XPACmdInternalSend(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char **buf;
-     size_t *len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-
-  /* make sure we have something */
-  if( xpa == NULL )
-    return(-1);
-
-  /* make the call */
-  return(XPASendCommands(client_data, xpa, paramlist, buf, len));
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAGetReserved
- *
- * Purpose:	return xpa handle for reserved xpa commands
- *
- * Return:	xpa handle
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-XPA 
-XPAGetReserved (void)
-#else
-XPA XPAGetReserved()
-#endif
-{
-  return(rxpa);
-}
diff --git a/xpa/conf.h.in b/xpa/conf.h.in
deleted file mode 100644
index 206d8d6..0000000
--- a/xpa/conf.h.in
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-/* Define as 1 if you have string.h  */
-#undef HAVE_STRING_H
-
-/* Define as 1 if you have strings.h  */
-#undef HAVE_STRINGS_H
-
-/* Define as 1 if you have stdlib.h  */
-#undef HAVE_STDLIB_H
-
-/* Define as 1 if you have malloc.h  */
-#undef HAVE_MALLOC_H
-
-/* Define as 1 if you have unistd.h  */
-#undef HAVE_UNISTD_H
-
-/* Define as 1 if you have getopt.h  */
-#undef HAVE_GETOPT_H
-
-/* Define as 1 if you have pwd.h  */
-#undef HAVE_PWD_H
-
-/* Define as 1 if you have values.h  */
-#undef HAVE_VALUES_H
-
-/* Define as 1 if you have dlfcn.h  */
-#undef HAVE_DLFCN_H
-
-/* Define as 1 if you have sys/un.h  */
-#undef HAVE_SYS_UN_H
-
-/* Define as 1 if you have sys/shm.h  */
-#undef HAVE_SYS_SHM_H
-
-/* Define as 1 if you have sys/mman.h  */
-#undef HAVE_SYS_MMAN_H
-
-/* Define as 1 if you have sys/select.h  */
-#undef HAVE_SYS_SELECT_H
-
-/* Define as 1 if you have sys/ipc.h  */
-#undef HAVE_SYS_IPC_H
-
-/* Define as 1 if you have setjmp.h  */
-#undef HAVE_SETJMP_H
-
-/* Define as 1 if you have socklen_t */
-#undef HAVE_SOCKLEN_T
-
-/* Define as 1 if you have strchr  */
-#undef HAVE_STRCHR
-
-/* Define as 1 if you have memcpy  */
-#undef HAVE_MEMCPY
-
-/* Define as 1 if you have snprintf  */
-#undef HAVE_SNPRINTF
-
-/* Define as 1 if you have setenv  */
-#undef HAVE_SETENV
-
-/* Define as 1 if you have posix_spawn  */
-#undef HAVE_POSIX_SPAWN
-
-/* Define as 1 if you have crt_externs.h  */
-#undef HAVE_CRT_EXTERNS_H
-
-/* Define as 1 if you have NSGetEvniron  */
-#undef HAVE__NSGETENVIRON
-
-/* Define as 1 if you have atexit  */
-#undef HAVE_ATEXIT
-
-/* Define as 1 if you have pthread library  */
-#undef HAVE_LIBPTHREAD
-
-/* Define as 1 if you need reentrant errno, etc.  */
-#undef _REENTRANT
-
-/* Define as 1 if you have Tcl  */
-#undef HAVE_TCL
-
-/* Define as 1 if you have Xt */
-#undef HAVE_XT
-
-/* Define as 1 if you have Gtk  */
-#undef HAVE_GTK
-
-/* Define as 1 if you are running Cygwin. */
-#undef HAVE_CYGWIN
-
-/* Define as 1 if you are running MinGW. */
-#undef HAVE_MINGW32
diff --git a/xpa/config.guess b/xpa/config.guess
deleted file mode 100755
index 22906b3..0000000
--- a/xpa/config.guess
+++ /dev/null
@@ -1,1495 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
-#   Inc.
-
-timestamp='2006-03-13'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner <per@bothner.com>.
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted ChangeLog entry.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
-#
-# The plan is that this can be called by configure scripts if you
-# don't specify an explicit build system type.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help" >&2
-       exit 1 ;;
-    * )
-       break ;;
-  esac
-done
-
-if test $# != 0; then
-  echo "$me: too many arguments$help" >&2
-  exit 1
-fi
-
-trap 'exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,)    echo "int x;" > $dummy.c ;
-	for c in cc gcc c89 c99 ; do
-	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
-	     CC_FOR_BUILD="$c"; break ;
-	  fi ;
-	done ;
-	if test x"$CC_FOR_BUILD" = x ; then
-	  CC_FOR_BUILD=no_compiler_found ;
-	fi
-	;;
- ,,*)   CC_FOR_BUILD=$CC ;;
- ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
-	PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-    *:NetBSD:*:*)
-	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
-	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
-	# switched to ELF, *-*-netbsd* would select the old
-	# object file format.  This provides both forward
-	# compatibility and a consistent mechanism for selecting the
-	# object file format.
-	#
-	# Note: NetBSD doesn't particularly care about the vendor
-	# portion of the name.  We always set it to "unknown".
-	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
-	case "${UNAME_MACHINE_ARCH}" in
-	    armeb) machine=armeb-unknown ;;
-	    arm*) machine=arm-unknown ;;
-	    sh3el) machine=shl-unknown ;;
-	    sh3eb) machine=sh-unknown ;;
-	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
-	esac
-	# The Operating System including object format, if it has switched
-	# to ELF recently, or will in the future.
-	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
-		eval $set_cc_for_build
-		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-			| grep __ELF__ >/dev/null
-		then
-		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
-		    # Return netbsd for either.  FIX?
-		    os=netbsd
-		else
-		    os=netbsdelf
-		fi
-		;;
-	    *)
-	        os=netbsd
-		;;
-	esac
-	# The OS release
-	# Debian GNU/NetBSD machines have a different userland, and
-	# thus, need a distinct triplet. However, they do not need
-	# kernel version information, so it can be replaced with a
-	# suitable tag, in the style of linux-gnu.
-	case "${UNAME_VERSION}" in
-	    Debian*)
-		release='-gnu'
-		;;
-	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-		;;
-	esac
-	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
-	# contains redundant information, the shorter form:
-	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
-	exit ;;
-    *:OpenBSD:*:*)
-	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
-	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
-	exit ;;
-    *:ekkoBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
-	exit ;;
-    *:SolidBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
-	exit ;;
-    macppc:MirBSD:*:*)
-	echo powerppc-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    *:MirBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    alpha:OSF1:*:*)
-	case $UNAME_RELEASE in
-	*4.0)
-		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-		;;
-	*5.*)
-	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
-		;;
-	esac
-	# According to Compaq, /usr/sbin/psrinfo has been available on
-	# OSF/1 and Tru64 systems produced since 1995.  I hope that
-	# covers most systems running today.  This code pipes the CPU
-	# types through head -n 1, so we only detect the type of CPU 0.
-	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
-	case "$ALPHA_CPU_TYPE" in
-	    "EV4 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
-	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
-	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
-	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
-	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
-	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
-	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
-	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
-	    "EV7.9 (21364A)")
-		UNAME_MACHINE="alphaev79" ;;
-	esac
-	# A Pn.n version is a patched version.
-	# A Vn.n version is a released version.
-	# A Tn.n version is a released field test version.
-	# A Xn.n version is an unreleased experimental baselevel.
-	# 1.2 uses "1.2" for uname -r.
-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	exit ;;
-    Alpha\ *:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# Should we change UNAME_MACHINE based on the output of uname instead
-	# of the specific Alpha model?
-	echo alpha-pc-interix
-	exit ;;
-    21064:Windows_NT:50:3)
-	echo alpha-dec-winnt3.5
-	exit ;;
-    Amiga*:UNIX_System_V:4.0:*)
-	echo m68k-unknown-sysv4
-	exit ;;
-    *:[Aa]miga[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-amigaos
-	exit ;;
-    *:[Mm]orph[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-morphos
-	exit ;;
-    *:OS/390:*:*)
-	echo i370-ibm-openedition
-	exit ;;
-    *:z/VM:*:*)
-	echo s390-ibm-zvmoe
-	exit ;;
-    *:OS400:*:*)
-        echo powerpc-ibm-os400
-	exit ;;
-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-	echo arm-acorn-riscix${UNAME_RELEASE}
-	exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
-	echo arm-unknown-riscos
-	exit ;;
-    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
-	echo hppa1.1-hitachi-hiuxmpp
-	exit ;;
-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
-	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-	if test "`(/bin/universe) 2>/dev/null`" = att ; then
-		echo pyramid-pyramid-sysv3
-	else
-		echo pyramid-pyramid-bsd
-	fi
-	exit ;;
-    NILE*:*:*:dcosx)
-	echo pyramid-pyramid-svr4
-	exit ;;
-    DRS?6000:unix:4.0:6*)
-	echo sparc-icl-nx6
-	exit ;;
-    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
-	case `/usr/bin/uname -p` in
-	    sparc) echo sparc-icl-nx7; exit ;;
-	esac ;;
-    sun4H:SunOS:5.*:*)
-	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    i86pc:SunOS:5.*:*)
-	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:6*:*)
-	# According to config.sub, this is the proper way to canonicalize
-	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
-	# it's likely to be more like Solaris than SunOS4.
-	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:*:*)
-	case "`/usr/bin/arch -k`" in
-	    Series*|S4*)
-		UNAME_RELEASE=`uname -v`
-		;;
-	esac
-	# Japanese Language versions have a version number like `4.1.3-JL'.
-	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-	exit ;;
-    sun3*:SunOS:*:*)
-	echo m68k-sun-sunos${UNAME_RELEASE}
-	exit ;;
-    sun*:*:4.2BSD:*)
-	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
-	case "`/bin/arch`" in
-	    sun3)
-		echo m68k-sun-sunos${UNAME_RELEASE}
-		;;
-	    sun4)
-		echo sparc-sun-sunos${UNAME_RELEASE}
-		;;
-	esac
-	exit ;;
-    aushp:SunOS:*:*)
-	echo sparc-auspex-sunos${UNAME_RELEASE}
-	exit ;;
-    # The situation for MiNT is a little confusing.  The machine name
-    # can be virtually everything (everything which is not
-    # "atarist" or "atariste" at least should have a processor
-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
-    # to the lowercase version "mint" (or "freemint").  Finally
-    # the system name "TOS" denotes a system which is actually not
-    # MiNT.  But MiNT is downward compatible to TOS, so this should
-    # be no problem.
-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-        exit ;;
-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit ;;
-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit ;;
-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit ;;
-    m68k:machten:*:*)
-	echo m68k-apple-machten${UNAME_RELEASE}
-	exit ;;
-    powerpc:machten:*:*)
-	echo powerpc-apple-machten${UNAME_RELEASE}
-	exit ;;
-    RISC*:Mach:*:*)
-	echo mips-dec-mach_bsd4.3
-	exit ;;
-    RISC*:ULTRIX:*:*)
-	echo mips-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    VAX*:ULTRIX*:*:*)
-	echo vax-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    2020:CLIX:*:* | 2430:CLIX:*:*)
-	echo clipper-intergraph-clix${UNAME_RELEASE}
-	exit ;;
-    mips:*:*:UMIPS | mips:*:*:RISCos)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-	int main (int argc, char *argv[]) {
-#else
-	int main (argc, argv) int argc; char *argv[]; {
-#endif
-	#if defined (host_mips) && defined (MIPSEB)
-	#if defined (SYSTYPE_SYSV)
-	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_SVR4)
-	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
-	#endif
-	#endif
-	  exit (-1);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c &&
-	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
-	  SYSTEM_NAME=`$dummy $dummyarg` &&
-	    { echo "$SYSTEM_NAME"; exit; }
-	echo mips-mips-riscos${UNAME_RELEASE}
-	exit ;;
-    Motorola:PowerMAX_OS:*:*)
-	echo powerpc-motorola-powermax
-	exit ;;
-    Motorola:*:4.3:PL8-*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:Power_UNIX:*:*)
-	echo powerpc-harris-powerunix
-	exit ;;
-    m88k:CX/UX:7*:*)
-	echo m88k-harris-cxux7
-	exit ;;
-    m88k:*:4*:R4*)
-	echo m88k-motorola-sysv4
-	exit ;;
-    m88k:*:3*:R3*)
-	echo m88k-motorola-sysv3
-	exit ;;
-    AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
-	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
-	then
-	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
-	       [ ${TARGET_BINARY_INTERFACE}x = x ]
-	    then
-		echo m88k-dg-dgux${UNAME_RELEASE}
-	    else
-		echo m88k-dg-dguxbcs${UNAME_RELEASE}
-	    fi
-	else
-	    echo i586-dg-dgux${UNAME_RELEASE}
-	fi
- 	exit ;;
-    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
-	echo m88k-dolphin-sysv3
-	exit ;;
-    M88*:*:R3*:*)
-	# Delta 88k system running SVR3
-	echo m88k-motorola-sysv3
-	exit ;;
-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-	echo m88k-tektronix-sysv3
-	exit ;;
-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-	echo m68k-tektronix-bsd
-	exit ;;
-    *:IRIX*:*:*)
-	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-	exit ;;
-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
-	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
-    i*86:AIX:*:*)
-	echo i386-ibm-aix
-	exit ;;
-    ia64:AIX:*:*)
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:2:3)
-	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-		eval $set_cc_for_build
-		sed 's/^		//' << EOF >$dummy.c
-		#include <sys/systemcfg.h>
-
-		main()
-			{
-			if (!__power_pc())
-				exit(1);
-			puts("powerpc-ibm-aix3.2.5");
-			exit(0);
-			}
-EOF
-		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
-		then
-			echo "$SYSTEM_NAME"
-		else
-			echo rs6000-ibm-aix3.2.5
-		fi
-	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-		echo rs6000-ibm-aix3.2.4
-	else
-		echo rs6000-ibm-aix3.2
-	fi
-	exit ;;
-    *:AIX:*:[45])
-	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
-	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
-		IBM_ARCH=rs6000
-	else
-		IBM_ARCH=powerpc
-	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:*:*)
-	echo rs6000-ibm-aix
-	exit ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
-	echo romp-ibm-bsd4.4
-	exit ;;
-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
-	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-	exit ;;                             # report: romp-ibm BSD 4.3
-    *:BOSX:*:*)
-	echo rs6000-bull-bosx
-	exit ;;
-    DPX/2?00:B.O.S.:*:*)
-	echo m68k-bull-sysv3
-	exit ;;
-    9000/[34]??:4.3bsd:1.*:*)
-	echo m68k-hp-bsd
-	exit ;;
-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-	echo m68k-hp-bsd4.4
-	exit ;;
-    9000/[34678]??:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	case "${UNAME_MACHINE}" in
-	    9000/31? )            HP_ARCH=m68000 ;;
-	    9000/[34]?? )         HP_ARCH=m68k ;;
-	    9000/[678][0-9][0-9])
-		if [ -x /usr/bin/getconf ]; then
-		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
-                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-                    case "${sc_cpu_version}" in
-                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
-                      532)                      # CPU_PA_RISC2_0
-                        case "${sc_kernel_bits}" in
-                          32) HP_ARCH="hppa2.0n" ;;
-                          64) HP_ARCH="hppa2.0w" ;;
-			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
-                        esac ;;
-                    esac
-		fi
-		if [ "${HP_ARCH}" = "" ]; then
-		    eval $set_cc_for_build
-		    sed 's/^              //' << EOF >$dummy.c
-
-              #define _HPUX_SOURCE
-              #include <stdlib.h>
-              #include <unistd.h>
-
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
-
-                  switch (cpu)
-              	{
-              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-              	case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-              	    switch (bits)
-              		{
-              		case 64: puts ("hppa2.0w"); break;
-              		case 32: puts ("hppa2.0n"); break;
-              		default: puts ("hppa2.0"); break;
-              		} break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-              	    puts ("hppa2.0"); break;
-              #endif
-              	default: puts ("hppa1.0"); break;
-              	}
-                  exit (0);
-              }
-EOF
-		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
-		    test -z "$HP_ARCH" && HP_ARCH=hppa
-		fi ;;
-	esac
-	if [ ${HP_ARCH} = "hppa2.0w" ]
-	then
-	    eval $set_cc_for_build
-
-	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
-	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
-	    # generating 64-bit code.  GNU and HP use different nomenclature:
-	    #
-	    # $ CC_FOR_BUILD=cc ./config.guess
-	    # => hppa2.0w-hp-hpux11.23
-	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
-	    # => hppa64-hp-hpux11.23
-
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
-		grep __LP64__ >/dev/null
-	    then
-		HP_ARCH="hppa2.0w"
-	    else
-		HP_ARCH="hppa64"
-	    fi
-	fi
-	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-	exit ;;
-    ia64:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	echo ia64-hp-hpux${HPUX_REV}
-	exit ;;
-    3050*:HI-UX:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <unistd.h>
-	int
-	main ()
-	{
-	  long cpu = sysconf (_SC_CPU_VERSION);
-	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
-	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
-	     results, however.  */
-	  if (CPU_IS_PA_RISC (cpu))
-	    {
-	      switch (cpu)
-		{
-		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
-		  default: puts ("hppa-hitachi-hiuxwe2"); break;
-		}
-	    }
-	  else if (CPU_IS_HP_MC68K (cpu))
-	    puts ("m68k-hitachi-hiuxwe2");
-	  else puts ("unknown-hitachi-hiuxwe2");
-	  exit (0);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
-		{ echo "$SYSTEM_NAME"; exit; }
-	echo unknown-hitachi-hiuxwe2
-	exit ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
-	echo hppa1.1-hp-bsd
-	exit ;;
-    9000/8??:4.3bsd:*:*)
-	echo hppa1.0-hp-bsd
-	exit ;;
-    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
-	echo hppa1.0-hp-mpeix
-	exit ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
-	echo hppa1.1-hp-osf
-	exit ;;
-    hp8??:OSF1:*:*)
-	echo hppa1.0-hp-osf
-	exit ;;
-    i*86:OSF1:*:*)
-	if [ -x /usr/sbin/sysversion ] ; then
-	    echo ${UNAME_MACHINE}-unknown-osf1mk
-	else
-	    echo ${UNAME_MACHINE}-unknown-osf1
-	fi
-	exit ;;
-    parisc*:Lites*:*:*)
-	echo hppa1.1-hp-lites
-	exit ;;
-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-	echo c1-convex-bsd
-        exit ;;
-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-        exit ;;
-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-	echo c34-convex-bsd
-        exit ;;
-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-	echo c38-convex-bsd
-        exit ;;
-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-	echo c4-convex-bsd
-        exit ;;
-    CRAY*Y-MP:*:*:*)
-	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*[A-Z]90:*:*:*)
-	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
-	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
-	      -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*TS:*:*:*)
-	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*T3E:*:*:*)
-	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*SV1:*:*:*)
-	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    *:UNICOS/mp:*:*)
-	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-        exit ;;
-    5000:UNIX_System_V:4.*:*)
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
-        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
-    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
-	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-	exit ;;
-    sparc*:BSD/OS:*:*)
-	echo sparc-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:BSD/OS:*:*)
-	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:FreeBSD:*:*)
-	case ${UNAME_MACHINE} in
-	    pc98)
-		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    *)
-		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	esac
-	exit ;;
-    i*:CYGWIN*:*)
-	echo ${UNAME_MACHINE}-pc-cygwin
-	exit ;;
-    i*:MINGW*:*)
-	echo ${UNAME_MACHINE}-pc-mingw32
-	exit ;;
-    i*:windows32*:*)
-    	# uname -m includes "-pc" on this system.
-    	echo ${UNAME_MACHINE}-mingw32
-	exit ;;
-    i*:PW*:*)
-	echo ${UNAME_MACHINE}-pc-pw32
-	exit ;;
-    x86:Interix*:[345]*)
-	echo i586-pc-interix${UNAME_RELEASE}
-	exit ;;
-    EM64T:Interix*:[345]*)
-	echo x86_64-unknown-interix${UNAME_RELEASE}
-	exit ;;
-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
-	echo i${UNAME_MACHINE}-pc-mks
-	exit ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-	# UNAME_MACHINE based on the output of uname instead of i386?
-	echo i586-pc-interix
-	exit ;;
-    i*:UWIN*:*)
-	echo ${UNAME_MACHINE}-pc-uwin
-	exit ;;
-    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-	echo x86_64-unknown-cygwin
-	exit ;;
-    p*:CYGWIN*:*)
-	echo powerpcle-unknown-cygwin
-	exit ;;
-    prep*:SunOS:5.*:*)
-	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    *:GNU:*:*)
-	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-	exit ;;
-    *:GNU/*:*:*)
-	# other systems with GNU libc and userland
-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
-	exit ;;
-    i*86:Minix:*:*)
-	echo ${UNAME_MACHINE}-pc-minix
-	exit ;;
-    arm*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    cris:Linux:*:*)
-	echo cris-axis-linux-gnu
-	exit ;;
-    crisv32:Linux:*:*)
-	echo crisv32-axis-linux-gnu
-	exit ;;
-    frv:Linux:*:*)
-    	echo frv-unknown-linux-gnu
-	exit ;;
-    ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    mips:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef mips
-	#undef mipsel
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=mipsel
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=mips
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-	    /^CPU/{
-		s: ::g
-		p
-	    }'`"
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-	;;
-    mips64:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef mips64
-	#undef mips64el
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=mips64el
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=mips64
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-	    /^CPU/{
-		s: ::g
-		p
-	    }'`"
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-	;;
-    or32:Linux:*:*)
-	echo or32-unknown-linux-gnu
-	exit ;;
-    ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
-	exit ;;
-    ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
-	exit ;;
-    alpha:Linux:*:*)
-	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
-	  EV5)   UNAME_MACHINE=alphaev5 ;;
-	  EV56)  UNAME_MACHINE=alphaev56 ;;
-	  PCA56) UNAME_MACHINE=alphapca56 ;;
-	  PCA57) UNAME_MACHINE=alphapca56 ;;
-	  EV6)   UNAME_MACHINE=alphaev6 ;;
-	  EV67)  UNAME_MACHINE=alphaev67 ;;
-	  EV68*) UNAME_MACHINE=alphaev68 ;;
-        esac
-	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
-	exit ;;
-    parisc:Linux:*:* | hppa:Linux:*:*)
-	# Look for CPU level
-	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
-	  *)    echo hppa-unknown-linux-gnu ;;
-	esac
-	exit ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
-	exit ;;
-    s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
-	exit ;;
-    sh64*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-gnu
-	exit ;;
-    x86_64:Linux:*:*)
-	echo x86_64-unknown-linux-gnu
-	exit ;;
-    i*86:Linux:*:*)
-	# The BFD linker knows what the default object file format is, so
-	# first see if it will tell us. cd to the root directory to prevent
-	# problems with other programs or directories called `ld' in the path.
-	# Set LC_ALL=C to ensure ld outputs messages in English.
-	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
-			 | sed -ne '/supported targets:/!d
-				    s/[ 	][ 	]*/ /g
-				    s/.*supported targets: *//
-				    s/ .*//
-				    p'`
-        case "$ld_supported_targets" in
-	  elf32-i386)
-		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
-		;;
-	  a.out-i386-linux)
-		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
-		exit ;;
-	  coff-i386)
-		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
-		exit ;;
-	  "")
-		# Either a pre-BFD a.out linker (linux-gnuoldld) or
-		# one that does not give us useful --help.
-		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
-		exit ;;
-	esac
-	# Determine whether the default compiler is a.out or elf
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <features.h>
-	#ifdef __ELF__
-	# ifdef __GLIBC__
-	#  if __GLIBC__ >= 2
-	LIBC=gnu
-	#  else
-	LIBC=gnulibc1
-	#  endif
-	# else
-	LIBC=gnulibc1
-	# endif
-	#else
-	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__sun)
-	LIBC=gnu
-	#else
-	LIBC=gnuaout
-	#endif
-	#endif
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-	    /^LIBC/{
-		s: ::g
-		p
-	    }'`"
-	test x"${LIBC}" != x && {
-		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
-		exit
-	}
-	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
-	;;
-    i*86:DYNIX/ptx:4*:*)
-	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
-	# earlier versions are messed up and put the nodename in both
-	# sysname and nodename.
-	echo i386-sequent-sysv4
-	exit ;;
-    i*86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
-	# I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
-	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-	exit ;;
-    i*86:OS/2:*:*)
-	# If we were able to find `uname', then EMX Unix compatibility
-	# is probably installed.
-	echo ${UNAME_MACHINE}-pc-os2-emx
-	exit ;;
-    i*86:XTS-300:*:STOP)
-	echo ${UNAME_MACHINE}-unknown-stop
-	exit ;;
-    i*86:atheos:*:*)
-	echo ${UNAME_MACHINE}-unknown-atheos
-	exit ;;
-    i*86:syllable:*:*)
-	echo ${UNAME_MACHINE}-pc-syllable
-	exit ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
-	echo i386-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    i*86:*DOS:*:*)
-	echo ${UNAME_MACHINE}-pc-msdosdjgpp
-	exit ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
-	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
-	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
-	else
-		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
-	fi
-	exit ;;
-    i*86:*:5:[678]*)
-    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
-	case `/bin/uname -X | grep "^Machine"` in
-	    *486*)	     UNAME_MACHINE=i486 ;;
-	    *Pentium)	     UNAME_MACHINE=i586 ;;
-	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
-	esac
-	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-	exit ;;
-    i*86:*:3.2:*)
-	if test -f /usr/options/cb.name; then
-		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
-	elif /bin/uname -X 2>/dev/null >/dev/null ; then
-		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
-		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
-		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
-			&& UNAME_MACHINE=i586
-		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
-	else
-		echo ${UNAME_MACHINE}-pc-sysv32
-	fi
-	exit ;;
-    pc:*:*:*)
-	# Left here for compatibility:
-        # uname -m prints for DJGPP always 'pc', but it prints nothing about
-        # the processor, so we play safe by assuming i386.
-	echo i386-pc-msdosdjgpp
-        exit ;;
-    Intel:Mach:3*:*)
-	echo i386-pc-mach3
-	exit ;;
-    paragon:*:*:*)
-	echo i860-intel-osf1
-	exit ;;
-    i860:*:4.*:*) # i860-SVR4
-	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
-	else # Add other i860-SVR4 vendors below as they are discovered.
-	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
-	fi
-	exit ;;
-    mini*:CTIX:SYS*5:*)
-	# "miniframe"
-	echo m68010-convergent-sysv
-	exit ;;
-    mc68k:UNIX:SYSTEM5:3.51m)
-	echo m68k-convergent-sysv
-	exit ;;
-    M680?0:D-NIX:5.3:*)
-	echo m68k-diab-dnix
-	exit ;;
-    M68*:*:R3V[5678]*:*)
-	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
-    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
-	OS_REL=''
-	test -r /etc/.relid \
-	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && { echo i486-ncr-sysv4; exit; } ;;
-    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-	echo m68k-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    mc68030:UNIX_System_V:4.*:*)
-	echo m68k-atari-sysv4
-	exit ;;
-    TSUNAMI:LynxOS:2.*:*)
-	echo sparc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    rs6000:LynxOS:2.*:*)
-	echo rs6000-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
-	echo powerpc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    SM[BE]S:UNIX_SV:*:*)
-	echo mips-dde-sysv${UNAME_RELEASE}
-	exit ;;
-    RM*:ReliantUNIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    RM*:SINIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    *:SINIX-*:*:*)
-	if uname -p 2>/dev/null >/dev/null ; then
-		UNAME_MACHINE=`(uname -p) 2>/dev/null`
-		echo ${UNAME_MACHINE}-sni-sysv4
-	else
-		echo ns32k-sni-sysv
-	fi
-	exit ;;
-    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                      # says <Richard.M.Bartel@ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit ;;
-    *:UNIX_System_V:4*:FTX*)
-	# From Gerald Hewes <hewes@openmarket.com>.
-	# How about differentiating between stratus architectures? -djm
-	echo hppa1.1-stratus-sysv4
-	exit ;;
-    *:*:*:FTX*)
-	# From seanf@swdc.stratus.com.
-	echo i860-stratus-sysv4
-	exit ;;
-    i*86:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo ${UNAME_MACHINE}-stratus-vos
-	exit ;;
-    *:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo hppa1.1-stratus-vos
-	exit ;;
-    mc68*:A/UX:*:*)
-	echo m68k-apple-aux${UNAME_RELEASE}
-	exit ;;
-    news*:NEWS-OS:6*:*)
-	echo mips-sony-newsos6
-	exit ;;
-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-	if [ -d /usr/nec ]; then
-	        echo mips-nec-sysv${UNAME_RELEASE}
-	else
-	        echo mips-unknown-sysv${UNAME_RELEASE}
-	fi
-        exit ;;
-    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
-	echo powerpc-be-beos
-	exit ;;
-    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
-	echo powerpc-apple-beos
-	exit ;;
-    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
-	echo i586-pc-beos
-	exit ;;
-    SX-4:SUPER-UX:*:*)
-	echo sx4-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-5:SUPER-UX:*:*)
-	echo sx5-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-6:SUPER-UX:*:*)
-	echo sx6-nec-superux${UNAME_RELEASE}
-	exit ;;
-    Power*:Rhapsody:*:*)
-	echo powerpc-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Rhapsody:*:*)
-	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Darwin:*:*)
-	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
-	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
-	exit ;;
-    *:procnto*:*:* | *:QNX:[0123456789]*:*)
-	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
-		UNAME_PROCESSOR=i386
-		UNAME_MACHINE=pc
-	fi
-	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
-	exit ;;
-    *:QNX:*:4*)
-	echo i386-pc-qnx
-	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
-	echo nse-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    NSR-?:NONSTOP_KERNEL:*:*)
-	echo nsr-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    *:NonStop-UX:*:*)
-	echo mips-compaq-nonstopux
-	exit ;;
-    BS2000:POSIX*:*:*)
-	echo bs2000-siemens-sysv
-	exit ;;
-    DS/*:UNIX_System_V:*:*)
-	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-	exit ;;
-    *:Plan9:*:*)
-	# "uname -m" is not consistent, so use $cputype instead. 386
-	# is converted to i386 for consistency with other x86
-	# operating systems.
-	if test "$cputype" = "386"; then
-	    UNAME_MACHINE=i386
-	else
-	    UNAME_MACHINE="$cputype"
-	fi
-	echo ${UNAME_MACHINE}-unknown-plan9
-	exit ;;
-    *:TOPS-10:*:*)
-	echo pdp10-unknown-tops10
-	exit ;;
-    *:TENEX:*:*)
-	echo pdp10-unknown-tenex
-	exit ;;
-    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
-	echo pdp10-dec-tops20
-	exit ;;
-    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
-	echo pdp10-xkl-tops20
-	exit ;;
-    *:TOPS-20:*:*)
-	echo pdp10-unknown-tops20
-	exit ;;
-    *:ITS:*:*)
-	echo pdp10-unknown-its
-	exit ;;
-    SEI:*:*:SEIUX)
-        echo mips-sei-seiux${UNAME_RELEASE}
-	exit ;;
-    *:DragonFly:*:*)
-	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-	exit ;;
-    *:*VMS:*:*)
-    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
-	case "${UNAME_MACHINE}" in
-	    A*) echo alpha-dec-vms ; exit ;;
-	    I*) echo ia64-dec-vms ; exit ;;
-	    V*) echo vax-dec-vms ; exit ;;
-	esac ;;
-    *:XENIX:*:SysV)
-	echo i386-pc-xenix
-	exit ;;
-    i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
-	exit ;;
-    i*86:rdos:*:*)
-	echo ${UNAME_MACHINE}-pc-rdos
-	exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-          "4"
-#else
-	  ""
-#endif
-         ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
-  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
-and
-  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo               = `(hostinfo) 2>/dev/null`
-/bin/universe          = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch              = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM  = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/xpa/config.sub b/xpa/config.sub
deleted file mode 100755
index 5705e54..0000000
--- a/xpa/config.sub
+++ /dev/null
@@ -1,1609 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
-#   Inc.
-
-timestamp='2006-03-07'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support.  The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help"
-       exit 1 ;;
-
-    *local*)
-       # First pass through any local machine types.
-       echo $1
-       exit ;;
-
-    * )
-       break ;;
-  esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
-    exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
-    exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
-  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
-  storm-chaos* | os2-emx* | rtmk-nova*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-	-sun*os*)
-		# Prevent following clause from handling this invalid input.
-		;;
-	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray)
-		os=
-		basic_machine=$1
-		;;
-	-sim | -cisco | -oki | -wec | -winbond)
-		os=
-		basic_machine=$1
-		;;
-	-scout)
-		;;
-	-wrs)
-		os=-vxworks
-		basic_machine=$1
-		;;
-	-chorusos*)
-		os=-chorusos
-		basic_machine=$1
-		;;
- 	-chorusrdb)
- 		os=-chorusrdb
-		basic_machine=$1
- 		;;
-	-hiux*)
-		os=-hiuxwe2
-		;;
-	-sco6)
-		os=-sco5v6
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5)
-		os=-sco3.2v5
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco4)
-		os=-sco3.2v4
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2.[4-9]*)
-		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2v[4-9]*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5v6*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco*)
-		os=-sco3.2v2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-udk*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-isc)
-		os=-isc2.2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-clix*)
-		basic_machine=clipper-intergraph
-		;;
-	-isc*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-lynx*)
-		os=-lynxos
-		;;
-	-ptx*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
-		;;
-	-windowsnt*)
-		os=`echo $os | sed -e 's/windowsnt/winnt/'`
-		;;
-	-psos*)
-		os=-psos
-		;;
-	-mint | -mint[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
-	# Recognize the basic CPU types without company name.
-	# Some are omitted here because they have special meanings below.
-	1750a | 580 \
-	| a29k \
-	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
-	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
-	| bfin \
-	| c4x | clipper \
-	| d10v | d30v | dlx | dsp16xx \
-	| fr30 | frv \
-	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-	| i370 | i860 | i960 | ia64 \
-	| ip2k | iq2000 \
-	| m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \
-	| mips | mipsbe | mipseb | mipsel | mipsle \
-	| mips16 \
-	| mips64 | mips64el \
-	| mips64vr | mips64vrel \
-	| mips64orion | mips64orionel \
-	| mips64vr4100 | mips64vr4100el \
-	| mips64vr4300 | mips64vr4300el \
-	| mips64vr5000 | mips64vr5000el \
-	| mips64vr5900 | mips64vr5900el \
-	| mipsisa32 | mipsisa32el \
-	| mipsisa32r2 | mipsisa32r2el \
-	| mipsisa64 | mipsisa64el \
-	| mipsisa64r2 | mipsisa64r2el \
-	| mipsisa64sb1 | mipsisa64sb1el \
-	| mipsisa64sr71k | mipsisa64sr71kel \
-	| mipstx39 | mipstx39el \
-	| mn10200 | mn10300 \
-	| mt \
-	| msp430 \
-	| nios | nios2 \
-	| ns16k | ns32k \
-	| or32 \
-	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
-	| pyramid \
-	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
-	| sh64 | sh64le \
-	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
-	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| strongarm \
-	| tahoe | thumb | tic4x | tic80 | tron \
-	| v850 | v850e \
-	| we32k \
-	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
-	| z8k)
-		basic_machine=$basic_machine-unknown
-		;;
-	m32c)
-		basic_machine=$basic_machine-unknown
-		;;
-	m6811 | m68hc11 | m6812 | m68hc12)
-		# Motorola 68HC11/12.
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
-		;;
-	ms1)
-		basic_machine=mt-unknown
-		;;
-
-	# We use `pc' rather than `unknown'
-	# because (1) that's what they normally are, and
-	# (2) the word "unknown" tends to confuse beginning users.
-	i*86 | x86_64)
-	  basic_machine=$basic_machine-pc
-	  ;;
-	# Object if more than one company name word.
-	*-*-*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-	# Recognize the basic CPU types with company name.
-	580-* \
-	| a29k-* \
-	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
-	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-	| avr-* \
-	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
-	| clipper-* | craynv-* | cydra-* \
-	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
-	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
-	| h8300-* | h8500-* \
-	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-	| i*86-* | i860-* | i960-* | ia64-* \
-	| ip2k-* | iq2000-* \
-	| m32r-* | m32rle-* \
-	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* \
-	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
-	| mips16-* \
-	| mips64-* | mips64el-* \
-	| mips64vr-* | mips64vrel-* \
-	| mips64orion-* | mips64orionel-* \
-	| mips64vr4100-* | mips64vr4100el-* \
-	| mips64vr4300-* | mips64vr4300el-* \
-	| mips64vr5000-* | mips64vr5000el-* \
-	| mips64vr5900-* | mips64vr5900el-* \
-	| mipsisa32-* | mipsisa32el-* \
-	| mipsisa32r2-* | mipsisa32r2el-* \
-	| mipsisa64-* | mipsisa64el-* \
-	| mipsisa64r2-* | mipsisa64r2el-* \
-	| mipsisa64sb1-* | mipsisa64sb1el-* \
-	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
-	| mipstx39-* | mipstx39el-* \
-	| mmix-* \
-	| mt-* \
-	| msp430-* \
-	| nios-* | nios2-* \
-	| none-* | np1-* | ns16k-* | ns32k-* \
-	| orion-* \
-	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
-	| pyramid-* \
-	| romp-* | rs6000-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
-	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
-	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
-	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
-	| tahoe-* | thumb-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
-	| tron-* \
-	| v850-* | v850e-* | vax-* \
-	| we32k-* \
-	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
-	| xstormy16-* | xtensa-* \
-	| ymp-* \
-	| z8k-*)
-		;;
-	m32c-*)
-		;;
-	# Recognize the various machine names and aliases which stand
-	# for a CPU type and a company and sometimes even an OS.
-	386bsd)
-		basic_machine=i386-unknown
-		os=-bsd
-		;;
-	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-		basic_machine=m68000-att
-		;;
-	3b*)
-		basic_machine=we32k-att
-		;;
-	a29khif)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-    	abacus)
-		basic_machine=abacus-unknown
-		;;
-	adobe68k)
-		basic_machine=m68010-adobe
-		os=-scout
-		;;
-	alliant | fx80)
-		basic_machine=fx80-alliant
-		;;
-	altos | altos3068)
-		basic_machine=m68k-altos
-		;;
-	am29k)
-		basic_machine=a29k-none
-		os=-bsd
-		;;
-	amd64)
-		basic_machine=x86_64-pc
-		;;
-	amd64-*)
-		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	amdahl)
-		basic_machine=580-amdahl
-		os=-sysv
-		;;
-	amiga | amiga-*)
-		basic_machine=m68k-unknown
-		;;
-	amigaos | amigados)
-		basic_machine=m68k-unknown
-		os=-amigaos
-		;;
-	amigaunix | amix)
-		basic_machine=m68k-unknown
-		os=-sysv4
-		;;
-	apollo68)
-		basic_machine=m68k-apollo
-		os=-sysv
-		;;
-	apollo68bsd)
-		basic_machine=m68k-apollo
-		os=-bsd
-		;;
-	aux)
-		basic_machine=m68k-apple
-		os=-aux
-		;;
-	balance)
-		basic_machine=ns32k-sequent
-		os=-dynix
-		;;
-	c90)
-		basic_machine=c90-cray
-		os=-unicos
-		;;
-	convex-c1)
-		basic_machine=c1-convex
-		os=-bsd
-		;;
-	convex-c2)
-		basic_machine=c2-convex
-		os=-bsd
-		;;
-	convex-c32)
-		basic_machine=c32-convex
-		os=-bsd
-		;;
-	convex-c34)
-		basic_machine=c34-convex
-		os=-bsd
-		;;
-	convex-c38)
-		basic_machine=c38-convex
-		os=-bsd
-		;;
-	cray | j90)
-		basic_machine=j90-cray
-		os=-unicos
-		;;
-	craynv)
-		basic_machine=craynv-cray
-		os=-unicosmp
-		;;
-	cr16c)
-		basic_machine=cr16c-unknown
-		os=-elf
-		;;
-	crds | unos)
-		basic_machine=m68k-crds
-		;;
-	crisv32 | crisv32-* | etraxfs*)
-		basic_machine=crisv32-axis
-		;;
-	cris | cris-* | etrax*)
-		basic_machine=cris-axis
-		;;
-	crx)
-		basic_machine=crx-unknown
-		os=-elf
-		;;
-	da30 | da30-*)
-		basic_machine=m68k-da30
-		;;
-	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-		basic_machine=mips-dec
-		;;
-	decsystem10* | dec10*)
-		basic_machine=pdp10-dec
-		os=-tops10
-		;;
-	decsystem20* | dec20*)
-		basic_machine=pdp10-dec
-		os=-tops20
-		;;
-	delta | 3300 | motorola-3300 | motorola-delta \
-	      | 3300-motorola | delta-motorola)
-		basic_machine=m68k-motorola
-		;;
-	delta88)
-		basic_machine=m88k-motorola
-		os=-sysv3
-		;;
-	djgpp)
-		basic_machine=i586-pc
-		os=-msdosdjgpp
-		;;
-	dpx20 | dpx20-*)
-		basic_machine=rs6000-bull
-		os=-bosx
-		;;
-	dpx2* | dpx2*-bull)
-		basic_machine=m68k-bull
-		os=-sysv3
-		;;
-	ebmon29k)
-		basic_machine=a29k-amd
-		os=-ebmon
-		;;
-	elxsi)
-		basic_machine=elxsi-elxsi
-		os=-bsd
-		;;
-	encore | umax | mmax)
-		basic_machine=ns32k-encore
-		;;
-	es1800 | OSE68k | ose68k | ose | OSE)
-		basic_machine=m68k-ericsson
-		os=-ose
-		;;
-	fx2800)
-		basic_machine=i860-alliant
-		;;
-	genix)
-		basic_machine=ns32k-ns
-		;;
-	gmicro)
-		basic_machine=tron-gmicro
-		os=-sysv
-		;;
-	go32)
-		basic_machine=i386-pc
-		os=-go32
-		;;
-	h3050r* | hiux*)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	h8300hms)
-		basic_machine=h8300-hitachi
-		os=-hms
-		;;
-	h8300xray)
-		basic_machine=h8300-hitachi
-		os=-xray
-		;;
-	h8500hms)
-		basic_machine=h8500-hitachi
-		os=-hms
-		;;
-	harris)
-		basic_machine=m88k-harris
-		os=-sysv3
-		;;
-	hp300-*)
-		basic_machine=m68k-hp
-		;;
-	hp300bsd)
-		basic_machine=m68k-hp
-		os=-bsd
-		;;
-	hp300hpux)
-		basic_machine=m68k-hp
-		os=-hpux
-		;;
-	hp3k9[0-9][0-9] | hp9[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k2[0-9][0-9] | hp9k31[0-9])
-		basic_machine=m68000-hp
-		;;
-	hp9k3[2-9][0-9])
-		basic_machine=m68k-hp
-		;;
-	hp9k6[0-9][0-9] | hp6[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k7[0-79][0-9] | hp7[0-79][0-9])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k78[0-9] | hp78[0-9])
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][13679] | hp8[0-9][13679])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][0-9] | hp8[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hppa-next)
-		os=-nextstep3
-		;;
-	hppaosf)
-		basic_machine=hppa1.1-hp
-		os=-osf
-		;;
-	hppro)
-		basic_machine=hppa1.1-hp
-		os=-proelf
-		;;
-	i370-ibm* | ibm*)
-		basic_machine=i370-ibm
-		;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-	i*86v32)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv32
-		;;
-	i*86v4*)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv4
-		;;
-	i*86v)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv
-		;;
-	i*86sol2)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-solaris2
-		;;
-	i386mach)
-		basic_machine=i386-mach
-		os=-mach
-		;;
-	i386-vsta | vsta)
-		basic_machine=i386-unknown
-		os=-vsta
-		;;
-	iris | iris4d)
-		basic_machine=mips-sgi
-		case $os in
-		    -irix*)
-			;;
-		    *)
-			os=-irix4
-			;;
-		esac
-		;;
-	isi68 | isi)
-		basic_machine=m68k-isi
-		os=-sysv
-		;;
-	m88k-omron*)
-		basic_machine=m88k-omron
-		;;
-	magnum | m3230)
-		basic_machine=mips-mips
-		os=-sysv
-		;;
-	merlin)
-		basic_machine=ns32k-utek
-		os=-sysv
-		;;
-	mingw32)
-		basic_machine=i386-pc
-		os=-mingw32
-		;;
-	miniframe)
-		basic_machine=m68000-convergent
-		;;
-	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-	mips3*-*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-		;;
-	mips3*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-		;;
-	monitor)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	morphos)
-		basic_machine=powerpc-unknown
-		os=-morphos
-		;;
-	msdos)
-		basic_machine=i386-pc
-		os=-msdos
-		;;
-	ms1-*)
-		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
-		;;
-	mvs)
-		basic_machine=i370-ibm
-		os=-mvs
-		;;
-	ncr3000)
-		basic_machine=i486-ncr
-		os=-sysv4
-		;;
-	netbsd386)
-		basic_machine=i386-unknown
-		os=-netbsd
-		;;
-	netwinder)
-		basic_machine=armv4l-rebel
-		os=-linux
-		;;
-	news | news700 | news800 | news900)
-		basic_machine=m68k-sony
-		os=-newsos
-		;;
-	news1000)
-		basic_machine=m68030-sony
-		os=-newsos
-		;;
-	news-3600 | risc-news)
-		basic_machine=mips-sony
-		os=-newsos
-		;;
-	necv70)
-		basic_machine=v70-nec
-		os=-sysv
-		;;
-	next | m*-next )
-		basic_machine=m68k-next
-		case $os in
-		    -nextstep* )
-			;;
-		    -ns2*)
-		      os=-nextstep2
-			;;
-		    *)
-		      os=-nextstep3
-			;;
-		esac
-		;;
-	nh3000)
-		basic_machine=m68k-harris
-		os=-cxux
-		;;
-	nh[45]000)
-		basic_machine=m88k-harris
-		os=-cxux
-		;;
-	nindy960)
-		basic_machine=i960-intel
-		os=-nindy
-		;;
-	mon960)
-		basic_machine=i960-intel
-		os=-mon960
-		;;
-	nonstopux)
-		basic_machine=mips-compaq
-		os=-nonstopux
-		;;
-	np1)
-		basic_machine=np1-gould
-		;;
-	nsr-tandem)
-		basic_machine=nsr-tandem
-		;;
-	op50n-* | op60c-*)
-		basic_machine=hppa1.1-oki
-		os=-proelf
-		;;
-	openrisc | openrisc-*)
-		basic_machine=or32-unknown
-		;;
-	os400)
-		basic_machine=powerpc-ibm
-		os=-os400
-		;;
-	OSE68000 | ose68000)
-		basic_machine=m68000-ericsson
-		os=-ose
-		;;
-	os68k)
-		basic_machine=m68k-none
-		os=-os68k
-		;;
-	pa-hitachi)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	paragon)
-		basic_machine=i860-intel
-		os=-osf
-		;;
-	pbd)
-		basic_machine=sparc-tti
-		;;
-	pbb)
-		basic_machine=m68k-tti
-		;;
-	pc532 | pc532-*)
-		basic_machine=ns32k-pc532
-		;;
-	pc98)
-		basic_machine=i386-pc
-		;;
-	pc98-*)
-		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium | p5 | k5 | k6 | nexgen | viac3)
-		basic_machine=i586-pc
-		;;
-	pentiumpro | p6 | 6x86 | athlon | athlon_*)
-		basic_machine=i686-pc
-		;;
-	pentiumii | pentium2 | pentiumiii | pentium3)
-		basic_machine=i686-pc
-		;;
-	pentium4)
-		basic_machine=i786-pc
-		;;
-	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
-		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumpro-* | p6-* | 6x86-* | athlon-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium4-*)
-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pn)
-		basic_machine=pn-gould
-		;;
-	power)	basic_machine=power-ibm
-		;;
-	ppc)	basic_machine=powerpc-unknown
-		;;
-	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppcle | powerpclittle | ppc-le | powerpc-little)
-		basic_machine=powerpcle-unknown
-		;;
-	ppcle-* | powerpclittle-*)
-		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64)	basic_machine=powerpc64-unknown
-		;;
-	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
-		basic_machine=powerpc64le-unknown
-		;;
-	ppc64le-* | powerpc64little-*)
-		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ps2)
-		basic_machine=i386-ibm
-		;;
-	pw32)
-		basic_machine=i586-unknown
-		os=-pw32
-		;;
-	rdos)
-		basic_machine=i386-pc
-		os=-rdos
-		;;
-	rom68k)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	rm[46]00)
-		basic_machine=mips-siemens
-		;;
-	rtpc | rtpc-*)
-		basic_machine=romp-ibm
-		;;
-	s390 | s390-*)
-		basic_machine=s390-ibm
-		;;
-	s390x | s390x-*)
-		basic_machine=s390x-ibm
-		;;
-	sa29200)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	sb1)
-		basic_machine=mipsisa64sb1-unknown
-		;;
-	sb1el)
-		basic_machine=mipsisa64sb1el-unknown
-		;;
-	sei)
-		basic_machine=mips-sei
-		os=-seiux
-		;;
-	sequent)
-		basic_machine=i386-sequent
-		;;
-	sh)
-		basic_machine=sh-hitachi
-		os=-hms
-		;;
-	sh64)
-		basic_machine=sh64-unknown
-		;;
-	sparclite-wrs | simso-wrs)
-		basic_machine=sparclite-wrs
-		os=-vxworks
-		;;
-	sps7)
-		basic_machine=m68k-bull
-		os=-sysv2
-		;;
-	spur)
-		basic_machine=spur-unknown
-		;;
-	st2000)
-		basic_machine=m68k-tandem
-		;;
-	stratus)
-		basic_machine=i860-stratus
-		os=-sysv4
-		;;
-	sun2)
-		basic_machine=m68000-sun
-		;;
-	sun2os3)
-		basic_machine=m68000-sun
-		os=-sunos3
-		;;
-	sun2os4)
-		basic_machine=m68000-sun
-		os=-sunos4
-		;;
-	sun3os3)
-		basic_machine=m68k-sun
-		os=-sunos3
-		;;
-	sun3os4)
-		basic_machine=m68k-sun
-		os=-sunos4
-		;;
-	sun4os3)
-		basic_machine=sparc-sun
-		os=-sunos3
-		;;
-	sun4os4)
-		basic_machine=sparc-sun
-		os=-sunos4
-		;;
-	sun4sol2)
-		basic_machine=sparc-sun
-		os=-solaris2
-		;;
-	sun3 | sun3-*)
-		basic_machine=m68k-sun
-		;;
-	sun4)
-		basic_machine=sparc-sun
-		;;
-	sun386 | sun386i | roadrunner)
-		basic_machine=i386-sun
-		;;
-	sv1)
-		basic_machine=sv1-cray
-		os=-unicos
-		;;
-	symmetry)
-		basic_machine=i386-sequent
-		os=-dynix
-		;;
-	t3e)
-		basic_machine=alphaev5-cray
-		os=-unicos
-		;;
-	t90)
-		basic_machine=t90-cray
-		os=-unicos
-		;;
-	tic54x | c54x*)
-		basic_machine=tic54x-unknown
-		os=-coff
-		;;
-	tic55x | c55x*)
-		basic_machine=tic55x-unknown
-		os=-coff
-		;;
-	tic6x | c6x*)
-		basic_machine=tic6x-unknown
-		os=-coff
-		;;
-	tx39)
-		basic_machine=mipstx39-unknown
-		;;
-	tx39el)
-		basic_machine=mipstx39el-unknown
-		;;
-	toad1)
-		basic_machine=pdp10-xkl
-		os=-tops20
-		;;
-	tower | tower-32)
-		basic_machine=m68k-ncr
-		;;
-	tpf)
-		basic_machine=s390x-ibm
-		os=-tpf
-		;;
-	udi29k)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	ultra3)
-		basic_machine=a29k-nyu
-		os=-sym1
-		;;
-	v810 | necv810)
-		basic_machine=v810-nec
-		os=-none
-		;;
-	vaxv)
-		basic_machine=vax-dec
-		os=-sysv
-		;;
-	vms)
-		basic_machine=vax-dec
-		os=-vms
-		;;
-	vpp*|vx|vx-*)
-		basic_machine=f301-fujitsu
-		;;
-	vxworks960)
-		basic_machine=i960-wrs
-		os=-vxworks
-		;;
-	vxworks68)
-		basic_machine=m68k-wrs
-		os=-vxworks
-		;;
-	vxworks29k)
-		basic_machine=a29k-wrs
-		os=-vxworks
-		;;
-	w65*)
-		basic_machine=w65-wdc
-		os=-none
-		;;
-	w89k-*)
-		basic_machine=hppa1.1-winbond
-		os=-proelf
-		;;
-	xbox)
-		basic_machine=i686-pc
-		os=-mingw32
-		;;
-	xps | xps100)
-		basic_machine=xps100-honeywell
-		;;
-	ymp)
-		basic_machine=ymp-cray
-		os=-unicos
-		;;
-	z8k-*-coff)
-		basic_machine=z8k-unknown
-		os=-sim
-		;;
-	none)
-		basic_machine=none-none
-		os=-none
-		;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-	w89k)
-		basic_machine=hppa1.1-winbond
-		;;
-	op50n)
-		basic_machine=hppa1.1-oki
-		;;
-	op60c)
-		basic_machine=hppa1.1-oki
-		;;
-	romp)
-		basic_machine=romp-ibm
-		;;
-	mmix)
-		basic_machine=mmix-knuth
-		;;
-	rs6000)
-		basic_machine=rs6000-ibm
-		;;
-	vax)
-		basic_machine=vax-dec
-		;;
-	pdp10)
-		# there are many clones, so DEC is not a safe bet
-		basic_machine=pdp10-unknown
-		;;
-	pdp11)
-		basic_machine=pdp11-dec
-		;;
-	we32k)
-		basic_machine=we32k-att
-		;;
-	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
-		basic_machine=sh-unknown
-		;;
-	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
-		basic_machine=sparc-sun
-		;;
-	cydra)
-		basic_machine=cydra-cydrome
-		;;
-	orion)
-		basic_machine=orion-highlevel
-		;;
-	orion105)
-		basic_machine=clipper-highlevel
-		;;
-	mac | mpw | mac-mpw)
-		basic_machine=m68k-apple
-		;;
-	pmac | pmac-mpw)
-		basic_machine=powerpc-apple
-		;;
-	*-unknown)
-		# Make sure to match an already-canonicalized machine name.
-		;;
-	*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-	*-digital*)
-		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
-		;;
-	*-commodore*)
-		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
-		;;
-	*)
-		;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
-	# -solaris* is a basic system type, with this one exception.
-	-solaris1 | -solaris1.*)
-		os=`echo $os | sed -e 's|solaris1|sunos4|'`
-		;;
-	-solaris)
-		os=-solaris2
-		;;
-	-svr4*)
-		os=-sysv4
-		;;
-	-unixware*)
-		os=-sysv4.2uw
-		;;
-	-gnu/linux*)
-		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-		;;
-	# First accept the basic system types.
-	# The portable systems comes first.
-	# Each alternative MUST END IN A *, to match a version number.
-	# -sysv* is not here because it comes later, after sysvr4.
-	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
-	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* \
-	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
-	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
-	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* \
-	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
-	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
-	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
-	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
-	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
-	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos*)
-	# Remember, each alternative MUST END IN *, to match a version number.
-		;;
-	-qnx*)
-		case $basic_machine in
-		    x86-* | i*86-*)
-			;;
-		    *)
-			os=-nto$os
-			;;
-		esac
-		;;
-	-nto-qnx*)
-		;;
-	-nto*)
-		os=`echo $os | sed -e 's|nto|nto-qnx|'`
-		;;
-	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
-	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
-		;;
-	-mac*)
-		os=`echo $os | sed -e 's|mac|macos|'`
-		;;
-	-linux-dietlibc)
-		os=-linux-dietlibc
-		;;
-	-linux*)
-		os=`echo $os | sed -e 's|linux|linux-gnu|'`
-		;;
-	-sunos5*)
-		os=`echo $os | sed -e 's|sunos5|solaris2|'`
-		;;
-	-sunos6*)
-		os=`echo $os | sed -e 's|sunos6|solaris3|'`
-		;;
-	-opened*)
-		os=-openedition
-		;;
-        -os400*)
-		os=-os400
-		;;
-	-wince*)
-		os=-wince
-		;;
-	-osfrose*)
-		os=-osfrose
-		;;
-	-osf*)
-		os=-osf
-		;;
-	-utek*)
-		os=-bsd
-		;;
-	-dynix*)
-		os=-bsd
-		;;
-	-acis*)
-		os=-aos
-		;;
-	-atheos*)
-		os=-atheos
-		;;
-	-syllable*)
-		os=-syllable
-		;;
-	-386bsd)
-		os=-bsd
-		;;
-	-ctix* | -uts*)
-		os=-sysv
-		;;
-	-nova*)
-		os=-rtmk-nova
-		;;
-	-ns2 )
-		os=-nextstep2
-		;;
-	-nsk*)
-		os=-nsk
-		;;
-	# Preserve the version number of sinix5.
-	-sinix5.*)
-		os=`echo $os | sed -e 's|sinix|sysv|'`
-		;;
-	-sinix*)
-		os=-sysv4
-		;;
-        -tpf*)
-		os=-tpf
-		;;
-	-triton*)
-		os=-sysv3
-		;;
-	-oss*)
-		os=-sysv3
-		;;
-	-svr4)
-		os=-sysv4
-		;;
-	-svr3)
-		os=-sysv3
-		;;
-	-sysvr4)
-		os=-sysv4
-		;;
-	# This must come after -sysvr4.
-	-sysv*)
-		;;
-	-ose*)
-		os=-ose
-		;;
-	-es1800*)
-		os=-ose
-		;;
-	-xenix)
-		os=-xenix
-		;;
-	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-		os=-mint
-		;;
-	-aros*)
-		os=-aros
-		;;
-	-kaos*)
-		os=-kaos
-		;;
-	-zvmoe)
-		os=-zvmoe
-		;;
-	-none)
-		;;
-	*)
-		# Get rid of the `-' at the beginning of $os.
-		os=`echo $os | sed 's/[^-]*-//'`
-		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-		exit 1
-		;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system.  Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
-	*-acorn)
-		os=-riscix1.2
-		;;
-	arm*-rebel)
-		os=-linux
-		;;
-	arm*-semi)
-		os=-aout
-		;;
-    c4x-* | tic4x-*)
-        os=-coff
-        ;;
-	# This must come before the *-dec entry.
-	pdp10-*)
-		os=-tops20
-		;;
-	pdp11-*)
-		os=-none
-		;;
-	*-dec | vax-*)
-		os=-ultrix4.2
-		;;
-	m68*-apollo)
-		os=-domain
-		;;
-	i386-sun)
-		os=-sunos4.0.2
-		;;
-	m68000-sun)
-		os=-sunos3
-		# This also exists in the configure program, but was not the
-		# default.
-		# os=-sunos4
-		;;
-	m68*-cisco)
-		os=-aout
-		;;
-	mips*-cisco)
-		os=-elf
-		;;
-	mips*-*)
-		os=-elf
-		;;
-	or32-*)
-		os=-coff
-		;;
-	*-tti)	# must be before sparc entry or we get the wrong os.
-		os=-sysv3
-		;;
-	sparc-* | *-sun)
-		os=-sunos4.1.1
-		;;
-	*-be)
-		os=-beos
-		;;
-	*-haiku)
-		os=-haiku
-		;;
-	*-ibm)
-		os=-aix
-		;;
-    	*-knuth)
-		os=-mmixware
-		;;
-	*-wec)
-		os=-proelf
-		;;
-	*-winbond)
-		os=-proelf
-		;;
-	*-oki)
-		os=-proelf
-		;;
-	*-hp)
-		os=-hpux
-		;;
-	*-hitachi)
-		os=-hiux
-		;;
-	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-		os=-sysv
-		;;
-	*-cbm)
-		os=-amigaos
-		;;
-	*-dg)
-		os=-dgux
-		;;
-	*-dolphin)
-		os=-sysv3
-		;;
-	m68k-ccur)
-		os=-rtu
-		;;
-	m88k-omron*)
-		os=-luna
-		;;
-	*-next )
-		os=-nextstep
-		;;
-	*-sequent)
-		os=-ptx
-		;;
-	*-crds)
-		os=-unos
-		;;
-	*-ns)
-		os=-genix
-		;;
-	i370-*)
-		os=-mvs
-		;;
-	*-next)
-		os=-nextstep3
-		;;
-	*-gould)
-		os=-sysv
-		;;
-	*-highlevel)
-		os=-bsd
-		;;
-	*-encore)
-		os=-bsd
-		;;
-	*-sgi)
-		os=-irix
-		;;
-	*-siemens)
-		os=-sysv4
-		;;
-	*-masscomp)
-		os=-rtu
-		;;
-	f30[01]-fujitsu | f700-fujitsu)
-		os=-uxpv
-		;;
-	*-rom68k)
-		os=-coff
-		;;
-	*-*bug)
-		os=-coff
-		;;
-	*-apple)
-		os=-macos
-		;;
-	*-atari*)
-		os=-mint
-		;;
-	*)
-		os=-none
-		;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-	*-unknown)
-		case $os in
-			-riscix*)
-				vendor=acorn
-				;;
-			-sunos*)
-				vendor=sun
-				;;
-			-aix*)
-				vendor=ibm
-				;;
-			-beos*)
-				vendor=be
-				;;
-			-hpux*)
-				vendor=hp
-				;;
-			-mpeix*)
-				vendor=hp
-				;;
-			-hiux*)
-				vendor=hitachi
-				;;
-			-unos*)
-				vendor=crds
-				;;
-			-dgux*)
-				vendor=dg
-				;;
-			-luna*)
-				vendor=omron
-				;;
-			-genix*)
-				vendor=ns
-				;;
-			-mvs* | -opened*)
-				vendor=ibm
-				;;
-			-os400*)
-				vendor=ibm
-				;;
-			-ptx*)
-				vendor=sequent
-				;;
-			-tpf*)
-				vendor=ibm
-				;;
-			-vxsim* | -vxworks* | -windiss*)
-				vendor=wrs
-				;;
-			-aux*)
-				vendor=apple
-				;;
-			-hms*)
-				vendor=hitachi
-				;;
-			-mpw* | -macos*)
-				vendor=apple
-				;;
-			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-				vendor=atari
-				;;
-			-vos*)
-				vendor=stratus
-				;;
-		esac
-		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
-		;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/xpa/configure b/xpa/configure
deleted file mode 100755
index f6c832d..0000000
--- a/xpa/configure
+++ /dev/null
@@ -1,9061 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.59 for xpa 2.1.18.
-#
-# Report bugs to <eric@cfa.harvard.edu>.
-#
-# Copyright (C) 2003 Free Software Foundation, Inc.
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## --------------------- ##
-## M4sh Initialization.  ##
-## --------------------- ##
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
-else
-  as_unset=false
-fi
-
-
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    $as_unset $as_var
-  fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-
-
-# PATH needs CR, and LINENO needs CR and PATH.
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conf$$.sh
-fi
-
-
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
-
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
-  fi
-  if test ! -f "$as_myself"; then
-    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
-	 /*)
-	   if ("$as_dir/$as_base" -c '
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
-
-  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
-  # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
-    sed '
-      N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
-      t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
-    ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
-    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
-   { (exit 1); exit 1; }; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
-  # Exit status is that of the last command.
-  exit
-}
-
-
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
-esac
-
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-rm -f conf$$ conf$$.exe conf$$.file
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
-    as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
-elif ln conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s=ln
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.file
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p=:
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-as_executable_p="test -f"
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
-
-# CDPATH.
-$as_unset CDPATH
-
-
-# Name of the host.
-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-exec 6>&1
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_config_libobj_dir=.
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-# Maximum number of lines to put in a shell here document.
-# This variable seems obsolete.  It should probably be removed, and
-# only ac_max_sed_lines should be used.
-: ${ac_max_here_lines=38}
-
-# Identity of this package.
-PACKAGE_NAME='xpa'
-PACKAGE_TARNAME='xpa'
-PACKAGE_VERSION='2.1.18'
-PACKAGE_STRING='xpa 2.1.18'
-PACKAGE_BUGREPORT='eric@cfa.harvard.edu'
-
-ac_unique_file="./xpa.h"
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#if STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# if HAVE_STDLIB_H
-#  include <stdlib.h>
-# endif
-#endif
-#if HAVE_STRING_H
-# if !STDC_HEADERS && HAVE_MEMORY_H
-#  include <memory.h>
-# endif
-# include <string.h>
-#endif
-#if HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#if HAVE_INTTYPES_H
-# include <inttypes.h>
-#else
-# if HAVE_STDINT_H
-#  include <stdint.h>
-# endif
-#endif
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP SZ_LONG RANLIB ac_ct_RANLIB TLIB DOSHARED LLIB X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS TCL_VERSION TCL_BIN_DIR TCL_SRC_DIR TCL_LIB_FILE TCL_LIB_FLAG TCL_LIB_SPEC TCL_STUB_LIB_FILE TCL_STUB_LIB_FLAG TCL_STUB_LIB_SPEC TCL_CFLAGS TCL_LIBS GTK_CFLAGS GTK_LIBS EXTRA_LIBS LIBOBJS LTLIBOBJS'
-ac_subst_files=''
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datadir='${prefix}/share'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-libdir='${exec_prefix}/lib'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-infodir='${prefix}/info'
-mandir='${prefix}/man'
-
-ac_prev=
-for ac_option
-do
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval "$ac_prev=\$ac_option"
-    ac_prev=
-    continue
-  fi
-
-  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case $ac_option in
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir=$ac_optarg ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build_alias ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build_alias=$ac_optarg ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file=$ac_optarg ;;
-
-  --config-cache | -C)
-    cache_file=config.cache ;;
-
-  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
-  | --da=*)
-    datadir=$ac_optarg ;;
-
-  -disable-* | --disable-*)
-    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
-   { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
-    eval "enable_$ac_feature=no" ;;
-
-  -enable-* | --enable-*)
-    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
-   { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
-    case $ac_option in
-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "enable_$ac_feature='$ac_optarg'" ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix=$ac_optarg ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he | -h)
-    ac_init_help=long ;;
-  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
-    ac_init_help=recursive ;;
-  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
-    ac_init_help=short ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host_alias ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host_alias=$ac_optarg ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir=$ac_optarg ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir=$ac_optarg ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir=$ac_optarg ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir=$ac_optarg ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst \
-  | --locals | --local | --loca | --loc | --lo)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
-  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
-    localstatedir=$ac_optarg ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir=$ac_optarg ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c | -n)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir=$ac_optarg ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix=$ac_optarg ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix=$ac_optarg ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix=$ac_optarg ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name=$ac_optarg ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir=$ac_optarg ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir=$ac_optarg ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site=$ac_optarg ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir=$ac_optarg ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir=$ac_optarg ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target_alias ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target_alias=$ac_optarg ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers | -V)
-    ac_init_version=: ;;
-
-  -with-* | --with-*)
-    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid package name: $ac_package" >&2
-   { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    case $ac_option in
-      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "with_$ac_package='$ac_optarg'" ;;
-
-  -without-* | --without-*)
-    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid package name: $ac_package" >&2
-   { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package | sed 's/-/_/g'`
-    eval "with_$ac_package=no" ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes=$ac_optarg ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries=$ac_optarg ;;
-
-  -*) { echo "$as_me: error: unrecognized option: $ac_option
-Try \`$0 --help' for more information." >&2
-   { (exit 1); exit 1; }; }
-    ;;
-
-  *=*)
-    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
-   { (exit 1); exit 1; }; }
-    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
-    eval "$ac_envvar='$ac_optarg'"
-    export $ac_envvar ;;
-
-  *)
-    # FIXME: should be removed in autoconf 3.0.
-    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
-    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  { echo "$as_me: error: missing argument to $ac_option" >&2
-   { (exit 1); exit 1; }; }
-fi
-
-# Be sure to have absolute paths.
-for ac_var in exec_prefix prefix
-do
-  eval ac_val=$`echo $ac_var`
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; };;
-  esac
-done
-
-# Be sure to have absolute paths.
-for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
-	      localstatedir libdir includedir oldincludedir infodir mandir
-do
-  eval ac_val=$`echo $ac_var`
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* ) ;;
-    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; };;
-  esac
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
-  if test "x$build_alias" = x; then
-    cross_compiling=maybe
-    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used." >&2
-  elif test "x$build_alias" != "x$host_alias"; then
-    cross_compiling=yes
-  fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then its parent.
-  ac_confdir=`(dirname "$0") 2>/dev/null ||
-$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$0" : 'X\(//\)[^/]' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$0" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  srcdir=$ac_confdir
-  if test ! -r $srcdir/$ac_unique_file; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r $srcdir/$ac_unique_file; then
-  if test "$ac_srcdir_defaulted" = yes; then
-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
-   { (exit 1); exit 1; }; }
-  else
-    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
-   { (exit 1); exit 1; }; }
-  fi
-fi
-(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
-  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
-   { (exit 1); exit 1; }; }
-srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
-ac_env_build_alias_set=${build_alias+set}
-ac_env_build_alias_value=$build_alias
-ac_cv_env_build_alias_set=${build_alias+set}
-ac_cv_env_build_alias_value=$build_alias
-ac_env_host_alias_set=${host_alias+set}
-ac_env_host_alias_value=$host_alias
-ac_cv_env_host_alias_set=${host_alias+set}
-ac_cv_env_host_alias_value=$host_alias
-ac_env_target_alias_set=${target_alias+set}
-ac_env_target_alias_value=$target_alias
-ac_cv_env_target_alias_set=${target_alias+set}
-ac_cv_env_target_alias_value=$target_alias
-ac_env_CC_set=${CC+set}
-ac_env_CC_value=$CC
-ac_cv_env_CC_set=${CC+set}
-ac_cv_env_CC_value=$CC
-ac_env_CFLAGS_set=${CFLAGS+set}
-ac_env_CFLAGS_value=$CFLAGS
-ac_cv_env_CFLAGS_set=${CFLAGS+set}
-ac_cv_env_CFLAGS_value=$CFLAGS
-ac_env_LDFLAGS_set=${LDFLAGS+set}
-ac_env_LDFLAGS_value=$LDFLAGS
-ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
-ac_cv_env_LDFLAGS_value=$LDFLAGS
-ac_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_env_CPPFLAGS_value=$CPPFLAGS
-ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_cv_env_CPPFLAGS_value=$CPPFLAGS
-ac_env_CPP_set=${CPP+set}
-ac_env_CPP_value=$CPP
-ac_cv_env_CPP_set=${CPP+set}
-ac_cv_env_CPP_value=$CPP
-
-#
-# Report the --help message.
-#
-if test "$ac_init_help" = "long"; then
-  # Omit some internal or obsolete options to make the list less imposing.
-  # This message is too long to be a string in the A/UX 3.1 sh.
-  cat <<_ACEOF
-\`configure' configures xpa 2.1.18 to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE.  See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
-  -h, --help              display this help and exit
-      --help=short        display options specific to this package
-      --help=recursive    display the short help of all the included packages
-  -V, --version           display version information and exit
-  -q, --quiet, --silent   do not print \`checking...' messages
-      --cache-file=FILE   cache test results in FILE [disabled]
-  -C, --config-cache      alias for \`--cache-file=config.cache'
-  -n, --no-create         do not create output files
-      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
-
-_ACEOF
-
-  cat <<_ACEOF
-Installation directories:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-			  [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-			  [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
-  --bindir=DIR           user executables [EPREFIX/bin]
-  --sbindir=DIR          system admin executables [EPREFIX/sbin]
-  --libexecdir=DIR       program executables [EPREFIX/libexec]
-  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
-  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
-  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
-  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
-  --libdir=DIR           object code libraries [EPREFIX/lib]
-  --includedir=DIR       C header files [PREFIX/include]
-  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
-  --infodir=DIR          info documentation [PREFIX/info]
-  --mandir=DIR           man documentation [PREFIX/man]
-_ACEOF
-
-  cat <<\_ACEOF
-
-X features:
-  --x-includes=DIR    X include files are in DIR
-  --x-libraries=DIR   X library files are in DIR
-
-System types:
-  --build=BUILD     configure for building on BUILD [guessed]
-  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
-  case $ac_init_help in
-     short | recursive ) echo "Configuration of xpa 2.1.18:";;
-   esac
-  cat <<\_ACEOF
-
-Optional Features:
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --enable-threaded-xpans    build threaded xpans
-  --enable-shared    build shared libraries
-  --enable-posix_spawn    use posix_spawn() if available
-
-Optional Packages:
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --with-x                use the X Window System
-  --with-tcl              directory containing tcl configuration (tclConfig.sh)
-  --with-threads          build for use in threaded programs
-  --with-gtk=<path>       include directory for gtk e.g. /usr/include/gtk-1.2
-
-Some influential environment variables:
-  CC          C compiler command
-  CFLAGS      C compiler flags
-  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
-              nonstandard directory <lib dir>
-  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
-              headers in a nonstandard directory <include dir>
-  CPP         C preprocessor
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-Report bugs to <eric@cfa.harvard.edu>.
-_ACEOF
-fi
-
-if test "$ac_init_help" = "recursive"; then
-  # If there are subdirs, report their specific --help.
-  ac_popdir=`pwd`
-  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d $ac_dir || continue
-    ac_builddir=.
-
-if test "$ac_dir" != .; then
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
-    ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
-
-    cd $ac_dir
-    # Check for guested configure; otherwise get Cygnus style configure.
-    if test -f $ac_srcdir/configure.gnu; then
-      echo
-      $SHELL $ac_srcdir/configure.gnu  --help=recursive
-    elif test -f $ac_srcdir/configure; then
-      echo
-      $SHELL $ac_srcdir/configure  --help=recursive
-    elif test -f $ac_srcdir/configure.ac ||
-	   test -f $ac_srcdir/configure.in; then
-      echo
-      $ac_configure --help
-    else
-      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi
-    cd $ac_popdir
-  done
-fi
-
-test -n "$ac_init_help" && exit 0
-if $ac_init_version; then
-  cat <<\_ACEOF
-xpa configure 2.1.18
-generated by GNU Autoconf 2.59
-
-Copyright (C) 2003 Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
-  exit 0
-fi
-exec 5>config.log
-cat >&5 <<_ACEOF
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-
-It was created by xpa $as_me 2.1.18, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
-
-  $ $0 $@
-
-_ACEOF
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
-
-/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
-/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
-/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  echo "PATH: $as_dir"
-done
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_sep=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
-  for ac_arg
-  do
-    case $ac_arg in
-    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-    | -silent | --silent | --silen | --sile | --sil)
-      continue ;;
-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
-      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    case $ac_pass in
-    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
-    2)
-      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
-      if test $ac_must_keep_next = true; then
-	ac_must_keep_next=false # Got value, back to normal.
-      else
-	case $ac_arg in
-	  *=* | --config-cache | -C | -disable-* | --disable-* \
-	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
-	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
-	  | -with-* | --with-* | -without-* | --without-* | --x)
-	    case "$ac_configure_args0 " in
-	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
-	    esac
-	    ;;
-	  -* ) ac_must_keep_next=true ;;
-	esac
-      fi
-      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
-      # Get rid of the leading space.
-      ac_sep=" "
-      ;;
-    esac
-  done
-done
-$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
-$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log.  We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Be sure not to use single quotes in there, as some shells,
-# such as our DU 5.0 friend, will then `close' the trap.
-trap 'exit_status=$?
-  # Save into config.log some information that might help in debugging.
-  {
-    echo
-
-    cat <<\_ASBOX
-## ---------------- ##
-## Cache variables. ##
-## ---------------- ##
-_ASBOX
-    echo
-    # The following way of writing the cache mishandles newlines in values,
-{
-  (set) 2>&1 |
-    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
-    *ac_space=\ *)
-      sed -n \
-	"s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
-      ;;
-    *)
-      sed -n \
-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
-      ;;
-    esac;
-}
-    echo
-
-    cat <<\_ASBOX
-## ----------------- ##
-## Output variables. ##
-## ----------------- ##
-_ASBOX
-    echo
-    for ac_var in $ac_subst_vars
-    do
-      eval ac_val=$`echo $ac_var`
-      echo "$ac_var='"'"'$ac_val'"'"'"
-    done | sort
-    echo
-
-    if test -n "$ac_subst_files"; then
-      cat <<\_ASBOX
-## ------------- ##
-## Output files. ##
-## ------------- ##
-_ASBOX
-      echo
-      for ac_var in $ac_subst_files
-      do
-	eval ac_val=$`echo $ac_var`
-	echo "$ac_var='"'"'$ac_val'"'"'"
-      done | sort
-      echo
-    fi
-
-    if test -s confdefs.h; then
-      cat <<\_ASBOX
-## ----------- ##
-## confdefs.h. ##
-## ----------- ##
-_ASBOX
-      echo
-      sed "/^$/d" confdefs.h | sort
-      echo
-    fi
-    test "$ac_signal" != 0 &&
-      echo "$as_me: caught signal $ac_signal"
-    echo "$as_me: exit $exit_status"
-  } >&5
-  rm -f core *.core &&
-  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
-    exit $exit_status
-     ' 0
-for ac_signal in 1 2 13 15; do
-  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo >confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
-  if test "x$prefix" != xNONE; then
-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
-  else
-    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
-  fi
-fi
-for ac_site_file in $CONFIG_SITE; do
-  if test -r "$ac_site_file"; then
-    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
-echo "$as_me: loading site script $ac_site_file" >&6;}
-    sed 's/^/| /' "$ac_site_file" >&5
-    . "$ac_site_file"
-  fi
-done
-
-if test -r "$cache_file"; then
-  # Some versions of bash will fail to source /dev/null (special
-  # files actually), so we avoid doing that.
-  if test -f "$cache_file"; then
-    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
-echo "$as_me: loading cache $cache_file" >&6;}
-    case $cache_file in
-      [\\/]* | ?:[\\/]* ) . $cache_file;;
-      *)                      . ./$cache_file;;
-    esac
-  fi
-else
-  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
-echo "$as_me: creating cache $cache_file" >&6;}
-  >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in `(set) 2>&1 |
-	       sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
-  eval ac_old_set=\$ac_cv_env_${ac_var}_set
-  eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
-  eval ac_new_val="\$ac_env_${ac_var}_value"
-  case $ac_old_set,$ac_new_set in
-    set,)
-      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,set)
-      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
-echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,);;
-    *)
-      if test "x$ac_old_val" != "x$ac_new_val"; then
-	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
-echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
-echo "$as_me:   former value:  $ac_old_val" >&2;}
-	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
-echo "$as_me:   current value: $ac_new_val" >&2;}
-	ac_cache_corrupted=:
-      fi;;
-  esac
-  # Pass precious variables to config.status.
-  if test "$ac_new_set" = set; then
-    case $ac_new_val in
-    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
-      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
-    *) ac_arg=$ac_var=$ac_new_val ;;
-    esac
-    case " $ac_configure_args " in
-      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
-      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
-    esac
-  fi
-done
-if $ac_cache_corrupted; then
-  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
-echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
-echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-          ac_config_headers="$ac_config_headers conf.h"
-
-
-ac_aux_dir=
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
-  if test -f $ac_dir/install-sh; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install-sh -c"
-    break
-  elif test -f $ac_dir/install.sh; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install.sh -c"
-    break
-  elif test -f $ac_dir/shtool; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/shtool install -c"
-    break
-  fi
-done
-if test -z "$ac_aux_dir"; then
-  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
-echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"
-ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
-
-# Make sure we can run config.sub.
-$ac_config_sub sun4 >/dev/null 2>&1 ||
-  { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
-echo "$as_me: error: cannot run $ac_config_sub" >&2;}
-   { (exit 1); exit 1; }; }
-
-echo "$as_me:$LINENO: checking build system type" >&5
-echo $ECHO_N "checking build system type... $ECHO_C" >&6
-if test "${ac_cv_build+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_build_alias=$build_alias
-test -z "$ac_cv_build_alias" &&
-  ac_cv_build_alias=`$ac_config_guess`
-test -z "$ac_cv_build_alias" &&
-  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
-echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
-   { (exit 1); exit 1; }; }
-ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
-   { (exit 1); exit 1; }; }
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_build" >&5
-echo "${ECHO_T}$ac_cv_build" >&6
-build=$ac_cv_build
-build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-
-
-echo "$as_me:$LINENO: checking host system type" >&5
-echo $ECHO_N "checking host system type... $ECHO_C" >&6
-if test "${ac_cv_host+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_host_alias=$host_alias
-test -z "$ac_cv_host_alias" &&
-  ac_cv_host_alias=$ac_cv_build_alias
-ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
-  { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
-   { (exit 1); exit 1; }; }
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_host" >&5
-echo "${ECHO_T}$ac_cv_host" >&6
-host=$ac_cv_host
-host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-
-
-
-# save LDFLAGS
-XLDFLAGS="$LDFLAGS"
-
-#
-# checks that we use in most projects
-#
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  CC=$ac_ct_CC
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  test -n "$ac_ct_CC" && break
-done
-
-  CC=$ac_ct_CC
-fi
-
-fi
-
-
-test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&5
-echo "$as_me: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-
-# Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
-     "checking for C compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
-  (eval $ac_compiler --version </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
-  (eval $ac_compiler -v </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
-  (eval $ac_compiler -V </dev/null >&5) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
-echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
-ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
-  (eval $ac_link_default) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  # Find the output, starting from the most likely.  This scheme is
-# not robust to junk in `.', hence go to wildcards (a.*) only as a last
-# resort.
-
-# Be careful to initialize this variable, since it used to be cached.
-# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
-ac_cv_exeext=
-# b.out is created by i960 compilers.
-for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
-do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
-	;;
-    conftest.$ac_ext )
-	# This is the source file.
-	;;
-    [ab].out )
-	# We found the default executable, but exeext='' is most
-	# certainly right.
-	break;;
-    *.* )
-	ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	# FIXME: I believe we export ac_cv_exeext for Libtool,
-	# but it would be cool to find out if it's true.  Does anybody
-	# maintain Libtool? --akim.
-	export ac_cv_exeext
-	break;;
-    * )
-	break;;
-  esac
-done
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
-See \`config.log' for more details." >&5
-echo "$as_me: error: C compiler cannot create executables
-See \`config.log' for more details." >&2;}
-   { (exit 77); exit 77; }; }
-fi
-
-ac_exeext=$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_file" >&5
-echo "${ECHO_T}$ac_file" >&6
-
-# Check the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether the C compiler works" >&5
-echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
-# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
-# If not cross compiling, check that we can run a simple program.
-if test "$cross_compiling" != yes; then
-  if { ac_try='./$ac_file'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-    cross_compiling=no
-  else
-    if test "$cross_compiling" = maybe; then
-	cross_compiling=yes
-    else
-	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-    fi
-  fi
-fi
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-
-rm -f a.out a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-# Check the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
-echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
-echo "$as_me:$LINENO: result: $cross_compiling" >&5
-echo "${ECHO_T}$cross_compiling" >&6
-
-echo "$as_me:$LINENO: checking for suffix of executables" >&5
-echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  export ac_cv_exeext
-	  break;;
-    * ) break;;
-  esac
-done
-else
-  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-rm -f conftest$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
-echo "${ECHO_T}$ac_cv_exeext" >&6
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-echo "$as_me:$LINENO: checking for suffix of object files" >&5
-echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
-if test "${ac_cv_objext+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
-       break;;
-  esac
-done
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
-echo "${ECHO_T}$ac_cv_objext" >&6
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
-if test "${ac_cv_c_compiler_gnu+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_compiler_gnu=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_compiler_gnu=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
-GCC=`test $ac_compiler_gnu = yes && echo yes`
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-CFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_g+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_g=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_prog_cc_g=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
-echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_stdc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_prog_cc_stdc=no
-ac_save_CC=$CC
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std1 is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std1.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
-_ACEOF
-# Don't try gcc -ansi; that turns off useful extensions and
-# breaks some systems' header files.
-# AIX			-qlanglvl=ansi
-# Ultrix and OSF/1	-std1
-# HP-UX 10.20 and later	-Ae
-# HP-UX older versions	-Aa -D_HPUX_SOURCE
-# SVR4			-Xc -D__EXTENSIONS__
-for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_stdc=$ac_arg
-break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext
-done
-rm -f conftest.$ac_ext conftest.$ac_objext
-CC=$ac_save_CC
-
-fi
-
-case "x$ac_cv_prog_cc_stdc" in
-  x|xno)
-    echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6 ;;
-  *)
-    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
-    CC="$CC $ac_cv_prog_cc_stdc" ;;
-esac
-
-# Some people use a C++ compiler to compile C.  Since we use `exit',
-# in C++ we need to declare it.  In case someone uses the same compiler
-# for both compiling C and C++ we need to have the C++ compiler decide
-# the declaration of exit, since it's the most demanding environment.
-cat >conftest.$ac_ext <<_ACEOF
-#ifndef __cplusplus
-  choke me
-#endif
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  for ac_declaration in \
-   '' \
-   'extern "C" void std::exit (int) throw (); using std::exit;' \
-   'extern "C" void std::exit (int); using std::exit;' \
-   'extern "C" void exit (int) throw ();' \
-   'extern "C" void exit (int);' \
-   'void exit (int);'
-do
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-#include <stdlib.h>
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-continue
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_declaration
-int
-main ()
-{
-exit (42);
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
-  echo '#ifdef __cplusplus' >>confdefs.h
-  echo $ac_declaration      >>confdefs.h
-  echo '#endif'             >>confdefs.h
-fi
-
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-if test x"${EXEEXT}" = "xno"; then
-  EXEEXT=""
-fi
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
-echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if test "${ac_cv_prog_CPP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether non-existent headers
-  # can be detected and how.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  # Broken: success on invalid input.
-continue
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
-  break
-fi
-
-    done
-    ac_cv_prog_CPP=$CPP
-
-fi
-  CPP=$ac_cv_prog_CPP
-else
-  ac_cv_prog_CPP=$CPP
-fi
-echo "$as_me:$LINENO: result: $CPP" >&5
-echo "${ECHO_T}$CPP" >&6
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether non-existent headers
-  # can be detected and how.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  # Broken: success on invalid input.
-continue
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
-  :
-else
-  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." >&5
-echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-echo "$as_me:$LINENO: checking for egrep" >&5
-echo $ECHO_N "checking for egrep... $ECHO_C" >&6
-if test "${ac_cv_prog_egrep+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if echo a | (grep -E '(a|b)') >/dev/null 2>&1
-    then ac_cv_prog_egrep='grep -E'
-    else ac_cv_prog_egrep='egrep'
-    fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
-echo "${ECHO_T}$ac_cv_prog_egrep" >&6
- EGREP=$ac_cv_prog_egrep
-
-
-echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
-if test "${ac_cv_header_stdc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_header_stdc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_header_stdc=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then
-  :
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then
-  :
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then
-  :
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ctype.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      exit(2);
-  exit (0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-ac_cv_header_stdc=no
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-echo "${ECHO_T}$ac_cv_header_stdc" >&6
-if test $ac_cv_header_stdc = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define STDC_HEADERS 1
-_ACEOF
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-
-
-
-
-
-
-
-
-
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-		  inttypes.h stdint.h unistd.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_Header=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_Header=no"
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-echo "$as_me:$LINENO: checking for long" >&5
-echo $ECHO_N "checking for long... $ECHO_C" >&6
-if test "${ac_cv_type_long+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-if ((long *) 0)
-  return 0;
-if (sizeof (long))
-  return 0;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_long=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_type_long=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5
-echo "${ECHO_T}$ac_cv_type_long" >&6
-
-echo "$as_me:$LINENO: checking size of long" >&5
-echo $ECHO_N "checking size of long... $ECHO_C" >&6
-if test "${ac_cv_sizeof_long+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test "$ac_cv_type_long" = yes; then
-  # The cast to unsigned long works around a bug in the HP C Compiler
-  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-  # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-  # This bug is HP SR number 8606223364.
-  if test "$cross_compiling" = yes; then
-  # Depending upon the size, compute the lo and hi bounds.
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_lo=0 ac_mid=0
-  while :; do
-    cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_hi=$ac_mid; break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_lo=`expr $ac_mid + 1`
-		    if test $ac_lo -le $ac_mid; then
-		      ac_lo= ac_hi=
-		      break
-		    fi
-		    ac_mid=`expr 2 '*' $ac_mid + 1`
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_hi=-1 ac_mid=-1
-  while :; do
-    cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_lo=$ac_mid; break
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_hi=`expr '(' $ac_mid ')' - 1`
-		       if test $ac_mid -le $ac_hi; then
-			 ac_lo= ac_hi=
-			 break
-		       fi
-		       ac_mid=`expr 2 '*' $ac_mid`
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-  done
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_lo= ac_hi=
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-# Binary search between lo and hi bounds.
-while test "x$ac_lo" != "x$ac_hi"; do
-  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-int
-main ()
-{
-static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
-test_array [0] = 0
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_hi=$ac_mid
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_lo=`expr '(' $ac_mid ')' + 1`
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-case $ac_lo in
-?*) ac_cv_sizeof_long=$ac_lo;;
-'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (long), 77
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; } ;;
-esac
-else
-  if test "$cross_compiling" = yes; then
-  { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run test program while cross compiling
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-long longval () { return (long) (sizeof (long)); }
-unsigned long ulongval () { return (long) (sizeof (long)); }
-#include <stdio.h>
-#include <stdlib.h>
-int
-main ()
-{
-
-  FILE *f = fopen ("conftest.val", "w");
-  if (! f)
-    exit (1);
-  if (((long) (sizeof (long))) < 0)
-    {
-      long i = longval ();
-      if (i != ((long) (sizeof (long))))
-	exit (1);
-      fprintf (f, "%ld\n", i);
-    }
-  else
-    {
-      unsigned long i = ulongval ();
-      if (i != ((long) (sizeof (long))))
-	exit (1);
-      fprintf (f, "%lu\n", i);
-    }
-  exit (ferror (f) || fclose (f) != 0);
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_sizeof_long=`cat conftest.val`
-else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute sizeof (long), 77
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-fi
-rm -f conftest.val
-else
-  ac_cv_sizeof_long=0
-fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5
-echo "${ECHO_T}$ac_cv_sizeof_long" >&6
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG $ac_cv_sizeof_long
-_ACEOF
-
-
-SZ_LONG=$ac_cv_sizeof_long
-
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_RANLIB+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  echo "$as_me:$LINENO: result: $RANLIB" >&5
-echo "${ECHO_T}$RANLIB" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-
-  test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
-echo "${ECHO_T}$ac_ct_RANLIB" >&6
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-  RANLIB=$ac_ct_RANLIB
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-
-echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
-if test "${ac_cv_header_stdc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_header_stdc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_header_stdc=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then
-  :
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then
-  :
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then
-  :
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ctype.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      exit(2);
-  exit (0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-ac_cv_header_stdc=no
-fi
-rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-echo "${ECHO_T}$ac_cv_header_stdc" >&6
-if test $ac_cv_header_stdc = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define STDC_HEADERS 1
-_ACEOF
-
-fi
-
-
-for ac_header in malloc.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ----------------------------------- ##
-## Report this to eric@cfa.harvard.edu ##
-## ----------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in getopt.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ----------------------------------- ##
-## Report this to eric@cfa.harvard.edu ##
-## ----------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in pwd.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ----------------------------------- ##
-## Report this to eric@cfa.harvard.edu ##
-## ----------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in values.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ----------------------------------- ##
-## Report this to eric@cfa.harvard.edu ##
-## ----------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in dlfcn.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ----------------------------------- ##
-## Report this to eric@cfa.harvard.edu ##
-## ----------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in setjmp.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ----------------------------------- ##
-## Report this to eric@cfa.harvard.edu ##
-## ----------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in sys/un.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ----------------------------------- ##
-## Report this to eric@cfa.harvard.edu ##
-## ----------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in sys/shm.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ----------------------------------- ##
-## Report this to eric@cfa.harvard.edu ##
-## ----------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in sys/mman.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ----------------------------------- ##
-## Report this to eric@cfa.harvard.edu ##
-## ----------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in sys/ipc.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ----------------------------------- ##
-## Report this to eric@cfa.harvard.edu ##
-## ----------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in sys/select.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ----------------------------------- ##
-## Report this to eric@cfa.harvard.edu ##
-## ----------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-echo "$as_me:$LINENO: checking for socklen_t" >&5
-echo $ECHO_N "checking for socklen_t... $ECHO_C" >&6
-if test "${ac_cv_type_socklen_t+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <sys/socket.h>
-
-int
-main ()
-{
-if ((socklen_t *) 0)
-  return 0;
-if (sizeof (socklen_t))
-  return 0;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_type_socklen_t=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_type_socklen_t=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_type_socklen_t" >&5
-echo "${ECHO_T}$ac_cv_type_socklen_t" >&6
-if test $ac_cv_type_socklen_t = yes; then
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_SOCKLEN_T 1
-_ACEOF
-
-
-fi
-
-
-echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
-echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
-if test "${ac_cv_c_const+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-/* FIXME: Include the comments suggested by Paul. */
-#ifndef __cplusplus
-  /* Ultrix mips cc rejects this.  */
-  typedef int charset[2];
-  const charset x;
-  /* SunOS 4.1.1 cc rejects this.  */
-  char const *const *ccp;
-  char **p;
-  /* NEC SVR4.0.2 mips cc rejects this.  */
-  struct point {int x, y;};
-  static struct point const zero = {0,0};
-  /* AIX XL C 1.02.0.0 rejects this.
-     It does not let you subtract one const X* pointer from another in
-     an arm of an if-expression whose if-part is not a constant
-     expression */
-  const char *g = "string";
-  ccp = &g + (g ? g-g : 0);
-  /* HPUX 7.0 cc rejects these. */
-  ++ccp;
-  p = (char**) ccp;
-  ccp = (char const *const *) p;
-  { /* SCO 3.2v4 cc rejects this.  */
-    char *t;
-    char const *s = 0 ? (char *) 0 : (char const *) 0;
-
-    *t++ = 0;
-  }
-  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
-    int x[] = {25, 17};
-    const int *foo = &x[0];
-    ++foo;
-  }
-  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
-    typedef const int *iptr;
-    iptr p = 0;
-    ++p;
-  }
-  { /* AIX XL C 1.02.0.0 rejects this saying
-       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
-    struct s { int j; const int *ap[3]; };
-    struct s *b; b->j = 5;
-  }
-  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
-    const int foo = 10;
-  }
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_c_const=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_c_const=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
-echo "${ECHO_T}$ac_cv_c_const" >&6
-if test $ac_cv_c_const = no; then
-
-cat >>confdefs.h <<\_ACEOF
-#define const
-_ACEOF
-
-fi
-
-
-
-
-
-
-
-for ac_func in strchr memcpy snprintf atexit setenv
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-
-echo "$as_me:$LINENO: checking for connect" >&5
-echo $ECHO_N "checking for connect... $ECHO_C" >&6
-if test "${ac_cv_func_connect+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define connect to an innocuous variant, in case <limits.h> declares connect.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define connect innocuous_connect
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char connect (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef connect
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char connect ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_connect) || defined (__stub___connect)
-choke me
-#else
-char (*f) () = connect;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != connect;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_func_connect=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_func_connect=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5
-echo "${ECHO_T}$ac_cv_func_connect" >&6
-
-if test $ac_cv_func_connect = no; then
-  echo "$as_me:$LINENO: checking for connect in -lsocket" >&5
-echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6
-if test "${ac_cv_lib_socket_connect+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsocket  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char connect ();
-int
-main ()
-{
-connect ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_socket_connect=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_socket_connect=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5
-echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6
-if test $ac_cv_lib_socket_connect = yes; then
-  EXTRA_LIBS="$EXTRA_LIBS -lsocket"
-fi
-
-fi
-echo "$as_me:$LINENO: checking for gethostbyname" >&5
-echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6
-if test "${ac_cv_func_gethostbyname+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define gethostbyname to an innocuous variant, in case <limits.h> declares gethostbyname.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define gethostbyname innocuous_gethostbyname
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char gethostbyname (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef gethostbyname
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char gethostbyname ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname)
-choke me
-#else
-char (*f) () = gethostbyname;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != gethostbyname;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_func_gethostbyname=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_func_gethostbyname=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5
-echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6
-
-if test $ac_cv_func_gethostbyname = no; then
-  echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5
-echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6
-if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lnsl  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char gethostbyname ();
-int
-main ()
-{
-gethostbyname ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_nsl_gethostbyname=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_nsl_gethostbyname=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5
-echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6
-if test $ac_cv_lib_nsl_gethostbyname = yes; then
-  EXTRA_LIBS="$EXTRA_LIBS -lnsl"
-fi
-
-fi
-# AC_CHECK_LIB(db, snprintf, EXTRA_LIBS="$EXTRA_LIBS -ldb")
-
-#
-# checks specific to this project
-#
-
-echo "$as_me:$LINENO: checking for threaded xpans" >&5
-echo $ECHO_N "checking for threaded xpans... $ECHO_C" >&6
-# Check whether --enable-threaded-xpans or --disable-threaded-xpans was given.
-if test "${enable_threaded_xpans+set}" = set; then
-  enableval="$enable_threaded_xpans"
-  fun_ok=$enableval
-else
-  fun_ok=no
-fi;
-if test "$fun_ok" = "yes"; then
-  echo "$as_me:$LINENO: result: $fun_ok" >&5
-echo "${ECHO_T}$fun_ok" >&6
-  echo "$as_me:$LINENO: checking for pthread_create in -lpthread" >&5
-echo $ECHO_N "checking for pthread_create in -lpthread... $ECHO_C" >&6
-if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lpthread  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char pthread_create ();
-int
-main ()
-{
-pthread_create ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_pthread_pthread_create=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_pthread_pthread_create=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_create" >&5
-echo "${ECHO_T}$ac_cv_lib_pthread_pthread_create" >&6
-if test $ac_cv_lib_pthread_pthread_create = yes; then
-  have_pthread=yes
-fi
-
-  if test  x"${have_pthread}" = x"yes"; then
-    cat >>confdefs.h <<\_ACEOF
-#define HAVE_LIBPTHREAD 1
-_ACEOF
-
-    cat >>confdefs.h <<\_ACEOF
-#define _REENTRANT 1
-_ACEOF
-
-    TLIB="-lpthread"
-  else
-    { { echo "$as_me:$LINENO: error: no threads found ... can't use enable-threaded-xpans" >&5
-echo "$as_me: error: no threads found ... can't use enable-threaded-xpans" >&2;}
-   { (exit 1); exit 1; }; }
-  fi
-else
-  echo "$as_me:$LINENO: result: $fun_ok" >&5
-echo "${ECHO_T}$fun_ok" >&6
-fi
-
-
-echo "$as_me:$LINENO: checking for shared library build" >&5
-echo $ECHO_N "checking for shared library build... $ECHO_C" >&6
-# Check whether --enable-shared or --disable-shared was given.
-if test "${enable_shared+set}" = set; then
-  enableval="$enable_shared"
-  fun_ok=$enableval
-else
-  fun_ok=no
-fi;
-if test "$fun_ok" != "no"; then
-  fpic="yes"
-  DOSHARED=shlib
-
-  if test "$fun_ok" = "link"; then
-    LLIB="-L. -l$PACKAGE_NAME"
-  else
-    LLIB='$(LIB)'
-  fi
-else
-  DOSHARED=""
-  LLIB='$(LIB)'
-fi
-
-echo "$as_me:$LINENO: result: $fun_ok" >&5
-echo "${ECHO_T}$fun_ok" >&6
-
-echo "$as_me:$LINENO: checking for request to use posix_spawn" >&5
-echo $ECHO_N "checking for request to use posix_spawn... $ECHO_C" >&6
-# Check whether --enable-posix_spawn or --disable-posix_spawn was given.
-if test "${enable_posix_spawn+set}" = set; then
-  enableval="$enable_posix_spawn"
-  fun_ok=$enableval
-else
-  fun_ok=no
-fi;
-echo "$as_me:$LINENO: result: $fun_ok" >&5
-echo "${ECHO_T}$fun_ok" >&6
-if test "$fun_ok" = "yes"; then
-
-
-for ac_func in posix_spawn _NSGetEnviron
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $ac_func innocuous_$ac_func
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $ac_func
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char $ac_func ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-char (*f) () = $ac_func;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != $ac_func;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  eval "$as_ac_var=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-eval "$as_ac_var=no"
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-
-for ac_header in crt_externs.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
-  # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_header_compiler=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
-    (
-      cat <<\_ASBOX
-## ----------------------------------- ##
-## Report this to eric@cfa.harvard.edu ##
-## ----------------------------------- ##
-_ASBOX
-    ) |
-      sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  eval "$as_ac_Header=\$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-fi
-
-echo "$as_me:$LINENO: checking for X" >&5
-echo $ECHO_N "checking for X... $ECHO_C" >&6
-
-
-# Check whether --with-x or --without-x was given.
-if test "${with_x+set}" = set; then
-  withval="$with_x"
-
-fi;
-# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
-if test "x$with_x" = xno; then
-  # The user explicitly disabled X.
-  have_x=disabled
-else
-  if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then
-    # Both variables are already set.
-    have_x=yes
-  else
-    if test "${ac_cv_have_x+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  # One or both of the vars are not set, and there is no cached value.
-ac_x_includes=no ac_x_libraries=no
-rm -fr conftest.dir
-if mkdir conftest.dir; then
-  cd conftest.dir
-  # Make sure to not put "make" in the Imakefile rules, since we grep it out.
-  cat >Imakefile <<'_ACEOF'
-acfindx:
-	@echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"'
-_ACEOF
-  if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
-    # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-    eval `${MAKE-make} acfindx 2>/dev/null | grep -v make`
-    # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
-    for ac_extension in a so sl; do
-      if test ! -f $ac_im_usrlibdir/libX11.$ac_extension &&
-	 test -f $ac_im_libdir/libX11.$ac_extension; then
-	ac_im_usrlibdir=$ac_im_libdir; break
-      fi
-    done
-    # Screen out bogus values from the imake configuration.  They are
-    # bogus both because they are the default anyway, and because
-    # using them would break gcc on systems where it needs fixed includes.
-    case $ac_im_incroot in
-	/usr/include) ;;
-	*) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
-    esac
-    case $ac_im_usrlibdir in
-	/usr/lib | /lib) ;;
-	*) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;;
-    esac
-  fi
-  cd ..
-  rm -fr conftest.dir
-fi
-
-# Standard set of common directories for X headers.
-# Check X11 before X11Rn because it is often a symlink to the current release.
-ac_x_header_dirs='
-/usr/X11/include
-/usr/X11R6/include
-/usr/X11R5/include
-/usr/X11R4/include
-
-/usr/include/X11
-/usr/include/X11R6
-/usr/include/X11R5
-/usr/include/X11R4
-
-/usr/local/X11/include
-/usr/local/X11R6/include
-/usr/local/X11R5/include
-/usr/local/X11R4/include
-
-/usr/local/include/X11
-/usr/local/include/X11R6
-/usr/local/include/X11R5
-/usr/local/include/X11R4
-
-/usr/X386/include
-/usr/x386/include
-/usr/XFree86/include/X11
-
-/usr/include
-/usr/local/include
-/usr/unsupported/include
-/usr/athena/include
-/usr/local/x11r5/include
-/usr/lpp/Xamples/include
-
-/usr/openwin/include
-/usr/openwin/share/include'
-
-if test "$ac_x_includes" = no; then
-  # Guess where to find include files, by looking for Intrinsic.h.
-  # First, try using that file with no special directory specified.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <X11/Intrinsic.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
-  # We can compile using X headers with no special include directory.
-ac_x_includes=
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  for ac_dir in $ac_x_header_dirs; do
-  if test -r "$ac_dir/X11/Intrinsic.h"; then
-    ac_x_includes=$ac_dir
-    break
-  fi
-done
-fi
-rm -f conftest.err conftest.$ac_ext
-fi # $ac_x_includes = no
-
-if test "$ac_x_libraries" = no; then
-  # Check for the libraries.
-  # See if we find them without any special options.
-  # Don't add to $LIBS permanently.
-  ac_save_LIBS=$LIBS
-  LIBS="-lXt $LIBS"
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <X11/Intrinsic.h>
-int
-main ()
-{
-XtMalloc (0)
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  LIBS=$ac_save_LIBS
-# We can link X programs with no special library path.
-ac_x_libraries=
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-LIBS=$ac_save_LIBS
-for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g`
-do
-  # Don't even attempt the hair of trying to link an X program!
-  for ac_extension in a so sl; do
-    if test -r $ac_dir/libXt.$ac_extension; then
-      ac_x_libraries=$ac_dir
-      break 2
-    fi
-  done
-done
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi # $ac_x_libraries = no
-
-if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then
-  # Didn't find X anywhere.  Cache the known absence of X.
-  ac_cv_have_x="have_x=no"
-else
-  # Record where we found X for the cache.
-  ac_cv_have_x="have_x=yes \
-		ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries"
-fi
-fi
-
-  fi
-  eval "$ac_cv_have_x"
-fi # $with_x != no
-
-if test "$have_x" != yes; then
-  echo "$as_me:$LINENO: result: $have_x" >&5
-echo "${ECHO_T}$have_x" >&6
-  no_x=yes
-else
-  # If each of the values was on the command line, it overrides each guess.
-  test "x$x_includes" = xNONE && x_includes=$ac_x_includes
-  test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
-  # Update the cache value to reflect the command line values.
-  ac_cv_have_x="have_x=yes \
-		ac_x_includes=$x_includes ac_x_libraries=$x_libraries"
-  echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5
-echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6
-fi
-
-if test "$no_x" = yes; then
-  # Not all programs may use this symbol, but it does not hurt to define it.
-
-cat >>confdefs.h <<\_ACEOF
-#define X_DISPLAY_MISSING 1
-_ACEOF
-
-  X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS=
-else
-  if test -n "$x_includes"; then
-    X_CFLAGS="$X_CFLAGS -I$x_includes"
-  fi
-
-  # It would also be nice to do this for all -L options, not just this one.
-  if test -n "$x_libraries"; then
-    X_LIBS="$X_LIBS -L$x_libraries"
-    # For Solaris; some versions of Sun CC require a space after -R and
-    # others require no space.  Words are not sufficient . . . .
-    case `(uname -sr) 2>/dev/null` in
-    "SunOS 5"*)
-      echo "$as_me:$LINENO: checking whether -R must be followed by a space" >&5
-echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6
-      ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries"
-      cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_R_nospace=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_R_nospace=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-      if test $ac_R_nospace = yes; then
-	echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-	X_LIBS="$X_LIBS -R$x_libraries"
-      else
-	LIBS="$ac_xsave_LIBS -R $x_libraries"
-	cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_R_space=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_R_space=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-	if test $ac_R_space = yes; then
-	  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-	  X_LIBS="$X_LIBS -R $x_libraries"
-	else
-	  echo "$as_me:$LINENO: result: neither works" >&5
-echo "${ECHO_T}neither works" >&6
-	fi
-      fi
-      LIBS=$ac_xsave_LIBS
-    esac
-  fi
-
-  # Check for system-dependent libraries X programs must link with.
-  # Do this before checking for the system-independent R6 libraries
-  # (-lICE), since we may need -lsocket or whatever for X linking.
-
-  if test "$ISC" = yes; then
-    X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet"
-  else
-    # Martyn Johnson says this is needed for Ultrix, if the X
-    # libraries were built with DECnet support.  And Karl Berry says
-    # the Alpha needs dnet_stub (dnet does not exist).
-    ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11"
-    cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char XOpenDisplay ();
-int
-main ()
-{
-XOpenDisplay ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet" >&5
-echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6
-if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldnet  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char dnet_ntoa ();
-int
-main ()
-{
-dnet_ntoa ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_dnet_dnet_ntoa=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_dnet_dnet_ntoa=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
-echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6
-if test $ac_cv_lib_dnet_dnet_ntoa = yes; then
-  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
-fi
-
-    if test $ac_cv_lib_dnet_dnet_ntoa = no; then
-      echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5
-echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6
-if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldnet_stub  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char dnet_ntoa ();
-int
-main ()
-{
-dnet_ntoa ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_dnet_stub_dnet_ntoa=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_dnet_stub_dnet_ntoa=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
-echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6
-if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then
-  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
-fi
-
-    fi
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-    LIBS="$ac_xsave_LIBS"
-
-    # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,
-    # to get the SysV transport functions.
-    # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4)
-    # needs -lnsl.
-    # The nsl library prevents programs from opening the X display
-    # on Irix 5.2, according to T.E. Dickey.
-    # The functions gethostbyname, getservbyname, and inet_addr are
-    # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking.
-    echo "$as_me:$LINENO: checking for gethostbyname" >&5
-echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6
-if test "${ac_cv_func_gethostbyname+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define gethostbyname to an innocuous variant, in case <limits.h> declares gethostbyname.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define gethostbyname innocuous_gethostbyname
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char gethostbyname (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef gethostbyname
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char gethostbyname ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname)
-choke me
-#else
-char (*f) () = gethostbyname;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != gethostbyname;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_func_gethostbyname=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_func_gethostbyname=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5
-echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6
-
-    if test $ac_cv_func_gethostbyname = no; then
-      echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5
-echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6
-if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lnsl  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char gethostbyname ();
-int
-main ()
-{
-gethostbyname ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_nsl_gethostbyname=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_nsl_gethostbyname=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5
-echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6
-if test $ac_cv_lib_nsl_gethostbyname = yes; then
-  X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
-fi
-
-      if test $ac_cv_lib_nsl_gethostbyname = no; then
-	echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5
-echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6
-if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lbsd  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char gethostbyname ();
-int
-main ()
-{
-gethostbyname ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_bsd_gethostbyname=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_bsd_gethostbyname=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5
-echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6
-if test $ac_cv_lib_bsd_gethostbyname = yes; then
-  X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
-fi
-
-      fi
-    fi
-
-    # lieder@skyler.mavd.honeywell.com says without -lsocket,
-    # socket/setsockopt and other routines are undefined under SCO ODT
-    # 2.0.  But -lsocket is broken on IRIX 5.2 (and is not necessary
-    # on later versions), says Simon Leinen: it contains gethostby*
-    # variants that don't use the name server (or something).  -lsocket
-    # must be given before -lnsl if both are needed.  We assume that
-    # if connect needs -lnsl, so does gethostbyname.
-    echo "$as_me:$LINENO: checking for connect" >&5
-echo $ECHO_N "checking for connect... $ECHO_C" >&6
-if test "${ac_cv_func_connect+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define connect to an innocuous variant, in case <limits.h> declares connect.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define connect innocuous_connect
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char connect (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef connect
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char connect ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_connect) || defined (__stub___connect)
-choke me
-#else
-char (*f) () = connect;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != connect;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_func_connect=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_func_connect=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5
-echo "${ECHO_T}$ac_cv_func_connect" >&6
-
-    if test $ac_cv_func_connect = no; then
-      echo "$as_me:$LINENO: checking for connect in -lsocket" >&5
-echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6
-if test "${ac_cv_lib_socket_connect+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char connect ();
-int
-main ()
-{
-connect ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_socket_connect=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_socket_connect=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5
-echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6
-if test $ac_cv_lib_socket_connect = yes; then
-  X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
-fi
-
-    fi
-
-    # Guillermo Gomez says -lposix is necessary on A/UX.
-    echo "$as_me:$LINENO: checking for remove" >&5
-echo $ECHO_N "checking for remove... $ECHO_C" >&6
-if test "${ac_cv_func_remove+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define remove to an innocuous variant, in case <limits.h> declares remove.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define remove innocuous_remove
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char remove (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef remove
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char remove ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_remove) || defined (__stub___remove)
-choke me
-#else
-char (*f) () = remove;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != remove;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_func_remove=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_func_remove=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_func_remove" >&5
-echo "${ECHO_T}$ac_cv_func_remove" >&6
-
-    if test $ac_cv_func_remove = no; then
-      echo "$as_me:$LINENO: checking for remove in -lposix" >&5
-echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6
-if test "${ac_cv_lib_posix_remove+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lposix  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char remove ();
-int
-main ()
-{
-remove ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_posix_remove=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_posix_remove=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5
-echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6
-if test $ac_cv_lib_posix_remove = yes; then
-  X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
-fi
-
-    fi
-
-    # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
-    echo "$as_me:$LINENO: checking for shmat" >&5
-echo $ECHO_N "checking for shmat... $ECHO_C" >&6
-if test "${ac_cv_func_shmat+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-/* Define shmat to an innocuous variant, in case <limits.h> declares shmat.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define shmat innocuous_shmat
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char shmat (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef shmat
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char shmat ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_shmat) || defined (__stub___shmat)
-choke me
-#else
-char (*f) () = shmat;
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-int
-main ()
-{
-return f != shmat;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_func_shmat=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_func_shmat=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_func_shmat" >&5
-echo "${ECHO_T}$ac_cv_func_shmat" >&6
-
-    if test $ac_cv_func_shmat = no; then
-      echo "$as_me:$LINENO: checking for shmat in -lipc" >&5
-echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6
-if test "${ac_cv_lib_ipc_shmat+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lipc  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char shmat ();
-int
-main ()
-{
-shmat ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_ipc_shmat=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_ipc_shmat=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5
-echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6
-if test $ac_cv_lib_ipc_shmat = yes; then
-  X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
-fi
-
-    fi
-  fi
-
-  # Check for libraries that X11R6 Xt/Xaw programs need.
-  ac_save_LDFLAGS=$LDFLAGS
-  test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries"
-  # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to
-  # check for ICE first), but we must link in the order -lSM -lICE or
-  # we get undefined symbols.  So assume we have SM if we have ICE.
-  # These have to be linked with before -lX11, unlike the other
-  # libraries we check for below, so use a different variable.
-  # John Interrante, Karl Berry
-  echo "$as_me:$LINENO: checking for IceConnectionNumber in -lICE" >&5
-echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6
-if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lICE $X_EXTRA_LIBS $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char IceConnectionNumber ();
-int
-main ()
-{
-IceConnectionNumber ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_ICE_IceConnectionNumber=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_ICE_IceConnectionNumber=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
-echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6
-if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then
-  X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
-fi
-
-  LDFLAGS=$ac_save_LDFLAGS
-
-fi
-
-if test x"${have_x}" = "xyes"; then
-    cat >>confdefs.h <<\_ACEOF
-#define HAVE_XT 1
-_ACEOF
-
-fi
-
-
-    #
-    # Ok, lets find the tcl configuration
-    # First, look for one uninstalled.
-    # the alternative search directory is invoked by --with-tcl
-    #
-
-    if test x"${no_tcl}" = x ; then
-	# we reset no_tcl in case something fails here
-	no_tcl=true
-
-# Check whether --with-tcl or --without-tcl was given.
-if test "${with_tcl+set}" = set; then
-  withval="$with_tcl"
-  with_tclconfig=${withval}
-fi;
-	echo "$as_me:$LINENO: checking for Tcl configuration" >&5
-echo $ECHO_N "checking for Tcl configuration... $ECHO_C" >&6
-	if test x"${withval}" != xno ; then
-	if test "${ac_cv_c_tclconfig+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-
-
-	    # First check to see if --with-tcl was specified.
-	    if test x"${with_tclconfig}" != x ; then
-		if test -f "${with_tclconfig}/tclConfig.sh" ; then
-		    ac_cv_c_tclconfig=`(cd ${with_tclconfig}; pwd)`
-		else
-		    echo "$as_me:$LINENO: result: ${with_tclconfig} directory doesn't contain tclConfig.sh" >&5
-echo "${ECHO_T}${with_tclconfig} directory doesn't contain tclConfig.sh" >&6
-		fi
-	    fi
-
-	    # then check for a private Tcl installation
-	    if test x"${ac_cv_c_tclconfig}" = x ; then
-		for i in \
-			../tcl \
-			`ls -dr ../tcl[8-9].[0-9]* 2>/dev/null` \
-			../../tcl \
-			`ls -dr ../../tcl[8-9].[0-9]* 2>/dev/null` \
-			../../../tcl \
-			`ls -dr ../../../tcl[8-9].[0-9]* 2>/dev/null` ; do
-		    if test -f "$i/unix/tclConfig.sh" ; then
-			ac_cv_c_tclconfig=`(cd $i/unix; pwd)`
-			break
-		    fi
-		done
-	    fi
-
-	    # check in a few common install locations
-	    if test x"${ac_cv_c_tclconfig}" = x ; then
-		for i in `ls -d ${libdir} 2>/dev/null` \
-			`ls -d /usr/local/lib 2>/dev/null` \
-			`ls -d /usr/contrib/lib 2>/dev/null` \
-			`ls -d /usr/lib 2>/dev/null` \
-			; do
-		    if test -f "$i/tclConfig.sh" ; then
-			ac_cv_c_tclconfig=`(cd $i; pwd)`
-			break
-		    fi
-		done
-	    fi
-
-	    # check in a few other private locations
-	    if test x"${ac_cv_c_tclconfig}" = x ; then
-		for i in \
-			${srcdir}/../tcl \
-			`ls -dr ${srcdir}/../tcl[8-9].[0-9]* 2>/dev/null` ; do
-		    if test -f "$i/unix/tclConfig.sh" ; then
-		    ac_cv_c_tclconfig=`(cd $i/unix; pwd)`
-		    break
-		fi
-		done
-	    fi
-
-fi
-
-	else
-	    echo "$as_me:$LINENO: result: skipping Tcl configuration" >&5
-echo "${ECHO_T}skipping Tcl configuration" >&6
-	    ac_cv_c_tclconfig="none"
-	fi
-
-	if test x"${ac_cv_c_tclconfig}" = x ; then
-	    TCL_BIN_DIR="# no Tcl configs found"
-	    echo "$as_me:$LINENO: result: can't find Tcl configuration definitions" >&5
-echo "${ECHO_T}can't find Tcl configuration definitions" >&6
-# no Tcl is OK egm 03/25/03
-#	    AC_MSG_WARN(Can't find Tcl configuration definitions)
-#	    exit 0
-	elif test x"${ac_cv_c_tclconfig}" = xnone ; then
-	    TCL_BIN_DIR=""
-	else
-	    no_tcl=
-	    TCL_BIN_DIR=${ac_cv_c_tclconfig}
-	    echo "$as_me:$LINENO: result: found $TCL_BIN_DIR/tclConfig.sh" >&5
-echo "${ECHO_T}found $TCL_BIN_DIR/tclConfig.sh" >&6
-	fi
-    fi
-
-if test x"${no_tcl}" = x ; then
-
-    echo "$as_me:$LINENO: checking for existence of $TCL_BIN_DIR/tclConfig.sh" >&5
-echo $ECHO_N "checking for existence of $TCL_BIN_DIR/tclConfig.sh... $ECHO_C" >&6
-
-    if test -f "$TCL_BIN_DIR/tclConfig.sh" ; then
-        echo "$as_me:$LINENO: result: loading" >&5
-echo "${ECHO_T}loading" >&6
-	. $TCL_BIN_DIR/tclConfig.sh
-    else
-        echo "$as_me:$LINENO: result: file not found" >&5
-echo "${ECHO_T}file not found" >&6
-    fi
-
-    #
-    # If the TCL_BIN_DIR is the build directory (not the install directory),
-    # then set the common variable name to the value of the build variables.
-    # For example, the variable TCL_LIB_SPEC will be set to the value
-    # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC
-    # instead of TCL_BUILD_LIB_SPEC since it will work with both an
-    # installed and uninstalled version of Tcl.
-    #
-
-    if test -f $TCL_BIN_DIR/Makefile ; then
-        TCL_LIB_SPEC=${TCL_BUILD_LIB_SPEC}
-        TCL_STUB_LIB_SPEC=${TCL_BUILD_STUB_LIB_SPEC}
-        TCL_STUB_LIB_PATH=${TCL_BUILD_STUB_LIB_PATH}
-    fi
-
-    #
-    # eval is required to do the TCL_DBGX substitution
-    #
-
-    eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\""
-    eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\""
-    eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\""
-
-    eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\""
-    eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\""
-    eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\""
-
-
-
-
-
-
-
-
-
-
-
-
-
-    if test -r $TCL_PREFIX/include/tcl.h; then
-      TCL_CFLAGS="$TCL_INCLUDE_SPEC"
-      if test x"$DOSHARED" != x -a x"$TCL_SUPPORTS_STUBS" = x1; then
-        TCL_LIBS="$TCL_STUB_LIB_SPEC"
-        TCL_CFLAGS="$TCL_CFLAGS -DUSE_TCL_STUBS=1"
-        echo "$as_me:$LINENO: result: Tcl support will utilize stubs library: $TCL_LIBS" >&5
-echo "${ECHO_T}Tcl support will utilize stubs library: $TCL_LIBS" >&6
-      else
-        TCL_LIBS="$TCL_LIB_SPEC"
-        echo "$as_me:$LINENO: result: Tcl support will utilize library: $TCL_LIBS" >&5
-echo "${ECHO_T}Tcl support will utilize library: $TCL_LIBS" >&6
-      fi
-      cat >>confdefs.h <<\_ACEOF
-#define HAVE_TCL 1
-_ACEOF
-
-    else
-      if test x"${with_tclconfig}" != x ; then
-        TCL_CFLAGS="$TCL_INCLUDE_SPEC"
-        TCL_LIBS="$TCL_LIB_SPEC"
-        cat >>confdefs.h <<\_ACEOF
-#define HAVE_TCL 1
-_ACEOF
-
-        echo "$as_me:$LINENO: result: warning: tcl.h not found with --with-tcl ... tcl build might fail" >&5
-echo "${ECHO_T}warning: tcl.h not found with --with-tcl ... tcl build might fail" >&6
-      else
-        echo "$as_me:$LINENO: result: $TCL_PREFIX/include/tcl.h not found ... use --with-tcl to build tcl explicitly" >&5
-echo "${ECHO_T}$TCL_PREFIX/include/tcl.h not found ... use --with-tcl to build tcl explicitly" >&6
-      fi
-    fi
-fi
-
-
-
-echo "$as_me:$LINENO: checking for incorporation of thread support" >&5
-echo $ECHO_N "checking for incorporation of thread support... $ECHO_C" >&6
-
-# Check whether --with-threads or --without-threads was given.
-if test "${with_threads+set}" = set; then
-  withval="$with_threads"
-  thr=1
-else
-  thr=0
-fi;
-if test x"$thr" = x1 ; then
-  echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-  CFLAGS="$CFLAGS -D_REENTRANT"
-else
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-echo "$as_me:$LINENO: checking for gtk" >&5
-echo $ECHO_N "checking for gtk... $ECHO_C" >&6
-
-# Check whether --with-gtk or --without-gtk was given.
-if test "${with_gtk+set}" = set; then
-  withval="$with_gtk"
-  havelib=1
-else
-  havelib=0
-fi;
-if test x"$havelib" = x1 ; then
-  echo "$as_me:$LINENO: result: yes ($withval)" >&5
-echo "${ECHO_T}yes ($withval)" >&6
-  GTK_CFLAGS="`pkg-config gtk+-2.0 --cflags` -DHAVE_GTK=1"
-  GTK_LIBS="`pkg-config gtk+-2.0 --libs`"
-  cat >>confdefs.h <<\_ACEOF
-#define HAVE_GTK 1
-_ACEOF
-
-else
-  GTK_CFLAGS=""
-  GTK_LIBS=""
-  echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-
-
-# restore LDFLAGS
-LDFLAGS="$LDFLAGS $XLDFLAGS"
-
-echo "$as_me:$LINENO: checking $host_os configuration" >&5
-echo $ECHO_N "checking $host_os configuration... $ECHO_C" >&6
-case $host_os in
-    *cygwin*|*Cygwin* )
-        cat >>confdefs.h <<\_ACEOF
-#define HAVE_CYGWIN 1
-_ACEOF
-
-        echo "$as_me:$LINENO: result: flagging Cygwin" >&5
-echo "${ECHO_T}flagging Cygwin" >&6
-        ;;
-    *mingw32*|*Mingw32*)
-        CFLAGS="$CFLAGS -mconsole"
-	EXTRA_LIBS="$EXTRA_LIBS -lwsock32"
-        cat >>confdefs.h <<\_ACEOF
-#define HAVE_MINGW32 1
-_ACEOF
-
-        echo "$as_me:$LINENO: result: flagging MinGW" >&5
-echo "${ECHO_T}flagging MinGW" >&6
-        ;;
-    *darwin*|*Darwin*)
-	LDFLAGS="$LDFLAGS $CFLAGS"
-        G=`$CC -v 2>&1 | grep version | awk '{print $3}' | awk -F. '{print $1$2}'`
-        if test x"$G" != x -a "$G" -lt 42; then
-	  CFLAGS="$CFLAGS -no-cpp-precomp"
-        fi
-        if test x"$TCL_PREFIX" = x"/usr/local"; then
-	  TCL_CFLAGS=""
-          echo "$as_me:$LINENO: result: removing -I/usr/local/include" >&5
-echo "${ECHO_T}removing -I/usr/local/include" >&6
-        fi
-	;;
-    *osf*|*Osf*)
-	  echo "$as_me:$LINENO: checking for snprintf in -ldb" >&5
-echo $ECHO_N "checking for snprintf in -ldb... $ECHO_C" >&6
-if test "${ac_cv_lib_db_snprintf+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldb  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char snprintf ();
-int
-main ()
-{
-snprintf ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
-  (eval $ac_link) 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; } &&
-	 { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_lib_db_snprintf=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_lib_db_snprintf=no
-fi
-rm -f conftest.err conftest.$ac_objext \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_db_snprintf" >&5
-echo "${ECHO_T}$ac_cv_lib_db_snprintf" >&6
-if test $ac_cv_lib_db_snprintf = yes; then
-  EXTRA_LIBS="$EXTRA_LIBS -ldb"
-fi
-
-        ;;
-    * )
-        if test x"$fpic" = x"yes" ; then
-          if test "$CC" = "gcc" -o `$CC -v 2>&1 | grep -c gcc` != "0" ; then
-	    CFLAGS="$CFLAGS -fPIC"
-	    echo "$as_me:$LINENO: result: adding -fPIC to gcc" >&5
-echo "${ECHO_T}adding -fPIC to gcc" >&6
-	  else
-            echo "$as_me:$LINENO: result: none" >&5
-echo "${ECHO_T}none" >&6
-	  fi
-	else
-            echo "$as_me:$LINENO: result: none" >&5
-echo "${ECHO_T}none" >&6
-	fi
-        ;;
-esac
-
-
-
-          ac_config_files="$ac_config_files Makefile"
-
-
-# generate pkg-config meta-data file
-          ac_config_files="$ac_config_files xpa.pc"
-
-
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems.  If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, don't put newlines in cache variables' values.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-{
-  (set) 2>&1 |
-    case `(ac_space=' '; set | grep ac_space) 2>&1` in
-    *ac_space=\ *)
-      # `set' does not quote correctly, so add quotes (double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \).
-      sed -n \
-	"s/'/'\\\\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;;
-    *)
-      # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n \
-	"s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
-      ;;
-    esac;
-} |
-  sed '
-     t clear
-     : clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
-     t end
-     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     : end' >>confcache
-if diff $cache_file confcache >/dev/null 2>&1; then :; else
-  if test -w $cache_file; then
-    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
-    cat confcache >$cache_file
-  else
-    echo "not updating unwritable cache $cache_file"
-  fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/;
-s/:*\${srcdir}:*/:/;
-s/:*@srcdir@:*/:/;
-s/^\([^=]*=[	 ]*\):*/\1/;
-s/:*$//;
-s/^[^=]*=[	 ]*$//;
-}'
-fi
-
-DEFS=-DHAVE_CONFIG_H
-
-ac_libobjs=
-ac_ltlibobjs=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
-  # 1. Remove the extension, and $U if already installed.
-  ac_i=`echo "$ac_i" |
-	 sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
-  # 2. Add them.
-  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
-  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
-
-: ${CONFIG_STATUS=./config.status}
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
-echo "$as_me: creating $CONFIG_STATUS" >&6;}
-cat >$CONFIG_STATUS <<_ACEOF
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-SHELL=\${CONFIG_SHELL-$SHELL}
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-## --------------------- ##
-## M4sh Initialization.  ##
-## --------------------- ##
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
-else
-  as_unset=false
-fi
-
-
-# Work around bugs in pre-3.0 UWIN ksh.
-$as_unset ENV MAIL MAILPATH
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    $as_unset $as_var
-  fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-
-# Name of the executable.
-as_me=`$as_basename "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-
-
-# PATH needs CR, and LINENO needs CR and PATH.
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conf$$.sh
-fi
-
-
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
-
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
-  fi
-  if test ! -f "$as_myself"; then
-    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
-echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
-	 /*)
-	   if ("$as_dir/$as_base" -c '
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
-	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
-
-  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
-  # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
-    sed '
-      N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
-      t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
-    ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
-    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
-echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
-   { (exit 1); exit 1; }; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
-  # Exit status is that of the last command.
-  exit
-}
-
-
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
-esac
-
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-rm -f conf$$ conf$$.exe conf$$.file
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
-    as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
-elif ln conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s=ln
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.file
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p=:
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-as_executable_p="test -f"
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
-
-# CDPATH.
-$as_unset CDPATH
-
-exec 6>&1
-
-# Open the log real soon, to keep \$[0] and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.  Logging --version etc. is OK.
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-} >&5
-cat >&5 <<_CSEOF
-
-This file was extended by xpa $as_me 2.1.18, which was
-generated by GNU Autoconf 2.59.  Invocation command line was
-
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
-
-_CSEOF
-echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
-echo >&5
-_ACEOF
-
-# Files that config.status was made for.
-if test -n "$ac_config_files"; then
-  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_headers"; then
-  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_links"; then
-  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_commands"; then
-  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-ac_cs_usage="\
-\`$as_me' instantiates files from templates according to the
-current configuration.
-
-Usage: $0 [OPTIONS] [FILE]...
-
-  -h, --help       print this help, then exit
-  -V, --version    print version number, then exit
-  -q, --quiet      do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-  --file=FILE[:TEMPLATE]
-		   instantiate the configuration file FILE
-  --header=FILE[:TEMPLATE]
-		   instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Report bugs to <bug-autoconf@gnu.org>."
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-ac_cs_version="\\
-xpa config.status 2.1.18
-configured by $0, generated by GNU Autoconf 2.59,
-  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
-
-Copyright (C) 2003 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-srcdir=$srcdir
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-# If no file are specified by the user, then we need to provide default
-# value.  By we need to know if files were specified by the user.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=*)
-    ac_option=`expr "x$1" : 'x\([^=]*\)='`
-    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
-    ac_shift=:
-    ;;
-  -*)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
-    ;;
-  *) # This is not an option, so the user has probably given explicit
-     # arguments.
-     ac_option=$1
-     ac_need_defaults=false;;
-  esac
-
-  case $ac_option in
-  # Handling of the options.
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --vers* | -V )
-    echo "$ac_cs_version"; exit 0 ;;
-  --he | --h)
-    # Conflict between --help and --header
-    { { echo "$as_me:$LINENO: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&2;}
-   { (exit 1); exit 1; }; };;
-  --help | --hel | -h )
-    echo "$ac_cs_usage"; exit 0 ;;
-  --debug | --d* | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
-    ac_need_defaults=false;;
-  --header | --heade | --head | --hea )
-    $ac_shift
-    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
-    ac_need_defaults=false;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
-
-  # This is an error.
-  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&2;}
-   { (exit 1); exit 1; }; } ;;
-
-  *) ac_config_targets="$ac_config_targets $1" ;;
-
-  esac
-  shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-if \$ac_cs_recheck; then
-  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
-  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-fi
-
-_ACEOF
-
-
-
-
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-for ac_config_target in $ac_config_targets
-do
-  case "$ac_config_target" in
-  # Handling of arguments.
-  "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-  "xpa.pc" ) CONFIG_FILES="$CONFIG_FILES xpa.pc" ;;
-  "conf.h" ) CONFIG_HEADERS="$CONFIG_HEADERS conf.h" ;;
-  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
-echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
-   { (exit 1); exit 1; }; };;
-  esac
-done
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used.  Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
-fi
-
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason to put it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Create a temporary directory, and hook for its removal unless debugging.
-$debug ||
-{
-  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
-  trap '{ (exit 1); exit 1; }' 1 2 13 15
-}
-
-# Create a (secure) tmp directory for tmp files.
-
-{
-  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
-}  ||
-{
-  tmp=./confstat$$-$RANDOM
-  (umask 077 && mkdir $tmp)
-} ||
-{
-   echo "$me: cannot create a temporary directory in ." >&2
-   { (exit 1); exit 1; }
-}
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-
-#
-# CONFIG_FILES section.
-#
-
-# No need to generate the scripts if there are no CONFIG_FILES.
-# This happens for instance when ./config.status config.h
-if test -n "\$CONFIG_FILES"; then
-  # Protect against being on the right side of a sed subst in config.status.
-  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
-   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
-s,@SHELL@,$SHELL,;t t
-s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
-s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
-s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
-s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
-s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
-s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
-s,@exec_prefix@,$exec_prefix,;t t
-s,@prefix@,$prefix,;t t
-s,@program_transform_name@,$program_transform_name,;t t
-s,@bindir@,$bindir,;t t
-s,@sbindir@,$sbindir,;t t
-s,@libexecdir@,$libexecdir,;t t
-s,@datadir@,$datadir,;t t
-s,@sysconfdir@,$sysconfdir,;t t
-s,@sharedstatedir@,$sharedstatedir,;t t
-s,@localstatedir@,$localstatedir,;t t
-s,@libdir@,$libdir,;t t
-s,@includedir@,$includedir,;t t
-s,@oldincludedir@,$oldincludedir,;t t
-s,@infodir@,$infodir,;t t
-s,@mandir@,$mandir,;t t
-s,@build_alias@,$build_alias,;t t
-s,@host_alias@,$host_alias,;t t
-s,@target_alias@,$target_alias,;t t
-s,@DEFS@,$DEFS,;t t
-s,@ECHO_C@,$ECHO_C,;t t
-s,@ECHO_N@,$ECHO_N,;t t
-s,@ECHO_T@,$ECHO_T,;t t
-s,@LIBS@,$LIBS,;t t
-s,@build@,$build,;t t
-s,@build_cpu@,$build_cpu,;t t
-s,@build_vendor@,$build_vendor,;t t
-s,@build_os@,$build_os,;t t
-s,@host@,$host,;t t
-s,@host_cpu@,$host_cpu,;t t
-s,@host_vendor@,$host_vendor,;t t
-s,@host_os@,$host_os,;t t
-s,@CC@,$CC,;t t
-s,@CFLAGS@,$CFLAGS,;t t
-s,@LDFLAGS@,$LDFLAGS,;t t
-s,@CPPFLAGS@,$CPPFLAGS,;t t
-s,@ac_ct_CC@,$ac_ct_CC,;t t
-s,@EXEEXT@,$EXEEXT,;t t
-s,@OBJEXT@,$OBJEXT,;t t
-s,@CPP@,$CPP,;t t
-s,@EGREP@,$EGREP,;t t
-s,@SZ_LONG@,$SZ_LONG,;t t
-s,@RANLIB@,$RANLIB,;t t
-s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
-s,@TLIB@,$TLIB,;t t
-s,@DOSHARED@,$DOSHARED,;t t
-s,@LLIB@,$LLIB,;t t
-s,@X_CFLAGS@,$X_CFLAGS,;t t
-s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t
-s,@X_LIBS@,$X_LIBS,;t t
-s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t
-s,@TCL_VERSION@,$TCL_VERSION,;t t
-s,@TCL_BIN_DIR@,$TCL_BIN_DIR,;t t
-s,@TCL_SRC_DIR@,$TCL_SRC_DIR,;t t
-s,@TCL_LIB_FILE@,$TCL_LIB_FILE,;t t
-s,@TCL_LIB_FLAG@,$TCL_LIB_FLAG,;t t
-s,@TCL_LIB_SPEC@,$TCL_LIB_SPEC,;t t
-s,@TCL_STUB_LIB_FILE@,$TCL_STUB_LIB_FILE,;t t
-s,@TCL_STUB_LIB_FLAG@,$TCL_STUB_LIB_FLAG,;t t
-s,@TCL_STUB_LIB_SPEC@,$TCL_STUB_LIB_SPEC,;t t
-s,@TCL_CFLAGS@,$TCL_CFLAGS,;t t
-s,@TCL_LIBS@,$TCL_LIBS,;t t
-s,@GTK_CFLAGS@,$GTK_CFLAGS,;t t
-s,@GTK_LIBS@,$GTK_LIBS,;t t
-s,@EXTRA_LIBS@,$EXTRA_LIBS,;t t
-s,@LIBOBJS@,$LIBOBJS,;t t
-s,@LTLIBOBJS@,$LTLIBOBJS,;t t
-CEOF
-
-_ACEOF
-
-  cat >>$CONFIG_STATUS <<\_ACEOF
-  # Split the substitutions into bite-sized pieces for seds with
-  # small command number limits, like on Digital OSF/1 and HP-UX.
-  ac_max_sed_lines=48
-  ac_sed_frag=1 # Number of current file.
-  ac_beg=1 # First line for current file.
-  ac_end=$ac_max_sed_lines # Line after last line for current file.
-  ac_more_lines=:
-  ac_sed_cmds=
-  while $ac_more_lines; do
-    if test $ac_beg -gt 1; then
-      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    else
-      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
-    fi
-    if test ! -s $tmp/subs.frag; then
-      ac_more_lines=false
-    else
-      # The purpose of the label and of the branching condition is to
-      # speed up the sed processing (if there are no `@' at all, there
-      # is no need to browse any of the substitutions).
-      # These are the two extra sed commands mentioned above.
-      (echo ':t
-  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
-      if test -z "$ac_sed_cmds"; then
-	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
-      else
-	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
-      fi
-      ac_sed_frag=`expr $ac_sed_frag + 1`
-      ac_beg=$ac_end
-      ac_end=`expr $ac_end + $ac_max_sed_lines`
-    fi
-  done
-  if test -z "$ac_sed_cmds"; then
-    ac_sed_cmds=cat
-  fi
-fi # test -n "$CONFIG_FILES"
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
-  esac
-
-  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
-  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-  { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
-
-  ac_builddir=.
-
-if test "$ac_dir" != .; then
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A "../" for each directory in $ac_dir_suffix.
-  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
-  ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
-  .)  # No --srcdir option.  We are building in place.
-    ac_srcdir=.
-    if test -z "$ac_top_builddir"; then
-       ac_top_srcdir=.
-    else
-       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
-    fi ;;
-  [\\/]* | ?:[\\/]* )  # Absolute path.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir ;;
-  *) # Relative path.
-    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-
-# Do not use `cd foo && pwd` to compute absolute paths, because
-# the directories may not exist.
-case `pwd` in
-.) ac_abs_builddir="$ac_dir";;
-*)
-  case "$ac_dir" in
-  .) ac_abs_builddir=`pwd`;;
-  [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
-  *) ac_abs_builddir=`pwd`/"$ac_dir";;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_builddir=${ac_top_builddir}.;;
-*)
-  case ${ac_top_builddir}. in
-  .) ac_abs_top_builddir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
-  *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_srcdir=$ac_srcdir;;
-*)
-  case $ac_srcdir in
-  .) ac_abs_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
-  *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
-  esac;;
-esac
-case $ac_abs_builddir in
-.) ac_abs_top_srcdir=$ac_top_srcdir;;
-*)
-  case $ac_top_srcdir in
-  .) ac_abs_top_srcdir=$ac_abs_builddir;;
-  [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
-  *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
-  esac;;
-esac
-
-
-
-  if test x"$ac_file" != x-; then
-    { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-    rm -f "$ac_file"
-  fi
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    configure_input=
-  else
-    configure_input="$ac_file.  "
-  fi
-  configure_input=$configure_input"Generated from `echo $ac_file_in |
-				     sed 's,.*/,,'` by configure."
-
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-  sed "$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s,@configure_input@,$configure_input,;t t
-s,@srcdir@,$ac_srcdir,;t t
-s,@abs_srcdir@,$ac_abs_srcdir,;t t
-s,@top_srcdir@,$ac_top_srcdir,;t t
-s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
-s,@builddir@,$ac_builddir,;t t
-s,@abs_builddir@,$ac_abs_builddir,;t t
-s,@top_builddir@,$ac_top_builddir,;t t
-s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
-" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
-  rm -f $tmp/stdin
-  if test x"$ac_file" != x-; then
-    mv $tmp/out $ac_file
-  else
-    cat $tmp/out
-    rm -f $tmp/out
-  fi
-
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-#
-# CONFIG_HEADER section.
-#
-
-# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
-# NAME is the cpp macro being defined and VALUE is the value it is being given.
-#
-# ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s,^\([	 ]*\)#\([	 ]*define[	 ][	 ]*\)'
-ac_dB='[	 ].*$,\1#\2'
-ac_dC=' '
-ac_dD=',;t'
-# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_uA='s,^\([	 ]*\)#\([	 ]*\)undef\([	 ][	 ]*\)'
-ac_uB='$,\1#\2define\3'
-ac_uC=' '
-ac_uD=',;t'
-
-for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case $ac_file in
-  - | *:- | *:-:* ) # input from stdin
-	cat >$tmp/stdin
-	ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
-	ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
-  * )   ac_file_in=$ac_file.in ;;
-  esac
-
-  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-
-  # First look for the input files in the build tree, otherwise in the
-  # src tree.
-  ac_file_inputs=`IFS=:
-    for f in $ac_file_in; do
-      case $f in
-      -) echo $tmp/stdin ;;
-      [\\/$]*)
-	 # Absolute (can't be DOS-style, as IFS=:)
-	 test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 # Do quote $f, to prevent DOS paths from being IFS'd.
-	 echo "$f";;
-      *) # Relative
-	 if test -f "$f"; then
-	   # Build tree
-	   echo "$f"
-	 elif test -f "$srcdir/$f"; then
-	   # Source tree
-	   echo "$srcdir/$f"
-	 else
-	   # /dev/null tree
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
-   { (exit 1); exit 1; }; }
-	 fi;;
-      esac
-    done` || { (exit 1); exit 1; }
-  # Remove the trailing spaces.
-  sed 's/[	 ]*$//' $ac_file_inputs >$tmp/in
-
-_ACEOF
-
-# Transform confdefs.h into two sed scripts, `conftest.defines' and
-# `conftest.undefs', that substitutes the proper values into
-# config.h.in to produce config.h.  The first handles `#define'
-# templates, and the second `#undef' templates.
-# And first: Protect against being on the right side of a sed subst in
-# config.status.  Protect against being in an unquoted here document
-# in config.status.
-rm -f conftest.defines conftest.undefs
-# Using a here document instead of a string reduces the quoting nightmare.
-# Putting comments in sed scripts is not portable.
-#
-# `end' is used to avoid that the second main sed command (meant for
-# 0-ary CPP macros) applies to n-ary macro definitions.
-# See the Autoconf documentation for `clear'.
-cat >confdef2sed.sed <<\_ACEOF
-s/[\\&,]/\\&/g
-s,[\\$`],\\&,g
-t clear
-: clear
-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 (][^	 (]*\)\(([^)]*)\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
-t end
-s,^[	 ]*#[	 ]*define[	 ][	 ]*\([^	 ][^	 ]*\)[	 ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
-: end
-_ACEOF
-# If some macros were called several times there might be several times
-# the same #defines, which is useless.  Nevertheless, we may not want to
-# sort them, since we want the *last* AC-DEFINE to be honored.
-uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
-sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
-rm -f confdef2sed.sed
-
-# This sed command replaces #undef with comments.  This is necessary, for
-# example, in the case of _POSIX_SOURCE, which is predefined and required
-# on some systems where configure will not decide to define it.
-cat >>conftest.undefs <<\_ACEOF
-s,^[	 ]*#[	 ]*undef[	 ][	 ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
-_ACEOF
-
-# Break up conftest.defines because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
-echo '  if grep "^[	 ]*#[	 ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
-echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
-echo '  :' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.defines >/dev/null
-do
-  # Write a limited-size here document to $tmp/defines.sed.
-  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
-  # Speed up: don't consider the non `#define' lines.
-  echo '/^[	 ]*#[	 ]*define/!b' >>$CONFIG_STATUS
-  # Work around the forget-to-reset-the-flag bug.
-  echo 't clr' >>$CONFIG_STATUS
-  echo ': clr' >>$CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
-  echo 'CEOF
-  sed -f $tmp/defines.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
-  rm -f conftest.defines
-  mv conftest.tail conftest.defines
-done
-rm -f conftest.defines
-echo '  fi # grep' >>$CONFIG_STATUS
-echo >>$CONFIG_STATUS
-
-# Break up conftest.undefs because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.undefs >/dev/null
-do
-  # Write a limited-size here document to $tmp/undefs.sed.
-  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
-  # Speed up: don't consider the non `#undef'
-  echo '/^[	 ]*#[	 ]*undef/!b' >>$CONFIG_STATUS
-  # Work around the forget-to-reset-the-flag bug.
-  echo 't clr' >>$CONFIG_STATUS
-  echo ': clr' >>$CONFIG_STATUS
-  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
-  echo 'CEOF
-  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
-  rm -f $tmp/in
-  mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
-  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
-  rm -f conftest.undefs
-  mv conftest.tail conftest.undefs
-done
-rm -f conftest.undefs
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-  # Let's still pretend it is `configure' which instantiates (i.e., don't
-  # use $as_me), people would be surprised to read:
-  #    /* config.h.  Generated by config.status.  */
-  if test x"$ac_file" = x-; then
-    echo "/* Generated by configure.  */" >$tmp/config.h
-  else
-    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
-  fi
-  cat $tmp/in >>$tmp/config.h
-  rm -f $tmp/in
-  if test x"$ac_file" != x-; then
-    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
-      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
-echo "$as_me: $ac_file is unchanged" >&6;}
-    else
-      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-      { if $as_mkdir_p; then
-    mkdir -p "$ac_dir"
-  else
-    as_dir="$ac_dir"
-    as_dirs=
-    while test ! -d "$as_dir"; do
-      as_dirs="$as_dir $as_dirs"
-      as_dir=`(dirname "$as_dir") 2>/dev/null ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
-  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
-  	  /^X\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-    done
-    test ! -n "$as_dirs" || mkdir $as_dirs
-  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }; }
-
-      rm -f $ac_file
-      mv $tmp/config.h $ac_file
-    fi
-  else
-    cat $tmp/config.h
-    rm -f $tmp/config.h
-  fi
-done
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-{ (exit 0); exit 0; }
-_ACEOF
-chmod +x $CONFIG_STATUS
-ac_clean_files=$ac_clean_files_save
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded.  So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status.  When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
-  ac_cs_success=:
-  ac_config_status_args=
-  test "$silent" = yes &&
-    ac_config_status_args="$ac_config_status_args --quiet"
-  exec 5>/dev/null
-  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
-  exec 5>>config.log
-  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
-  # would make configure fail if this is the last instruction.
-  $ac_cs_success || { (exit 1); exit 1; }
-fi
-
diff --git a/xpa/configure.ac b/xpa/configure.ac
deleted file mode 100644
index fb5aeb2..0000000
--- a/xpa/configure.ac
+++ /dev/null
@@ -1,217 +0,0 @@
-#	This file is an input file used by the GNU "autoconf" program to
-#	generate the file "configure", which is run during XPA installation
-#	to configure the system for the local environment.
-AC_INIT(xpa, 2.1.18, eric@cfa.harvard.edu, xpa)
-
-AC_CONFIG_HEADERS([conf.h])
-AC_CONFIG_SRCDIR(./xpa.h)
-AC_CANONICAL_HOST
-
-# save LDFLAGS
-XLDFLAGS="$LDFLAGS"
-
-#
-# checks that we use in most projects
-#
-AC_PROG_CC
-
-AC_EXEEXT
-if test x"${EXEEXT}" = "xno"; then
-  EXEEXT=""
-fi
-
-AC_CHECK_SIZEOF(long)
-SZ_LONG=$ac_cv_sizeof_long
-AC_SUBST(SZ_LONG)
-
-AC_PROG_RANLIB
-
-AC_HEADER_STDC
-AC_CHECK_HEADERS(malloc.h)
-AC_CHECK_HEADERS(getopt.h)
-AC_CHECK_HEADERS(pwd.h)
-AC_CHECK_HEADERS(values.h)
-AC_CHECK_HEADERS(dlfcn.h)
-AC_CHECK_HEADERS(setjmp.h)
-AC_CHECK_HEADERS(sys/un.h)
-AC_CHECK_HEADERS(sys/shm.h)
-AC_CHECK_HEADERS(sys/mman.h)
-AC_CHECK_HEADERS(sys/ipc.h)
-AC_CHECK_HEADERS(sys/select.h)
-
-AC_CHECK_TYPES([socklen_t], [], [], [#include <sys/socket.h>])
-
-AC_C_CONST
-
-AC_CHECK_FUNCS(strchr memcpy snprintf atexit setenv)
-
-AC_CHECK_FUNC(connect)
-if test $ac_cv_func_connect = no; then
-  AC_CHECK_LIB(socket, connect,  EXTRA_LIBS="$EXTRA_LIBS -lsocket")
-fi                                                                          
-AC_CHECK_FUNC(gethostbyname)
-if test $ac_cv_func_gethostbyname = no; then
-  AC_CHECK_LIB(nsl, gethostbyname, EXTRA_LIBS="$EXTRA_LIBS -lnsl")
-fi                                                                          
-# AC_CHECK_LIB(db, snprintf, EXTRA_LIBS="$EXTRA_LIBS -ldb")
-
-#
-# checks specific to this project
-# 
-
-AC_MSG_CHECKING(for threaded xpans)
-AC_ARG_ENABLE(threaded-xpans, [  --enable-threaded-xpans    build threaded xpans],
-    [fun_ok=$enableval], [fun_ok=no])
-if test "$fun_ok" = "yes"; then
-  AC_MSG_RESULT($fun_ok)
-  AC_CHECK_LIB(pthread, pthread_create, have_pthread=yes)
-  if test  x"${have_pthread}" = x"yes"; then
-    AC_DEFINE(HAVE_LIBPTHREAD)
-    AC_DEFINE(_REENTRANT)
-    TLIB="-lpthread"
-  else
-    AC_MSG_ERROR([no threads found ... can't use enable-threaded-xpans], 1)
-  fi
-else
-  AC_MSG_RESULT($fun_ok)
-fi
-AC_SUBST(TLIB)
-
-AC_MSG_CHECKING(for shared library build)
-AC_ARG_ENABLE(shared, [  --enable-shared    build shared libraries],
-    [fun_ok=$enableval], [fun_ok=no])
-if test "$fun_ok" != "no"; then
-  fpic="yes"
-  DOSHARED=shlib
-  AC_SUBST(DOSHARED)
-  if test "$fun_ok" = "link"; then
-    LLIB="-L. -l$PACKAGE_NAME"
-  else
-    LLIB='$(LIB)'
-  fi
-else
-  DOSHARED=""
-  LLIB='$(LIB)'
-fi
-AC_SUBST(LLIB)
-AC_MSG_RESULT($fun_ok)
-
-AC_MSG_CHECKING(for request to use posix_spawn)
-AC_ARG_ENABLE(posix_spawn, [  --enable-posix_spawn    use posix_spawn() if available],
-    [fun_ok=$enableval], [fun_ok=no])
-AC_MSG_RESULT($fun_ok)
-if test "$fun_ok" = "yes"; then
-  AC_CHECK_FUNCS(posix_spawn _NSGetEnviron)
-  AC_CHECK_HEADERS(crt_externs.h)
-fi
-
-AC_PATH_XTRA
-if test x"${have_x}" = "xyes"; then
-    AC_DEFINE(HAVE_XT)
-fi
-
-SC_PATH_TCLCONFIG
-if test x"${no_tcl}" = x ; then
-    SC_LOAD_TCLCONFIG
-    if test -r $TCL_PREFIX/include/tcl.h; then
-      TCL_CFLAGS="$TCL_INCLUDE_SPEC"
-      if test x"$DOSHARED" != x -a x"$TCL_SUPPORTS_STUBS" = x1; then
-        TCL_LIBS="$TCL_STUB_LIB_SPEC"
-        TCL_CFLAGS="$TCL_CFLAGS -DUSE_TCL_STUBS=1"
-        AC_MSG_RESULT([Tcl support will utilize stubs library: $TCL_LIBS])
-      else
-        TCL_LIBS="$TCL_LIB_SPEC"
-        AC_MSG_RESULT([Tcl support will utilize library: $TCL_LIBS])
-      fi
-      AC_DEFINE(HAVE_TCL)
-    else
-      if test x"${with_tclconfig}" != x ; then
-        TCL_CFLAGS="$TCL_INCLUDE_SPEC"
-        TCL_LIBS="$TCL_LIB_SPEC"
-        AC_DEFINE(HAVE_TCL)
-        AC_MSG_RESULT([warning: tcl.h not found with --with-tcl ... tcl build might fail])
-      else
-        AC_MSG_RESULT([$TCL_PREFIX/include/tcl.h not found ... use --with-tcl to build tcl explicitly])
-      fi
-    fi
-fi
-AC_SUBST(TCL_CFLAGS)
-AC_SUBST(TCL_LIBS)
-
-AC_MSG_CHECKING(for incorporation of thread support)
-AC_ARG_WITH(threads,
-    [  --with-threads          build for use in threaded programs], thr=1, thr=0)
-if test x"$thr" = x1 ; then
-  AC_MSG_RESULT(yes)
-  CFLAGS="$CFLAGS -D_REENTRANT"
-else
-  AC_MSG_RESULT(no)
-fi
-
-AC_MSG_CHECKING(for gtk)
-AC_ARG_WITH(gtk,
-    [  --with-gtk=<path>       include directory for gtk e.g. /usr/include/gtk-1.2], havelib=1, havelib=0)
-if test x"$havelib" = x1 ; then
-  AC_MSG_RESULT(yes ($withval))
-  GTK_CFLAGS="`pkg-config gtk+-2.0 --cflags` -DHAVE_GTK=1"
-  GTK_LIBS="`pkg-config gtk+-2.0 --libs`"
-  AC_DEFINE(HAVE_GTK)
-else
-  GTK_CFLAGS=""
-  GTK_LIBS=""
-  AC_MSG_RESULT(no)
-fi
-AC_SUBST(GTK_CFLAGS)
-AC_SUBST(GTK_LIBS)
-
-# restore LDFLAGS
-LDFLAGS="$LDFLAGS $XLDFLAGS"
-
-AC_MSG_CHECKING([$host_os configuration])
-case $host_os in
-    *cygwin*|*Cygwin* )
-        AC_DEFINE(HAVE_CYGWIN)
-        AC_MSG_RESULT([flagging Cygwin])
-        ;;
-    *mingw32*|*Mingw32*)
-        CFLAGS="$CFLAGS -mconsole"
-	EXTRA_LIBS="$EXTRA_LIBS -lwsock32"
-        AC_DEFINE(HAVE_MINGW32)
-        AC_MSG_RESULT([flagging MinGW])
-        ;;
-    *darwin*|*Darwin*)
-	LDFLAGS="$LDFLAGS $CFLAGS"
-        G=`$CC -v 2>&1 | grep version | awk '{print $3}' | awk -F. '{print $1$2}'`
-        if test x"$G" != x -a "$G" -lt 42; then
-	  CFLAGS="$CFLAGS -no-cpp-precomp"
-        fi
-        if test x"$TCL_PREFIX" = x"/usr/local"; then
-	  TCL_CFLAGS=""
-          AC_MSG_RESULT([removing -I/usr/local/include])
-        fi
-	;;
-    *osf*|*Osf*)
-	  AC_CHECK_LIB(db, snprintf, EXTRA_LIBS="$EXTRA_LIBS -ldb")
-        ;;
-    * )
-        if test x"$fpic" = x"yes" ; then
-          if test "$CC" = "gcc" -o `$CC -v 2>&1 | grep -c gcc` != "0" ; then
-	    CFLAGS="$CFLAGS -fPIC"
-	    AC_MSG_RESULT([adding -fPIC to gcc])
-	  else
-            AC_MSG_RESULT(none)
-	  fi
-	else
-            AC_MSG_RESULT(none)
-	fi
-        ;;
-esac
-
-AC_SUBST(EXTRA_LIBS)
-
-AC_CONFIG_FILES(Makefile)
-
-# generate pkg-config meta-data file
-AC_CONFIG_FILES(xpa.pc)
-
-AC_OUTPUT
diff --git a/xpa/copyright b/xpa/copyright
deleted file mode 100644
index e115788..0000000
--- a/xpa/copyright
+++ /dev/null
@@ -1,30 +0,0 @@
-Unless otherwise indicated, all source is:
-
-Copyright (C) 1999-2013
-Smithsonian Astrophysical Observatory, Cambridge, MA, USA
-
-XPA is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-Correspondence concerning XPA should be addressed as follows:
-
-Eric Mandel
-Smithsonian Astrophysical Observatory
-MS 3
-60 Garden St.
-Cambridge, MA 02138 USA
-
-eric@cfa.harvard.edu
-
-http://hea-www.harvard.edu/saord/xpa/
diff --git a/xpa/ctest.c b/xpa/ctest.c
deleted file mode 100644
index b4827d1..0000000
--- a/xpa/ctest.c
+++ /dev/null
@@ -1,684 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * ctest -- client test for xpa
- *
- */
-#include <xpap.h>
-
-extern char *optarg;
-extern int optind;
-
-int  quiet=0;
-int  dowait=0;
-int  n=0;
-int don=0;
-int  save_bytes=-1;
-int  exitonerror=0;
-char *save_buf=NULL;
-char *mode="";
-char name[SZ_LINE];
-
-#define MAX_FPS 4
-
-#ifdef ANSI_FUNC
-int 
-send_cb (void *client_data, void *call_data, char *paramlist,
-	 char **buf, size_t *len)
-#else
-int send_cb(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char **buf;
-     size_t *len;
-#endif
-{
-  char *s = (char *)client_data;
-  XPA xpa = (XPA)call_data;
-  char tbuf[SZ_LINE];
-  int sendbuf=0;
-
-  /* introduce ourselves */
-  if( !quiet ){
-    fprintf(stdout, "SEND_CB #%d: %s:%s (%s)\n",
-	    n++, xpa_class(xpa), xpa_name(xpa), s);
-  }
-
-  /* process special paramlist tokens */
-  if( paramlist && *paramlist ){
-    if( !quiet )
-      fprintf(stdout, "\tparamlist: %s\n", paramlist);
-    if( !strncmp(paramlist, "buf", 3) ){
-      sendbuf=1;
-    }
-    else if( !strncmp(paramlist, "error", 5) ){
-      if( !quiet )
-	fprintf(stdout, "\treturning error: %s\n", &paramlist[6]);
-      *len = 0;
-      *buf = NULL;
-      XPAError(xpa, &paramlist[6]);
-      return(-1);
-    }
-    else if( !strcmp(paramlist, "exit") ){
-      if( !quiet )
-	fprintf(stdout, "Exiting\n");
-      exit(0);
-    }
-    else if( !strcmp(paramlist, "wait") ){
-      fprintf(stdout, "Press <CR> to continue ...");
-      fgets(tbuf, SZ_LINE, stdin);
-    }
-  }
-  else if( dowait ){
-    fprintf(stdout, "Press <CR> to continue ...");
-    fgets(tbuf, SZ_LINE, stdin);
-  }
-
-  /* return information about this xpa */
-  if( !sendbuf ){
-    snprintf(tbuf, SZ_LINE,
-	  "nclass: %s\nname: %s\nmethod: %s\nsendian: %s\ncendian: %s\n",
-	  xpa_class(xpa), xpa_name(xpa), xpa_method(xpa),
-	  xpa_sendian(xpa), xpa_cendian(xpa));
-  
-    if( (xpa->send_mode & XPA_MODE_FILLBUF) ){
-      send(xpa_datafd(xpa), tbuf, strlen(tbuf), 0);
-      *len = 0;
-      *buf = NULL;
-      if( !quiet)
-	fprintf(stdout, "\tcallback writes %d bytes to client\n",
-		(int)strlen(tbuf));
-    }
-    /* return the buffer and let xpa transmit it */
-    else{
-      *len = strlen(tbuf);
-      *buf = (char *)xmalloc(*len);
-      memcpy(*buf, tbuf, *len);
-      if( !quiet)
-	fprintf(stdout, "\tcallback returns %d bytes to xpa handler\n",
-		(int)strlen(tbuf));
-    }
-  }
-  /* return the last buffer we were sent */
-  else{
-    if( (xpa->send_mode & XPA_MODE_FILLBUF) ){
-      send(xpa_datafd(xpa), save_buf, save_bytes, 0);
-      *len = 0;
-      *buf = NULL;
-      if( !quiet)
-	fprintf(stdout, "\tcallback writes %d bytes to client\n", save_bytes);
-    }
-    /* return the buffer and let xpa transmit it */
-    else{
-      *len = save_bytes;
-      *buf = (char *)xmalloc(*len);
-      memcpy(*buf, save_buf, *len);
-      if( !quiet)
-	fprintf(stdout, "\tcallback returns %d bytes to xpa handler\n",
-		save_bytes);
-    }
-  }
-  fflush(stdout);
-  fflush(stderr);
-  return(0);
-}
-
-#ifdef ANSI_FUNC
-int 
-receive_cb (void *client_data, void *call_data, char *paramlist,
-	    char *buf, size_t len)
-#else
-int receive_cb(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     size_t len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  char *s = (char *)client_data;
-  char tbuf[SZ_LINE];
-  char *errs[1];
-  int i;
-  int ip;
-  int got;
-  int xwait;
-
-  if( !quiet ){
-    fprintf(stdout, "RECEIVE_CB #%d: %s:%s (%s)\n",
-	    n++, xpa_class(xpa), xpa_name(xpa), s);
-  }
-  if( !quiet ){
-    fprintf(stdout, "\tbuf: %lu bytes\n", (unsigned long)len);
-  }
-
-  /* process param list */
-  if( paramlist && *paramlist ){
-    if( !quiet )
-      fprintf(stdout, "\tparamlist: %s\n", paramlist);
-    if( !strcmp(paramlist, "free") ){
-      if( !quiet )
-	fprintf(stdout, "Freeing xpa struct\n");
-      XPAFree(xpa);
-      return(0);
-    }
-    else if( !strncmp(paramlist, "error", 5) ){
-      if( !quiet )
-	fprintf(stdout, "Processing error: %s\n", &paramlist[6]);
-      XPAError(xpa, &paramlist[6]);
-      return(-1);
-    }
-    else if( !strcmp(paramlist, "exit") ){
-      if( !quiet )
-	fprintf(stdout, "Exiting\n");
-      exit(0);
-    }
-    else if( !strcmp(paramlist, "wait") ){
-      fprintf(stdout, "Press <CR> to continue ...");
-      fgets(tbuf, SZ_LINE, stdin);
-    }
-    else if( !strncmp(paramlist, "xpaset", 6) ){
-      ip = 0;
-      word(paramlist, tbuf, &ip);
-      if( word(paramlist, tbuf, &ip) ){
-	if( !quiet )
-	  fprintf(stdout, "calling XPASet(%s, \"%s\")\n",
-		  tbuf, &(paramlist[ip]));
-	got = XPASet(NULL, tbuf, &(paramlist[ip]), mode,
-		     paramlist, strlen(paramlist), NULL, errs, 1);
-	if( got == 0 ){
-	  if( !quiet )
-	    fprintf(stdout, "no XPA access points matched template %s\n",
-		    tbuf);
-	}
-	else if( errs[0] != NULL ){
-	  if( !quiet )
-	    fprintf(stdout, "Error on xpaset to %s: %s\n", tbuf, errs[0]);
-	  xfree(errs[0]);
-	  if( exitonerror )
-	    exit(1);
-	}
-	else{
-	  if( !quiet )
-	    fprintf(stdout, "XPASet to %s successful\n", tbuf);
-	}
-      }
-      return(0);
-    }
-  }
-  else if( dowait ){
-    fprintf(stdout, "Press <CR> to continue ...");
-    fgets(tbuf, SZ_LINE, stdin);
-  }
-
-  /* reset save buffer */
-  if( save_buf != NULL ){
-    xfree(save_buf);
-    save_buf = NULL;
-  }
-  save_bytes = 0;
-
-  xwait = dowait;
-  if( !(xpa->receive_mode & XPA_MODE_FILLBUF) ){
-    while( (got=recv(xpa_datafd(xpa), tbuf, SZ_LINE, 0)) >0 ){
-      if( xwait >0 ){
-	fprintf(stdout, "got %d bytes ... press <CR> to continue ...", got);
-	fgets(tbuf, SZ_LINE, stdin);
-	xwait--;
-      }
-      i = save_bytes;
-      save_bytes += got;
-      if( save_buf == NULL )
-	save_buf = (char *)xmalloc(save_bytes);
-      else
-	save_buf = (char *)xrealloc(save_buf, save_bytes);
-      memcpy(&save_buf[i], tbuf, got);
-    }
-    if( !quiet )
-      fprintf(stdout, "callback read %d bytes\n", save_bytes);
-  }
-  else{
-    save_bytes = len;
-    save_buf = (char *)xmalloc(len);
-    memcpy(save_buf, buf, len);
-  }
-  fflush(stdout);
-  fflush(stderr);
-  return(0);
-}
-
-#ifdef ANSI_FUNC
-int 
-info_cb (void *client_data, void *call_data, char *paramlist)
-#else
-int info_cb(client_data, call_data, paramlist)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  char *s = (char *)client_data;
-  char xtemplate[SZ_LINE];
-  char *names[MAX_FPS];
-  char *bufs[MAX_FPS];
-  char *errs[MAX_FPS];
-  size_t lens[MAX_FPS];
-  int i;
-  int ip;
-  int got;
-
-  if( !quiet ){
-    fprintf(stdout, "INFO_CB #%d: %s:%s (%s)\n",
-	    n++, xpa_class(xpa), xpa_name(xpa), s);
-  }
-
-  if( paramlist && *paramlist ){
-    if( !quiet )
-      fprintf(stdout, "\tparamlist: %s\n", paramlist);
-    ip = 0;
-    word(paramlist, xtemplate, &ip);
-    if( !strcmp(xtemplate, "xpaget") ){
-      word(paramlist, xtemplate, &ip);
-      got = XPAGet(xpa, xtemplate, &(paramlist[ip]), NULL,
-		   bufs, lens, names, errs, MAX_FPS);
-      if( !quiet )
-	fprintf(stdout, "XPAGet (%s) returned %d buffer(s)\n", xtemplate, got);
-      for(i=0; i<got; i++){
-	if( !quiet )
-	  fprintf(stdout, "\t%d: %s\n", i, names[i]);
-	if( errs[i] == NULL ){
-	  if( lens[i] > 0 ){
-	    fprintf(stdout, "contents (%lu bytes):\n", (unsigned long)lens[i]);
-	    write(fileno(stdout), bufs[i], lens[i]);
-	  }
-	  if( !quiet )
-	    fprintf(stdout, "\n");
-	}
-	else{
-	  write(fileno(stdout), errs[i], strlen(errs[i]));
-	  if( exitonerror )
-	    exit(1);
-	}
-	if( bufs[i] )
-	  xfree(bufs[i]);
-	if( names[i] )
-	  xfree(names[i]);
-	if( errs[i] )
-	  xfree(errs[i]);
-      }
-    }
-  }
-  fflush(stdout);
-  fflush(stderr);
-  return(0);
-}
-
-#ifdef ANSI_FUNC
-int 
-main (int argc, char **argv)
-#else
-int
-main(argc, argv)
-     int argc;
-     char **argv;
-#endif
-{
-  char *plist=NULL;
-  char *paramlist=NULL;
-  char *xtemplate="*:*";
-  char *smode=NULL;
-  char tbuf[SZ_LINE];
-  char name[SZ_LINE];
-  char cmd[SZ_LINE];
-  char fxpa[SZ_LINE];
-  char *names[MAX_FPS];
-  char *bufs[MAX_FPS];
-  char *dbufs[MAX_FPS];
-  char *errs[MAX_FPS];
-  char *buf=NULL;
-  int c;
-  size_t lens[MAX_FPS];
-  size_t dlens[MAX_FPS];
-  int i;
-  int got;
-  int maxbufs;
-  int j=0;
-  int loop=1;
-  int delay=0;
-  int get=1;
-  int set=0;
-  int info=0;
-  int access=0;
-  int pipe=0;
-  int tiny=0;
-  int doxpa = 0;
-  int xpaopen=0;
-  int wait=0;
-  XPA xpa=NULL;
-  XPA xpa1=NULL;
-  int fds[1];
-
-#if HAVE_MINGW32==0
-  setvbuf(stdout, NULL, _IONBF, 0);
-  setvbuf(stderr, NULL, _IONBF, 0);
-#endif
-
-  *cmd = '\0';
-  /* process switch arguments */
-  while ((c = getopt(argc, argv, "abd:ef:gil:m:nopqstwx:")) != -1){
-    switch(c){
-    case 'a':
-      get = 0;
-      set = 0;
-      info = 0;
-      access = 1;
-      break;
-    case 'b':
-      get = 1;
-      set = 1;
-      info = 0;
-      access = 0;
-      break;
-    case 'd':
-      delay = atoi(optarg);
-      break;
-    case 'e':
-      exitonerror++;
-      break;
-    case 'f':
-      snprintf(cmd, SZ_LINE, "stest %s &\n", optarg);
-      snprintf(fxpa, SZ_LINE, "%s1", optarg);
-      break;
-    case 'g':
-      get = 1;
-      set = 0;
-      info = 0;
-      access = 0;
-      break;
-    case 'i':
-      get = 0;
-      set = 0;
-      info = 1;
-      access = 0;
-      break;
-    case 'l':
-      loop = atoi(optarg);
-      break;
-    case 'm':
-      smode = xstrdup(optarg);
-      break;
-    case 'n':
-      don = 1;
-      break;
-    case 'o':
-      xpaopen = 1;
-      break;
-    case 'p':
-      pipe = 1;
-      fds[0] = fileno(stdout);
-      break;
-    case 'q':
-      quiet = 1;
-      break;
-    case 's':
-      get = 0;
-      set = 1;
-      info = 0;
-      access = 0;
-      break;
-    case 't':
-      tiny = 1;
-      break;
-    case 'w':
-      wait = 1;
-      break;
-    case 'x':
-      doxpa = 1;
-      strcpy(name, optarg);
-      break;
-    }
-  }
-  if( optind < argc ){
-    xtemplate = argv[optind];
-    optind++;
-  }
-
-  /* make up the paramlist */
-  plist = XPAArgvParamlist(argc, argv, optind);
-  if( !don )
-    paramlist = plist;
-  else
-    paramlist = (char *)xcalloc(strlen(plist)+SZ_LINE, sizeof(char));
-
-  /* for setting, make up a number of dbufs that we will send */
-  if( set ){
-    /* must be less than MAX_FPS */
-    maxbufs = 2;
-
-    dbufs[0] = (char *)xmalloc(SZ_LINE);
-    strcpy(dbufs[0], "this is a short string");
-    dlens[0] = strlen(dbufs[0]);
-
-    if( tiny )
-      dlens[1] = 256+1;
-    else
-      dlens[1] = 256*1000+1;
-    dbufs[1] = (char *)xmalloc(dlens[1]);
-    for(j=0, buf=dbufs[1]; j<dlens[1]; j++){
-      buf[j] = j%256;
-    }
-  }
-
-  /* background process initialization */
-  if( *cmd != '\0' ){
-    fprintf(stdout, "starting bkgd process: %s", cmd);
-    system(cmd);
-    for(i=0, n=0; i<5; i++){
-      if( (got=XPAAccess(NULL, fxpa, "g", NULL, names, errs, MAX_FPS)) ){
-	for(j=0; j<got; j++){
-	  if( names[j] ) xfree(names[j]);
-	  if( !errs[j] )
-	    n++;
-	  else
-	    xfree(errs[j]);
-	}
-	if( n ){
-	  fprintf(stdout, "process is started\n");
-	  break;
-	}
-      }
-      else{
-        XPASleep(1000);
-      }
-    }
-  }
-
-  /* start up an xpa server, if necessary */
-  if( doxpa ) {
-    snprintf(tbuf, SZ_LINE, "%s from ctest", name);
-    if( (xpa1 = XPANew("CLIENT", name, name,
-		       send_cb, tbuf, mode, receive_cb, tbuf, mode)) == NULL ){
-      fprintf(stderr, "ERROR: could not init client xpa: %s\n", name);
-    }
-    else{
-      fprintf(stdout, "%s using method: %s\n",
-	      xpa_name(xpa1), xpa_method(xpa1));
-    }
-  }
-
-  /* XPAOpen */
-  if( xpaopen ){
-    if( (xpa = XPAOpen(NULL)) == NULL ){
-      fprintf(stderr, "ERROR: could not open any xpa access points: %s\n",
-	      xtemplate);
-      exit(1);
-    }
-  }
-
-  /* iterate */
-  for(j=0; j<loop; j++){
-    if( loop > 1 ){
-      if( !quiet ){
-	fprintf(stdout, "CLIENT #%d: %s\n", j, xtemplate);
-	if( paramlist && *paramlist )
-	  fprintf(stdout, "\tparamlist: %s\n", paramlist);
-      }
-    }
-    /* make up paramlist, if necessary */
-    if( don )
-      snprintf(paramlist, SZ_LINE, "%s %d", plist, j);
-    /* XPAGet, XPAGetFd */
-    if( get ){
-      if( pipe ){
-	got = XPAGetFd(xpa, xtemplate, paramlist, smode,
-		       fds, names, errs, -MAX_FPS);
-      }
-      else{
-	got = XPAGet(xpa, xtemplate, paramlist, smode, 
-		     bufs, lens, names, errs, MAX_FPS);
-	for(i=0; i<got; i++){
-	  if( !quiet ){
-	    if( strcmp(paramlist, "buf") )
-	      fprintf(stdout, "\treceived from %s\n", names[i]);
-	    if( errs[i] == NULL ){
-	      if( lens[i] > 0 ){
-		write(fileno(stdout), bufs[i], lens[i]);
-	      }
-	      if( strcmp(paramlist, "buf") )
-		fprintf(stdout, "\n");
-	    }
-	    else{
-	      write(fileno(stdout), errs[i], strlen(errs[i]));
-	      if( exitonerror )
-		exit(1);
-	    }
-	  }
-	  if( bufs[i] )
-	    xfree(bufs[i]);
-	  if( names[i] )
-	    xfree(names[i]);
-	  if( errs[i] )
-	    xfree(errs[i]);
-	}
-      }
-    }
-    
-    /* XPASet, XPASetFd */
-    if( set ){
-      if( pipe ){
-	if( !quiet )
-	  fprintf(stdout, "\tsending data from stdin\n");
-	got =XPASetFd(xpa, xtemplate, paramlist, smode, 
-		      fileno(stdin), names, errs, MAX_FPS);
-      }
-      else{
-	got = XPASet(xpa, xtemplate, paramlist, smode,
-		     dbufs[j%maxbufs], dlens[j%maxbufs],
-		     names, errs, MAX_FPS);
-      }
-      for(i=0; i<got; i++){
-	if( !quiet )
-	  fprintf(stdout, "\tsent %lu bytes to %s\n",
-		  (unsigned long)dlens[j%maxbufs], names[i]);
-	if( errs[i] != NULL ){
-	  fprintf(stdout, "Error from server %s\n", names[i]);
-	  write(fileno(stdout), errs[i], strlen(errs[i]));
-	  if( exitonerror )
-	    exit(1);
-	}
-	if( names[i] )
-	  xfree(names[i]);
-	if( errs[i] )
-	  xfree(errs[i]);
-      }
-    }
-
-    /* XPAInfo */
-    if( info ){
-      got = XPAInfo(xpa, xtemplate, paramlist, smode, names, errs, MAX_FPS);
-      for(i=0; i<got; i++){
-	if( !quiet ){
-	  fprintf(stdout, "\tinfo from %s\n", names[i]);
-	  if( errs[i] != NULL ){
-	    write(fileno(stdout), errs[i], strlen(errs[i]));
-	    if( exitonerror )
-	      exit(1);
-	  }
-	}
-	if( names[i] )
-	  xfree(names[i]);
-	if( errs[i] )
-	  xfree(errs[i]);
-      }
-    }
-
-    /* XPAAccess */
-    if( access ){
-      got = XPAAccess(xpa, xtemplate, paramlist, smode, names, errs, MAX_FPS);
-      for(i=0; i<got; i++){
-	if( !quiet ){
-	  fprintf(stdout, "\taccess from %s\n", names[i]);
-	  if( errs[i] != NULL ){
-	    write(fileno(stdout), errs[i], strlen(errs[i]));
-	    if( exitonerror )
-	      exit(1);
-	  }
-	}
-	if( names[i] )
-	  xfree(names[i]);
-	if( errs[i] )
-	  xfree(errs[i]);
-      }
-    }
-
-    /* if we processed no access points, let`s hear about it */
-    if( got == 0 ){
-      fprintf(stderr, "XPA$ERROR: no xpa access points processed\n");
-    }
-    else{
-	if( !quiet ){
-	  if( strcmp(paramlist, "buf") )
-	    fprintf(stdout, "CLIENT #%d complete\n", j);
-	}
-	else{
-	  fprintf(stdout, ".");
-	  fflush(stdout);
-	}
-    }
-
-    /* wait for next iteration */
-    if( wait ){
-      fprintf(stdout, "Press <CR> to continue ...");
-      fgets(tbuf, SZ_LINE, stdin);
-    }
-
-    /* delay */
-    if( delay )
-      XPASleep(delay);
-  }
-
-  /* XPAOpen/XPAClose */
-  if( xpaopen ){
-    XPAClose(xpa);
-  }
-
-  /* free up space */
-  if( set ){
-    for(j=0; j<maxbufs; j++){
-      if( dbufs[j] )
-	xfree(dbufs[j]);
-    }
-  }
-  if(  plist ) xfree(plist);
-  if( don )    xfree(paramlist);
-  if( smode )  xfree(smode);
-  /* make valgrind happy */
-  XPACleanup();
-  exit(0);
-}
diff --git a/xpa/dns.c b/xpa/dns.c
deleted file mode 100644
index 32e33b1..0000000
--- a/xpa/dns.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-#include <unistd.h>
-#include <strings.h>
-#include <stdio.h>
-#include <netdb.h>              /* gethostbyname() */
-
-#define SZ_LINE 1024
-
-int main(int argc, char **argv)
-{
-  int i;
-  char host[SZ_LINE];
-  struct hostent *hostent;
-
-  if( argc > 1 )
-    strcpy(host, argv[1]);
-  else{
-    fprintf(stderr, "calling gethostname() ...\n");
-    if( gethostname(host, SZ_LINE) == -1 ){
-      perror("gethostname");
-      exit(1);
-    }
-    else{
-      fprintf(stderr, "host name is %s\n", host);
-    }
-  }
-  fprintf(stderr, "calling gethostbyname(host) ...\n");
-  if( !(hostent = gethostbyname(host)) ){
-      perror("gethostbyname");
-      exit(1);
-  }
-  else{
-    fprintf(stderr, "gethostbyname() succeeded\n");
-  }
-  fprintf(stderr, "printing ip address(es) for this host ...\n");
-  if( hostent ){
-    for(i=0; hostent->h_addr_list[i]; i++){
-      fprintf(stderr, "%x\n", *(int *)hostent->h_addr_list[i]);
-    }
-  }
-  else{
-    fprintf(stderr, "ERROR: can't look up: %s\n", host);
-  }
-  return(0);
-}
diff --git a/xpa/doc/Makefile b/xpa/doc/Makefile
deleted file mode 100644
index eda8931..0000000
--- a/xpa/doc/Makefile
+++ /dev/null
@@ -1,51 +0,0 @@
-#
-# Makefile for misc programs, not good enough for their own directory
-#
-
-RM	= rm
-RMFLAGS	= -f
-MV	= mv
-MVFLAGS	= -f
-CP	= cp
-CPFLAGS	= -p
-
-MANDIR =	../man
-
-all:		dirs files hardcopy
-
-dirs:
-		@(if [ ! -d ${MANDIR} ]; then 				\
-		    mkdir ${MANDIR}; 					\
-		    mkdir ${MANDIR}/man1 ${MANDIR}/man3 ${MANDIR}/mann; \
-		fi)
-
-files:
-		@(for i in *.html; do \
-		    echo processing $$i; \
-		    ./html2man ../man < $$i; \
-		done)
-
-hardcopy:	
-		html2ps -C fb -d -g -n -u -W b -x 1 -o xpa.ps help.html
-		ps2pdf xpa.ps xpa.pdf
-
-
-# NB: sman.conf must be copied to $HOME or else its not found ...
-# we also have to figure out where swish-e is located and hardwire it
-index:  szlong
-	@(cd ..; MANPATH=`pwd`/man; export MANPATH; cd doc; \
-	SW=`which swish-e`; \
-	SZ_LONG=`./szlong`; \
-	sed -e 's#@SW@#'$$SW'#g' < sman_conf.tmpl > $${HOME}/sman.conf; \
-	sman-update --clearcache; \
-	sman-update --verbose --index=./sman/xpa$${SZ_LONG}.index; \
-	rm -f $${HOME}/sman.conf szlong)
-
-szlong: szlong.c
-	$(CC) $(CFLAGS) -o szlong szlong.c
-
-clean:
-	-$(RM) $(RMFLAGS) *.BAK *.bak *.o core errs ,* *~ *.a \
-	foo* goo* tags TAGS html2ps.dbg
-
-
diff --git a/xpa/doc/acl.html b/xpa/doc/acl.html
deleted file mode 100644
index b1f458d..0000000
--- a/xpa/doc/acl.html
+++ /dev/null
@@ -1,137 +0,0 @@
-<!-- =defdoc xpaacl xpaacl n -->
-<HTML>
-<HEAD>
-<TITLE>XPA Access Control</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpaacl NAME -->
-<H2><A NAME="xpaacl">XPAAcl: Access Control for XPA Messaging</A></H2>
-
-<!-- =section xpaacl SYNOPSIS -->
-<H2>Summary</H2>
-<P>
-XPA supports host-based access control for each XPA access point.  You
-can enable/disable access control using the XPA_ACL environment
-variable. You can specify access to specific XPA access points for
-specific machines using the XPA_DEFACL and XPA_ACLFILE environment
-variables. By default, an XPA access point is accessible only to
-processes running on the same machine (same as X Windows).
-
-<!-- =section xpaacl DESCRIPTION -->
-<H2>Description</H2>
-<P>
-When INET sockets are in use (the default, as specified by the
-<EM>XPA_METHOD</EM> environment variable), XPA supports a host-based
-access control mechanism for individual access points. This mean that
-access can be specified for get, set, or info operations for each
-access point on a machine by machine basis.  For LOCAL sockets, access
-is restricted (by definition) to the host machine.
-
-<P>
-XPA access control is enabled by default, but can be turned off by
-setting the <EM>XPA_ACL</EM> environment variable to <EM>false</EM>.
-In this case, any process can access any XPA server.
-
-<P>
-Assuming that access control is turned on, the ACL for an individual
-XPA access point is set up when that access point is registered
-(although it can be changed later on; see below). This can be done in
-one of two ways:
-
-Firstly, the <EM>XPA_ACLFILE</EM> environment variable can defined to
-point to a file of access controls for individual access points. The format
-of this file is:
-<pre>
- class:name ip acl
-</pre>
-The first argument is a template that specifies the class:name of the
-access point covered by this ACL. See
-<A HREF="./template.html">XPA Access Points and Templates</A>
-for more information about xpa templates.
-
-<P>
-The second argument is the IP address (in human-readable format) of
-the machine which is being given access.  This argument can be
-<EM>*</EM> to match all IP addresses.  It also can be <EM>$host</EM>
-to match the IP address of the current host.
-
-<P>
-The third argument is a string combination of <EM>s</EM>, <EM>g</EM>,
-or <EM>i</EM> to allow <EM>xpaset</EM>, <EM>xpaget</EM>, or
-<EM>xpainfo</EM> access respectively.  The ACL argument can be
-<EM>+</EM> to give <EM>sgi</EM> access or it can be <EM>-</EM> to turn
-off all access.
-
-<P>
-For example,
-<PRE>
-  *:xpa1  somehost sg
-  *:xpa1  myhost +
-  * * g
-</PRE>
-will allow processes on the machine somehost to make xpaget and xpaset calls,
-allow processes on myhost to make any call, and allow all other hosts to
-make xpaget (but not xpaset) calls.
-
-Secondly, if the <EM>XPA_ACLFILE</EM> does not exist, then a single
-default value for all access points can be specified using the
-<EM>XPA_DEFACL</EM> environment variable.  The default value for this
-variable is:
-<PRE>
-  #define XPA_DEFACL "*:* $host +"
-</PRE>
-meaning that all access points are fully accessible to all processes
-on the current host. Thus, in the absence of any ACL environment variables,
-processes on the current host have full access to all access points
-created on that host. This parallels the X11 xhost mechanism.
-
-<P>
-Access to an individual XPA access point can be changed using the -acl
-parameter for that access point.  For example:
-<PRE>
-  xpaset -p xpa1 -acl "somehost -"
-</PRE>
-will turn off all access control for somehost to the xpa1 access point, while:
-<PRE>
-  xpaset -p XPA:xpa1 -acl "beberly gs"
-</PRE>
-will give beberly xpaget and xpaset access to the access point whose
-class is XPA and whose name is xpa1.
-<P>
-Similarly, the current ACL for a given access point can be retrieved using:
-<PRE>
-  xpaget xpa1 -acl
-</PRE>
-Of course, you must have xpaget access to this XPA access point to
-retrieve its ACL.
-
-<P>
-Note that the XPA access points registered in the <EM>xpans</EM>
-program also behave according to the ACL rules.  That is, you cannot
-use xpaget to view the access points registered with xpans unless
-you have the proper ACL.
-
-<P>
-Note also when a client request is made to an XPA server, the access
-control is checked when the initial connection is established.  This
-access in effect at this time remains in effect so long as the client
-connection is maintained, regardless of whether the access fro that
-XPA is changed later on.
-
-<P>
-We recognize that host-based access control is only relatively secure
-and will consider more stringent security (e.g., private key) in the
-future if the community requires such support.
-
-<!-- =section xpaacl SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: September 10, 2003</H5>
-
-</BODY>
-</HTML>
diff --git a/xpa/doc/changelog.html b/xpa/doc/changelog.html
deleted file mode 100644
index c7b146a..0000000
--- a/xpa/doc/changelog.html
+++ /dev/null
@@ -1,806 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE>XPA ChangeLog</TITLE>
-</HEAD>
-<BODY>
-<H2>XPA ChangeLog</H2>
-
-<P>
-This ChangeLog covers the XPA 2 implementation. It will be updated
-as we continue to develop and improve XPA.  The up-to-date version can be 
-found <A HREF="http://hea-www.harvard.edu/RD/xpa/changelog.html">here</A>.
-
-<H2> Public Release 2.1.16 (TBD)</H2>
-<ul>
-<li> Ensure that mingw utilizes Windows error codes instead of *nix codes
-</ul>
-
-<H2> Public Release 2.1.15 (July 23, 2013)</H2>
-<ul>
-<p>
-<li> Added support for large data transfers
-<P>
-<li> XPAGet and XPASet now pass size_t instead of int for lengths
-<p>
-<li> Send and receive callbacks now pass size_t instead of int for lengths
-<p>
-<li> Port to mingw (Windows)
-</ul>
-
-
-<H2> Public Release 2.1.14 (June 7, 2012)</H2>
-<ul>
-<P>
-<li> Fixed several memory leaks in the Tcl wrappers (tcl.c).
-<P>
-<li> Use Tcl stubs library for linking shared Tcl, if available.
-</ul>
-
-<H2> Public Release 2.1.13 (April 14, 2011)</H2>
-<ul>
-<P>
-<li> An atexit handler is no longer installed automatically (it crashes
-Tcl 8.5.8 applications). Call XPAAtExit(void) to install the handler.
-<p>
-<li> Removed permission checking from Find() on cygwin systems. This was broken
-by Windows 7.
-<p>
-<li> Removed addition of -no-cpp-precomp flag from gcc 4.2 and beyond (Mac).
-</ul>
-
-<H2> Public Release 2.1.12 (January 26, 2010)</H2>
-<ul>
-<p>
-<li> Added XPA_HOST environment variable to allow users to specify
-the hostname (and hence, ip) component of the INET method id. This is
-useful, for example, if you want to register an access point using a
-VPN-generated IP instead of the canonical IP.
-<p>
-<li> Fix typo in Tcl binding to xpainfo causing a crash after 2 invocations.
-</ul>
-
-<H2> Public Release 2.1.11 (December 7, 2009)</H2>
-<ul>
-<p>
-<li> Generalized XPANSKeepAlive() to send messages to xpans, proxy xpans, or
-both. The default is to send just to proxies (e.g. chandra-ed).
-<p>
-<li> Changed XPANSKeepAlive() to send an in-band new-line char to
-xpans, changed xpans to handle an in-band new-line as a keep-alive
-message. Necessitated by Cisco routers that clear the URG flag in
-a TCP packet, breaking OOB data transfer for the whole Internet, as
-well as the OOB-based keep-alive implemented in xpans.
-<p>
-<li> In xpans, print warning when the keep-alive option switch is used.
-<p>
-<li> Port to mingw (thanks to B.Schoenhammer)
-<p>
-<li> Change OOB character sent by xpans keepalive to a space, trying to working around cisco routers that force OOB data into the inbound stream.
-<p>
-<li> fix gcc fprintf warning in xpans.c
-</ul>
-
-<H2> Public Release 2.1.10 (September 1, 2009)</H2>
-<ul>
-<p>
-<li> Update mklib and configure.ac to support 64-bit builds on Macs.
-<p>
-<li> Fixed bug in XPAAccess() in which the returned names could have an extra
-(bogus) character when the target is an explicit ip:port or local socket file.
-<p>
-<li> Add setjmp/longjmp support to xalloc.
-<p>
-<li> Add XPASaveJmp(void *env) as a high-level interface to xalloc_savejmp();
-</ul>
-
-<H2> Internal Release 2.1.9</H2>
-<ul>
-<p>
-<li> Fixed a bug that prevented an access point starting with a number
-from being recognized peoperly. NB: a pure number still signifies a
-port on the current machine. Also num:num signifies ip:port, where ip
-can be a pure hex value or the canonical form vvv.xxx.yyy.zzz.
-<p>
-<li> Modified internal Launch() routine to use posix_spawn(), if necessary.
-This is required for OS X 10.5 (leopard), which frowns upon use of fork()
-and exec(). Also modified zprocess routines to use Launch().
-<p>
-<li> Added XPASetFree(xpa, void (*myfree)(void *)) routine to allow callbacks
-to specify a free routine other than malloc free (e.g. Perl garbage collection).
-<p>
-<li> XPACmdAdd() now checks to ensure that it was passed an XPA struct created
-by XPACmdNew().
-<p>
-<li> Change launch.h to xlaunch.h to avoid conflict with OS X.
-</ul>
-
-<H2> Public Release 2.1.8 (1 November 2007)</H2>
-<ul>
-<p>
-<li> A public release to complete current XPA development work.
-</ul>
-
-<H2> Patch Release 2.1.7b[1,2] (Feb 22, 2006; March 8, 2007)</H2>
-<ul>
-
-<p>
-<li> Added a convenience null to the end of the buffers returned by XPAGet.
-
-<p>
-<li> Added code to avoid calling atexit routine if a fork'ed child
-calls exit() instead of _exit().
-
-<p>
-<li> Added XPA_CLIENT_DOXPA environment variable to turn off client
-processing of xpa server requests.
-
-<p>
-<li> Added --version to xpaset, xpaget, xpainfo, xpaaccess, xpans to
-display XPA version and exit.
-
-<p>
-<li> Added support for integrating XPA into a Gtk loop.
-
-<p>
-<li> xpaaccess now returns its answer in the error code as well as to stdout
-(without the -n switch, it returns 1 for a match, with the -n switch,
-the number of matches is returned).
-
-<p>
-<li> Fixed bug which prevented xpans from being started up automatically
-by an xpa server if its pathname contained a space character.
-
-<p>
-<li> Fixed bug in MINGW port of xpans in which an XPA server that
-terminated via an interrupt was not being properly removed from the
-list of registered access points.
-
-<p>
-<li> Added XPA_LOGNAME to override LOGNAME when registering username
-
-<p>
-<li> Upgraded swish-e indexing code to 2.4.5.
-
-</ul>
-
-<H2> Patch Release 2.1.6 (4 May 2005)</H2>
-<ul>
-
-<p>
-<li> Added -P switch to xpans to enable experimental proxy support
-(default is disabled).  An argument of 1 processes proxy requests in
-the same thread as xpans requests, while an argument of 2 processes
-proxy requests in a separate thread. (The latter is recommended to
-avoid xpans timeouts, since xpa callback processing can take a long
-time.)
-
-<p> 
-<li> Added ability to build shared libraries (done automatically with
-configure --enable-shared) with compilers other than gcc.
-
-<p>
-<li> Made yet another attempt to build shared libraries under OS X.
-
-<p>
-<li> Fixed a server bug in Tcl support under Windows (introduced early
-in 2.1.6) which caused an occasional SEGV.
-
-<p>
-<li> Fixed race condition in cases where 2 or more servers makes client calls
-to one another.
-
-<p>
-<li> Fixed bug in the XPA handler routine in which an access point was
-turned off if an error occurred in that routine (as opposed to the
-user-defined callback routine).
-
-<p>
-<li> Fixed race condition when "ack=false" flag (or -n) is used with XPASet()
-(or xpaset).
-
-<p>
-<li> Added defensive code to XPA handler to ensure that the passed XPA record
-is valid.
-
-<p>
-<li> Tcl/XPA servers such as ds9 were not turning off select() on the
-xpa channels inside an xpa callback, as required. This is now fixed.
-
-<p>
-<li> Added timestamps to most server and client error messages if the
-XPA_TIMESTAMP_ERRORS variable is set. This is useful when XPA errors are
-being logged in an error log (e.g. Web/CGI use).
-
-<p>
-<li> Generated PostScript and PDF versions of the help pages.
-
-<p>
-<li> Moved OPTIONS section before (often-lengthy) DESCRIPTION section in
-man pages.
-
-<p>
-<li> All memory allocation now performs error checking on the result.
-
-<p>
-<li> Removed some compiler warnings that surfaced when using gcc -O2.
- 
-<p>
-<li> Updated configure.ac to better support Tcl in Panther with Apple
-Frameworks.
-
-</ul>
-
-<H2> Patch Release 2.1.5 (12 January 2004)</H2>
-<ul>
-
-<p>
-<li> Fixed bug in XPAPoll(). Erroneously, no requests were being
-processed when maxreq==0. Now, all pending events are processed, as
-per the documentation.
-
-<p>
-<li> Added ack=false to XPAInfo() (and corresponding -n to xpainfo)
-so that client does not wait for a response from the server. This is
-essential in cases where XPA servers wish to send info messages to
-one another without causing a race condition.
-
-<p>
-<li> Generated man pages from the html pages. These are installed
-automatically at build time.
-
-<p>
-<li> The xpans program with Unix sockets now uses a lock file to signal
-that it is running, in order to avoid a potential (but rare) race
-condition at startup.
-
-<p>
-<li> Code that calls Unix-type bind() now manipulate umask() to ensure that
-all users have write permissions to the socket file (OS X apparently uses
-these permissions while previous platforms ignore them).
-
-<p>
-<li> Configure now checks for socklen_t type (OS X does not define it).
-
-<p> 
-<li> Added an atexit function to run XPAFree. The aim here is to delete Unix
-socket files on exiting.
-
-<p>
-<li> Under Windows, the Tcl event-handling code now blocks for 1/1000 of a
-second instead of not blocking at all (which inadvertently used 100% of cpu).
-
-<p>
-<li> Upgraded Tcl/Tk support to 8.4.
-
-<p>
-<li> Made another round of checks was made through all instances of
-strcat, strcpy, etc. to look for potential buffer overflows.  Changed
-all instances of sprintf() to snprintf().
-
-<p>
-<li> Class and name designators are now limited to 1024 characters, for
-no particular reason.
-
-<p>
-<li> The obsolete $SAORD_BIN variable was being added to the path when
-searching for xpans. This is no longer the case.
-
-<p>
-<li> Fixed non-ANSI compiler errors in both xpa.c and xpans.c.
-
-<p>
-<li> Fixed minor problems to support compilation with g++.
-
-<p>
-<li> Ported to Intel icc and gcc 3.3 compilers.
-
-<p>
-<li> Upgraded autoconf to 2.57. Included in this upgrade is a change that
-makes gcc the default compiler (use "configure CC=cc" to change this).
-Also, by default, the Tcl shared object is no longer automatically built
-if the Tcl libraries are used. Use the --enable-tclshlib switch in 
-configure to enable this feature.
-
-<p>
-<li>  Changed license from public domain to GNU GPL.
-
-</ul>
-
-<H2> Patch Release 2.1.4 (24 March 2003)</H2>
-<ul>
-
-<p>
-<li> Made inet method unique, even when hosts are behind a firewall using
-the same ports (on different local machines).
-
-<p>
-<li> The initial connection from an xpa server to a local xpans now is
-controlled by a timeout (default 5 sec, controlled by XPA_CONNECT_TIMEOUT
-variable). This should prevent a hang on connect() if the network
-is not set up correctly.
-
-<p>
-<li> Fixed rare race condition when an XPA server callback performed its own
-XPAGet or XPASet call to another XPA server.
-
-<p>
-<li> Use POSIX O_NONBLOCK for non-blocking I/O in fcntl call if it
-exists, instead of O_NDELAY.
-
-</ul>
-
-<H2> Patch Release 2.1.3 (26 September 2002)</H2>
-<ul>
-
-<p>
-<li> Added -k [sec] switch to xpans to support sending one-byte keepalive
-messages from xpans to registered xpa servers.
-
-<p>
-<li> Added XPANSKeepAlive routine (and Tcl equivalent) to allow
-xpa servers to send a one-byte keepalive message to xpans.
-
-</ul>
-
-<H2> Patch Release 2.1.2 (18 July 2002)</H2>
-<ul>
-
-<p>
-<li> The "-help" reserved command now also displays the XPA version, if
-no explicit sub-commands are specified.
-
-<p>
-<li> Change internal state of xpans proxy to save ip:port value of a
-server behind a NAT firewall. This is required to give some hope of
-distinguishing multiple instances of ds9 running behind NAT.
-
-</ul>
-
-<H2> Patch Release 2.1.1 (20 June 2002)</H2>
-<ul>
-
-<p>
-<li> Added a version check between xpans and an access point,
-performed when it gets registered by an XPA server.  If the server
-has a version greater than the xpans version, a warning is issued by
-both programs.
-
-<p>
-<li> Added a boolean XPA_NSREGISTER environment variable to allow an
-XPA server to skip xpans registration. The default is to register with
-the name server.  If set to "false", the access point still is set up
-but it is not registered with an xpans. It can be registered later on
-(using -remote or -proxy, for example).
-
-<p>
-<li> Fixed bug in which xpans was still listening on any interface when
-XPA_METHOD was localhost (instead of just listening on localhost).
-
-</ul>
-
-<H2> Public Release 2.1.0 (22 April 2002)</H2>
-
-<P>
-New features include:
-
-<ul>
-<p>
-<li> Support for proxy access to XPA servers (e.g. ds9) situated
-behind a firewall (useful for NVO-type applications).
-
-<p>
-<li> Improved support for allowing remote machines access rights to the
-XPA access points (useful for NVO-type applications).
-
-<p>
-<li> Ability for XPAAccess() routine and xpaaccess program to contact XPA
- directly.
-
-<p>
-<li> Support for a clipboard access point that allows clients to store ASCII
-state information in an XPA-enabled server.
-
-<p>
-<li> Improved support for Windows platform, as well as new support for Mac OSX.
-</ul>
-
-<H2> Pre-Release 2.1.0e (2 April 2002)</H2>
-<UL>
-
-<P>
-<LI> Removed the environment variable generated by each XPA access
-point (of the form XPA_name=method). The putenv() call was causing ds9
-to crash under both Linux and LinuxPPC during a socket operation. We
-suspect a bug in putenv but cannot prove it and this feature is not
-essential, so ...
-
-</UL>
-
-<H2> Pre-Release 2.1.0e (1 April 2002)</H2>
-<UL>
-
-<P>
-<LI> Fixed an uninitialized variable in xpamb which prevented it from
-working at all on some systems.
-
-<P>
-<LI> Changed xpamb switch from "-add" to "-data" (to store named data).
-
-<P>
-<LI> Changed how xpamb works with xpaget so that xpamb can return data
-from XPA access points as well as from stored data. (Previous versions
-only returned stored data.) Now, you can retrieve stored data
-explicitly using the -info and/or -data switches. For example:
-<PRE>
-  xpaget xpamb -info foo
-</PRE>
-will return info about the previously stored data named foo. If
-neither switch is present, then the name is assumed to be an XPA access
-point.
-</UL>
-
-<H2> Pre-Release 2.1.0e (25 March 2002)</H2>
-<UL>
-
-<P>
-<LI> Changed symbol for default port from "*" to "$port" to avoid
-a syntactical conflict between class:* and machine:* when processing an
-XPA access point class:name specification. Thus, the default inet
-method now is '$host:$port' instead of '$host:*'.
-
-</UL>
-
-<H2> Pre-Release 2.1.0e (19 March 2002)</H2>
-<UL>
-
-<P>
-<LI> Removed timeout check when reading data (in clients using xpaget
-and servers filling the data buffer). We have more and more cases
-where we need to wait a long time to retrieve data (e.g., slow
-networks or receiving data being compressed on the fly).
-
-<P>
-<LI> Moved call to sigaction(SIGCHLD,...) out of XPAOpen(), so that it
-is only executed when needed by XPAGet()/XPASet() routines called from
-within xpans/proxy. But then changed logic to use a double fork() instead
-of sigaction() to prevent zombies (Stevens Adv. Programming p 202).
-
-<P>
-<LI> Each XPA access point now generates an environment variable of the
-form XPA_name=method so that children can communicate with the parent access
-point more easily.
-
-<P>
-<LI> Added version option to Tcl xparec:
-<PRE>
-  if [catch { xparec "" version } version] {
-    puts "pre-2.1.0e"
-  } else {
-    puts [split $version .]
-  }
-</PRE>
-to help differentiate between XPA versions within Tcl code.
-
-</UL>
-
-<H2> Pre-Release 2.1.0e (14 February 2002)</H2>
-<UL>
-<P>
-<LI> Fixed client handling of out-of-sync messages.
-</UL>
-
-<H2> Pre-Release 2.1.0e (11 February 2002)</H2>
-<UL>
-
-<P>
-<LI> Fixed client.c/xopen() so that it does not open an extra socket.
-
-<P>
-<LI> Fixed xpainfo/xopen() to prevent client from hanging waiting for ack.
-
-<P> 
-<LI> Modified stest to generate xpaaccess points xpa, xpa1, c_xpa, and
-i_xpa (or more generally, <name>, <name>1, c_<name>, i<name>) to allow
-more flexible testing of templates. Also added -a for testing XPAAccess().
-
-</UL>
-
-<H2> Beta Release 2.1.0b10 (31 January 2002)</H2>
-<UL>
-
-<P>
-<LI> Added support for Mac OSX/Darwin to configure file.
-
-</UL>
-
-<H2> Beta Release 2.1.0b9 (26 January 2002)</H2>
-<UL>
-
-<P>
-<LI> Fixed bug in client library that caused XPAAccess() call to hang.
-
-</UL>
-
-<H2> Beta Release 2.1.0b8 (4 January 2002)</H2>
-<UL>
-
-<P>
-<LI> Made modifications to Makefile.in to make releases easier.
-
-<P>
-<LI> Added instructions to Makefile.in so that xpa.h will always have
-correct #defines for XPA_VERSION, XPA_MAJOR_VERSION, XPA_MINOR_VERSION,
-and XPA_PATCH_LEVEL.
-
-</UL>
-
-<H2> Beta Release 2.1.0b7 (21 December 2001)</H2>
-<UL>
-
-<P>
-<LI> Added -proxy switch to -remote sub-command to allow remote access
-through a firewall, using xpans as a proxy server. The support for proxy
-processing required a change to the client/server protocol. This means
-that new xpa servers will not work with old xpa clients (although new
-xpa clients will work with old xpa servers). For details about proxy
-firewall support, see http://hea-www.harvard.edu/RD/xpa/inet.html.
-
-<P>
-<LI> Fixed Tcl support for XPA under Windows/Cygwin by re-writing
-the code used to add XPA to the Tcl event loop. This fix makes ds9
-support for XPA much more stable under Windows.
-
-<P>
-<LI> Added the shutdown() call to XPA under Cygwin/Windows before
-closing send() sockets. It appears that a Cygwin recv() socket call
-does not always sense when the other end closes the socket using
-close(). This measure must be considered a hack, since the actual
-problem was never resolved.
-
-<P>
-<LI> Added code to protect accept() and select() calls from interrupts.
-
-<P>
-<LI> Extended syntax of the environment variable XPA_NSINET to:
-<PRE>
-  setenv XPA_NSINET host:port[,port[,port]]
-</PRE>
-to allow specification of the XPA access point port for xpans,
-as well as the proxy data port.
-
-<P>
-<LI> Modified xpans log file so that it contains the xpaset commands
-required to reconnect with xpa servers.
-
-<P>
-<LI> xpans now deletes its Unix socket files.
-
-</UL>
-
-<H2> Beta Release 2.1.0b6 (29 October 2001)</H2>
-<UL>
-
-<P>
-<LI> Implemented a reserve public access point named -clipboard so
-that clients can store ASCII state information on any number of named
-clipboards. Clipboards of the same name created by clients on
-different machines are kept separate.  The syntax for creating a
-clipboard is:
-<PRE>
-  [data] | xpaset [server] -clipboard add|append [clipboard_name]
-  xpaset -p [server] -clipboard delete [clipboard_name]
-  xpaget [server] -clipboard [clipboard_name]
-</PRE>
-Use "add" to create a new clipboard or replace the contents of an existing
-one. Use "append" to append to an existing clipboard.
-
-</UL>
-
-<H2> Beta Release 2.1.0b5 (22 October 2001)</H2>
-<UL>
-
-<P>
-<LI> Use FD_SETSIZE instead of getdtablesize() to determine how many files
-to check during select();
-
-<P>
-<LI> Under Cygwin, the launch() routine now uses the Cygwin spawnvp()
-instead of fork()/exec() where possible (i.e., if no stdfiles are
-being redirected). This is recommended by Cygwin's (skimpy) on-line
-documentation and seems to fix the problems ds9 had when starting xpans
-automatically.
-
-<P>
-<LI> Added error check to select() call in xpans.
-
-</UL>
-
-<H2> Beta Release 2.1.0b4 (24 September 2001)</H2>
-<UL>
-
-<P>
-<LI> The launch() now can return an error code if the execv() system
-call fails (something system() does not do).
-
-<P>
-<LI> INET socket calls between xpa clients and servers now will use
-localhost if they are on the same machine. This protects against
-Linux systems where the hostname is hardwired (wrongly) in a DHCP
-environment.
-
-</UL>
-
-<H2> Beta Release 2.1.0b3 (6 September 2001)</H2>
-<UL>
-
-<P>
-<LI> Modified xpans so that, in the case of a firewall, it tries to
-correct the specified ip:port by matching against the ip found in
-the socket packet at accept() time.
-
-<P>
-<LI> Replaced system() call used to start xpans automatically with
-a special launch() call, which performs execvp() directly without going
-through sh. (launch() works under DOS and has fewer security problems.)
-
-<P>
-<LI> Fixed bug in xpans in which its xpa port was always being set to 14286.
-
-</UL>
-
-<H2> Beta Release 2.1.0b2 (17 August 2001)</H2>
-<UL>
-
-<P>
-<LI>Added support for -remote command, which registers the access
-point in the XPA name server of the specified remote server, and gives
-the remote server access rights to the access point. This is used, for
-example, to give data servers xpa access to ds9 so that data can be
-sent to ds9 as a result of a CGI-based Web query.
-
-<P>
-<LI>Reserved commands (except "-help" and "-version") now can only be
-executed on the machine on which the xpa service is running (not
-through -remote servers).
-
-<P>
-<LI>Fixed bug in xpans in which a bad telnet command could hang the program.
-
-<P>
-<LI>Added -s [security file] to xpans to allow logging of all external
-connections.
-
-</UL>
-
-<H2> Beta Release 2.1.0b1 (6 August 2001)</H2>
-<UL>
-<P>
-<LI> The xpaaccess client program and XPAAccess() client subroutine
-were modified so that an access-type query can directly contact the
-xpa servers matching the requested xpa template, instead of just
-querying the name server for registered access points. This avoid the
-race condition in which an access point is registered but is not yet
-available, perhaps because the server has not yet entered its event
-loop.  Note that the calling sequence of the XPAAccess() routine was
-changed to return all matching access points and their availability
-status (instead of just returning the number of registered access
-points). Because of this, we are calling this a minor release instead
-of a patch.
-
-<P>
-<LI> Added support for XPA_PORT and XPA_PORTFILE environment variables
-to allow specification of the port to be used by the command channel
-(and data channel, if an optional second port is specified) for a given
-access point.
-
-<P>
-<LI> Added -m switch to xpaget, xpaset, xpainfo, xpaaccess to allow
-override of the XPA_METHOD environment variable.
-
-<P>
-<LI> Changed the default name of the ACL file from xpa.acl to acls.xpa.
-
-<P>
-<LI> Fixed bug in which it was not possible to send a "set ACL"
-command to an XPA server which did not have a receive callback (i.e.,
-did not allow xpaset). The xpans program is one such server. It now is
-possible to set the ACL on xpans.
-
-<P>
-<LI> We have discovered that Tcl support for datachan and cmdchan is
-broken under Windows due to an unexplained incompatibility between
-Cygwin sockets and Win32 sockets. We therefore have removed datachan
-and cmdchan from the Windows/Tcl support until further notice.
-
-<P>
-<LI> Extended the behavior of the XPA_DEFACL environment variable so that
-it can support more than one acl, using a list of semi-colon delimited
-controls such as: setenv XPA_DEFACL '*:* $host +; *:foo1 otherhost +'.
-
-<P>
-<LI> Fixed bug in which the class:name specifier "*:*" was erroneously
-trying to access the xpans name server, instead of accessing all
-access points.
-
-<P>
-<LI> Support TMPDIR and TMP environment variables as well as XPA_TMPDIR.
-
-</UL>
-
-<H2> Patch Release 2.0.5 (10 November 2000)</H2>
-<UL>
-<P>
-<LI> Added support for Tcl on Windows where there is no select()-based
-event loop (i.e., where there is no Tcl_CreateFileHandler call in Tcl)
-<P>
-<LI> Minor fixes in Makefile for installing on Windows
-<P>
-<LI> Minor compiler fixes from gcc -Wall.
-</UL>
-
-<H2> Patch Release 2.0.4 (20 September 2000) </H2>
-<UL>
-<P>
-<LI> Removed extraneous include of varargs.h from find.c.
-<P>
-<LI> Ported to SGI C compiler, which caught lots of unused variables, etc.
-<P>
-<LI> Ported to Cygwin/Windows, which required that we change socket read()
-and write() calls to recv() and send() respectively. Also had to ensure that
-we only did socket I/O on sockets (no fileio).
-</UL>
-
-<H2> Patch Release 2.0.3 (15 June 2000) </H2>
-<UL> 
-<P>
-<LI> Fixed the client XPASet() and XPASetFd() calls to handle the specified
-max number of connections (they were ignoring this argument, leading to
-memory overwrites).
-<P>
-<LI> Fixed Makefile.in so that CFLAGS and LDFLAGS are not hard-wired values.
-<P>
-<LI> Fixed word.h to load malloc.h and stdlib.h only if they exist.
-<P>
-<LI> Documentation fixes to programs.html (in xpaaccess) and client.html
-(XPANSLookup).
-<P>
-<LI> Added explicit typecast to strlen() argument to MAX #define in
-XPAClientStart (strlen() is unsigned in Linux, which can break MAX).
-<P>
-<LI> Removed bogus Imakefile from directory.
-<P>
-<LI> Changed directory name to include patch level (i.e., xpa-2.0.3).
-</UL>
-
-<H2> Patch Release 2.0.2 (9 September 1999)</H2>
-<UL> 
-<P>
-<LI> Fixed server mode (-s) in the xpaset program by properly cleaning up
-the input buffers (sending commands and data in server mode was broken).
-</UL>
-
-<H2> Patch Release 2.0.1 (6 August 1999)</H2>
-<UL> 
-<P>
-<LI> Fixed the Tcl binding code (tcl.c) for 64-bit machines (Dec Alpha)
-(erroneously used %x instead of %p when converting pointers to ASCII).
-<P>
-<LI> Got rid of a few compiler warnings on 64-bit machines (a few are
-unavoidable since we must cast int to void * and back when passing around
-client data).
-</UL>
-
-<H2> Public Release 2.0 (27 May 1999)</H2>
-<UL> 
-<P>
-<LI> "a new day with no mistakes ... yet"
-</UL>
-
-<HR>
-<P>
-<A HREF="./help.html">Index to the XPA Help Pages</A>
-
-<HR>
-<H5>Last updated: 22 April 2002</H5>
-</BODY>
-</HTML>
diff --git a/xpa/doc/changes.html b/xpa/doc/changes.html
deleted file mode 100644
index 8488985..0000000
--- a/xpa/doc/changes.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<!-- =defdoc xpachanges xpachanges 1 -->
-<HTML>
-<HEAD>
-<TITLE>Changes For Users from XPA 1.0 and 2.0</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpachanges NAME -->
-<H2><A NAME="xpachanges">XPA Changes: Changes For Users from XPA 1.0 and 2.0</A></H2>
-
-<!-- =section xpachanges SYNOPSIS -->
-<H2>Summary</H2>
-<P>
-This document describes changes that will affect users who migrate
-from XPA 1.0 to XPA 2.0.
-
-<!-- =section xpachanges DESCRIPTION -->
-<H2>Description</H2>
-<P>
-There have been a few changes that affect users who upgrade XPA
-from version 1.0 to version 2.0.  These changes are detailed below.
-<UL>
-<P>
-<LI>XPA commands no longer have a resolver routine (this is open to
-negotiations, but we decided the idea was dumb).  For the SAOtng
-program, this means that you must explicitly specify the access
-point, i.e.,:
-<PRE>
-  cat foo.fits | xpaset SAOtng fits
-</PRE>
-
-<P>
-instead of:
-<PRE>
-  cat foo.fits | xpaset SAOtng
-</PRE>
-<P>
-<LI>By default, xpaset, xpaget, etc. now wait for the server callback to
-complete; i.e., the old -W is implied (and the switch is ignored).
-This allows support for better error handling.  If you want xpaset, etc.
-to return before the callback is complete, use -n switch:
-<PRE>
-  echo "file foo.fits" | xpaset -n SAOtng
-</PRE>
-<P>
-<LI>The old -w switch in xpaset and xpaget is no longer necessary (and is
-ignored), since you can have more than one process communicating with
-an xpa access point at one time.
-
-<P>
-<LI>The new -p switch on xpaset means you need not read from stdout:
-<PRE>              
-  xpaset -p SAOtng colormap I8
-</PRE>
-<P>
-will send the paramlist to the SAOtng callback without reading from stdin.
-
-</UL>
-
-<!-- =section xpachanges SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: September 10, 2003</H5>
-</BODY>
-</HTML>
diff --git a/xpa/doc/client.html b/xpa/doc/client.html
deleted file mode 100644
index 5648d85..0000000
--- a/xpa/doc/client.html
+++ /dev/null
@@ -1,898 +0,0 @@
-<!-- =defdoc xpaclient xpaclient 3 -->
-<HTML>
-<HEAD>
-<TITLE>XPA Client API</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpaclient NAME -->
-<H2><A NAME="xpaclient">XPAClient: The XPA Client-side Programming Interface</A></H2>
-
-<!-- =section xpaclient SYNOPSIS -->
-<H2>Summary</H2>
-A description of the XPA client-side programming interface.
-
-<!-- =section xpaclient DESCRIPTION -->
-<H2><A NAME="intro">Introduction to XPA Client Programming</H2></A>
-<P>
-Sending/receiving data to/from an XPA access point is easy: you
-generally only need to call the XPAGet() or XPASet() subroutines.
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  int <A HREF="./client.html#xpaget">XPAGet</A>(XPA xpa,
-      char *template, char *paramlist, char *mode,
-      char **bufs, size_t *lens, char **names, char **messages, int n);
-
-  int <A HREF="./client.html#xpaset">XPASet</A>(XPA xpa,
-      char *template, char *paramlist, char *mode,
-      char *buf, size_t len, char **names, char **messages, int n);
-
-  int <A HREF="./client.html#xpainfo">XPAInfo</A>(XPA xpa,
-      char *template, char *paramlist, char *mode,
-      char **names, char **messages, int n);
-
-  int <A HREF="./client.html#xpaaccess">XPAAccess</A>(XPA xpa,
-      char *template, char *paramlist, char *mode,
-      char **names, char **messages, int n);
-
-  int <A HREF="./client.html#xpagetfd">XPAGetFd</A>(XPA xpa,
-      char *template, char *paramlist, char *mode,
-      int *fds, char **names, char **messages, int n);
-
-  int <A HREF="./client.html#xpasetfd">XPASetFd</A>(XPA xpa,
-      char *template, char *paramlist, char *mode,
-      int fd, char **names, char **messages, int n);
-
-  XPA <A HREF="./client.html#xpaopen">XPAOpen</A>(char *mode);
-
-  void <A HREF="./client.html#xpaclose">XPAClose</A>(XPA xpa);
-
-  int <A HREF="./client.html#xpanslookup">XPANSLookup</A>(XPA xpa,
-      char *template, char *type,
-      char ***classes, char ***names, char ***methods, char ***infos);
-</PRE>
-
-<H2>Introduction</H2>
-
-To use the XPA application programming interface, a software developer
-generally will include the xpa.h definitions file:
-<PRE>
-  #include &lt;xpa.h&gt;
-</PRE>
-in the software module that defines or accesses an XPA access point and
-then will link against the libxpa.a library:
-<PRE>
-  gcc -o foo foo.c libxpa.a
-</PRE>
-XPA has been compiled using both C and C++ compilers.
-<P>
-Client communication with XPA public access points generally is
-accomplished using XPAGet() or XPASet() within a program (or xpaget
-and xpaset at the command line).  Both routines require specification
-of the name of the access point.  If a <A HREF="./template.html">template</A>
-is used to specify the access point name (e.g., "ds9*"), then
-communication will take place with all servers matching that template.
-
-<!-- =defdoc xpaget xpaget 3 -->
-
-<!-- =section xpaget NAME -->
-<H2><A NAME="xpaget">XPAGet: retrieve data from one or more XPA servers</A></H2>
-
-<!-- =section xpaget SYNOPSIS -->
-<B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  int XPAGet(XPA xpa,
-             char *template, char *paramlist, char *mode,
-             char **bufs, size_t *lens, char **names, char **messages,
-	     int n);
-</PRE>
-</B>
-
-<!-- =section xpaget DESCRIPTION -->
-<P>
-Retrieve data from one or more XPA servers whose class:name identifier
-matches the specified template.
-
-<P>
-A 
-<A HREF="./template.html">template</A>
-of the form "class1:name1" is sent to the
-XPA name server, which returns a list of at most n matching XPA
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an XPA struct is passed to the call, then the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers (which will be closed
-when the call completes).
-
-<P>
-The XPAGet() routine then retrieves data from at most n XPA servers,
-places these data into n allocated buffers and places the buffer
-pointers in the bufs array. The length of each buffer is stored in the
-lens array. A string containing the class:name and ip:port is stored
-in the name array.  If a given server returned an error or the server
-callback sends a message back to the client, then the message will be
-stored in the associated element of the messages array.  NB: if
-specified, the name and messages arrays must be of size n or greater.
-
-<p>
-The returned message string will be of the form:
-<PRE>
-  XPA$ERROR error-message (class:name ip:port)
-</PRE>
-or
-<PRE>
-  XPA$MESSAGE message (class:name ip:port)
-</PRE>
-<P>
-Note that when there is an error stored in an messages entry, the
-corresponding bufs and lens entry may or may not be NULL and 0
-(respectively), depending on the particularities of the server.
-
-<P>
-The return value will contain the actual number of servers that were
-processed.  This value thus will hold the number of valid entries in
-the bufs, lens, names, and messages arrays, and can be used to loop
-through these arrays.  In names and/or messages is NULL, no information is
-passed back in that array.
-
-<P>
-The bufs, names, and messages arrays should be freed upon completion (if
-they are not NULL);
-
-<P>
-The mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-<PRE>
-  key   	value		default		explanation
-  ------	--------	--------	-----------
-  ack		true/false	true		if false, don't wait for ack from server (after callback completes)
-  doxpa		true/false	true		client processes xpa requests
-</PRE>
-<P>
-The ack keyword is not very useful, since the server completes the callback
-in order to return the data anyway.  It is here for completion (and perhaps
-for future usefulness).
-
-<p>
-Normally, an XPA client will process incoming XPA server requests
-while awaiting the completion of the client request.  Setting this
-variable to "false" will prevent XPA server requests from being
-processed by the client.
-					   
-<P>
-<B>Example:</B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  #define NXPA 10
-  int  i, got;
-  size_t  lens[NXPA];
-  char *bufs[NXPA];
-  char *names[NXPA];
-  char *messages[NXPA];
-  got = XPAGet(NULL, "ds9", "file", NULL, bufs, lens, names, messages,
-  NXPA);
-  for(i=0; i&lt;got; i++){
-    if( messages[i] == NULL ){
-      /* process buf contents */
-      ProcessImage(bufs[i], ...);
-      free(bufs[i]);
-    }
-    else{
-      /* error processing */
-      fprintf(stderr, "ERROR: %s (%s)\n", messages[i], names[i]);
-    }
-    if( names[i] )
-      free(names[i]);
-    if( messages[i] )
-      free(messages[i]);
-  }
-</PRE>
-
-<!-- =defdoc xpaset xpaset 3 -->
-
-<!-- =section xpaset NAME -->
-<H2><A NAME="xpaset">XPASet: send data to one or more XPA servers</A></H2>
-
-<!-- =section xpaset SYNOPSIS -->
-<B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  int XPASet(XPA xpa,
-             char *template, char *paramlist, char *mode,
-             char *buf, size_t len, char **names, char **messages,
-             int n);
-</PRE>
-</B>
-
-<!-- =section xpaset DESCRIPTION -->
-<P>
-Send data to one or more XPA servers whose class:name identifier
-matches the specified template.
-
-<P>
-A 
-<A HREF="./template.html">template</A>
-of the form "class1:name1" is sent to the
-XPA name server, which returns a list of at most n matching XPA
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an XPA struct is passed to the call, the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers (which will be closed
-when the call completes).
-
-<P>
-The XPASet() routine transfers data from buf to the XPA servers.
-The length of buf (in bytes) should be placed in the len variable.
-
-<P>
-A string containing the class:name and ip:port of each of these server
-is returned in the name array.  If a given server returned an error or
-the server callback sends a message back to the client, then the
-message will be stored in the associated element of the messages
-array. NB: if specified, the name and messages arrays must be of size
-n or greater.
-
-<p>
-The returned message string will be of the form:
-
-<PRE>
-  XPA$ERROR   [error] (class:name ip:port)
-</PRE>
-or
-<PRE>
-  XPA$MESSAGE [message] (class:name ip:port)
-</PRE>
-<P>
-The return value will contain the actual number of servers that were
-processed.  This value thus will hold the number of valid entries in
-the names and messages arrays, and can be used to loop through these
-arrays.  In names and/or messages is NULL, no information is passed back
-in that particular array.
-
-<P>
-The mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-<PRE>
-  key   	value		default		explanation
-  ------	--------	--------	-----------
-  ack		true/false	true		if false, don't wait for ack from server (after callback completes)
-  verify	true/false	false		send buf from XPASet[Fd] to stdout
-  doxpa		true/false	true		client processes xpa requests
-</PRE>
-<P>
-The ack keyword is useful in cases where one does not want to wait for
-the server to complete, e.g. if a lot of processing needs to be done
-by the server on the passed data or when the success of the server
-operation is not relevant to the client.
-
-<p>
-Normally, an XPA client will process incoming XPA server requests
-while awaiting the completion of the client request.  Setting this
-variable to "false" will prevent XPA server requests from being
-processed by the client.
-					   
-<P>
-<B>Example:</B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  #define NXPA 10
-  int  i, got;
-  size_t  len;
-  char *buf;
-  char *names[NXPA];
-  char *messages[NXPA];
-  ...
-  [fill buf with data and set len to the length, in bytes, of the data]
-  ...
-  /* send data to all access points */
-  got = XPASet(NULL, "ds9", "fits", NULL, buf, len, names, messages, NXPA);
-  /* error processing */
-  for(i=0; i&lt;got; i++){
-    if( messages[i] ){
-      fprintf(stderr, "ERROR: %s (%s)\n", messages[i], names[i]);
-    }
-    if( names[i] )    free(names[i]);
-    if( messages[i] ) free(messages[i]);
-  }
-</PRE>
-					   
-<!-- =defdoc xpainfo xpainfo 3 -->
-
-<!-- =section xpainfo NAME -->
-<H2><A NAME="xpainfo">XPAInfo: send short message to one or more XPA servers</A></H2>
-
-<!-- =section xpainfo SYNOPSIS -->
-<B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  int XPAInfo(XPA xpa,
-              char *template, char *paramlist, char *mode,
-	      char **names, char **messages, int n);
-</PRE>
-</B>
-
-<!-- =section xpainfo DESCRIPTION -->
-<P>
-Send a short paramlist message to one or more XPA servers whose
-class:name identifier matches the specified
-<A HREF="./template.html">template</A>.
-
-<P>
-A
-<A HREF="./template.html">template</A>
-of the form "class1:name1" is sent to the
-XPA name server, which returns a list of at most n matching XPA
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an XPA struct is passed to the call, then the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers (which will be closed
-when the call completes).
-
-<P>
-The XPAInfo() routine does not send data from a buf to the XPA
-servers. Only the paramlist is sent.  The semantics of the paramlist
-is not formalized, but at a minimum is should tell the server how to
-get more information.  For example, it might contain the class:name
-of the XPA access point from which the server (acting as a client)
-can obtain more info using XPAGet.
-
-<P>
-A string containing the class:name and ip:port of each server is
-returned in the name array.  If a given server returned an error or
-the server callback sends a message back to the client, then the
-message will be stored in the associated element of the messages
-array.  The returned message string will be of the form:
-<PRE>
-  XPA$ERROR   error-message (class:name ip:port)
-</PRE>
-or
-<PRE>
-  XPA$MESSAGE message 	  (class:name ip:port)
-</PRE>
-<P>
-The return value will contain the actual number of servers that were
-processed.  This value thus will hold the number of valid entries in
-the names and messages arrays, and can be used to loop through these
-arrays.  In names and/or messages is NULL, no information is passed back
-in that array.
-
-<P>
-The following keywords are recognized:
-<PRE>
-  key   	value		default		explanation
-  ------	--------	--------	-----------
-  ack		true/false	true		if false, don't wait for ack from server
-</PRE>
-<P>
-When ack is false, XPAInfo() will not wait for an error return from the XPA
-server. This means, in effect, that XPAInfo will send its paramlist string
-to the XPA server and then exit: no information will be sent from the server
-to the client. This UDP-like behavior is essential to avoid race
-conditions in cases where XPA servers are sending info messages to
-other servers. If two servers try to send each other an info message
-at the same time and then wait for an ack, a race condition will result and
-one or both will time out.
-
-<P>
-<B>Example:</B>
-<PRE>
-  (void)XPAInfo(NULL, "IMAGE", "ds9 image", NULL, NULL, NULL, 0);
-</PRE>
-					   
-<!-- =defdoc xpagetfd xpagetfd 3 -->
-
-<!-- =section xpagetfd NAME -->
-<H2><A NAME="xpagetfd">XPAGetFd: retrieve data from one or more XPA servers and write to files</A></H2>
-
-<!-- =section xpagetfd SYNOPSIS -->
-<B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  int XPAGetFd(XPA xpa,
-               char *template, char *paramlist, char *mode,
-	       int *fds, char **names, char **messages, int n);
-</PRE>
-</B>
-
-<!-- =section xpagetfd DESCRIPTION -->
-<P>
-Retrieve data from one or more XPA servers whose class:name identifier
-matches the specified
-<A HREF="./template.html">template</A>
-and write it to files associated with
-one or more standard I/O fds (i.e, handles returned by open()).
-
-<P>
-A 
-<A HREF="./template.html">template</A>
-of the form "class1:name1" is sent to the
-XPA name server, which returns a list of at most ABS(n) matching XPA
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an XPA struct is passed to the call, then the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers (which will be closed
-when the call completes).
-
-<P>
-The XPAGetFd() routine then retrieves data from the XPA servers,
-and write these data to the fds associated with one or more fds
-(i.e., results from open). Is n is positive, then there will be n fds
-and the data from each server will be sent to a separate fd. If n is
-negative, then there is only 1 fd and all data is sent to this single
-fd. (The latter is how xpaget is implemented.)
-
-<P>
-A string containing the class:name and ip:port is stored in the name
-array.  If a given server returned an error or the server callback
-sends a message back to the client, then the message will be stored in
-the associated element of the messages array.  NB: if specified, the
-name and messages arrays must be of size n or greater.
-
-<P>
-The returned message string will be of the form:
-<PRE>
-  XPA$ERROR   error-message (class:name ip:port)
-</PRE>
-or
-<PRE>
-  XPA$MESSAGE message 	  (class:name ip:port)
-</PRE>
-<P>
-Note that when there is an error stored in an messages entry, the
-corresponding bufs and lens entry may or may not be NULL and 0
-(respectively), depending on the particularities of the server.
-
-<P>
-The return value will contain the actual number of servers that were
-processed.  This value thus will hold the number of valid entries in
-the bufs, lens, names, and messages arrays, and can be used to loop
-through these arrays.  In names and/or messages is NULL, no information is
-passed back in that array.
-
-<P>
-The mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-<PRE>
-  key   	value		default		explanation
-  ------	--------	--------	-----------
-  ack		true/false	true		if false, don't wait for ack from server (after callback completes)
-</PRE>
-<P>
-The ack keyword is not very useful, since the server completes the callback
-in order to return the data anyway.  It is here for completion (and perhaps
-for future usefulness).
-					   
-<P>
-<B>Example:</B>
-<PRE>
-  #include &lt;xpa.h&gt;
-  #define NXPA 10
-  int  i, got;
-  int fds[NXPA];
-  char *names[NXPA];
-  char *messages[NXPA];
-  for(i=0; i&lt;NXPA; i++)
-    fds[i] = open(...);
-  got = XPAGetFd(NULL, "ds9", "file", NULL, fds, names, messages, NXPA);
-  for(i=0; i&lt;got; i++){
-    if( messages[i] != NULL ){
-      /* error processing */
-      fprintf(stderr, "ERROR: %s (%s)\n", messages[i], names[i]);
-    }
-    if( names[i] )
-      free(names[i]);
-    if( messages[i] )
-      free(messages[i]);
-  }
-</PRE>
-
-<!-- =defdoc xpasetfd xpasetfd 3 -->
-
-<!-- =section xpasetfd NAME -->
-<H2><A NAME="xpasetfd">XPASetFd: send data from stdin to one or more XPA servers</A></H2>
-
-<!-- =section xpasetfd SYNOPSIS -->
-</B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  int XPASetFd(XPA xpa,
-               char *template, char *paramlist, char *mode,
-	       int fd, char **names, char **messages, int n)
-</PRE>
-</B>
-
-<!-- =section xpasetfd DESCRIPTION -->
-<P>
-Read data from a standard I/O fd and send it to one or more XPA
-servers whose class:name identifier matches the specified
-<A HREF="./template.html">template.
-
-<P>
-A
-<A HREF="./template.html">template</A>
-of the form "class1:name1" is sent to the
-XPA name server, which returns a list of at most n matching XPA
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an XPA struct is passed to the call, then the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers (which will be closed
-when the call completes).
-
-<P>
-The XPASetFd() routine then reads bytes from the specified fd
-until EOF and sends these bytes to the XPA servers.  
-The final parameter n specifies the maximum number of servers to contact.
-A string containing the class:name and ip:port of each server is returned in
-the name array.  If a given server returned an error, then the error
-message will be stored in the associated element of the messages array.
-NB: if specified, the name and messages arrays must be of size n or greater.
-
-<P>
-The return value will contain the actual number of servers that were
-processed.  This value thus will hold the number of valid entries in
-the names and messages arrays, and can be used to loop through these
-arrays.  In names and/or messages is NULL, no information is passed back
-in that array.
-
-<P>
-The mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-<PRE>
-  key   	value		default		explanation
-  ------	--------	--------	-----------
-  ack		true/false	true		if false, don't wait for ack from server (after callback completes)
-  verify	true/false	false		send buf from XPASet[Fd] to stdout
-</PRE>
-<P>
-The ack keyword is useful in cases where one does not want to wait for
-the server to complete, e.g. is a lot of processing needs to be done
-on the passed data or when the success of the server operation is not
-relevant to the client.
-
-<P>
-<B>Example:</B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  #define NXPA 10
-  int  i, got;
-  int fd;
-  char *names[NXPA];
-  char *messages[NXPA];
-  fd = open(...);
-  got = XPASetFd(NULL, "ds9", "fits", NULL, fd, names, messages, NXPA);
-  for(i=0; i&lt;got; i++){
-    if( messages[i] != NULL ){
-      /* error processing */
-      fprintf(stderr, "ERROR: %s (%s)\n", messages[i], names[i]);
-    }
-    if( names[i] )
-      free(names[i]);
-    if( messages[i] )
-      free(messages[i]);
-  }
-</PRE>
-
-<!-- =defdoc xpaopen xpaopen 3 -->
-
-<!-- =section xpaopen NAME -->
-<H2><A NAME="xpaopen">XPAOpen: allocate a persistent client handle</A></H2>
-
-<!-- =section xpaopen SYNOPSIS -->
-<B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  XPA XPAOpen(char *mode);
-</PRE>
-</B>
-
-<!-- =section xpaopen DESCRIPTION -->
-<P>
-XPAOpen() allocates a persistent XPA struct that can be used with
-calls to XPAGet(), XPASet(), XPAInfo(), XPAGetFd(), and
-XPASetFd(). Persistence means that a connection to an XPA server is
-not closed when one of the above calls is completed but will be
-re-used on successive calls. Using XPAOpen() therefore saves the time
-it takes to connect to a server, which could be significant with slow
-connections or if there will be a large number of exchanges with a
-given access point.  The mode argument currently is ignored ("reserved
-for future use").
-
-<P>
-An XPA struct is returned if XPAOpen() was successful; otherwise NULL
-is returned. This returned struct can be passed as the first argument
-to XPAGet(), etc.  Those calls will update the list of active XPA
-connections.  Already connected servers (from a previous call) are
-left connected and new servers also will be connected.  Old servers
-(from a previous call) that are no longer needed are disconnected.
-The connected servers will remain connected when the next call to
-XPAGet() is made and connections are once again updated.
-
-<P>
-<B>Example:</B>
-<PRE>
- #include &lt;xpa.h&gt;
-
-  XPA xpa;
-  xpa = XPAOpen(NULL);
-</PRE>
-
-<!-- =defdoc xpaclose xpaclose 3 -->
-
-<!-- =section xpaclose NAME -->
-<H2><A NAME="xpaclose">XPAClose: close a persistent XPA client handle</A></H2>
-
-<!-- =section xpaclose SYNOPSIS -->
-<B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  void XPAClose(XPA xpa);
-</PRE>
-</B>
-
-<!-- =section xpaclose DESCRIPTION -->
-<P>
-XPAClose closes the persistent connections associated with this XPA struct
-and frees all allocated space. It also closes the open sockets connections
-to all XPA servers that were opened using this handle.
-
-<P>
-<B>Example:</B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  XPA xpa;
-  XPAClose(xpa);
-</PRE>
-
-<!-- =defdoc xpanslookup xpanslookup 3 -->
-
-<!-- =section xpanslookup NAME -->
-<H2><A NAME="xpanslookup">XPANSLookup: lookup registered XPA access points</A></H2>
-
-<!-- =section xpanslookup SYNOPSIS -->
-<B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  int XPANSLookup(XPA xpa,
-  	          char *template, char type,
-	          char ***classes, char ***names,
-	          char ***methods, char ***infos)
-</PRE>
-</B>
-
-<!-- =section xpanslookup DESCRIPTION -->
-<P>
-XPA routines act on a class:name identifier in such a way
-that all access points that match the identifier are processed.  It is
-sometimes desirable to choose specific access points from the
-candidates that match the
-<A HREF="./template.html">template</A>.  In order to do this, the
-XPANSLookup routine can be called to return a list of matches, so that
-specific class:name instances can then be fed to XPAGet(), XPASet(), etc.
-
-<P> The first argument is an optional XPA struct. If non-NULL, the
-existing name server connection associated with the specified xpa is
-used to query the xpans name server for matching templates. Otherwise,
-a new (temporary) connection is established with the name server.
-
-<P>
-The second argument to XPANSLookup is the class:name 
-<A HREF="./template.html">template</A>
-to match.
-
-<P>
-The third argument for XPANSLookup() is the type of access and can be
-any combination of:
-<PRE>
-  type   	explanation
-  ------	-----------
-  g		xpaget calls can be made on this access point
-  s		xpaset calls can be made on this access point
-  i		xpainfo calls can be made on this access point
-</PRE>
-<P>
-The call typically specifies only one of these at a time.
-
-<P>
-The final arguments are pointers to arrays that will be filled
-in and returned by the name server. The name server will allocate and
-return arrays filled with the classes, names, and methods of all XPA
-access points that match the <A HREF="./template.html">template</A>
-and have the specified type. Also returned are info strings, which
-generally are used internally by the client routines. These can be
-ignored (but the strings must be freed).  The function returns the
-number of matches. The returned value can be used to loop through the
-matches:
-
-<B>Example:</B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  char **classes;
-  char **names;
-  char **methods;
-  char **infos;
-  int i, n;
-  n = XPANSLookup(NULL, "foo*", "g", &classes, &names, &methods, &infos);
-  for(i=0; i&lt;n; i++){
-    [more specific checks on possibilities ...]
-    [perhaps a call to XPAGet for those that pass, etc. ...]
-    /* don't forget to free alloc'ed strings when done */
-    free(classes[i]);
-    free(names[i]);
-    free(methods[i]);
-    free(infos[i]);
-  }
-  /* free up arrays alloc'ed by names server */
-  if( n > 0 ){
-    free(classes);
-    free(names);
-    free(methods);
-    free(infos);
-  }
-</PRE>
-<P>
-The specified 
-<A HREF="./template.html">template</A>
-also can be a host:port specification, for example:
-<PRE>
-  myhost:12345
-</PRE>
-<P>
-In this case, no connection is made to the name server. Instead, the
-call will return one entry such that the ip array contains the ip for
-the specified host and the port array contains the port.  The class
-and name entries are set to the character "?", since the class and
-name of the access point are not known. 
-
-<!-- =defdoc xpaaccess xpaaccess 3 -->
-
-<!-- =section xpaaccess NAME -->
-<H2><A NAME="xpaaccess">XPAAccess: return XPA access points matching
-template (XPA 2.1 and above)</A></H2>
-
-<!-- =section xpaaccess SYNOPSIS -->
-<B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  int XPAAccess(XPA xpa,
-	        char *template, char *paramlist, char *mode,
-	        char **names, char **messages, int n);
-</PRE>
-</B>
-
-<!-- =section xpaaccess DESCRIPTION -->
-<P>
-The XPAAccess routine returns the public access points that match the
-specified second argument <A HREF="./template.html">template</A> and
-have the specified access type.
-
-<P>
-A
-<A HREF="./template.html">template</A>
-of the form "class1:name1" is sent to the
-XPA name server, which returns a list of at most n matching XPA
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an XPA struct is passed to the call, then the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers (which will be closed
-when the call completes).
-
-<P>
-The XPAAccess() routine retrieves names from at most n XPA servers
-that match the specified template and that were checked for access
-using the specified mode.  The return string contains both the
-class:name and ip:port.  If a given server returned an error or the
-server callback sends a message back to the client, then the message
-will be stored in the associated element of the messages array.
-NB: if specified, the name and messages arrays must be of size n or greater.
-
-<P>
-The returned message string will be of the form:
-<PRE>
-  XPA$ERROR error-message (class:name ip:port)
-</PRE>
-<P>
-Note that names of matching registered access points are always
-returned but may not be valid; it is not sufficient to assume that the
-returned number of access points is the number of valid access points.
-Rather, it is essential to check the messages array for error
-messages.  Any string in the messages array is an error message and
-indicated that the associated access point is not available.
-
-<P>
-For example, assume that a server registers a number of access points
-but delays entering its event loop. If a call to XPAAccess() is made
-before the event loop is entered, the call will timeout (after waiting
-for the long timeout period) and return an error of the form:
-<PRE>
-  XPA$ERROR: timeout waiting for server authentication (XPA:xpa1)
-</PRE>
-The error means that the XPA access point has been registered but is
-not yet available (because events are not being processed). When the
-server finally enters its event loop, subsequent calls to XPAAccess()
-will return successfully.
-
-<P>
-NB: This routine only works with XPA servers built with XPA 2.1.x and later.
-Servers with older versions of XPA will return the error message:
-
-  XPA$ERROR invalid xpa command in initialization string
-
-If you get this error message, then the old server actually is ready
-for access, since it got to the point of fielding the query! The
-xpaaccess program, for example, ignores this message in order to work
-properly with older servers.
-
-<P>
-The third argument for XPAAccess() is the type of access and can be
-any combination of:
-<PRE>
-  type   	explanation
-  ------	-----------
-  g		xpaget calls can be made on this access point
-  s		xpaset calls can be made on this access point
-  i		xpainfo calls can be made on this access point
-</PRE>
-<P>
-The mode string argument is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-<PRE>
-  key   	value		default		explanation
-  ------	--------	--------	-----------
-  ack		true/false	true		if false, don't wait for ack from server (after callback completes)
-</PRE>
-<P>
-The ack keyword is not very useful, since the server completes the callback
-in order to return the data anyway.  It is here for completion (and perhaps
-for future usefulness).
-
-<!-- =section xpaclient SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpaget SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpaset SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpainfo SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpagetfd SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpasetfd SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpaopen SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpaclose SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpanslookup SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpaaccess SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: March 10, 2007</H5>
-
-</BODY>
-</HTML>
diff --git a/xpa/doc/convert.html b/xpa/doc/convert.html
deleted file mode 100644
index a8d0dd2..0000000
--- a/xpa/doc/convert.html
+++ /dev/null
@@ -1,146 +0,0 @@
-<!-- =defdoc xpaconvert xpaconvert n -->
-<HTML>
-<HEAD>
-<TITLE>Converting the XPA API to 2.0</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpaconvert NAME -->
-<H2><A NAME="xpaconvert">XPAConvert: Converting the XPA API to 2.0</A></H2>
-
-<!-- =section xpaconvert SYNOPSIS -->
-<H2>Summary</H2>
-<P>
-This document describes tips for converting from xpa 1.0 (Xt-based
-xpa) to xpa 2.0 (socket-based xpa).
-
-<!-- =section xpaconvert DESCRIPTION -->
-<H2>Description</H2>
-<P>
-The following are tips for converting from xpa 1.0 (Xt-based xpa) to
-xpa 2.0 (socket-based xpa). The changes are straight-forward and
-almost can be done automatically (we used editor macros for most of
-the conversion).
-<UL>
-<P>
-<LI>The existence of the cpp XPA_VERSION directive to distinguish between 1.0
-(where it is not defined) and 2.0 (where it is defined).
-
-<P>
-<LI>Remove the first widget argument from all send and receive server
-callbacks.  Also change first 2 arguments from XtPointer to void
-*. For example:
-<PRE>
-#ifdef XPA_VERSION
-static void XPAReceiveFile(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     int len;
-#else
-static void XPAReceiveFile(w, client_data, call_data, paramlist, buf, len)
-     Widget w;
-     XtPointer client_data;
-     XtPointer call_data;
-     char *paramlist;
-     char *buf;
-     int len;
-#endif
-</PRE>
-<P>
-<LI>Server callbacks should be declared as returning int instead
-of void. They now should return 0 for no errors, -1 for error.
-
-<P>
-<LI> The mode flags have changed when defining XPA server callbacks.
-The old <EM>S</EM> flag (save buffer) is replaced by <EM>freebuf=false</EM>.
-The old <EM>E</EM> flag (empty buffer is OK) is no longer used (it
-was an artifact of the X implementation).
-
-<P>
-<LI>Change NewXPACommand() to XPAcmdNew(), with the new calling sequence:
-<PRE>
-  xpa = NewXPACommand(toplevel, NULL, prefix, NULL);
-</PRE>
-is changed to:
-<PRE>
-  xpa = XPACmdNew(xclass, name);
-</PRE>
-<P>
-<LI>Change the AddXPACommand() subroutine name to XPACmdAdd (with the same
-calling sequence):
-<PRE>
-  AddXPACommand(xpa, "file",
-    "\tdisplay a new file\n\t\t  requires: filename",
-    NULL, NULL, NULL, XPAReceiveFile, text, NULL);
-</PRE>
-is changed to:
-<PRE>
-  XPACmdAdd(xpa, "file",
-    "\tdisplay a new file\n\t\t  requires: filename",
-    NULL, NULL, NULL, XPAReceiveFile, text, NULL);
-</PRE>
-<P>
-<LI>The XPAXtAppInput() routine should be called just before XtAppMainLoop()
-to add xpa fds to the Xt event loop:
-<PRE>
-  /* add the xpas to the Xt loop */
-  XPAXtAddInput(app, NULL);
-
-  /* process events */
-  XtAppMainLoop(app);
-</PRE>
-<P>
-<LI>Change NewXPA() to XPANew() and call XPAXtAddInput() if the XtAppMainLoop
-routine already has been entered:
-<PRE>
-  xpa = NewXPA(saotng->xim->toplevel, prefix, xparoot,
-               "FITS data or image filename\n\t\t  options: file type",
-               XPASendData, new, NULL,
-               XPAReceiveData, new, "SE");
-</PRE>
-is changed to:
-<PRE>
-  sprintf(tbuf, "%s.%s", prefix, xparoot);
-  xpa = XPANew("SAOTNG", tbuf,
-               "FITS data or image filename\n\t\t  options: file type",
-               XPASendData, new, NULL,
-               XPAReceiveData, new, "SE");
-  XPAXtAddInput(XtWidgetToApplicationContext(saotng->xim->toplevel), xpa);
-</PRE>
-<P>
-<LI>Change XPAInternalReceiveCommand() to XPACmdInternalReceive()
-remove first argument in the calling sequence):
-<PRE>
-  XPAInternalReceiveCommand(im->saotng->xim->toplevel,
-			    im->saotng, im->saotng->commands,
-			    "zoom reset", NULL, 0);
-</PRE>
-is changed to:
-<PRE>
-  XPACmdInternalReceive(im->saotng, im->saotng->commands,
-			"zoom reset", NULL, 0);
-</PRE>
-<P>
-<LI>Change DestroyXPA to XPAFree:
-<PRE>
-  DestroyXPA(im->dataxpa);
-</PRE>
-is changed to:
-<PRE>
-  XPAFree(im->dataxpa);
-</PRE>
-</UL>
-
-<!-- =section xpaconvert SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: September 10, 2003</H5>
-
-</BODY>
-</HTML>
diff --git a/xpa/doc/env.html b/xpa/doc/env.html
deleted file mode 100644
index 4a71e80..0000000
--- a/xpa/doc/env.html
+++ /dev/null
@@ -1,371 +0,0 @@
-<!-- =defdoc xpaenv xpaenv n -->
-<HTML>
-<HEAD>
-<TITLE>The XPA Environment</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpaenv NAME -->
-<H2><A NAME="xpaenvl">XPAEnv: Environment Variables for XPA Messaging</A></H2>
-
-<!-- =section xpaenv SYNOPSIS -->
-<H2>Summary</H2>
-Describes the environment variables which can be used to tailor the overall
-XPA environment.
-
-<!-- =section xpaenv DESCRIPTION -->
-<H2>Description</H2>
-<P>
-The following environment variables are supported by XPA:
-<DL>
-<P>
-<DT><B>XPA_ACL</B>
-<DD> If <EM>XPA_ACL</EM> is <EM>true</EM>, then 
-host-based <A HREF="./acl.html">XPA Access Control</A>
-is turned on and only specified machines can access specified access
-points.  If <EM>false</EM>, then access control is turned off and any
-machine can access point. The default is turn turn access control on.
-
-<P>
-<DT><B>XPA_ACLFILE</B>
-<DD> If
-<A HREF="./acl.html">XPA Access Control</A>
-is turned on, this variable specifies the name of the file containing
-access control information for all access points started by this user.
-The default file name is: <EM>$HOME/acls.xpa</EM>.
-
-<P>
-<DT><B>XPA_CONNECT_TIMEOUT</B>
-<DD> When an XPA server first starts up, it immediately tries to
-connect to the XPA name server program (xpans) on the host specified by
-the <em>XPA_NSINET</em> variable. (If this connection fails on the
-local host, and if xpans can be found in the path, then the name
-server is started automatically.)  Unfortunately, a mis-configured
-network can cause this connect attempt to hang for many seconds while
-the connect() system call times out. Therefore, an alarm is started
-to interrupt the connect() call and prevent a long hang.  The initial
-value of the alarm timeout is 10 seconds, but can be changed by setting
-this environment variable. If you want to disable the alarm and allow
-the initial connect() to time out, set the value of this variable to
-0. Normally, users would not change this variable at all.
-
-<P>
-<DT><B>XPA_CLIENT_DOXPA</B>
-<DD> Normally, an XPA client (xpaget, xpaset, etc.) will process incoming
-XPA server requests while awaiting the completion of the client request.
-Setting this variable to "false" will prevent XPA server requests from
-being processed by the client.
-
-<P>
-<DT><B>XPA_DEFACL</B>
-<DD> If
-<A HREF="./acl.html">XPA Access Control</A>
-is turned on, this variable specifies the default access control
-condition for all access points, if the <EM>XPA_ACLFILE</EM> file does
-not exist.  The default acl is: <EM>$host:* $host +</EM>, meaning that
-all processes on the host machine have full access to all access points.
-
-<P>
-<DT><B>XPA_HOST</B>
-<DD>
-For the INET socket method, XPA utilizes the canonical hostname (as
-returned by the gethostname() routine) to construct the IP part of the
-method id. Under some circumstances, this might not be a correct choice
-of name and IP. For example, if an XPA server is started on a machine
-running VPN, you might want to use the VPN name and IP instead of the
-canonical host name, so that other machines in the VPN network can
-access the server. In this case, you can set the XPA_HOST to be
-the VPN name (if resolvable) or, more easily, the VPN IP.
-
-<P>
-<DT><B>XPA_IOCALLSXPA</B>
-<DD> 
-Setting this variable causes all XPA socket IO calls to process
-outstanding XPA requests whenever the primary socket is not ready for
-IO. This means that a server making a client call will (recursively)
-process incoming server requests while waiting for client completion.
-This inter-IO XPA processing avoids a rare
-<A HREF="./server.html#race">XPA Race Condition</A>: two or more
-XPA servers sending messages to one another using an XPA client
-routine such as XPASet() can deadlock while each waits for the other
-server to respond. This can happen, for example, if the servers call
-XPAPoll() with a time limit, and send messages in between the polling call.
-
-<P>
-By default, this option is turned off, because we judge that the added
-code complication and overhead involved will not be justified by the
-amount of its use.  Moreover, processing XPA requests within socket IO
-can lead to non-intuitive results, since incoming server requests will
-not necessarily be processed to completion in the order in which they
-are received.
-
-<P>
-<DT><B>XPA_LOGNAME</B>
-<DD>
-XPA preferentially uses the de facto standard environment variable
-LOGNAME to determine the username when registering an access point in
-the name server. If this environment variable has been used for
-something other than the actual user name (such as a log file name),
-unexpected results can ensue. In such cases, use the XPA_LOGNAME
-variable to set the user name. (If neither exists, then getpwuid(geteuid())
-is used as a last resort).
-
-<P>
-<DT><B>XPA_LONG_TIMEOUT</B>
-<DD> XPA is designed to allow data to be sent from one process to
-another over a long period of time (i.e., a program that generates
-image data sends that data to an image display, but slowly) but it
-also seeks to prevent hangs. This is done by supporting 2 timeout
-periods: a <EM>short</EM> timeout for protocol communication
-and a <EM>long</EM> for data communication.
-<P>
-The <EM>XPA_LONG_TIMEOUT</EM> variable controls the <EM>long</EM>
-timeout and is used to prevent hangs in cases where communication
-between the client and server that is <EM>not</EM> controlled by the
-XPA interface itself. Transfer of data between client and server, or a
-client's wait for a status message after completion of the server
-callback, are two examples of this sort of communication. By default,
-the <EM>long</EM> timeout is set to 180 seconds.
-Setting the value to -1 will disable <EM>long</EM> timeouts and allow
-an infinite amount of time.
-
-<P>
-<DT><B>XPA_MAXHOSTS</B>
-<DD> The maximum number of access points that the programs 
-<EM>xpaset</EM>, <EM>xpaget</EM>, and <EM>xpainfo</EM> will
-communicate with at one time. The default is 64, meaning, for
-example, that the <EM>xpaset</EM> program will not send a message
-to more than 100 access points at one time and <EM>xpaget</EM> will
-not retrieve from more than 100 access points at one time.
-
-<P>
-<DT><B>XPA_METHOD</B>
-<DD>
-Determines the socket connection method used by this session of XPA.
-The choices are: <EM>inet</EM> (to use INET or Internet-based
-sockets), <EM>localhost</EM> (to use the machines localhost inet
-socket), or <EM>local (unix)</EM> (to use UNIX sockets). The default
-is <EM>INET</EM>.  Using the <EM>inet</EM> method will allow access
-from other machines (subject to access controls) but using
-<EM>localhost</EM> or <EM>local</EM> will not. Localhost is most useful
-for private access and when the machine in question is not connected
-to the Internet. The unix method also can be used for private access
-and non-Internet connections (Unix platforms only).
-<P>
-Once defined, the first registration of an XPA access point will
-ensure that an instance of the
-<A HREF="./xpans.html">XPA Name Server (xpans)</A>
-is running that handles that connection method. All new access points
-will use the new connection method but existing access points will use
-the original method.
-
-<P>
-<DT><B>XPA_NSINET</B>
-<DD> For the <EM>inet</EM> method of socket connection, this variable
-specifies the host and port on which the 
-<A HREF="./xpans.html">XPA Name Server (xpans)</A>
-is listens for new access points. The default is <EM>$host:$port</EM>,
-meaning that the default XPA port (14285) on the current machine
-(as returned by gethostname()) is used. If several machines were all
-accessing the same XPA access points, you would use this variable to
-specify that they all use the same name server to find out about these
-access points.  For example, a value of <EM>myhost:$port</EM> would
-mean that the xpans name server is running on myhost and uses the
-default port 12345.  All machines would then get the XPA access points
-registered with that name server, subject to access controls.
-<P>
-The port used by xpans to register its XPA access point normally is
-taken to be one greater than the port on which it receives new access
-points from XPA servers. You can specify a specific access point port
-using the syntax machine:port1,port2, i.e., the access point port is
-specified after the comma.  For example, $host:12345,23456 will listen
-for new access ports on 12345 and will accept XPA commands on 23456.
-
-<P>
-<DT><B>XPA_NSREGISTER</B>
-<DD>
-This boolean variable specifies whether a server registers its XPA
-access point with the specified xpans name server. The default is
-<em>true</em>.  If set to <em>false</em>, the access point still is
-set up but it is not registered with xpans and therefore cannot be
-accessed by name. (It can be accessed by method, if the latter is
-known.) Note that an access point can be registered later on (using
--remote or -proxy, for example). This variable mainly is useful in
-cases where the Internet configuration is broken (so that registration
-causes a DNS hang) but you still wish to and can use the server with a
-remote xpans (e.g., ds9's Virtual Observatory capability).
-
-<P>
-<DT><B>XPA_NSUNIX</B>
-<DD> For the <EM>local</EM> method of socket connection, this variable
-specifies the name of the Unix file that will be used to access the
-<A HREF="./xpans.html">XPA Name Server (xpans)</A>. The default is
-<EM>xpans_unix</EM>. This variable is not usually needed. Note that
-is the <EM>local</EM> socket method is used, then remote machines will
-not be able to access the xpans name server or the registered XPA access
-points.
-
-<P>
-<DT><B>XPA_NSUSERS</B>
-<DD>
-This variable specifies whether other users' access points will be
-returned by the
-<A HREF="./xpans.html">XPA Name Server (xpans)</A> for use by
-<EM>xpaget</EM>, <EM>xpaset</EM>, etc.
-Generally speaking, it is sufficient to run one xpans name server per
-machine and register the access points for all users with that xpans.
-This means, for example, that if you request information from
-ds9 by running:
-<PRE>
-  xpaget ds9 colormap
-</PRE>
-you might get information from your own ds9 as well as
-from another user running ds9 on the same machine.  The
-<EM>XPA_NSUSERS</EM> variable controls whether you want such access 
-to the access points of other users.
-By default, only your own access points are returned, so
-that, in the example above, you would only get the colormap information
-from the ds9 you registered. If, however, you had set the value of the
-<EM>XPA_NSUSERS</EM> variable to <EM>eric,fred</EM>, then you would be
-able to communicate with both eric and fred's access points. Note that
-this variable can be overridden using the <EM>-u</EM> switch on the
-<EM>xpaget</EM>, <EM>xpaset</EM>, and <EM>xpainfo</EM> programs.
-
-<P>
-<DT><B>XPA_PORT</B>
-<DD> 
-A semi-colon delimited list of user specified ports to use for specific
-XPA access points. The format is each specification is:
-<PRE>
-class:template port1[ port2]
-</PRE>
-where <B>port1</B> is the main (command) port for the access point and
-<B>port2</B> is the (secondary) data port. If port2 is not specified,
-it defaults to a value of 0 (meaning the system assigns the port).
-
-<P>
-Specification of specific ports is useful, for example, when a machine
-outside a firewall needs to communicate with a machine inside a
-firewall. In such a case, the firewall should be configured to allow
-socket connections to both the command and data port from the outside
-machine, and the inside XPA program should be started up with the
-outside machine in its ACL list. Then, when the inside program is
-started with specified ports, outside XPA programs can use
-"machine:port" to contact the inside access points, instead of the
-access point names. That is, the machine outside the firewall does not
-need access to the XPA name server:
-<PRE>
-export XPA_PORT="DS9:ds9 12345 12346"   # on machine "inside"
-cat foo.fits | xpaset inside:12345 fits # on machine "outside"
-</PRE>
-Note that 2 ports are required for full XPA communication and
-therefore 2 ports should be specified to go through a firewall.  The
-second port assignment is not important if you simply are assigning
-the command port in order to communicate commands with a known
-port (e.g., to bypass the xpans name server). If only one (command)
-port is specified, the system will negotiate a random data port and
-everything will work properly.
-
-<P>
-This support is somewhat experimental. If you run into problems, please
-let us know.
-
-<P>
-<DT><B>XPA_PORTFILE</B>
-<DD> 
-A list of user-specified port to use for specific xpa access points.
-The format of the file is:
-<PRE>
-class:template port1 [port2]
-</PRE>
-where <B>port1</B> is the main port for the access point and
-<B>port2</B> is the data port. If port2 is not specified, it defaults
-to a value of 0 (meaning the system assigns the port).  See
-<B>XPA_PORT</B> above for an explanation of user-specified ports.
-
-<P>
-<DT><B>XPA_SHORT_TIMEOUT</B>
-<DD> XPA is designed to allow data to be sent from one process to
-another over a long period of time (i.e., a program that generates
-image data sends that data to an image display, but slowly) but it
-also seeks to prevent hangs. This is done by supporting 2 timeout
-periods: a <EM>short</EM> timeout for protocol communication
-and a <EM>long</EM> for data communication.
-<P>
-The <EM>XPA_SHORT_TIMEOUT</EM> variable
-controls the <EM>short</EM> timeout and is used to prevent hangs
-in cases where the XPA protocol requires internal communication between
-the client and server that is controlled by the XPA interface
-itself. Authentication is an example of this sort of communication,
-as is the establishment of a data channel between the two processes.
-The default value for the <EM>short</EM> is 30 seconds (which is
-a pretty long time, actually). Setting the value to -1 will disable
-<EM>short</EM> timeouts and allow an infinite amount of time.
-
-<P>
-<DT><B>XPA_SIGUSR1</B>
-<DD> If the value of this variable is <EM>true</EM>, then XPA will
-catch SIGUSR1 signals when performing an I/O operation in order to
-curtail that operation. This facility allows users to send a SIGUSR1
-signal to an XPA server if a client is hanging up the server by
-sending or receiving data too slowly (timeouts also can be used -- see
-above). When enabled in this way, the SIGUSR1 signal is ignored at all other
-times, so that its safe to send the signal at any time.  If the
-variable is set to <EM>false</EM>, then SIGUSR1 is not used at
-all. Turning off SIGUSR1 would be desired in cases there the program
-uses SIGUSR1 for some other reason and does not want XPA interfering.
-The default is to use the signal.
-
-<P>
-<DT><B>XPA_TIMESTAMP_ERRORS</B>
-<DD> If <EM>XPA_TIMESTAMP_ERRORS</EM> is <EM>true</EM>, then error
-messages will include a date/time string.  This can be useful when
-XPA errors are being saved in an error log (e.g. Web/CGI use). The
-default is false.
-</DL>
-
-<P>
-<DT><B>XPA_TMPDIR</B>
-<DD> This variable specifies the directory into which XPA logs, Unix
-socket files (when <EM>XPA_METHOD</EM> is <EM>local</EM>), etc. are
-stored. The default is <EM>/tmp/.xpa</EM>.
-
-<P>
-<DT><B>XPA_VERBOSITY</B>
-<DD> Specify the verbosity level of error messages. If the value is
-set to <EM>0</EM>, <EM>false</EM>, or <EM>off</EM>, then no error
-messages are printed to stderr.  If the value is <EM>1</EM>, then
-important XPA error messages will be output.  If the value is
-set to <EM>2</EM>, XPA warnings about out-of-sync messages will also
-be output.  These latter almost always can be ignored.
-
-<P>
-<DT><B>XPA_VERSIONCHECK</B>
-<DD> Specify whether a new access point should check its major and minor XPA
-version number against the version used by the xpans name server at
-registration time. The default is <EM>true</EM>. When checking is
-performed, a warning is issued if the server major version is found to
-be greater than the xpans version. Note that the check is performed
-both by the XPA server and by the xpans process and warnings will be
-issued by each.  Also, instead of the values of <EM>true</EM> or
-<em>false</em>, you can give this variable an integer value n. In this
-case, each version checking process (i.e., the XPA-enabled server or
-xpans) will print out a maximum of n warning messages (after which
-version warnings are silently swallowed).
-<P>
-In general, it is a bad idea to run an XPA-enabled server program
-using a version of XPA newer than the basic xpaset, xpaget, xpaaccess,
-xpans programs. This sort of mismatch usually will not work due to
-protocol changes.
-
-<!-- =section xpaenv SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: December 23, 2009</H5>
-
-</BODY>
-</HTML>
diff --git a/xpa/doc/examples.html b/xpa/doc/examples.html
deleted file mode 100644
index 0bd68d4..0000000
--- a/xpa/doc/examples.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!-- =defdoc xpacode xpacode n -->
-<HTML>
-<HEAD>
-<TITLE>Where to Find Example/Test Code</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpacode NAME -->
-<H2><A NAME="xpacode">XPACode: Where to Find Example/Test Code</A></H2>
-
-<!-- =section xpacode SYNOPSIS -->
-<H2>Summary</H2>
-<P>
-The XPA source code directory contains two test programs,
-<EM>stest.c</EM>, and <EM>ctest.c</EM> that can serve as
-examples for writing XPA servers and clients, respectively.
-They also can be used to test various features of XPA.
-
-<!-- =section xpacode DESCRIPTION -->
-<H2>Description</H2>
-<P>
-To build the XPA test programs, execute:
-<PRE>
-   make All
-</PRE>
-in the XPA source directory to generate the <EM>stest</EM> and
-<EM>ctest</EM> programs.  (NB: this should work on all platforms,
-although we have had problems with unresolved externals on one
-Sun/Solaris machine, for reasons still unknown.)
-<P>
-The stest program can be executed with no arguments to start
-an XPA server that contains the access points: xpa, xpa1,
-c_xpa (containing sub-commands cmd1 and cmd2), and i_xpa.
-You then can use xpaset and xpaget to interact with these access points:
-<PRE>
-  cat xpa.c | xpaset xpa      # send to xpa
-  cat xpa.c | xpaset "xpa*"   # send to xpa and xpa1
-  xpaget xpa                  # receive from xpa
-  xpaget xpa*                 # receive from xpa and xpa1
-</PRE>
-etc. You also can use ctest to do the same thing, or to iterate:
-<PRE>
-  ctest -s -l 100 xpa        # send to xpa 100 times
-  ctest -s -l 100 "xpa*"     # send to xpa and xpa1 100 times
-  ctest -g -l 100 xpa        # receive from xpa 100 times
-  ctest -g -l 100 "xpa*"     # receive from xpa and xpa1 100 times
-</PRE>
-More options are available: see the stest.c and ctest.c code itself, which
-were used extensively to debug XPA.
-
-<P>
-The file test.tcl in the XPA source directory gives examples for using the 
-<A HREF="./tcl.html">XPATcl</A>Interface.
-
-<!-- =section xpacode SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: September 10, 2003</H5>
-</BODY>
-</HTML>
diff --git a/xpa/doc/help.html b/xpa/doc/help.html
deleted file mode 100644
index dfe51f9..0000000
--- a/xpa/doc/help.html
+++ /dev/null
@@ -1,162 +0,0 @@
-<!-- =defdoc xpa xpa n -->
-<HTML>
-<HEAD>
-<TITLE>The XPA Help Facility</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpa NAME -->
-<H2><A NAME="xpa">XPA: Public Access to Data and Algorithms</A></H2>
-
-<!-- =section xpa SYNOPSIS -->
-<H2>Summary</H2>
-This document is the Table of Contents for XPA.
-
-<!-- =section xpa DESCRIPTION -->
-<H2>Description</H2>
-<P>
-The XPA messaging system provides seamless communication between many
-kinds of Unix programs, including X programs and Tcl/Tk programs.  It
-also provides an easy way for users to communicate with XPA-enabled
-programs by executing XPA client commands in the shell or by utilizing
-such commands in scripts.  Because XPA works both at the programming
-level and the shell level, it is a powerful tool for unifying any
-analysis environment: users and programmers have great flexibility in
-choosing the best level or levels at which to access XPA services, and
-client access can be extended or modified easily at any time.
-
-<P>
-A program becomes an XPA-enabled server by defining named points of
-public access through which data and commands can be exchanged with
-other client programs (and users).  Using standard TCP sockets as a
-transport mechanism, XPA supports both single-point and broadcast
-messaging to and from these servers.  It supports direct communication
-between clients and servers, or indirect communication via an
-intermediate message bus emulation program. Host-based access control
-is implemented, as is as the ability to communicate with XPA servers
-across a network.
-
-<P>
-XPA implements a layered interface that is designed to be useful both
-to software developers and to users.  The interface consists of a
-library of XPA client and server routines for use in C/C++ programs and
-a suite of high-level user programs built on top of these libraries.
-Using the XPA library, access points can be added to Tcl/Tk programs,
-Xt programs, or to Unix programs that use the XPA event loop or any
-event loop based on select().  Client access subroutines can be added
-to any Tcl/Tk, Xt, or Unix program. Client access also is supported at
-the command line via a suite of high-level programs.
-
-<P>
-Choose from the following topics:
-
-<UL> 
-<LI><A HREF="./intro.html">Introduction to XPA</A>
-<!-- =text [xpaintro(n)] -->
-<LI><A HREF="./template.html">Access Point Names and Templates</A>
-<!-- =text [xpatemplate(n)] -->
-<LI><A HREF="./info.html">Getting Common Information About Access Points</A>
-<!-- =text [xpacommon(n)] -->
-<LI><A HREF="./method.html">Communication Methods</A>
-<!-- =text [xpamethod(n)] -->
-<LI><A HREF="./inet.html">Communication Between Hosts</A>
-<!-- =text [xpainet(n)] -->
-<LI><A HREF="./users.html">Distinguishing Users</A>
-<!-- =text [xpausers(n)] -->
-
-<LI><A HREF="./programs.html">XPA User Programs</A>
-<UL>
-<LI><A HREF="./programs.html#xpaget">xpaget: get data and info</A>
-<!-- =text [xpaget(1)] -->
-<LI><A HREF="./programs.html#xpaset">xpaset: send data and info</A>
-<!-- =text [xpaset(1)] -->
-<LI><A HREF="./programs.html#xpainfo">xpainfo: send info alert</A>
-<!-- =text [xpainfo(1)] -->
-<LI><A HREF="./programs.html#xpaaccess">xpaaccess: get access point info</A>
-<!-- =text [xpaaccess(1)] -->
-<LI><A HREF="./xpamb.html">xpamb: message bus emulation</A>
-<!-- =text [xpamb(1)] -->
-<LI><A HREF="./xpans.html">xpans: the XPA name server</A>
-<!-- =text [xpans(1)] -->
-</UL>
-
-<LI><A HREF="./server.html">XPA Server Routines</A>
-<UL>
-<LI><A HREF="./server.html#xpanew">XPANew: define a new access point</A>
-<!-- =text [xpanew(3)] -->
-<LI><A HREF="./server.html#xpacmdnew">XPACmdNew: define a new command access point</A>
-<!-- =text [xpacmdnew(3)] -->
-<LI><A HREF="./server.html#xpacmdadd">XPACmdAdd: add a command</A>
-<!-- =text [xpacmdadd(3)] -->
-<LI><A HREF="./server.html#xpacmddel">XPACmdDel: delete a command</A>
-<!-- =text [xpacmddel(3)] -->
-<LI><A HREF="./server.html#xpainfonew">XPAInfoNew: define an info access point</A>
-<!-- =text [xpainfonew(3)] -->
-<LI><A HREF="./server.html#xpafree">XPAFree: free an access point</A>
-<!-- =text [xpafree(3)] -->
-<LI><A HREF="./server.html#xpamainloop">XPAMainLoop: event loop for select server</A>
-<!-- =text [xpamainloop(3)] -->
-<LI><A HREF="./server.html#xpapoll">XPAPoll: poll for XPA events</A>
-<!-- =text [xpapoll(3)] -->
-<LI><A HREF="./server.html#xpacleanup">XPACleanup: release reserved XPA memory</A>
-<!-- =text [xpacleanup(3)] -->
-<LI><A HREF="./server.html#macros">XPA Server Macros: accessing structure internals</A>
-<!-- =text [xpamacros(3)] -->
-<LI><A HREF="./server.html#race">XPA Race Conditions: how to avoid them</A>
-<!-- =text [xparace(3)] -->
-<LI><A HREF="./oom.html">XPA Out of Memory (OOM) errors</A>
-<!-- =text [xpaoom(3)] -->
-</UL>
-
-<LI><A HREF="./client.html">XPA Client Routines</A>
-<UL>
-<LI><A HREF="./client.html#xpaopen">XPAOpen: open a persistent client connection</A>
-<!-- =text [xpaopen(3)] -->
-<LI><A HREF="./client.html#xpaclose">XPAClose: close persistent client connection</A>
-<!-- =text [xpaclose(3)] -->
-<LI><A HREF="./client.html#xpaget">XPAGet: get data</A>
-<!-- =text [xpaget(3)] -->
-<LI><A HREF="./client.html#xpaset">XPASet: send data or commands</A>
-<!-- =text [xpaset(3)] -->
-<LI><A HREF="./client.html#xpainfo">XPAInfo: send an info alert</A>
-<!-- =text [xpainfo(3)] -->
-<LI><A HREF="./client.html#xpagetfd">XPAGetFd: get data and write to an fd</A>
-<!-- =text [xpagetfd(3)] -->
-<LI><A HREF="./client.html#xpasetfd">XPASetFd: read data from and fd and send</A>
-<!-- =text [xpasetfd(3)] -->
-<LI><A HREF="./client.html#xpanslookup">XPANSLookup: look up an access point</A>
-<!-- =text [xpanslookup(3)] -->
-<LI><A HREF="./client.html#xpaaccess">XPAAccess: get access info</A>
-<!-- =text [xpaaccess(3)] -->
-<LI><A HREF="./xt.html">The XPA/Xt Interface: Xt interface to XPA</A>
-<!-- =text [xpaxt(n)] -->
-<LI><A HREF="./tcl.html">The XPA/Tcl Interface: Tcl interface to XPA</A>
-<!-- =text [xpatcl(n)] -->
-</UL>
-
-<LI> Tailoring the XPA Environment
-<UL>
-<LI><A HREF="./env.html">Environment Variables</A>
-<!-- =text [xpaenv(n)] -->
-<LI><A HREF="./acl.html">Access Control</A>
-<!-- =text [xpaacl(n)] -->
-</UL>
-
-<LI> Miscellaneous
-<UL>
-<!-- =stop -->
-<LI><A HREF="./changelog.html">XPA ChangeLog</A>
-<!-- =cont -->
-<LI><A HREF="./examples.html">Where to Find Example/Test Code</A>
-<LI><A HREF="./changes.html">User Changes Between XPA 1.0 and 2.0</A>
-<LI><A HREF="./convert.html">API Changes Between XPA 1.0 and 2.0</A>
-<LI><A HREF="./name.html">What Does XPA Stand For, Anyway?</A>
-</UL>
-
-</UL> 
-
-<!-- =stop -->
-
-<H5>Last updated: September 10, 2003</H5>
-</BODY>
-</HTML>
diff --git a/xpa/doc/html2man b/xpa/doc/html2man
deleted file mode 100755
index 4e60799..0000000
--- a/xpa/doc/html2man
+++ /dev/null
@@ -1,258 +0,0 @@
-#!/usr/bin/perl
-#
-# See COPYRIGHT
-#
-# Script to generate a pod file from an html source (the same one as for text files too)
-# and later this pod file it passed through pod2man
-#
-# Use:
-#  html2man [ <man-dir> [<version-dir>] ] <file.html
-#
-# <Man-dir> is the directory where the man pages will be created
-# (current directory by default). If a file name is given instead of
-# directory then the directory of that file is used.
-# <Version-dir> is the directory containing the ttf2pt1 files version.h
-# and CHANGES.html which are used to generate the release name and date
-# for the man page (by default looks in current directory and then in up to
-# 5 ancestor directories).
-# If the version files can not be found then the release defaults to
-# "current" and the date defaults to today.
-#
-# Special formatting in the html file is:
-# All controls are hidden within HTML comments that must occupy a whole separate line
-# Such a line looks like:
-# <!-- =<html2man_directive> <arguments> -->
-# <!-- ==<pod_directive> <arguments> -->
-# Any sort of directive must be followed by a space. The pod directives are
-# automatically surrounded by empty lines in the output file.
-# The html2man directives are:
-#
-# <!-- =defdoc <docid> <file> <section> -->
-# Define a man page. Multiple man pages can be defined in the same HTML
-# file. <Docid> is a short name by which this man page will be referred in the
-# other directives. <File> is the name of the man page, and <section> is the
-# section of the manual (do not confuse with sections within a man page).
-#
-# <!-- =section <docid> <page_section_name> -->
-# All the text following this directive is copied (with translation)
-# into the specified section of the specified man page. The sections
-# may appear in arbitrary order, they will be rearranged to the standard
-# order before output. Only standard section names are permitted (see @stdsect
-# below). The pod directives which occur outside of man sections are ignored,
-# just like the common text. The translation of HTML tags is:
-#
-# <br> - to paragraph break
-# <b> - to B<>
-# <i> - to I<>
-# <tt> - to C<>
-# <a href> - to F<>
-# <ul>, <li>, </ul> - to =over 2, =item *, =back
-# &nbsp;, &amp;, &lt;, &gt - to their symbols, appropriately encoded
-#
-# The rest of HTML tags is removed
-#
-# If the same section is started more than once, the text from the
-# second appearance will be added to the first, etc.
-#
-# <!-- =stop -->
-# Stop copying text to the man page.
-#
-# <!-- =cont -->
-# Continue copying text to the man page, same section as before.
-#
-# <!-- =text <text> -->
-# Insert this <text> into the man page (works only when copying is enabled).
-# Characters &lt;, &gt;, &amp; are converted as usual.
-
-@mons = qw(January February March April May June July August September October November December);
-
-$dir = $ARGV[0];
-$maindir = $ARGV[1];
-
-if($dir eq "") {
-	$dir = ".";
-} elsif( ! -d $dir ) {
-	if( ! ($dir =~ s|\/[^/]*$||) ) {
-		$dir = ".";
-	}
-}
-if($maindir eq "") {
-	$maindir = ".";
-	for($i=0; $i<5; $i++) {
-		if(-f "$maindir/version.h") {
-			last;
-		}
-		$maindir = "../$maindir";
-	}
-}
-
-if( open(VERFILE, "<$maindir/version.h") ) {
-	while(<VERFILE>) {
-		if( /^\s*\#define\s+TTF2PT1_VERSION\s+\"(.*)\"/ ) {
-			$release = "version $1";
-		}
-	}
-	close(VERFILE);
-	if( $release =~ /SNAP-([0-9][0-9])([0-9][0-9])([0-9][0-9])/ ) {
-		$date = sprintf("%s %d, 20%02d", $mons[$2-1], $3, $1);
-	} elsif( open(CFILE, "<$maindir/CHANGES.html") ) {
-		while(<CFILE>) {
-			if( /\<H4\>/) {
-				last;
-			}
-		}
-		$_ = <CFILE>;
-		chomp;
-		if( $_ =~ s/^.*?-- // ) {
-			$date = $_;
-		}
-		close(CFILE);
-	}
-}
-
-if($release eq "") {
-    if( open(VERFILE, "<../Makefile") ) {
-	while(<VERFILE>) {
-		if( /^VERSION\s+=\s+(.*)/ ) {
-			$release = "version $1";
-		}
-	}
-	close(VERFILE);
-    }
-}
-
-if($release eq "") {
-	$release = "current";
-}
-if($date eq "") {
-	@lt = localtime(time);
-	$date = sprintf("%s %d, %d", $mons[$lt[4]], $lt[3], 1900+$lt[5]);
-}
-
-#printf(STDERR "date=%s release=%s\n", $date, $release);
-
-$writemode = 0;
-
-while(<STDIN>) {
-	if( s/^\<\!\-\- \=(\S+)\s+//) { 
-		$cmd = $1;
-		s/\s*\-\-\>\s*$//;
-		#printf(STDERR "cmd=%s args=%s\n", $cmd, $_);
-		if($cmd =~ /^=/) {
-			if($writemode) {
-				$text{$tosect} .= "\n\n$cmd $_\n\n";
-			}
-		} elsif($cmd eq "defdoc") {
-			@sl = split;
-			push(@allids, $sl[0]);
-			$file{$sl[0]} = $sl[1];
-			$mansect{$sl[0]} = $sl[2];
-		} elsif($cmd eq "section") {
-			# tosect includes the file id
-			$tosect = $_;
-			$text{$tosect} .= "\n\n";
-			$writemode = 1;
-		} elsif($cmd eq "stop") {
-			$writemode = 0;
-			$text{$tosect} .= "\n";
-		} elsif($cmd eq "cont") {
-			$writemode = 1;
-		} elsif($cmd eq "text") {
-			if($writemode) {
-				s/\&lt\;/</gi;
-				s/\&gt\;/>/gi;
-				s/\&amp\;/\&/gi;
-				$text{$tosect} .= "$_\n";
-			}
-		}
-	} elsif($writemode) {
-#		s/^\s+//;
-
-		s/\{/\&lbr;/g;
-		s/\}/\&rbr;/g;
-
-		s/\<br\>/\n\n/gi;
-		#s/\<blockquote\>/\n\n=over 4\n\n/gi;
-		#s/\<\/blockquote\>/\n\n=back\n\n/gi;
-		s/\<ul\>/\n\n=over 4\n\n/gi;
-		s/\<\/ul\>/\n\n=back\n\n/gi;
-		s/\<li\>\s*/\n\n=item \*\n\n/gi;
-
-		s/\<dl\>/\n\n=over 4\n\n/gi;
-		s/\<\/dl\>/\n\n=back\n\n/gi;
-		s/\<dt\>\s*/\n\n=item \*\n\n/gi;
-		s/\<dd\>\s*/\n\n/gi;
-
-		s/\<i\>(.*?)\<\/i\>/I\{\1\}/gi;
-		s/\<em\>(.*?)\<\/em\>/I\{\1\}/gi;
-		s/\<b\>(.*?)\<\/b\>/B\{\1\}/gi;
-		s/\<tt\>(.*?)\<\/tt\>/C\{\1\}/gi;
-		s/\<a href\=\.*?\>(.*?)\<\/a\>/F\{\1\}/gi;
-		s/\<h2\>summary\<\/h2\>//gi;
-		s/\<h2\>description\<\/h2\>//gi;
-		s/\<h2\>examples\<\/h2\>//gi;
-		s/\<h2\>options\<\/h2\>//gi;
-		s/\<h2\>(.*?)\<\/h2\>/B\{\1\}/gi;
-		s/\<.*?\>//g;
-		s/\{/\</g;
-		s/\}/\>/g;
-
-		s/\&nbsp\;/S< >/gi;
-		s/\&amp\;/\&/gi;
-#		s/\&lt\;/E<lt>/gi;
-#		s/\&gt\;/E<gt>/gi;
-		s/\&lt\;/\</gi;
-		s/\&gt\;/\>/gi;
-		#s/\|/E<verbar>/g;
-		#s/\//E<sol>/g;
-		s/\&lbr\;/\{/g;
-		s/\&rbr\;/\}/g;
-
-		#printf(STDERR "section=%s add=%s", $tosect, $_);
-		$text{$tosect} .= $_;
-	}
-}
-
-@stdsect = (
-	"NAME", 
-	"SYNOPSIS",
-	"OPTIONS",
-	"DESCRIPTION",
-	"RETURN VALUE",
-	"ERRORS",
-	"EXAMPLES",
-	"ENVIRONMENT",
-	"FILES",
-	"SEE ALSO",
-	"NOTES",
-	"CAVEATS",
-	"DIAGNOSTICS",
-	"BUGS", 
-	"RESTRICTIONS",
-	"AUTHOR",
-	"HISTORY" );
-
-#printf(STDERR "allids= @allids\n");
-for $id (@allids) {
-	print(STDERR "creating man page $id $file{$id} $mansect{$id}\n\n");
-	die "Unable to create pod file $dir/$file{$id}.pod"
-		unless open(PODF, ">./pod/$file{$id}.pod");
-	print(PODF "=pod\n\n");
-	for $sect (@stdsect) {
-		$sid = "$id $sect";
-		#printf(STDERR "trying %s\n", $sid);
-		if(defined $text{$sid}) {
-		        #printf(STDERR "  section %s\n", $sid);
-			print(PODF "=head1 $sect\n\n$text{$sid}\n\n");
-		}
-	}
-	print(PODF "=cut\n");
-	close(PODF);
-	die "Unable to generate the man page $dir/$file{$id}.1"
-		if system("pod2man --section=\"$mansect{$id}\" --release=\"$release\" "
-		. "--center=\"SAORD Documentation\" --date=\"$date\" "
-		. "--name=\"$file{$id}\" "
-		. "./pod/$file{$id}.pod > $dir/man$mansect{$id}/$file{$id}.$mansect{$id}");
-
-	unlink("$dir/$file{$id}.pod");
-}
diff --git a/xpa/doc/html2ps.dbg b/xpa/doc/html2ps.dbg
deleted file mode 100644
index 2c7bc86..0000000
--- a/xpa/doc/html2ps.dbg
+++ /dev/null
@@ -1,94 +0,0 @@
-***** html2ps version 1.0 beta5
-***** Command: /proj/rd/linux64/bin/html2ps -C fb -d -g -n -u -W b -x 1 -o xpa.ps help.html
-***** Perl: 5.010001
-***** HTML2PSPATH=
-***** Global file /proj/rd/linux64/lib/html2ps/html2psrc:
-/* Global configuration file for html2ps */
-
-@html2ps {
-  package {
-    ImageMagick: 1;
-    djpeg: 1;
-    TeX: 1;
-    dvips: 1;
-    Ghostscript: 1;
-    libwww-perl: 1;
-    path: "/usr/bin";
-  }
-  paper {
-    type: letter;
-  }
-  hyphenation {
-    en {
-      file: "/proj/rd/linux64/lib/html2ps/hyphen.tex";
-    }
-  }
-}
-*****
-html2ps version 1.0 beta5
-Reading help.html
-Link: intro.html
-Link: template.html
-Link: info.html
-Link: method.html
-Link: inet.html
-Link: users.html
-Link: programs.html
-Link: xpamb.html
-Link: xpans.html
-Link: server.html
-Link: oom.html
-Link: client.html
-Link: xt.html
-Link: tcl.html
-Link: env.html
-Link: acl.html
-Link: changelog.html
-Link: examples.html
-Link: changes.html
-Link: convert.html
-Link: name.html
-At least 21 documents remaining
-Reading intro.html
-At least 20 documents remaining
-Reading template.html
-At least 19 documents remaining
-Reading info.html
-At least 18 documents remaining
-Reading method.html
-At least 17 documents remaining
-Reading inet.html
-At least 16 documents remaining
-Reading users.html
-At least 15 documents remaining
-Reading programs.html
-At least 14 documents remaining
-Reading xpamb.html
-At least 13 documents remaining
-Reading xpans.html
-At least 12 documents remaining
-Reading server.html
-At least 11 documents remaining
-Reading oom.html
-At least 10 documents remaining
-Reading client.html
-At least 9 documents remaining
-Reading xt.html
-At least 8 documents remaining
-Reading tcl.html
-At least 7 documents remaining
-Reading env.html
-At least 6 documents remaining
-Reading acl.html
-At least 5 documents remaining
-Reading changelog.html
-At least 4 documents remaining
-Reading examples.html
-At least 3 documents remaining
-Reading changes.html
-At least 2 documents remaining
-Reading convert.html
-At least 1 document remaining
-Reading name.html
-Inserting cross references
-
diff --git a/xpa/doc/inet.html b/xpa/doc/inet.html
deleted file mode 100644
index 3155885..0000000
--- a/xpa/doc/inet.html
+++ /dev/null
@@ -1,260 +0,0 @@
-<!-- =defdoc xpainet xpainet n -->
-<HTML>
-<HEAD>
-<TITLE>XPA Communication Between Hosts</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpainet NAME -->
-<H2><A NAME="xpainet">XPAInet: XPA Communication Between Hosts</A></H2>
-
-<!-- =section xpainet SYNOPSIS -->
-<H2>Summary</H2>
-XPA uses standard inet sockets to support communication between two or
-more host computers.
-
-<!-- =section xpainet DESCRIPTION -->
-<H2>Description</H2>
-<P>
-When the <A HREF="./method.html">Communication Method</A> is set to
-<B>inet</B> (as it is by default), XPA can be used to communicate
-between different computers on the Internet.  INET sockets utilize the
-IP address of the given machine and a (usually random) port number to
-communicate between processes on the same machine or between different
-machines on the Internet.  These standard Internet sockets are also
-used by programs such as Netscape, ftp. etc.
-
-<P>
-XPA supports a host-based <A HREF="./acl.html">Access Control</A> mechanism
-to prevent unauthorized access of XPA access points by other computers
-on the Net.  By default, only the machine on which the XPA server is
-running can access XPA services. Therefore, setting up communication
-between a local XPA server machine and a remote client machine
-requires a two-part registration process:
-
-<UL>
-<LI> the XPA service on the local machine must be made known to the 
-remote machine
-<LI> the remote machine must be given permission to access the local
-XPA service
-</UL>
-
-Three methods by which this remote registration can be accomplished
-are described below.
-
-<H2>Manual Registration</H2>
-
-The first method is the most basic and does not require the remote
-client to have xpans running.  To use it, the local server simply
-gives a remote client machine access to one or more XPA access points
-using xpaset and the <B>-acl</B> sub-command. For example,
-consider the XPA test program "stest" running on a local machine.  By
-default the access control for the access point named "xpa" is
-restricted to that machine:
-<PRE>
-  [sh]$ xpaget xpa -acl
-  *:* 123.456.78.910 gisa
-  *:* localhost gisa
-</PRE>
-Using xpaset and the <B>-acl</B> sub-command, a remote client
-machine can be given permission to perform xpaget, xpaset, xpaaccess,
-or xpainfo operations.  For example, to allow the xpaget operation, the
-following command can be issued on the local machine:
-<PRE>
-  [sh]$ xpaset -p xpa -acl "remote_machine g"
-</PRE>
-This results in the following access permissions on the local machine:
-<PRE>
-  [sh]$ xpaget xpa -acl
-  XPA:xpa 234.567.89.012 g
-  *:* 123.456.78.910 gisa
-  *:* localhost gisa
-</PRE>
-
-The remote client can now use the local server's xpans name server to
-establish communication with the local XPA service. This can be done
-on a call-by-call basis using the <B>-i</B> switch on xpaset, xpaget, etc:
-<PRE>
-  [sh]$ xpaget -i "local_machine:12345" xpa
-  class: XPA
-  name: xpa
-  method: 88877766:2778
-  sendian: little
-  cendian: big
-</PRE>
-Alternatively, the XPA_NSINET variable on the remote machine can be
-set to point directly to xpans on the local machine, removing
-the need to override this value each time an XPA program is run:
-<PRE>
-  [csh]$ setenv XPA_NSINET 'karapet:$port'
-  [csh]$ xpaget xpa
-  class: XPA
-  name: xpa
-  method: 88877766:2778
-  sendian: little
-  cendian: big
-</PRE>
-Here, '$port' means to use the default XPA name service port (14285).
-not a port environment variable.
-
-<p>
-Access permission for remote client machines can be stored in a file
-on the local machine pointed to by the <B>XPA_ACLFILE</B> environment
-variable or using the <B>XPA_DEFACL</B> environment variable. See <A
-HREF="./acl.html">XPA Access Control</A> for more information.
-
-<H2>Remote Registration</H2>
-
-If xpans is running on the remote client machine, then a local xpaset
-command can be used with the <B>-remote</B> sub-command to
-register the local XPA service in the remote name service, while at
-the same time giving the remote machine permission to access the local
-service.  For example, assume again that "stest" is running on the
-local machine and that xpans is also running on the remote machine.
-To register access of this local xpa on the remote machine, use 
-the xpaset and the <B>-remote</B> sub-command:
-<PRE>
-  [sh]$ ./xpaset -p xpa -remote 'remote_machine:$port' +
-</PRE>
-To register the local xpa access point on the remote machine with xpaget
-access only, execute:
-<PRE>
-  [sh]$ ./xpaset -p xpa -remote 'remote_machine:$port' g
-</PRE>
-Once the remote registration command is executed, the remote client
-machine will have an entry such as the following in its own xpans name
-service:
-<PRE>
-  [csh]$ xpaget xpans
-  XPA xpa gs 88877766:2839 eric
-</PRE>
-The xpa access point can now be utilized on the remote machine without
-further setup:
-<PRE>
-  [csh]$ xpaget xpa
-  class: XPA
-  name: xpa
-  method: 838e2f68:2839
-  sendian: little
-  cendian: big
-</PRE>
-To unregister remote access from the local machine, use the same
-command but with a '-' argument:
-<PRE>
-  [sh]$ xpaset -p xpa -remote 'remote_machine:$port' -
-</PRE>
-The benefit of using remote registration is that communication with
-remote access points can be mixed with that of other access points
-on the remote machine.  Using <A HREF="./template.html">Access Point
-Names and Templates</A>, one XPA command can be used to send or
-receive messages to the remote and local services.
-
-<H2>XPANS Proxy Registration</H2>
-
-The two methods described above are useful when the local and remote
-machines are able to communicate freely to one another. This would be
-the case on most Local Area Networks (LANs) where all machines are
-behind the same firewall and there is no port blocking between
-machines on the same LAN.  The situation is more complicated when the
-XPA server is behind a firewall, where outgoing connections are
-allowed, but incoming port blocking is implemented to prevent machines
-outside the firewall from connecting to machines inside the
-firewall. Such incoming port blocking will prevent xpaset and xpaget
-from connecting to an XPA server inside a firewall.
-
-<P>
-To allow locally fire-walled XPA services to register with remote
-machines, we have implemented a proxy service within the xpans name
-server. To register remote proxy service, xpaset and the
-<B>-remote</B> sub-command is again used, but with an additional
-<B>-proxy</B> argument added to the end of the command:
-<PRE>
-  [sh]$ ./xpaset -p xpa -remote 'remote_machine:$port' g -proxy
-</PRE>
-Once a remote proxy registration command is executed, the remote
-machine will have an entry such as the following in its own xpans name
-service:
-<PRE>
-  [csh]$ xpaget xpans
-  XPA xpa gs @88877766:2839 eric
-</PRE>
-The '@' sign in the name service entry indicates that xpans proxy
-processing is being used for this access point. Other than that, from
-the user's point of view, there is no difference in how this XPA
-access point is contacted using XPA programs (xpaset, xpaget, etc.) or
-libraries:
-<PRE>
-  [csh]$ xpaget xpa
-  class: XPA
-  name: xpa
-  method: 88877766:3053
-  sendian: little
-  cendian: big
-</PRE>
-<P>
-Of course, the underlying processing of the XPA requests is very much
-different when xpans proxy is involved. Instead of an XPA program such
-contacting the XPA service directly, it contacts the local xpans.
-Acting as a proxy server, xpans communicates with the XPA service
-using the command channel established at registration time. Commands
-(including establishing a new data channel) are sent between xpans and
-the XPA service to set up a new message transfer, and then data is fed
-to/from the xpa request, through xpans, from/to the XPA service. In
-this way, it can be arranged so that connections between the
-fire-walled XPA service and the remote client are always initiated by
-the XPA service itself. Thus, incoming connections that would be
-blocked by the firewall are avoided. Note that there is a performance
-penalty for using the xpans/proxy service.  Aside from extra overhead
-to set up proxy communication, all data must be sent through the
-intermediate proxy process.
-
-<P>
-The xpans proxy scheme requires that the remote client allow the local
-XPA server machine to connect to the remote xpans/proxy server. If the
-remote client machine also is behind a port-blocking firewall, such
-connections will be disallowed. In this case, the only solution is to
-open up some ports on the remote client machine to allow incoming
-connections to xpans/proxy. Two ports must be opened (for command and
-data channel connections). By default, these two ports are 14285 and
-14287. The port numbers can be changed using the <B>XPA_NSINET</B>
-environment variable. This variable takes the form:
-<PRE>
-  setenv XPA_NSINET machine:port1[,port2[,port3]]
-</PRE>
-where port1 is the main connecting port, port2 is the XPA access port,
-and port3 is the secondary data connecting port. The second and third
-ports are optional and default to port1+1 and port1+2, respectively.
-It is port1 and port3 that must be left open for incoming connections.
-
-<P>
-For example, to change the port assignments so that xpans listens
-for registration commands on port 12345 and data commands on port 28573:
-<PRE>
-  setenv XPA_NSINET myhost:12345
-</PRE>
-Alternatively, all three ports can be assigned explicitly:
-<PRE>
-  setenv XPA_NSINET remote:12345,3000,12346
-</PRE>
-In this case 12345 and 12346 should be open for incoming connections.
-The XPA access port (which need not be open to the outside
-world) is set to 3000.
-
-<P>
-Finally, note that we currently have no mechanism to cope with
-Internet proxy servers (such as SOCKS servers). If an XPA service is
-running on a machine that cannot connect directly to outside machines,
-but goes through a proxy server instead, there currently is no way to
-register that XPA service with a remote machine.  We hope to implement
-support for SOCKS proxy in a future release.
-
-<!-- =section xpainet SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: September 10, 2003</H5>
-</BODY>
-</HTML>
diff --git a/xpa/doc/info.html b/xpa/doc/info.html
deleted file mode 100644
index 75837bd..0000000
--- a/xpa/doc/info.html
+++ /dev/null
@@ -1,193 +0,0 @@
-<!-- =defdoc xpacommon xpacommon n -->
-<HTML>
-<HEAD>
-<TITLE>Getting Common Information About Access Points</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpacommon NAME -->
-<H2><A NAME="xpacommon">XPACommon: Getting Common Information About Access Points</A></H2>
-
-<!-- =section xpacommon SYNOPSIS -->
-<H2>Summary</H2>
-<P>
-There are various kinds of generic information you can retrieve about
-an XPA access point by using the xpaget command.
-
-<!-- =section xpacommon DESCRIPTION -->
-<H2>Description</H2>
-<P>
-You can find out which XPA access points have been registered with
-the currently running 
-<A HREF="./xpans.html">XPA name server</A>
-by executing the
-<A HREF="./programs.html#xpaget">xpaget</A>
-command to retrieve info from the XPA name server:
-<PRE>
-  xpaget xpans
-</PRE>
-If, for example, the
-<A HREF="./examples.html">stest</A> test server program
-is running, the following XPA access points will be returned (the specifics
-of the returned info will vary for different machines and users):
-<PRE>
-  XPA xpa gs 838e2f67:1262 eric
-  XPA xpa1 gs 838e2f67:1266 eric
-  XPA c_xpa gs 838e2f67:1267 eric
-  XPA i_xpa i 838e2f67:1268 eric
-</PRE>
-Note that access to this information is subject to the usual
-<A HREF="./acl.html">XPA Access Control</A> restrictions.
-
-<P>
-Each XPA access point supports a number of reserved sub-commands that provide
-access to different kinds of information, e.g. the access control for
-that access point.  These sub-commands can be executed by using
-<A HREF="./programs.html#xpaset">xpaset</A>
-or
-<A HREF="./programs.html#xpaget">xpaget</A>
-at the command line, or
-<A HREF="./client.html#xpaget">XPAGet()</A>
-or
-<A HREF="./client.html#xpaset">XPASet()</A>
-in programs, e.g:
-<PRE>
-  xpaget ds9 -acl
-  xpaget ds9 -help
-  xpaget ds9 env FOO
-
-  xpaset -p ds9 env FOO foofoo
-</PRE>
-With the exception of <B>-help</B> and <B>-version</B>, reserved
-sub-commands are available only on the machine on which the XPA server
-itself is running.
-
-The following reserved sub-commands are defined for all access points:
-<DL>
-
-<P>
-<DT><B>-acl</B> get (set) the access control list [options: host type acl, for set]
-<DD> 
-The 'xpaset' option allows you to add a new acl for a given host, or change
-the acl for an existing host. See
-<A HREF="./acl.html">XPA Access Control</A>
-for more information.
-This access point is available only on the server machine.
-
-<P>
-<DT><B>-env</B> get (set) an environment variable [options: name (value, for set)]
-<DD>
-The 'xpaget' option will return the value of the named environment
-variable.  The 'xpaset' option will set the value of the names
-variable to the specified value.
-This access point is available only on the server machine.
-(Please be advised that we have had problems setting environment
-variables in static Tcl/Tk programs such as ds9 running under Linux.)
-
-<P>
-<DT> <B>-clipboard</B> set(get) information on a named clipboard
-<DD> Clients can store ASCII state information on any number of named
-clipboards. Clipboards of the same name created by clients on
-different machines are kept separate.  The syntax for creating a
-clipboard is:
-<PRE>
-  [data] | xpaset [server] -clipboard add|append [clipboard_name]
-  xpaset -p [server] -clipboard delete [clipboard_name]
-</PRE>
-Use "add" to create a new clipboard or replace the contents of an existing
-one. Use "append" to append to an existing clipboard.
-<P>
-Information on a named clipboard is retrieved using:
-<PRE>
-  xpaget [server] -clipboard [clipboard_name]
-</PRE>
-<P>
-<DT><B>-exec</B> set: execute commands from buffer [options: none]
-<DD>
-If -exec is specified in the paramlist of an 'xpaset' call, then further
-sub-commands will be retrieved from the data buffer.
-
-<P>
-<DT><B>-help</B> get: return help string for this XPA or sub-command [options: name (for sub-commands)]
-<DD>
-Each XPA access point and each XPA sub-command can have a help string
-associated with it that is specified when the access point is defined.
-The -help option will return this help string.  For XPA access points
-that contain user-defined sub-commands, you can get the help string
-for a particular sub-command by specifying its name, or else get the
-help strings for all sub-commands if not name is specified.
-
-<P>
-<DT><B>-ltimeout</B> get (set) the long timeout value [options: seconds|reset]
-<DD>
-The 'xpaget' option will return the value of the long timeout (in seconds).
-The 'xpaset' option will set the value of the long timeout. If "reset" is
-specified, then the timeout value will be reset to the default value.
-
-<P>
-<DT><B>-nsconnect</B> set: re-establish name server connection to all XPA's [options: none]
-<DD>
-If the 
-<A HREF="./xpans.html">XPA Name Server (xpans)</A>
-process has terminated unexpectedly and then re-started, this
-sub-command can be used to re-establish the connection.  You use it by
-sending the command to the [name:port] or [file] of the access point
-instead of to the XPA name (since the latter requires the xpans
-connection!):
-<PRE>
-  xpaset -p 838e2f67:1268 -nsconnect
-</PRE>
-See <A HREF="./xpans.html">xpans</A> for more information.
-
-<P>
-<DT><B>-nsdisconnect</B> set: break name server connection to all XPA's [options: none]
-<DD>
-This sub-command will terminate the connection to the
-<A HREF="./xpans.html">XPA Name Server (xpans)</A>, thereby making
-all access points inaccessible except through their underlying [name:port]
-or [file] identifiers.  I forget why we added it, it seems pretty useless.
-
-<P>
-<DT><B>-stimeout</B> get (set) the short timeout value [options: seconds|reset]
-<DD>
-The 'xpaget' option will return the value of the short timeout (in seconds).
-The 'xpaset' option will set the value of the short timeout. If "reset" is
-specified, then the timeout value will be reset to the default value.
-
-<P>
-<DT><B>-remote</B> set: register xpa with remote server [options: host[:port] [acl]] [-proxy]
-<DD>
-This sub-command will register the XPA access point with the XPA name
-server (xpans) on the specified host (which must already be running).
-The specified host also is given access control to the access point,
-using the specified acl or the default acl of "+" (meaning the remote
-host can xpaset, xpaget, xpainfo or xpaaccess). If the acl is
-specified as "-", then the access point is unregistered. 
-See <A HREF="./inet.html">Communication Between Machines</A>
-for more information on how this sub-command is used.
-
-<P>
-<DT><B>-version</B> get: return XPA version string [options: none]
-<DD>
-The version refers to the version of XPA used to define this access point
-(currently something like 2.0).
-
-</DL>
-
-<P>
-You can add your own reserved commands to all XPA access points by using the
-<A HREF="./server.html#xpacmdadd">XPACmdAdd()</A>
-routine, passing the XPA handle returned by <EM>XPA XPAGetReserved(void)</EM>
-as the first argument. Note again that these will only be available on the
-machine where the XPA service is running.
-
-<!-- =section xpacommon SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: September 10, 2003</H5>
-</BODY>
-</HTML>
diff --git a/xpa/doc/intro.html b/xpa/doc/intro.html
deleted file mode 100644
index f9c9947..0000000
--- a/xpa/doc/intro.html
+++ /dev/null
@@ -1,148 +0,0 @@
-<!-- =defdoc xpaintro xpaintro n -->
-<HTML>
-<HEAD>
-<TITLE>Introduction to XPA</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpaintro NAME -->
-<H2><A NAME="xpaintro">XPAIntro: Introduction to the XPA Messaging System</A></H2>
-
-<!-- =section xpaintro SYNOPSIS -->
-<H2>Summary</H2>
-<P>
-A brief introduction to the XPA messaging system, which provides
-seamless communication between all kinds of Unix event-driven
-programs, including X programs, Tcl/Tk programs, and Perl programs.
-
-<!-- =section xpaintro DESCRIPTION -->
-<H2>Description</H2>
-<P>
-The XPA messaging system provides seamless communication between all
-kinds of Unix programs, including X programs, Tcl/Tk programs, and
-Perl programs.  It also provides an easy way for users to communicate
-with these XPA-enabled programs by executing XPA client commands in
-the shell or by utilizing such commands in scripts.  Because XPA works
-both at the programming level and the shell level, it is a powerful
-tool for unifying any analysis environment: users and programmers have
-great flexibility in choosing the best level or levels at which to
-access XPA services, and client access can be extended or modified
-easily at any time.
-
-<P>
-A program becomes an XPA-enabled server by defining named points of
-public access through which data and commands can be exchanged with
-other client programs (and users).  Using standard TCP sockets as
-a transport mechanism, XPA supports both single-point and broadcast
-messaging to and from these servers.  It supports direct communication
-between clients and servers, or indirect communication via an
-intermediate message bus emulation program. Host-based access control
-is implemented, as is as the ability to communicate with XPA servers
-across a network.
-
-<P>
-XPA implements a layered interface that is designed to be useful both
-to software developers and to users.  The interface consists of a
-library of XPA client and server routines for use in programs and a
-suite of high-level user programs built on top of these libraries.
-Using the XPA library, access points can be added to
-<A HREF="./tcl.html#">Tcl/Tk</A>
-programs, 
-<A HREF="./xt.html#">Xt</A>
-programs, or to Unix programs that use the XPA event loop or any
-event loop based on select().  Client access subroutines can be added
-to any Tcl/Tk or Unix program. Client access also is supported at the
-command line via a suite of high-level programs. 
-
-<P>
-The major components of the XPA layered interface are:
-<UL>
-<LI>
-A set of XPA server routines, centered on 
-<A HREF="./server.html#xpanew">XPANew(),</A>
-which are used by XPA server programs to tag public access points with
-string identifiers and to register send and receive callbacks for
-these access points.
-
-<LI>
-A set of XPA client routines, centered on the 
-<A HREF="./client.html#xpaset">XPASet()</A>
-and
-<A HREF="./client.html#xpaget">XPAGet(),</A>
-which are used by external client applications to exchange data and
-commands with an XPA server.
-
-<LI>
-High-level programs, centered on
-<A HREF="./programs.html#xpaset">xpaset</A>
-and
-<A HREF="./programs.html#xpaget">xpaget,</A>
-which allow data
-and information to be exchanged with XPA server programs from the
-command line and from scripts.  These programs have the command syntax:
-<PRE>
-  [data] | xpaset <XPA name> [qualifiers ...]
-           xpaget <XPA name> [qualifiers ...]
-</PRE>
-<LI>
-An XPA name server program, 
-<A HREF="./xpans.html">xpans,</A>
-through which XPA access point names are
-registered by servers and distributed to clients.
-</UL>
-
-<P>
-Defining an XPA access point is easy: a server application calls
-<A HREF="./server.html#xpanew">XPANew(),</A>
-<A HREF="./server.html#xpacmdnew">XPACmdNew(),</A>
-or the experimental
-<A HREF="./server.html#xpainfonew">XPAInfoNew()</A>
-routine to
-create a named public access point.  An XPA service can specify "send"
-and "receive" callback procedures (or an "info" procedure in the case
-of XPAInfoNew()) to be executed by the program when an external
-process either sends data or commands to this access point or requests
-data or information from this access point.  Either of the callbacks
-can be omitted, so that a particular access point can be specified as
-read-only, read-write, or write-only.  Application-specific client
-data can be associated with these callbacks.  Having defined one or
-more public access points in this way, an XPA server program enters
-its usual event loop (or uses the standard XPA event loop).
-
-<P>
-Clients communicate with these XPA public access points
-using programs such as
-<A HREF="./programs.html#xpaget">xpaget</A>,
-<A HREF="./programs.html#xpaset">xpaset</A>, and
-<A HREF="./programs.html#xpainfo">xpainfo</A>
-(at the command line),
-or routines such as
-<A HREF="./client.html#xpaget">XPAGet(),</A>
-<A HREF="./client.html#xpaset">XPASet(),</A>
-and
-<A HREF="./client.html#xpainfo">XPAInfo()</A>
-within a program.  Both methods require specification of the name of
-the access point.  The xpaget program returns data or other
-information from an XPA server to its standard output, while the
-xpaset program sends data or commands from its standard input to an
-XPA application. The corresponding API routines set/get data to/from
-memory, returning error messages and other info as needed.  If a
-<A HREF="./template.html">template</A>
-is used to specify the access point name (e.g., "ds9*"), then
-communication will take place with all servers matching that template.
-
-<p>
-Please note that XPA currently is not thread-safe. All XPA calls must be
-in the same thread.
-
-<!-- =section xpaintro SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: March 10, 2007</H5>
-</BODY>
-</HTML>
-
diff --git a/xpa/doc/method.html b/xpa/doc/method.html
deleted file mode 100644
index d85fc89..0000000
--- a/xpa/doc/method.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!-- =defdoc xpamethod xpamethod n -->
-<HTML>
-<HEAD>
-<TITLE>XPA Communication Methods</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpamethod NAME -->
-<H2><A NAME="xpamethod">XPAMethod: </A>XPA Communication Methods</H2>
-
-<!-- =section xpamethod SYNOPSIS -->
-<H2>Summary</H2>
-<P>
-XPA supports both inet and unix (local) socket communication.
-
-<!-- =section xpamethod DESCRIPTION -->
-<H2>Description</H2>
-<P>
-XPA uses sockets for communication between processes. It supports
-three methods of socket communication: inet, localhost, and unix. In
-general, the same method should be employed for all XPA processes in a
-session and the global environment variable XPA_METHOD should be used
-to set up the desired method. By default, the preferred method is
-"inet", which is appropriate for most users. You can set up a
-different method by typing something like:
-<PRE>
-  setenv XPA_METHOD local              # unix csh
-  XPA_METHOD=local; export XPA_METHOD  # unix sh, bash, windows/cygwin
-  set XPA_METHOD=localhost             # dos/windows
-</PRE>
-The options for XPA_METHOD are: <B>inet</B>, <B>unix</B> (or
-<B>local</B>), and <B>localhost</B>. On Unix machines, this
-environment setup command can be placed in your shell init file
-(.cshrc, .profile, .bashrc, etc.) On Windows platforms, it can be
-placed in your AUTOEXEC.BAT file (I think!).
-
-<P>
-By default, <B>inet</B> sockets are used by XPA. These are the standard
-Internet sockets that are used by programs such as Netscape,
-ftp. etc. Inet sockets utilize the IP address of the given machine and
-a (usually random) port number to communicate between processes on the
-same machine or between different machines on the Internet. (Note that
-XPA has an <A HREF="./acl.html">Access Control</A> mechanism to
-prevent unauthorized access of XPA access points by other computers on
-the Net). For users connected to the Internet, this usually is the
-appropriate communication method. For more information about setting
-up XPA communication between machines, see
-<A HREF="./inet.html">Communication Between Machines</A>.
-
-<P>
-In you are using XPA on a machine without an Internet connection, then
-inet sockets are not appropriate. In fact, an XPA process often will
-hang for many seconds while waiting for a response from the Domain
-Name Service (DNS) when using inet sockets. Instead of inet sockets,
-users on Unix platforms can also use <B>unix</B> sockets (also known
-as local sockets). These sockets are based on the local file system
-and do not make use of the DNS. They generally are considered to be
-faster than inet sockets, but they are not implemented under
-Windows. Use local sockets as a first resort if you are on a Unix
-machine that is not connected to the Internet.
-
-<P>
-Users not connected to the Internet also can use <B>localhost</B>
-sockets. These are also inet-type sockets but the IP address used for
-the local machine is the <B>localhost</B> address, 0x7F000001, instead
-of the real IP of the machine. Depending on how sockets are set up for
-a given platform, communication with the DNS usually is not required in
-this case (though of course, XPA cannot interact with other machines).
-The localhost method will generally work on both Unix and Windows
-platforms, but whether the DNS is required or not is subject to
-individual configurations.
-
-<P>
-A final warning/reminder: if your XPA-enabled server hangs at startup
-time and your XPA_METHOD is <B>inet</B>, the problem probably is
-related to an incorrect Internet configuration. This can be confirmed
-by using the <B>unix</B> method or (usually) the <B>localhost</B>
-method. You can use these alternate methods if other hosts do not need
-access to the XPA server.
-
-<!-- =section xpamethod SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: September 10, 2003</H5>
-</BODY>
-</HTML>
diff --git a/xpa/doc/name.html b/xpa/doc/name.html
deleted file mode 100644
index 5269378..0000000
--- a/xpa/doc/name.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!-- =defdoc xpaname xpaname n -->
-<HTML>
-<HEAD>
-<TITLE>What does XPA stand for?</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpaname NAME -->
-<H2><A NAME="xpaname">XPAName: What does XPA stand for?</A></H2>
-
-<!-- =section xpaname SYNOPSIS -->
-<H2>Summary</H2>
-<P>
-What does XPA stand for? Who knows anymore!
-
-<!-- =section xpaname DESCRIPTION -->
-<H2>Description</H2>
-<P>
-What does XPA stand for? Dunno! The XPA messaging system originally
-was built on top of the X Window System and XPA was the mnemonic for
-<EM>X Public Access</EM>, to emphasize that we were providing public
-access to previously private data and algorithms in Xt programs.  Now
-that XPA no longer is tied to X, it can be argued that we ought to
-change the name (how about <EM>SPAM: simple public access mechanism
-</EM>), but XPA is in wide-spread use in the astronomical community of
-its birth, and the name has taken on a life of its own. If anyone can
-think of what XPA now means, please let us know.
-
-<P>
-If you think this is bad, consider the MMT Telescope on Mount Hopkins,
-Arizona. When first installed twenty years ago, it featured an array
-of six 72-inch diameter mirrors. from which came its name: the
-<EM>Multiple Mirror Telescope</EM>.  In spring of 1999, these mirrors
-were replaced by a single 21 and 1/2 -foot diameter primary mirror,
-the largest single-piece glass reflector on the North American
-continent. And now MMT stands for ... MMT!
-
-<!-- =section xpaname SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: September 10, 2003</H5>
-</BODY>
-</HTML>
-
diff --git a/xpa/doc/oom.html b/xpa/doc/oom.html
deleted file mode 100644
index 360740e..0000000
--- a/xpa/doc/oom.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!-- =defdoc xpaoom xpaoom n -->
-<HTML>
-<HEAD>
-<TITLE>Out of Memory</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpaoom NAME -->
-<H2><A NAME="xpaoom">Xpaoom: What happens when XPA runs out of memory?</A></H2>
-
-<!-- =section xpaoom SYNOPSIS -->
-<H2>Summary</H2>
-<P>
-When XPA can't allocate memory, it exits. You can arrange to have it call
-longjmp() instead.
-
-<!-- =section xpaoom DESCRIPTION -->
-<H2>Description</H2>
-<P>
-When an XPA server or client cannot allocate memory, it will attempt to
-output an error message and then exit. If this is not satisfactory (e.g.,
-perhaps your program is interactive and can recover from OOM errors), you
-can tell XPA to call longjmp() to go to a recovery branch. To pass the 
-requisite jmp_buf variable to XPA, make the following call:
-<PRE>
-  XPASaveJmp(void *env);
-</PRE>
-The value of env is the address of a jmp_buf variable that was previously 
-passed to setjmp(). For example:
-<PRE>
-  jmp_buf env;
-  ...
-  if( setjmp(jmp_buf) != 0 ){
-    /* out of memory -- take corrective action, if possible */
-  } else {
-    /* save env for XPA */
-    XPASaveJmp((void *)&jmp_buf);
-  }
-  // enter main loop ...
-</PRE>
-
-<!-- =section xpaoom SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: April 7, 2009</H5>
-</BODY>
-</HTML>
-
diff --git a/xpa/doc/pod/xpa.pod b/xpa/doc/pod/xpa.pod
deleted file mode 100644
index 7787d4b..0000000
--- a/xpa/doc/pod/xpa.pod
+++ /dev/null
@@ -1,399 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPA: Public Access to Data and Algorithms>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-This document is the Table of Contents for XPA.
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-
-The XPA messaging system provides seamless communication between many
-kinds of Unix programs, including X programs and Tcl/Tk programs.  It
-also provides an easy way for users to communicate with XPA-enabled
-programs by executing XPA client commands in the shell or by utilizing
-such commands in scripts.  Because XPA works both at the programming
-level and the shell level, it is a powerful tool for unifying any
-analysis environment: users and programmers have great flexibility in
-choosing the best level or levels at which to access XPA services, and
-client access can be extended or modified easily at any time.
-
-
-A program becomes an XPA-enabled server by defining named points of
-public access through which data and commands can be exchanged with
-other client programs (and users).  Using standard TCP sockets as a
-transport mechanism, XPA supports both single-point and broadcast
-messaging to and from these servers.  It supports direct communication
-between clients and servers, or indirect communication via an
-intermediate message bus emulation program. Host-based access control
-is implemented, as is as the ability to communicate with XPA servers
-across a network.
-
-
-XPA implements a layered interface that is designed to be useful both
-to software developers and to users.  The interface consists of a
-library of XPA client and server routines for use in C/C++ programs and
-a suite of high-level user programs built on top of these libraries.
-Using the XPA library, access points can be added to Tcl/Tk programs,
-Xt programs, or to Unix programs that use the XPA event loop or any
-event loop based on select().  Client access subroutines can be added
-to any Tcl/Tk, Xt, or Unix program. Client access also is supported at
-the command line via a suite of high-level programs.
-
-
-Choose from the following topics:
-
-
-
-=over 4
-
- 
-
-
-=item *
-
-Introduction to XPA
-[xpaintro(n)]
-
-
-=item *
-
-Access Point Names and Templates
-[xpatemplate(n)]
-
-
-=item *
-
-Getting Common Information About Access Points
-[xpacommon(n)]
-
-
-=item *
-
-Communication Methods
-[xpamethod(n)]
-
-
-=item *
-
-Communication Between Hosts
-[xpainet(n)]
-
-
-=item *
-
-Distinguishing Users
-[xpausers(n)]
-
-
-
-=item *
-
-XPA User Programs
-
-
-=over 4
-
-
-
-
-=item *
-
-xpaget: get data and info
-[xpaget(1)]
-
-
-=item *
-
-xpaset: send data and info
-[xpaset(1)]
-
-
-=item *
-
-xpainfo: send info alert
-[xpainfo(1)]
-
-
-=item *
-
-xpaaccess: get access point info
-[xpaaccess(1)]
-
-
-=item *
-
-xpamb: message bus emulation
-[xpamb(1)]
-
-
-=item *
-
-xpans: the XPA name server
-[xpans(1)]
-
-
-=back
-
-
-
-
-
-=item *
-
-XPA Server Routines
-
-
-=over 4
-
-
-
-
-=item *
-
-XPANew: define a new access point
-[xpanew(3)]
-
-
-=item *
-
-XPACmdNew: define a new command access point
-[xpacmdnew(3)]
-
-
-=item *
-
-XPACmdAdd: add a command
-[xpacmdadd(3)]
-
-
-=item *
-
-XPACmdDel: delete a command
-[xpacmddel(3)]
-
-
-=item *
-
-XPAInfoNew: define an info access point
-[xpainfonew(3)]
-
-
-=item *
-
-XPAFree: free an access point
-[xpafree(3)]
-
-
-=item *
-
-XPAMainLoop: event loop for select server
-[xpamainloop(3)]
-
-
-=item *
-
-XPAPoll: poll for XPA events
-[xpapoll(3)]
-
-
-=item *
-
-XPACleanup: release reserved XPA memory
-[xpacleanup(3)]
-
-
-=item *
-
-XPA Server Macros: accessing structure internals
-[xpamacros(3)]
-
-
-=item *
-
-XPA Race Conditions: how to avoid them
-[xparace(3)]
-
-
-=item *
-
-XPA Out of Memory (OOM) errors
-[xpaoom(3)]
-
-
-=back
-
-
-
-
-
-=item *
-
-XPA Client Routines
-
-
-=over 4
-
-
-
-
-=item *
-
-XPAOpen: open a persistent client connection
-[xpaopen(3)]
-
-
-=item *
-
-XPAClose: close persistent client connection
-[xpaclose(3)]
-
-
-=item *
-
-XPAGet: get data
-[xpaget(3)]
-
-
-=item *
-
-XPASet: send data or commands
-[xpaset(3)]
-
-
-=item *
-
-XPAInfo: send an info alert
-[xpainfo(3)]
-
-
-=item *
-
-XPAGetFd: get data and write to an fd
-[xpagetfd(3)]
-
-
-=item *
-
-XPASetFd: read data from and fd and send
-[xpasetfd(3)]
-
-
-=item *
-
-XPANSLookup: look up an access point
-[xpanslookup(3)]
-
-
-=item *
-
-XPAAccess: get access info
-[xpaaccess(3)]
-
-
-=item *
-
-The XPA/Xt Interface: Xt interface to XPA
-[xpaxt(n)]
-
-
-=item *
-
-The XPA/Tcl Interface: Tcl interface to XPA
-[xpatcl(n)]
-
-
-=back
-
-
-
-
-
-=item *
-
-Tailoring the XPA Environment
-
-
-=over 4
-
-
-
-
-=item *
-
-Environment Variables
-[xpaenv(n)]
-
-
-=item *
-
-Access Control
-[xpaacl(n)]
-
-
-=back
-
-
-
-
-
-=item *
-
-Miscellaneous
-
-
-=over 4
-
-
-
-
-
-=item *
-
-Where to Find Example/Test Code
-
-
-=item *
-
-User Changes Between XPA 1.0 and 2.0
-
-
-=item *
-
-API Changes Between XPA 1.0 and 2.0
-
-
-=item *
-
-What Does XPA Stand For, Anyway?
-
-
-=back
-
-
-
-
-
-=back
-
- 
-
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpaaccess.pod b/xpa/doc/pod/xpaaccess.pod
deleted file mode 100644
index ab34b9b..0000000
--- a/xpa/doc/pod/xpaaccess.pod
+++ /dev/null
@@ -1,102 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<xpaaccess: see if template matches registered XPA access points>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-xpaaccess [-c] [-h] [-i nsinet] [-m method] [-n] [-t sval,lval] [-u users] -v <template> [type]
-
-
-
-
-
-=head1 OPTIONS
-
-
-
-
-
-  -c		contact each access point individually
-  -h		print help message
-  -i		access XPA point on different machine (override XPA_NSINET)
-  -m		override XPA_METHOD environment variable
-  -n		return number of matches instead of "yes" or "no"
-  -t [s,l]	set short and long timeouts (override XPA_[SHORT,LONG]_TIMEOUT)
-  -u [users]	XPA points can be from specified users (override XPA_NSUSERS)
-  -v		print info about each successful access point
-  -V		print info or error about each access point
-  --version     display version and exit
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-xpaaccess returns "yes" to stdout (with a return error code if 1) if there are
-existing XPA access points that match the 
-template
-(and optional access type: g,i,s). Otherwise, it returns "no" (with a
-return error code of 0).  If -n is specified, the number of matches is
-returned instead (both to stdout and in the returned error code). If
--v is specified, each access point is displayed to stdout instead of
-the number of matches.
-
-
-By default, xpaaccess simply contacts the xpans name server to find
-the list of registered access points that match the specified
-template. It also checks to make sure the specified types are
-supported by that access point. This is the fastest way to determine
-available access points. However, an access point might registered but
-not yet available, if, for example, the server program has not entered
-its event loop to process XPA requests. To find access points that are
-guaranteed to be available for processing, use the -c (contact)
-switch.  With this switch, xpaaccess contacts each matching XPA server
-(rather than the name server) to make sure the registered access point
-really is ready for processing. In this mode, if an access point is
-registered but not available, xpaaccess will pause for a period of
-time equal to the XPA_LONG_TIMEOUT, in order to give the server a
-chance to ready itself. By default, this timeout is 30 seconds. You
-can shorten the time of delay using the -t "short,long" switch. For
-example, to shorten the delay time to 2 seconds, use:
-
-  xpaaccess -c -t "2,2" ds9
-
-The first argument is the short delay value, and is ignored in this
-operation. The second is the long delay timeout.
-
-
-Note also that the default xpaaccess method (no -c switch) does not
-check access control (acls) but rather only checks whether the access
-point is both registered with the xpans name server and provides the
-specified type of access. In other words, the default xpaaccess could
-return 'yes' when you might not actually have access. This mode also
-always returns 'yes' for the xpans name server itself, regardless of
-whether the name server is active. The -c (contact) switch, which
-contacts the access point directly, can and does check the access
-control (only for servers using version 2.1 and above) and also
-returns the real status of xpans.
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpaacl.pod b/xpa/doc/pod/xpaacl.pod
deleted file mode 100644
index 3be9d4c..0000000
--- a/xpa/doc/pod/xpaacl.pod
+++ /dev/null
@@ -1,145 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAAcl: Access Control for XPA Messaging>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-XPA supports host-based access control for each XPA access point.  You
-can enable/disable access control using the XPA_ACL environment
-variable. You can specify access to specific XPA access points for
-specific machines using the XPA_DEFACL and XPA_ACLFILE environment
-variables. By default, an XPA access point is accessible only to
-processes running on the same machine (same as X Windows).
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-
-When INET sockets are in use (the default, as specified by the
-I<XPA_METHOD> environment variable), XPA supports a host-based
-access control mechanism for individual access points. This mean that
-access can be specified for get, set, or info operations for each
-access point on a machine by machine basis.  For LOCAL sockets, access
-is restricted (by definition) to the host machine.
-
-
-XPA access control is enabled by default, but can be turned off by
-setting the I<XPA_ACL> environment variable to I<false>.
-In this case, any process can access any XPA server.
-
-
-Assuming that access control is turned on, the ACL for an individual
-XPA access point is set up when that access point is registered
-(although it can be changed later on; see below). This can be done in
-one of two ways:
-
-Firstly, the I<XPA_ACLFILE> environment variable can defined to
-point to a file of access controls for individual access points. The format
-of this file is:
-
- class:name ip acl
-
-The first argument is a template that specifies the class:name of the
-access point covered by this ACL. See
-XPA Access Points and Templates
-for more information about xpa templates.
-
-
-The second argument is the IP address (in human-readable format) of
-the machine which is being given access.  This argument can be
-I<*> to match all IP addresses.  It also can be I<$host>
-to match the IP address of the current host.
-
-
-The third argument is a string combination of I<s>, I<g>,
-or I<i> to allow I<xpaset>, I<xpaget>, or
-I<xpainfo> access respectively.  The ACL argument can be
-I<+> to give I<sgi> access or it can be I<-> to turn
-off all access.
-
-
-For example,
-
-  *:xpa1  somehost sg
-  *:xpa1  myhost +
-  * * g
-
-will allow processes on the machine somehost to make xpaget and xpaset calls,
-allow processes on myhost to make any call, and allow all other hosts to
-make xpaget (but not xpaset) calls.
-
-Secondly, if the I<XPA_ACLFILE> does not exist, then a single
-default value for all access points can be specified using the
-I<XPA_DEFACL> environment variable.  The default value for this
-variable is:
-
-  #define XPA_DEFACL "*:* $host +"
-
-meaning that all access points are fully accessible to all processes
-on the current host. Thus, in the absence of any ACL environment variables,
-processes on the current host have full access to all access points
-created on that host. This parallels the X11 xhost mechanism.
-
-
-Access to an individual XPA access point can be changed using the -acl
-parameter for that access point.  For example:
-
-  xpaset -p xpa1 -acl "somehost -"
-
-will turn off all access control for somehost to the xpa1 access point, while:
-
-  xpaset -p XPA:xpa1 -acl "beberly gs"
-
-will give beberly xpaget and xpaset access to the access point whose
-class is XPA and whose name is xpa1.
-
-Similarly, the current ACL for a given access point can be retrieved using:
-
-  xpaget xpa1 -acl
-
-Of course, you must have xpaget access to this XPA access point to
-retrieve its ACL.
-
-
-Note that the XPA access points registered in the I<xpans>
-program also behave according to the ACL rules.  That is, you cannot
-use xpaget to view the access points registered with xpans unless
-you have the proper ACL.
-
-
-Note also when a client request is made to an XPA server, the access
-control is checked when the initial connection is established.  This
-access in effect at this time remains in effect so long as the client
-connection is maintained, regardless of whether the access fro that
-XPA is changed later on.
-
-
-We recognize that host-based access control is only relatively secure
-and will consider more stringent security (e.g., private key) in the
-future if the community requires such support.
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpaatexit.pod b/xpa/doc/pod/xpaatexit.pod
deleted file mode 100644
index 4310835..0000000
--- a/xpa/doc/pod/xpaatexit.pod
+++ /dev/null
@@ -1,41 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAAtExit: install exit handler>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-  #include <xpa.h>
-
-  void XPAAtExit(void);
-
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-XPAAtExit() will install an exit handler using atexit() to run XPAFree on all
-XPA access points. This might be useful in cases where Unix sockets are being
-used: if an explicit call to XPAFree() is not made by the program, the Unix
-socket file will not be deleted immediately without an atexit handler. (NB: this
-call should not be made in a Tcl/Tk application. Accessing the Tcl native file
-system after Tcl has shut down all file systems causes the Tcl/Tl program to
-crash).
-
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpachanges.pod b/xpa/doc/pod/xpachanges.pod
deleted file mode 100644
index bce7be0..0000000
--- a/xpa/doc/pod/xpachanges.pod
+++ /dev/null
@@ -1,102 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPA Changes: Changes For Users from XPA 1.0 and 2.0>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-This document describes changes that will affect users who migrate
-from XPA 1.0 to XPA 2.0.
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-
-There have been a few changes that affect users who upgrade XPA
-from version 1.0 to version 2.0.  These changes are detailed below.
-
-
-=over 4
-
-
-
-
-
-=item *
-
-XPA commands no longer have a resolver routine (this is open to
-negotiations, but we decided the idea was dumb).  For the SAOtng
-program, this means that you must explicitly specify the access
-point, i.e.,:
-
-  cat foo.fits | xpaset SAOtng fits
-
-
-
-instead of:
-
-  cat foo.fits | xpaset SAOtng
-
-
-
-
-=item *
-
-By default, xpaset, xpaget, etc. now wait for the server callback to
-complete; i.e., the old -W is implied (and the switch is ignored).
-This allows support for better error handling.  If you want xpaset, etc.
-to return before the callback is complete, use -n switch:
-
-  echo "file foo.fits" | xpaset -n SAOtng
-
-
-
-
-=item *
-
-The old -w switch in xpaset and xpaget is no longer necessary (and is
-ignored), since you can have more than one process communicating with
-an xpa access point at one time.
-
-
-
-
-=item *
-
-The new -p switch on xpaset means you need not read from stdout:
-              
-  xpaset -p SAOtng colormap I8
-
-
-will send the paramlist to the SAOtng callback without reading from stdin.
-
-
-
-=back
-
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpacleanup.pod b/xpa/doc/pod/xpacleanup.pod
deleted file mode 100644
index 2d55e5a..0000000
--- a/xpa/doc/pod/xpacleanup.pod
+++ /dev/null
@@ -1,47 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPACleanup: release reserved XPA memory>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-  #include <xpa.h>
-
-  void XPACleanup(void);
-
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-When XPA is initialized, it allocates a small amount of memory for the
-access control list, temp directory path, and reserved commands. This
-memory is found by valgrind to be "still reachable", meaning that "your
-program didn't free some memory it could have". Calling the
-XPACleanup() routine before exiting the program will free this memory
-and make valgrind happy.
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpaclient.pod b/xpa/doc/pod/xpaclient.pod
deleted file mode 100644
index 858a8a8..0000000
--- a/xpa/doc/pod/xpaclient.pod
+++ /dev/null
@@ -1,95 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAClient: The XPA Client-side Programming Interface>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-A description of the XPA client-side programming interface.
-
-
-
-=head1 DESCRIPTION
-
-
-
-B<Introduction to XPA Client Programming>
-
-Sending/receiving data to/from an XPA access point is easy: you
-generally only need to call the XPAGet() or XPASet() subroutines.
-
-  #include <xpa.h>
-
-  int XPAGet(XPA xpa,
-      char *template, char *paramlist, char *mode,
-      char **bufs, size_t *lens, char **names, char **messages, int n);
-
-  int XPASet(XPA xpa,
-      char *template, char *paramlist, char *mode,
-      char *buf, size_t len, char **names, char **messages, int n);
-
-  int XPAInfo(XPA xpa,
-      char *template, char *paramlist, char *mode,
-      char **names, char **messages, int n);
-
-  int XPAAccess(XPA xpa,
-      char *template, char *paramlist, char *mode,
-      char **names, char **messages, int n);
-
-  int XPAGetFd(XPA xpa,
-      char *template, char *paramlist, char *mode,
-      int *fds, char **names, char **messages, int n);
-
-  int XPASetFd(XPA xpa,
-      char *template, char *paramlist, char *mode,
-      int fd, char **names, char **messages, int n);
-
-  XPA XPAOpen(char *mode);
-
-  void XPAClose(XPA xpa);
-
-  int XPANSLookup(XPA xpa,
-      char *template, char *type,
-      char ***classes, char ***names, char ***methods, char ***infos);
-
-
-B<Introduction>
-
-To use the XPA application programming interface, a software developer
-generally will include the xpa.h definitions file:
-
-  #include <xpa.h>
-
-in the software module that defines or accesses an XPA access point and
-then will link against the libxpa.a library:
-
-  gcc -o foo foo.c libxpa.a
-
-XPA has been compiled using both C and C++ compilers.
-
-Client communication with XPA public access points generally is
-accomplished using XPAGet() or XPASet() within a program (or xpaget
-and xpaset at the command line).  Both routines require specification
-of the name of the access point.  If a template
-is used to specify the access point name (e.g., "ds9*"), then
-communication will take place with all servers matching that template.
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpaclose.pod b/xpa/doc/pod/xpaclose.pod
deleted file mode 100644
index 7148752..0000000
--- a/xpa/doc/pod/xpaclose.pod
+++ /dev/null
@@ -1,53 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAClose: close a persistent XPA client handle>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-  #include <xpa.h>
-
-  void XPAClose(XPA xpa);
-
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-XPAClose closes the persistent connections associated with this XPA struct
-and frees all allocated space. It also closes the open sockets connections
-to all XPA servers that were opened using this handle.
-
-
-B<Example:>
-
-  #include <xpa.h>
-
-  XPA xpa;
-  XPAClose(xpa);
-
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpacmdadd.pod b/xpa/doc/pod/xpacmdadd.pod
deleted file mode 100644
index 31859e5..0000000
--- a/xpa/doc/pod/xpacmdadd.pod
+++ /dev/null
@@ -1,69 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPACmdAdd: add a command to an XPA command public access point>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-  #include <xpa.h>
-
-  XPACmd XPACmdAdd(XPA xpa, char *name, char *help,
-	           int (*send_callback)(),
-		   void *send_data, char *send_mode,
-         	   int (*rec_callback)(),
-		   void *rec_data,  char *rec_mode);
-
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-Add a command to an XPA command access point. The XPA argument specifies the
-XPA struct returned by a call to XPANewCmd(). The name argument is the
-name of the command. The other arguments function identically to the
-arguments in the XPANew() command, i.e., the send_callback and rec_callback
-routines have identical calling sequences to their XPANew() counterparts,
-with the exceptions noted below.
-
-
-When help is requested for a command access point using:
-
-  xpaget -h class:name
-
-
-all of the command help strings are listed.  To get help for a given
-command, use:
-
-  xpaget -h class:name cmd
-
-
-Also, the acl keyword in the send_mode and receive_mode strings is
-global to the access point, not local to the command.  Thus, the value
-for the acl mode should be the same in all send_mode (or receive_mode)
-strings for each command in a command access point. (The acl for
-send_mode need not be the same as the acl for receive_mode, though).
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpacmddel.pod b/xpa/doc/pod/xpacmddel.pod
deleted file mode 100644
index 95c545d..0000000
--- a/xpa/doc/pod/xpacmddel.pod
+++ /dev/null
@@ -1,43 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPACmdDel: remove a command from an XPA command public access point>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-  #include <xpa.h>
-
-  void XPACmdDel(XPA xpa, XPACmd cmd);
-
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-This routine removes a command from the list of available commands in
-a given XPA.  That command will no longer be available for processing.
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpacmdnew.pod b/xpa/doc/pod/xpacmdnew.pod
deleted file mode 100644
index 429972b..0000000
--- a/xpa/doc/pod/xpacmdnew.pod
+++ /dev/null
@@ -1,90 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPACmdNew: create a new XPA public access point for commands>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-  #include <xpa.h>
-
-  XPA XPACmdNew(char *class, char *name);
-
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-Create a new XPA public access point for commands that will share a
-common identifier class:name. Enter this access point into the XPA
-name server, so that it can be accessed by external processes.
-XPACmdNew() returns an XPA struct.
-
-
-It often is more convenient to have one public access point that can
-manage a number of commands, rather than having individual access
-points for each command. For example, it is easier to command the
-ds9 image display using:
-
-  echo "colormap I8"   | xpaset ds9
-  echo "scale log"     | xpaset ds9
-  echo "file foo.fits" | xpaset ds9
-
-
-then to use:
-
-  echo "I8"       | xpaset ds9_colormap
-  echo "log"      | xpaset ds9_scale
-  echo "foo.fits" | xpaset ds9_file
-
-
-In the first case, the commands remain the same regardless of the
-target XPA name.  In the second case, the command names must change
-for each instance of ds9.  That is, if a second instance of ds9
-called DS9 were running, it would be commanded either as:
-
-  echo "colormap I8"   | xpaset DS9
-  echo "scale log"     | xpaset DS9
-  echo "file foo.fits" | xpaset DS9
-
-
-or as:
-
-  echo "I8"       | xpaset DS9_colormap
-  echo "log"      | xpaset DS9_scale
-  echo "foo.fits" | xpaset DS9_file
-
-
-Thus, in cases where a program is going to manage many commands, it
-generally is easier to define them as commands associated with the
-XPACmdNew() routine, rather than as separate access points using
-XPANew().
-
-
-When XPACmdNew() is called, only the class:name identifier is
-specified.  Each sub-command is subsequently defined using the
-XPACmdAdd() routine.
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpacode.pod b/xpa/doc/pod/xpacode.pod
deleted file mode 100644
index c5ea647..0000000
--- a/xpa/doc/pod/xpacode.pod
+++ /dev/null
@@ -1,73 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPACode: Where to Find Example/Test Code>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-The XPA source code directory contains two test programs,
-I<stest.c>, and I<ctest.c> that can serve as
-examples for writing XPA servers and clients, respectively.
-They also can be used to test various features of XPA.
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-
-To build the XPA test programs, execute:
-
-   make All
-
-in the XPA source directory to generate the I<stest> and
-I<ctest> programs.  (NB: this should work on all platforms,
-although we have had problems with unresolved externals on one
-Sun/Solaris machine, for reasons still unknown.)
-
-The stest program can be executed with no arguments to start
-an XPA server that contains the access points: xpa, xpa1,
-c_xpa (containing sub-commands cmd1 and cmd2), and i_xpa.
-You then can use xpaset and xpaget to interact with these access points:
-
-  cat xpa.c | xpaset xpa      # send to xpa
-  cat xpa.c | xpaset "xpa*"   # send to xpa and xpa1
-  xpaget xpa                  # receive from xpa
-  xpaget xpa*                 # receive from xpa and xpa1
-
-etc. You also can use ctest to do the same thing, or to iterate:
-
-  ctest -s -l 100 xpa        # send to xpa 100 times
-  ctest -s -l 100 "xpa*"     # send to xpa and xpa1 100 times
-  ctest -g -l 100 xpa        # receive from xpa 100 times
-  ctest -g -l 100 "xpa*"     # receive from xpa and xpa1 100 times
-
-More options are available: see the stest.c and ctest.c code itself, which
-were used extensively to debug XPA.
-
-
-The file test.tcl in the XPA source directory gives examples for using the 
-XPATclInterface.
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpacommon.pod b/xpa/doc/pod/xpacommon.pod
deleted file mode 100644
index 9fc9746..0000000
--- a/xpa/doc/pod/xpacommon.pod
+++ /dev/null
@@ -1,266 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPACommon: Getting Common Information About Access Points>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-There are various kinds of generic information you can retrieve about
-an XPA access point by using the xpaget command.
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-
-You can find out which XPA access points have been registered with
-the currently running 
-XPA name server
-by executing the
-xpaget
-command to retrieve info from the XPA name server:
-
-  xpaget xpans
-
-If, for example, the
-stest test server program
-is running, the following XPA access points will be returned (the specifics
-of the returned info will vary for different machines and users):
-
-  XPA xpa gs 838e2f67:1262 eric
-  XPA xpa1 gs 838e2f67:1266 eric
-  XPA c_xpa gs 838e2f67:1267 eric
-  XPA i_xpa i 838e2f67:1268 eric
-
-Note that access to this information is subject to the usual
-XPA Access Control restrictions.
-
-
-Each XPA access point supports a number of reserved sub-commands that provide
-access to different kinds of information, e.g. the access control for
-that access point.  These sub-commands can be executed by using
-xpaset
-or
-xpaget
-at the command line, or
-XPAGet()
-or
-XPASet()
-in programs, e.g:
-
-  xpaget ds9 -acl
-  xpaget ds9 -help
-  xpaget ds9 env FOO
-
-  xpaset -p ds9 env FOO foofoo
-
-With the exception of B<-help> and B<-version>, reserved
-sub-commands are available only on the machine on which the XPA server
-itself is running.
-
-The following reserved sub-commands are defined for all access points:
-
-
-=over 4
-
-
-
-
-
-
-=item *
-
-B<-acl> get (set) the access control list [options: host type acl, for set]
-
-
-The 'xpaset' option allows you to add a new acl for a given host, or change
-the acl for an existing host. See
-XPA Access Control
-for more information.
-This access point is available only on the server machine.
-
-
-
-
-=item *
-
-B<-env> get (set) an environment variable [options: name (value, for set)]
-
-
-The 'xpaget' option will return the value of the named environment
-variable.  The 'xpaset' option will set the value of the names
-variable to the specified value.
-This access point is available only on the server machine.
-(Please be advised that we have had problems setting environment
-variables in static Tcl/Tk programs such as ds9 running under Linux.)
-
-
-
-
-=item *
-
-B<-clipboard> set(get) information on a named clipboard
-
-
-Clients can store ASCII state information on any number of named
-clipboards. Clipboards of the same name created by clients on
-different machines are kept separate.  The syntax for creating a
-clipboard is:
-
-  [data] | xpaset [server] -clipboard add|append [clipboard_name]
-  xpaset -p [server] -clipboard delete [clipboard_name]
-
-Use "add" to create a new clipboard or replace the contents of an existing
-one. Use "append" to append to an existing clipboard.
-
-Information on a named clipboard is retrieved using:
-
-  xpaget [server] -clipboard [clipboard_name]
-
-
-
-
-=item *
-
-B<-exec> set: execute commands from buffer [options: none]
-
-
-If -exec is specified in the paramlist of an 'xpaset' call, then further
-sub-commands will be retrieved from the data buffer.
-
-
-
-
-=item *
-
-B<-help> get: return help string for this XPA or sub-command [options: name (for sub-commands)]
-
-
-Each XPA access point and each XPA sub-command can have a help string
-associated with it that is specified when the access point is defined.
-The -help option will return this help string.  For XPA access points
-that contain user-defined sub-commands, you can get the help string
-for a particular sub-command by specifying its name, or else get the
-help strings for all sub-commands if not name is specified.
-
-
-
-
-=item *
-
-B<-ltimeout> get (set) the long timeout value [options: seconds|reset]
-
-
-The 'xpaget' option will return the value of the long timeout (in seconds).
-The 'xpaset' option will set the value of the long timeout. If "reset" is
-specified, then the timeout value will be reset to the default value.
-
-
-
-
-=item *
-
-B<-nsconnect> set: re-establish name server connection to all XPA's [options: none]
-
-
-If the 
-XPA Name Server (xpans)
-process has terminated unexpectedly and then re-started, this
-sub-command can be used to re-establish the connection.  You use it by
-sending the command to the [name:port] or [file] of the access point
-instead of to the XPA name (since the latter requires the xpans
-connection!):
-
-  xpaset -p 838e2f67:1268 -nsconnect
-
-See xpans for more information.
-
-
-
-
-=item *
-
-B<-nsdisconnect> set: break name server connection to all XPA's [options: none]
-
-
-This sub-command will terminate the connection to the
-XPA Name Server (xpans), thereby making
-all access points inaccessible except through their underlying [name:port]
-or [file] identifiers.  I forget why we added it, it seems pretty useless.
-
-
-
-
-=item *
-
-B<-stimeout> get (set) the short timeout value [options: seconds|reset]
-
-
-The 'xpaget' option will return the value of the short timeout (in seconds).
-The 'xpaset' option will set the value of the short timeout. If "reset" is
-specified, then the timeout value will be reset to the default value.
-
-
-
-
-=item *
-
-B<-remote> set: register xpa with remote server [options: host[:port] [acl]] [-proxy]
-
-
-This sub-command will register the XPA access point with the XPA name
-server (xpans) on the specified host (which must already be running).
-The specified host also is given access control to the access point,
-using the specified acl or the default acl of "+" (meaning the remote
-host can xpaset, xpaget, xpainfo or xpaaccess). If the acl is
-specified as "-", then the access point is unregistered. 
-See Communication Between Machines
-for more information on how this sub-command is used.
-
-
-
-
-=item *
-
-B<-version> get: return XPA version string [options: none]
-
-
-The version refers to the version of XPA used to define this access point
-(currently something like 2.0).
-
-
-
-=back
-
-
-
-
-You can add your own reserved commands to all XPA access points by using the
-XPACmdAdd()
-routine, passing the XPA handle returned by I<XPA XPAGetReserved(void)>
-as the first argument. Note again that these will only be available on the
-machine where the XPA service is running.
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpaconvert.pod b/xpa/doc/pod/xpaconvert.pod
deleted file mode 100644
index 75597a7..0000000
--- a/xpa/doc/pod/xpaconvert.pod
+++ /dev/null
@@ -1,202 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAConvert: Converting the XPA API to 2.0>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-This document describes tips for converting from xpa 1.0 (Xt-based
-xpa) to xpa 2.0 (socket-based xpa).
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-
-The following are tips for converting from xpa 1.0 (Xt-based xpa) to
-xpa 2.0 (socket-based xpa). The changes are straight-forward and
-almost can be done automatically (we used editor macros for most of
-the conversion).
-
-
-=over 4
-
-
-
-
-
-=item *
-
-The existence of the cpp XPA_VERSION directive to distinguish between 1.0
-(where it is not defined) and 2.0 (where it is defined).
-
-
-
-
-=item *
-
-Remove the first widget argument from all send and receive server
-callbacks.  Also change first 2 arguments from XtPointer to void
-*. For example:
-
-#ifdef XPA_VERSION
-static void XPAReceiveFile(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     int len;
-#else
-static void XPAReceiveFile(w, client_data, call_data, paramlist, buf, len)
-     Widget w;
-     XtPointer client_data;
-     XtPointer call_data;
-     char *paramlist;
-     char *buf;
-     int len;
-#endif
-
-
-
-
-=item *
-
-Server callbacks should be declared as returning int instead
-of void. They now should return 0 for no errors, -1 for error.
-
-
-
-
-=item *
-
-The mode flags have changed when defining XPA server callbacks.
-The old I<S> flag (save buffer) is replaced by I<freebuf=false>.
-The old I<E> flag (empty buffer is OK) is no longer used (it
-was an artifact of the X implementation).
-
-
-
-
-=item *
-
-Change NewXPACommand() to XPAcmdNew(), with the new calling sequence:
-
-  xpa = NewXPACommand(toplevel, NULL, prefix, NULL);
-
-is changed to:
-
-  xpa = XPACmdNew(xclass, name);
-
-
-
-
-=item *
-
-Change the AddXPACommand() subroutine name to XPACmdAdd (with the same
-calling sequence):
-
-  AddXPACommand(xpa, "file",
-    "\tdisplay a new file\n\t\t  requires: filename",
-    NULL, NULL, NULL, XPAReceiveFile, text, NULL);
-
-is changed to:
-
-  XPACmdAdd(xpa, "file",
-    "\tdisplay a new file\n\t\t  requires: filename",
-    NULL, NULL, NULL, XPAReceiveFile, text, NULL);
-
-
-
-
-=item *
-
-The XPAXtAppInput() routine should be called just before XtAppMainLoop()
-to add xpa fds to the Xt event loop:
-
-  /* add the xpas to the Xt loop */
-  XPAXtAddInput(app, NULL);
-
-  /* process events */
-  XtAppMainLoop(app);
-
-
-
-
-=item *
-
-Change NewXPA() to XPANew() and call XPAXtAddInput() if the XtAppMainLoop
-routine already has been entered:
-
-  xpa = NewXPA(saotng->xim->toplevel, prefix, xparoot,
-               "FITS data or image filename\n\t\t  options: file type",
-               XPASendData, new, NULL,
-               XPAReceiveData, new, "SE");
-
-is changed to:
-
-  sprintf(tbuf, "%s.%s", prefix, xparoot);
-  xpa = XPANew("SAOTNG", tbuf,
-               "FITS data or image filename\n\t\t  options: file type",
-               XPASendData, new, NULL,
-               XPAReceiveData, new, "SE");
-  XPAXtAddInput(XtWidgetToApplicationContext(saotng->xim->toplevel), xpa);
-
-
-
-
-=item *
-
-Change XPAInternalReceiveCommand() to XPACmdInternalReceive()
-remove first argument in the calling sequence):
-
-  XPAInternalReceiveCommand(im->saotng->xim->toplevel,
-			    im->saotng, im->saotng->commands,
-			    "zoom reset", NULL, 0);
-
-is changed to:
-
-  XPACmdInternalReceive(im->saotng, im->saotng->commands,
-			"zoom reset", NULL, 0);
-
-
-
-
-=item *
-
-Change DestroyXPA to XPAFree:
-
-  DestroyXPA(im->dataxpa);
-
-is changed to:
-
-  XPAFree(im->dataxpa);
-
-
-
-=back
-
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpaenv.pod b/xpa/doc/pod/xpaenv.pod
deleted file mode 100644
index a1d095f..0000000
--- a/xpa/doc/pod/xpaenv.pod
+++ /dev/null
@@ -1,517 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAEnv: Environment Variables for XPA Messaging>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-Describes the environment variables which can be used to tailor the overall
-XPA environment.
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-
-The following environment variables are supported by XPA:
-
-
-=over 4
-
-
-
-
-
-=item *
-
-B<XPA_ACL>
-
-
-If I<XPA_ACL> is I<true>, then 
-host-based XPA Access Control
-is turned on and only specified machines can access specified access
-points.  If I<false>, then access control is turned off and any
-machine can access point. The default is turn turn access control on.
-
-
-
-
-=item *
-
-B<XPA_ACLFILE>
-
-
-If
-XPA Access Control
-is turned on, this variable specifies the name of the file containing
-access control information for all access points started by this user.
-The default file name is: I<$HOME/acls.xpa>.
-
-
-
-
-=item *
-
-B<XPA_CONNECT_TIMEOUT>
-
-
-When an XPA server first starts up, it immediately tries to
-connect to the XPA name server program (xpans) on the host specified by
-the I<XPA_NSINET> variable. (If this connection fails on the
-local host, and if xpans can be found in the path, then the name
-server is started automatically.)  Unfortunately, a mis-configured
-network can cause this connect attempt to hang for many seconds while
-the connect() system call times out. Therefore, an alarm is started
-to interrupt the connect() call and prevent a long hang.  The initial
-value of the alarm timeout is 10 seconds, but can be changed by setting
-this environment variable. If you want to disable the alarm and allow
-the initial connect() to time out, set the value of this variable to
-0. Normally, users would not change this variable at all.
-
-
-
-
-=item *
-
-B<XPA_CLIENT_DOXPA>
-
-
-Normally, an XPA client (xpaget, xpaset, etc.) will process incoming
-XPA server requests while awaiting the completion of the client request.
-Setting this variable to "false" will prevent XPA server requests from
-being processed by the client.
-
-
-
-
-=item *
-
-B<XPA_DEFACL>
-
-
-If
-XPA Access Control
-is turned on, this variable specifies the default access control
-condition for all access points, if the I<XPA_ACLFILE> file does
-not exist.  The default acl is: I<$host:* $host +>, meaning that
-all processes on the host machine have full access to all access points.
-
-
-
-
-=item *
-
-B<XPA_HOST>
-
-
-For the INET socket method, XPA utilizes the canonical hostname (as
-returned by the gethostname() routine) to construct the IP part of the
-method id. Under some circumstances, this might not be a correct choice
-of name and IP. For example, if an XPA server is started on a machine
-running VPN, you might want to use the VPN name and IP instead of the
-canonical host name, so that other machines in the VPN network can
-access the server. In this case, you can set the XPA_HOST to be
-the VPN name (if resolvable) or, more easily, the VPN IP.
-
-
-
-
-=item *
-
-B<XPA_IOCALLSXPA>
-
-
-Setting this variable causes all XPA socket IO calls to process
-outstanding XPA requests whenever the primary socket is not ready for
-IO. This means that a server making a client call will (recursively)
-process incoming server requests while waiting for client completion.
-This inter-IO XPA processing avoids a rare
-XPA Race Condition: two or more
-XPA servers sending messages to one another using an XPA client
-routine such as XPASet() can deadlock while each waits for the other
-server to respond. This can happen, for example, if the servers call
-XPAPoll() with a time limit, and send messages in between the polling call.
-
-
-By default, this option is turned off, because we judge that the added
-code complication and overhead involved will not be justified by the
-amount of its use.  Moreover, processing XPA requests within socket IO
-can lead to non-intuitive results, since incoming server requests will
-not necessarily be processed to completion in the order in which they
-are received.
-
-
-
-
-=item *
-
-B<XPA_LOGNAME>
-
-
-XPA preferentially uses the de facto standard environment variable
-LOGNAME to determine the username when registering an access point in
-the name server. If this environment variable has been used for
-something other than the actual user name (such as a log file name),
-unexpected results can ensue. In such cases, use the XPA_LOGNAME
-variable to set the user name. (If neither exists, then getpwuid(geteuid())
-is used as a last resort).
-
-
-
-
-=item *
-
-B<XPA_LONG_TIMEOUT>
-
-
-XPA is designed to allow data to be sent from one process to
-another over a long period of time (i.e., a program that generates
-image data sends that data to an image display, but slowly) but it
-also seeks to prevent hangs. This is done by supporting 2 timeout
-periods: a I<short> timeout for protocol communication
-and a I<long> for data communication.
-
-The I<XPA_LONG_TIMEOUT> variable controls the I<long>
-timeout and is used to prevent hangs in cases where communication
-between the client and server that is I<not> controlled by the
-XPA interface itself. Transfer of data between client and server, or a
-client's wait for a status message after completion of the server
-callback, are two examples of this sort of communication. By default,
-the I<long> timeout is set to 180 seconds.
-Setting the value to -1 will disable I<long> timeouts and allow
-an infinite amount of time.
-
-
-
-
-=item *
-
-B<XPA_MAXHOSTS>
-
-
-The maximum number of access points that the programs 
-I<xpaset>, I<xpaget>, and I<xpainfo> will
-communicate with at one time. The default is 64, meaning, for
-example, that the I<xpaset> program will not send a message
-to more than 100 access points at one time and I<xpaget> will
-not retrieve from more than 100 access points at one time.
-
-
-
-
-=item *
-
-B<XPA_METHOD>
-
-
-Determines the socket connection method used by this session of XPA.
-The choices are: I<inet> (to use INET or Internet-based
-sockets), I<localhost> (to use the machines localhost inet
-socket), or I<local (unix)> (to use UNIX sockets). The default
-is I<INET>.  Using the I<inet> method will allow access
-from other machines (subject to access controls) but using
-I<localhost> or I<local> will not. Localhost is most useful
-for private access and when the machine in question is not connected
-to the Internet. The unix method also can be used for private access
-and non-Internet connections (Unix platforms only).
-
-Once defined, the first registration of an XPA access point will
-ensure that an instance of the
-XPA Name Server (xpans)
-is running that handles that connection method. All new access points
-will use the new connection method but existing access points will use
-the original method.
-
-
-
-
-=item *
-
-B<XPA_NSINET>
-
-
-For the I<inet> method of socket connection, this variable
-specifies the host and port on which the 
-XPA Name Server (xpans)
-is listens for new access points. The default is I<$host:$port>,
-meaning that the default XPA port (14285) on the current machine
-(as returned by gethostname()) is used. If several machines were all
-accessing the same XPA access points, you would use this variable to
-specify that they all use the same name server to find out about these
-access points.  For example, a value of I<myhost:$port> would
-mean that the xpans name server is running on myhost and uses the
-default port 12345.  All machines would then get the XPA access points
-registered with that name server, subject to access controls.
-
-The port used by xpans to register its XPA access point normally is
-taken to be one greater than the port on which it receives new access
-points from XPA servers. You can specify a specific access point port
-using the syntax machine:port1,port2, i.e., the access point port is
-specified after the comma.  For example, $host:12345,23456 will listen
-for new access ports on 12345 and will accept XPA commands on 23456.
-
-
-
-
-=item *
-
-B<XPA_NSREGISTER>
-
-
-This boolean variable specifies whether a server registers its XPA
-access point with the specified xpans name server. The default is
-I<true>.  If set to I<false>, the access point still is
-set up but it is not registered with xpans and therefore cannot be
-accessed by name. (It can be accessed by method, if the latter is
-known.) Note that an access point can be registered later on (using
--remote or -proxy, for example). This variable mainly is useful in
-cases where the Internet configuration is broken (so that registration
-causes a DNS hang) but you still wish to and can use the server with a
-remote xpans (e.g., ds9's Virtual Observatory capability).
-
-
-
-
-=item *
-
-B<XPA_NSUNIX>
-
-
-For the I<local> method of socket connection, this variable
-specifies the name of the Unix file that will be used to access the
-XPA Name Server (xpans). The default is
-I<xpans_unix>. This variable is not usually needed. Note that
-is the I<local> socket method is used, then remote machines will
-not be able to access the xpans name server or the registered XPA access
-points.
-
-
-
-
-=item *
-
-B<XPA_NSUSERS>
-
-
-This variable specifies whether other users' access points will be
-returned by the
-XPA Name Server (xpans) for use by
-I<xpaget>, I<xpaset>, etc.
-Generally speaking, it is sufficient to run one xpans name server per
-machine and register the access points for all users with that xpans.
-This means, for example, that if you request information from
-ds9 by running:
-
-  xpaget ds9 colormap
-
-you might get information from your own ds9 as well as
-from another user running ds9 on the same machine.  The
-I<XPA_NSUSERS> variable controls whether you want such access 
-to the access points of other users.
-By default, only your own access points are returned, so
-that, in the example above, you would only get the colormap information
-from the ds9 you registered. If, however, you had set the value of the
-I<XPA_NSUSERS> variable to I<eric,fred>, then you would be
-able to communicate with both eric and fred's access points. Note that
-this variable can be overridden using the I<-u> switch on the
-I<xpaget>, I<xpaset>, and I<xpainfo> programs.
-
-
-
-
-=item *
-
-B<XPA_PORT>
-
-
-A semi-colon delimited list of user specified ports to use for specific
-XPA access points. The format is each specification is:
-
-class:template port1[ port2]
-
-where B<port1> is the main (command) port for the access point and
-B<port2> is the (secondary) data port. If port2 is not specified,
-it defaults to a value of 0 (meaning the system assigns the port).
-
-
-Specification of specific ports is useful, for example, when a machine
-outside a firewall needs to communicate with a machine inside a
-firewall. In such a case, the firewall should be configured to allow
-socket connections to both the command and data port from the outside
-machine, and the inside XPA program should be started up with the
-outside machine in its ACL list. Then, when the inside program is
-started with specified ports, outside XPA programs can use
-"machine:port" to contact the inside access points, instead of the
-access point names. That is, the machine outside the firewall does not
-need access to the XPA name server:
-
-export XPA_PORT="DS9:ds9 12345 12346"   # on machine "inside"
-cat foo.fits | xpaset inside:12345 fits # on machine "outside"
-
-Note that 2 ports are required for full XPA communication and
-therefore 2 ports should be specified to go through a firewall.  The
-second port assignment is not important if you simply are assigning
-the command port in order to communicate commands with a known
-port (e.g., to bypass the xpans name server). If only one (command)
-port is specified, the system will negotiate a random data port and
-everything will work properly.
-
-
-This support is somewhat experimental. If you run into problems, please
-let us know.
-
-
-
-
-=item *
-
-B<XPA_PORTFILE>
-
-
-A list of user-specified port to use for specific xpa access points.
-The format of the file is:
-
-class:template port1 [port2]
-
-where B<port1> is the main port for the access point and
-B<port2> is the data port. If port2 is not specified, it defaults
-to a value of 0 (meaning the system assigns the port).  See
-B<XPA_PORT> above for an explanation of user-specified ports.
-
-
-
-
-=item *
-
-B<XPA_SHORT_TIMEOUT>
-
-
-XPA is designed to allow data to be sent from one process to
-another over a long period of time (i.e., a program that generates
-image data sends that data to an image display, but slowly) but it
-also seeks to prevent hangs. This is done by supporting 2 timeout
-periods: a I<short> timeout for protocol communication
-and a I<long> for data communication.
-
-The I<XPA_SHORT_TIMEOUT> variable
-controls the I<short> timeout and is used to prevent hangs
-in cases where the XPA protocol requires internal communication between
-the client and server that is controlled by the XPA interface
-itself. Authentication is an example of this sort of communication,
-as is the establishment of a data channel between the two processes.
-The default value for the I<short> is 30 seconds (which is
-a pretty long time, actually). Setting the value to -1 will disable
-I<short> timeouts and allow an infinite amount of time.
-
-
-
-
-=item *
-
-B<XPA_SIGUSR1>
-
-
-If the value of this variable is I<true>, then XPA will
-catch SIGUSR1 signals when performing an I/O operation in order to
-curtail that operation. This facility allows users to send a SIGUSR1
-signal to an XPA server if a client is hanging up the server by
-sending or receiving data too slowly (timeouts also can be used -- see
-above). When enabled in this way, the SIGUSR1 signal is ignored at all other
-times, so that its safe to send the signal at any time.  If the
-variable is set to I<false>, then SIGUSR1 is not used at
-all. Turning off SIGUSR1 would be desired in cases there the program
-uses SIGUSR1 for some other reason and does not want XPA interfering.
-The default is to use the signal.
-
-
-
-
-=item *
-
-B<XPA_TIMESTAMP_ERRORS>
-
-
-If I<XPA_TIMESTAMP_ERRORS> is I<true>, then error
-messages will include a date/time string.  This can be useful when
-XPA errors are being saved in an error log (e.g. Web/CGI use). The
-default is false.
-
-
-=back
-
-
-
-
-
-
-=item *
-
-B<XPA_TMPDIR>
-
-
-This variable specifies the directory into which XPA logs, Unix
-socket files (when I<XPA_METHOD> is I<local>), etc. are
-stored. The default is I</tmp/.xpa>.
-
-
-
-
-=item *
-
-B<XPA_VERBOSITY>
-
-
-Specify the verbosity level of error messages. If the value is
-set to I<0>, I<false>, or I<off>, then no error
-messages are printed to stderr.  If the value is I<1>, then
-important XPA error messages will be output.  If the value is
-set to I<2>, XPA warnings about out-of-sync messages will also
-be output.  These latter almost always can be ignored.
-
-
-
-
-=item *
-
-B<XPA_VERSIONCHECK>
-
-
-Specify whether a new access point should check its major and minor XPA
-version number against the version used by the xpans name server at
-registration time. The default is I<true>. When checking is
-performed, a warning is issued if the server major version is found to
-be greater than the xpans version. Note that the check is performed
-both by the XPA server and by the xpans process and warnings will be
-issued by each.  Also, instead of the values of I<true> or
-I<false>, you can give this variable an integer value n. In this
-case, each version checking process (i.e., the XPA-enabled server or
-xpans) will print out a maximum of n warning messages (after which
-version warnings are silently swallowed).
-
-In general, it is a bad idea to run an XPA-enabled server program
-using a version of XPA newer than the basic xpaset, xpaget, xpaaccess,
-xpans programs. This sort of mismatch usually will not work due to
-protocol changes.
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpafree.pod b/xpa/doc/pod/xpafree.pod
deleted file mode 100644
index 4071fb2..0000000
--- a/xpa/doc/pod/xpafree.pod
+++ /dev/null
@@ -1,49 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAFree: remove an XPA public access point>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-  #include <xpa.h>
-
-  int XPAFree(XPA xpa);
-
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-Remove the specified XPA public access point from the name server and
-free all associated storage.  Note that removal from the name server
-happens automatically when the process terminates, so this call is not
-generally needed.  It is used when public access points are being
-defined temporarily and then destroyed when no longer needed.  For
-example, ds9 temporarily creates a public access point when it
-loads a new image for display and destroys it when the image is
-unloaded.
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpaget.pod b/xpa/doc/pod/xpaget.pod
deleted file mode 100644
index 77e771b..0000000
--- a/xpa/doc/pod/xpaget.pod
+++ /dev/null
@@ -1,67 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<xpaget: retrieve data from one or more XPA servers>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-xpaget [-h] [-i nsinet] [-m method] [-s] [-t sval,lval] [-u users] <template|host:port> [paramlist]
-
-
-
-
-
-=head1 OPTIONS
-
-
-
-
-
-  -h		print help message
-  -i		access XPA point on different machine (override XPA_NSINET)
-  -m		override XPA_METHOD environment variable
-  -n		don't wait for the status message after server completes
-  -s		enter server mode
-  -t [s,l]	set short and long timeouts (override XPA_[SHORT,LONG]_TIMEOUT)
-  -u [users]	XPA points can be from specified users (override XPA_NSUSERS)
-  --version     display version and exit
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-Data will be retrieved from access points matching the 
-template
-or host:port.
-A set of qualifying parameters can be appended.
-
-B<Examples:>
-
-  csh> xpaget ds9 images
-  csh> xpaget myhost.harvard.edu:12345
-
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpagetfd.pod b/xpa/doc/pod/xpagetfd.pod
deleted file mode 100644
index 5be9cfc..0000000
--- a/xpa/doc/pod/xpagetfd.pod
+++ /dev/null
@@ -1,133 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAGetFd: retrieve data from one or more XPA servers and write to files>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-  #include <xpa.h>
-
-  int XPAGetFd(XPA xpa,
-               char *template, char *paramlist, char *mode,
-	       int *fds, char **names, char **messages, int n);
-
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-Retrieve data from one or more XPA servers whose class:name identifier
-matches the specified
-template
-and write it to files associated with
-one or more standard I/O fds (i.e, handles returned by open()).
-
-
-A 
-template
-of the form "class1:name1" is sent to the
-XPA name server, which returns a list of at most ABS(n) matching XPA
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an XPA struct is passed to the call, then the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers (which will be closed
-when the call completes).
-
-
-The XPAGetFd() routine then retrieves data from the XPA servers,
-and write these data to the fds associated with one or more fds
-(i.e., results from open). Is n is positive, then there will be n fds
-and the data from each server will be sent to a separate fd. If n is
-negative, then there is only 1 fd and all data is sent to this single
-fd. (The latter is how xpaget is implemented.)
-
-
-A string containing the class:name and ip:port is stored in the name
-array.  If a given server returned an error or the server callback
-sends a message back to the client, then the message will be stored in
-the associated element of the messages array.  NB: if specified, the
-name and messages arrays must be of size n or greater.
-
-
-The returned message string will be of the form:
-
-  XPA$ERROR   error-message (class:name ip:port)
-
-or
-
-  XPA$MESSAGE message 	  (class:name ip:port)
-
-
-Note that when there is an error stored in an messages entry, the
-corresponding bufs and lens entry may or may not be NULL and 0
-(respectively), depending on the particularities of the server.
-
-
-The return value will contain the actual number of servers that were
-processed.  This value thus will hold the number of valid entries in
-the bufs, lens, names, and messages arrays, and can be used to loop
-through these arrays.  In names and/or messages is NULL, no information is
-passed back in that array.
-
-
-The mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-
-  key   	value		default		explanation
-  ------	--------	--------	-----------
-  ack		true/false	true		if false, don't wait for ack from server (after callback completes)
-
-
-The ack keyword is not very useful, since the server completes the callback
-in order to return the data anyway.  It is here for completion (and perhaps
-for future usefulness).
-					   
-
-B<Example:>
-
-  #include <xpa.h>
-  #define NXPA 10
-  int  i, got;
-  int fds[NXPA];
-  char *names[NXPA];
-  char *messages[NXPA];
-  for(i=0; i<NXPA; i++)
-    fds[i] = open(...);
-  got = XPAGetFd(NULL, "ds9", "file", NULL, fds, names, messages, NXPA);
-  for(i=0; i<got; i++){
-    if( messages[i] != NULL ){
-      /* error processing */
-      fprintf(stderr, "ERROR: %s (%s)\n", messages[i], names[i]);
-    }
-    if( names[i] )
-      free(names[i]);
-    if( messages[i] )
-      free(messages[i]);
-  }
-
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpainet.pod b/xpa/doc/pod/xpainet.pod
deleted file mode 100644
index 40793a0..0000000
--- a/xpa/doc/pod/xpainet.pod
+++ /dev/null
@@ -1,285 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAInet: XPA Communication Between Hosts>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-XPA uses standard inet sockets to support communication between two or
-more host computers.
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-
-When the Communication Method is set to
-B<inet> (as it is by default), XPA can be used to communicate
-between different computers on the Internet.  INET sockets utilize the
-IP address of the given machine and a (usually random) port number to
-communicate between processes on the same machine or between different
-machines on the Internet.  These standard Internet sockets are also
-used by programs such as Netscape, ftp. etc.
-
-
-XPA supports a host-based Access Control mechanism
-to prevent unauthorized access of XPA access points by other computers
-on the Net.  By default, only the machine on which the XPA server is
-running can access XPA services. Therefore, setting up communication
-between a local XPA server machine and a remote client machine
-requires a two-part registration process:
-
-
-
-=over 4
-
-
-
-
-=item *
-
-the XPA service on the local machine must be made known to the 
-remote machine
-
-
-=item *
-
-the remote machine must be given permission to access the local
-XPA service
-
-
-=back
-
-
-
-Three methods by which this remote registration can be accomplished
-are described below.
-
-B<Manual Registration>
-
-The first method is the most basic and does not require the remote
-client to have xpans running.  To use it, the local server simply
-gives a remote client machine access to one or more XPA access points
-using xpaset and the B<-acl> sub-command. For example,
-consider the XPA test program "stest" running on a local machine.  By
-default the access control for the access point named "xpa" is
-restricted to that machine:
-
-  [sh]$ xpaget xpa -acl
-  *:* 123.456.78.910 gisa
-  *:* localhost gisa
-
-Using xpaset and the B<-acl> sub-command, a remote client
-machine can be given permission to perform xpaget, xpaset, xpaaccess,
-or xpainfo operations.  For example, to allow the xpaget operation, the
-following command can be issued on the local machine:
-
-  [sh]$ xpaset -p xpa -acl "remote_machine g"
-
-This results in the following access permissions on the local machine:
-
-  [sh]$ xpaget xpa -acl
-  XPA:xpa 234.567.89.012 g
-  *:* 123.456.78.910 gisa
-  *:* localhost gisa
-
-
-The remote client can now use the local server's xpans name server to
-establish communication with the local XPA service. This can be done
-on a call-by-call basis using the B<-i> switch on xpaset, xpaget, etc:
-
-  [sh]$ xpaget -i "local_machine:12345" xpa
-  class: XPA
-  name: xpa
-  method: 88877766:2778
-  sendian: little
-  cendian: big
-
-Alternatively, the XPA_NSINET variable on the remote machine can be
-set to point directly to xpans on the local machine, removing
-the need to override this value each time an XPA program is run:
-
-  [csh]$ setenv XPA_NSINET 'karapet:$port'
-  [csh]$ xpaget xpa
-  class: XPA
-  name: xpa
-  method: 88877766:2778
-  sendian: little
-  cendian: big
-
-Here, '$port' means to use the default XPA name service port (14285).
-not a port environment variable.
-
-
-Access permission for remote client machines can be stored in a file
-on the local machine pointed to by the B<XPA_ACLFILE> environment
-variable or using the B<XPA_DEFACL> environment variable. See <A
-HREF="./acl.html">XPA Access Control for more information.
-
-B<Remote Registration>
-
-If xpans is running on the remote client machine, then a local xpaset
-command can be used with the B<-remote> sub-command to
-register the local XPA service in the remote name service, while at
-the same time giving the remote machine permission to access the local
-service.  For example, assume again that "stest" is running on the
-local machine and that xpans is also running on the remote machine.
-To register access of this local xpa on the remote machine, use 
-the xpaset and the B<-remote> sub-command:
-
-  [sh]$ ./xpaset -p xpa -remote 'remote_machine:$port' +
-
-To register the local xpa access point on the remote machine with xpaget
-access only, execute:
-
-  [sh]$ ./xpaset -p xpa -remote 'remote_machine:$port' g
-
-Once the remote registration command is executed, the remote client
-machine will have an entry such as the following in its own xpans name
-service:
-
-  [csh]$ xpaget xpans
-  XPA xpa gs 88877766:2839 eric
-
-The xpa access point can now be utilized on the remote machine without
-further setup:
-
-  [csh]$ xpaget xpa
-  class: XPA
-  name: xpa
-  method: 838e2f68:2839
-  sendian: little
-  cendian: big
-
-To unregister remote access from the local machine, use the same
-command but with a '-' argument:
-
-  [sh]$ xpaset -p xpa -remote 'remote_machine:$port' -
-
-The benefit of using remote registration is that communication with
-remote access points can be mixed with that of other access points
-on the remote machine.  Using Access Point
-Names and Templates, one XPA command can be used to send or
-receive messages to the remote and local services.
-
-B<XPANS Proxy Registration>
-
-The two methods described above are useful when the local and remote
-machines are able to communicate freely to one another. This would be
-the case on most Local Area Networks (LANs) where all machines are
-behind the same firewall and there is no port blocking between
-machines on the same LAN.  The situation is more complicated when the
-XPA server is behind a firewall, where outgoing connections are
-allowed, but incoming port blocking is implemented to prevent machines
-outside the firewall from connecting to machines inside the
-firewall. Such incoming port blocking will prevent xpaset and xpaget
-from connecting to an XPA server inside a firewall.
-
-
-To allow locally fire-walled XPA services to register with remote
-machines, we have implemented a proxy service within the xpans name
-server. To register remote proxy service, xpaset and the
-B<-remote> sub-command is again used, but with an additional
-B<-proxy> argument added to the end of the command:
-
-  [sh]$ ./xpaset -p xpa -remote 'remote_machine:$port' g -proxy
-
-Once a remote proxy registration command is executed, the remote
-machine will have an entry such as the following in its own xpans name
-service:
-
-  [csh]$ xpaget xpans
-  XPA xpa gs @88877766:2839 eric
-
-The '@' sign in the name service entry indicates that xpans proxy
-processing is being used for this access point. Other than that, from
-the user's point of view, there is no difference in how this XPA
-access point is contacted using XPA programs (xpaset, xpaget, etc.) or
-libraries:
-
-  [csh]$ xpaget xpa
-  class: XPA
-  name: xpa
-  method: 88877766:3053
-  sendian: little
-  cendian: big
-
-
-Of course, the underlying processing of the XPA requests is very much
-different when xpans proxy is involved. Instead of an XPA program such
-contacting the XPA service directly, it contacts the local xpans.
-Acting as a proxy server, xpans communicates with the XPA service
-using the command channel established at registration time. Commands
-(including establishing a new data channel) are sent between xpans and
-the XPA service to set up a new message transfer, and then data is fed
-to/from the xpa request, through xpans, from/to the XPA service. In
-this way, it can be arranged so that connections between the
-fire-walled XPA service and the remote client are always initiated by
-the XPA service itself. Thus, incoming connections that would be
-blocked by the firewall are avoided. Note that there is a performance
-penalty for using the xpans/proxy service.  Aside from extra overhead
-to set up proxy communication, all data must be sent through the
-intermediate proxy process.
-
-
-The xpans proxy scheme requires that the remote client allow the local
-XPA server machine to connect to the remote xpans/proxy server. If the
-remote client machine also is behind a port-blocking firewall, such
-connections will be disallowed. In this case, the only solution is to
-open up some ports on the remote client machine to allow incoming
-connections to xpans/proxy. Two ports must be opened (for command and
-data channel connections). By default, these two ports are 14285 and
-14287. The port numbers can be changed using the B<XPA_NSINET>
-environment variable. This variable takes the form:
-
-  setenv XPA_NSINET machine:port1[,port2[,port3]]
-
-where port1 is the main connecting port, port2 is the XPA access port,
-and port3 is the secondary data connecting port. The second and third
-ports are optional and default to port1+1 and port1+2, respectively.
-It is port1 and port3 that must be left open for incoming connections.
-
-
-For example, to change the port assignments so that xpans listens
-for registration commands on port 12345 and data commands on port 28573:
-
-  setenv XPA_NSINET myhost:12345
-
-Alternatively, all three ports can be assigned explicitly:
-
-  setenv XPA_NSINET remote:12345,3000,12346
-
-In this case 12345 and 12346 should be open for incoming connections.
-The XPA access port (which need not be open to the outside
-world) is set to 3000.
-
-
-Finally, note that we currently have no mechanism to cope with
-Internet proxy servers (such as SOCKS servers). If an XPA service is
-running on a machine that cannot connect directly to outside machines,
-but goes through a proxy server instead, there currently is no way to
-register that XPA service with a remote machine.  We hope to implement
-support for SOCKS proxy in a future release.
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpainfo.pod b/xpa/doc/pod/xpainfo.pod
deleted file mode 100644
index 65fdb3e..0000000
--- a/xpa/doc/pod/xpainfo.pod
+++ /dev/null
@@ -1,66 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<xpainfo: send short message to one or more XPA servers>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-xpainfo [-h] [-i nsinet] [-m method] [-n] [-s] [-t sval,lval] [-u users] <template|host:port> [paramlist]
-
-
-
-
-
-=head1 OPTIONS
-
-
-
-
-
-  -h		print help message
-  -i		access XPA point on different machine (override XPA_NSINET)
-  -m		override XPA_METHOD environment variable
-  -n		don't wait for the status message after server completes
-  -s		enter server mode
-  -t [s,l]	set short and long timeouts (override XPA_[SHORT,LONG]_TIMEOUT)
-  -u [users]	XPA points can be from specified users (override XPA_NSUSERS)
-  --version     display version and exit
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-Info will be sent to access points matching the
-template
-or host:port.
-A set of qualifying parameters can be appended.
-
-B<Examples:>
-
-  csh> xpainfo IMAGE ds9 image
-
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpainfonew.pod b/xpa/doc/pod/xpainfonew.pod
deleted file mode 100644
index ae54f54..0000000
--- a/xpa/doc/pod/xpainfonew.pod
+++ /dev/null
@@ -1,92 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAInfoNew: define an XPA info public access point>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-  #include <xpa.h>
-
-  XPA XPAInfoNew(char *class, char *name,
-	         int (*info_callback)(),
-		 void *info_data, char *info_mode);
-
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-[NB: this is an experimental interface, new to XPA 2.0, whose value
-and best use is evolving.]
-
-
-A program can register interest in receiving a short message about a
-particular topic from any other process that cares to send such a
-message.  Neither has to be an XPA server.  For example, if a user
-starts to work with a new image file called new.fits, she might
-wish to alert interested programs about this new file by sending a
-short message using xpainfo:
-
-  xpainfo IMAGEFILE /data/new.fits
-
-
-
-In this example, each process that has used the XPAInfoNew() call to
-register interest in messages associated with the identifier IMAGEFILE
-will have its info_callback() executed with the following calling
-sequence:
-
-  int info_cb(void *info_data, void *call_data, char *paramlist)
-  {
-    XPA xpa = (XPA)call_data;
-  }
-
-
-The arguments passed to this routine are equivalent to those sent in
-the send_callback() routine.  The main difference is that there is no
-buf sent to the info callback: this mechanism is meant for short
-announcement of messages of interest to many clients.
-
-
-The mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-
-  key   	value		default		explanation
-  ------	--------	--------	-----------
-  acl		true/false	true		enable access control
-
-
-Because no buf is passed to this callback, the usual buf-related keywords
-are not applicable here.
-
-
-The information sent in the parameter list is arbitrary.  However, we
-envision sending information such as file names or XPA access points
-from which to collect more data.  Note that the xpainfo program and
-the XPAInfo() routine that cause the info_callback to execute do not
-wait for the callback to complete before returning.
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpaintro.pod b/xpa/doc/pod/xpaintro.pod
deleted file mode 100644
index 31ce14f..0000000
--- a/xpa/doc/pod/xpaintro.pod
+++ /dev/null
@@ -1,176 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAIntro: Introduction to the XPA Messaging System>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-A brief introduction to the XPA messaging system, which provides
-seamless communication between all kinds of Unix event-driven
-programs, including X programs, Tcl/Tk programs, and Perl programs.
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-
-The XPA messaging system provides seamless communication between all
-kinds of Unix programs, including X programs, Tcl/Tk programs, and
-Perl programs.  It also provides an easy way for users to communicate
-with these XPA-enabled programs by executing XPA client commands in
-the shell or by utilizing such commands in scripts.  Because XPA works
-both at the programming level and the shell level, it is a powerful
-tool for unifying any analysis environment: users and programmers have
-great flexibility in choosing the best level or levels at which to
-access XPA services, and client access can be extended or modified
-easily at any time.
-
-
-A program becomes an XPA-enabled server by defining named points of
-public access through which data and commands can be exchanged with
-other client programs (and users).  Using standard TCP sockets as
-a transport mechanism, XPA supports both single-point and broadcast
-messaging to and from these servers.  It supports direct communication
-between clients and servers, or indirect communication via an
-intermediate message bus emulation program. Host-based access control
-is implemented, as is as the ability to communicate with XPA servers
-across a network.
-
-
-XPA implements a layered interface that is designed to be useful both
-to software developers and to users.  The interface consists of a
-library of XPA client and server routines for use in programs and a
-suite of high-level user programs built on top of these libraries.
-Using the XPA library, access points can be added to
-Tcl/Tk
-programs, 
-Xt
-programs, or to Unix programs that use the XPA event loop or any
-event loop based on select().  Client access subroutines can be added
-to any Tcl/Tk or Unix program. Client access also is supported at the
-command line via a suite of high-level programs. 
-
-
-The major components of the XPA layered interface are:
-
-
-=over 4
-
-
-
-
-=item *
-
-A set of XPA server routines, centered on 
-XPANew(),
-which are used by XPA server programs to tag public access points with
-string identifiers and to register send and receive callbacks for
-these access points.
-
-
-
-=item *
-
-A set of XPA client routines, centered on the 
-XPASet()
-and
-XPAGet(),
-which are used by external client applications to exchange data and
-commands with an XPA server.
-
-
-
-=item *
-
-High-level programs, centered on
-xpaset
-and
-xpaget,
-which allow data
-and information to be exchanged with XPA server programs from the
-command line and from scripts.  These programs have the command syntax:
-
-  [data] | xpaset  [qualifiers ...]
-           xpaget  [qualifiers ...]
-
-
-
-=item *
-
-An XPA name server program, 
-xpans,
-through which XPA access point names are
-registered by servers and distributed to clients.
-
-
-=back
-
-
-
-
-Defining an XPA access point is easy: a server application calls
-XPANew(),
-XPACmdNew(),
-or the experimental
-XPAInfoNew()
-routine to
-create a named public access point.  An XPA service can specify "send"
-and "receive" callback procedures (or an "info" procedure in the case
-of XPAInfoNew()) to be executed by the program when an external
-process either sends data or commands to this access point or requests
-data or information from this access point.  Either of the callbacks
-can be omitted, so that a particular access point can be specified as
-read-only, read-write, or write-only.  Application-specific client
-data can be associated with these callbacks.  Having defined one or
-more public access points in this way, an XPA server program enters
-its usual event loop (or uses the standard XPA event loop).
-
-
-Clients communicate with these XPA public access points
-using programs such as
-xpaget,
-xpaset, and
-xpainfo
-(at the command line),
-or routines such as
-XPAGet(),
-XPASet(),
-and
-XPAInfo()
-within a program.  Both methods require specification of the name of
-the access point.  The xpaget program returns data or other
-information from an XPA server to its standard output, while the
-xpaset program sends data or commands from its standard input to an
-XPA application. The corresponding API routines set/get data to/from
-memory, returning error messages and other info as needed.  If a
-template
-is used to specify the access point name (e.g., "ds9*"), then
-communication will take place with all servers matching that template.
-
-
-Please note that XPA currently is not thread-safe. All XPA calls must be
-in the same thread.
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpamacros.pod b/xpa/doc/pod/xpamacros.pod
deleted file mode 100644
index 786e04b..0000000
--- a/xpa/doc/pod/xpamacros.pod
+++ /dev/null
@@ -1,76 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPA Server Callback Macros>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-  #include <xpa.h>
-
-  xpa_class, xpa_name, xpa_method, xpa_cmdfd, xpa_datafd,
-  xpa_sendian, xpa_cendian
-
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-Server routines have  access to information about the XPA being called via
-the following macros (each of which takes the xpa handle as an argument):
-
-  macro		 	explanation
-  ------		-----------
-  xpa_class		class of this xpa
-  xpa_name		name of this xpa
-  xpa_method		method string (inet or local connect info)
-  xpa_cmdfd		fd of command socket
-  xpa_datafd		fd of data socket
-  xpa_sendian		endian-ness of server ("little" or "big")
-  xpa_cendian		endian-ness of client ("little" or "big"
-
-
-The argument to these macros is the call_data pointer that is passed
-to the server procedure.  This pointer should be type case to XPA
-in the server routine:
-
-  XPA xpa = (XPA)call_data;
-
-
-
-The most important of these macros is xpa_datafd().  A server routine
-that sets "fillbuf=false" in receive_mode or send_mode can use this
-macro to perform I/O directly to/from the client, rather than using
-buf.
-
-
-The xpa_cendian and xpa_sendian macros can be used together to determine
-if the data transferred from the client is byte swapped with respect
-to the server. Values for these macros are: "little", "big", or "?".
-In order to do a proper conversion, you still need to know the format
-of the data (i.e., byte swapping is dependent on the size of the data
-element being converted).
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpamainloop.pod b/xpa/doc/pod/xpamainloop.pod
deleted file mode 100644
index 4fabf8e..0000000
--- a/xpa/doc/pod/xpamainloop.pod
+++ /dev/null
@@ -1,108 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAMainLoop: optional main loop for XPA>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-  #include <xpa.h>
-
-  void XPAMainLoop();
-
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-Once XPA access points have been defined, a program must enter an
-event loop to watch for requests from external programs. This can be
-done in a variety of ways, depending on whether the event loop is
-processing events other than XPA events.  In cases where there are no
-non-XPA events to be processed, the program can simply call the
-XPAMainLoop() event loop.  This loop is implemented essentially as
-follows (error checking is simplified in this example):
-
-  FD_ZERO(&readfds);
-  while( XPAAddSelect(NULL, &readfds) ){
-    if( sgot = select(swidth, &readfds, NULL, NULL, NULL) >0 )
-      XPAProcessSelect(&readfds, 0);
-    else
-      break;
-    FD_ZERO(&readfds);
-  }
-
-
-The XPAAddSelect() routine sets up the select() readfds variable so
-that select() will wait for I/O on all the active XPA channels.  It
-returns the number of XPAs that are active; the loop will end when
-there are no active XPAs. The standard select() routine is called to
-wait for an external I/O request.  Since no timeout struct is passed
-in argument 5, the select() call hangs until there is an external
-request.  When an external I/O request is made, the XPAProcessSelect()
-routine is executed to process the pending requests.  In this routine,
-the maxreq value determines how many requests will be processed: if
-maxreq <=0, then all currently pending requests will be processed.
-Otherwise, up to maxreq requests will be processed.  (The most usual
-values for maxreq is 0 to process all requests.)
-
-
-If a program has its own Unix select() loop, then XPA access points can
-be added to it by using a variation of the standard XPAMainLoop:
-
-  XPAAddSelect(xpa, &readfds);
-  [app-specific ...]
-  if( select(width, &readfds, ...) ){
-    XPAProcessSelect(&readfds, maxreq);
-    [app-specific ...]
-    FD_ZERO(&readfds);
-  }
-
-
-XPAAddSelect() is called before select() to add the access points.
-If the first argument is NULL, then all active XPA access points
-are added. Otherwise only the specified access point is added.
-After select() is called, the XPAProcessSelect() routine can be called
-to process XPA requests.  Once again, the maxreq value determines how
-many requests will be processed: if maxreq <=0, then all currently
-pending requests will be processed.  Otherwise, up to maxreq requests
-will be processed.
-
-
-XPA access points can be added to
-Xt event loops (using XtAppMainLoop())
-and
-Tcl/Tk event loops (using vwait and the Tk loop).
-When using XPA with these event loops, you only need to call:
-
-int XPAXtAddInput(XtAppContext app, XPA xpa)
-
-or
-
-  int XPATclAddInput(XPA xpa)
-
-respectively before entering the loop.
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpamb.pod b/xpa/doc/pod/xpamb.pod
deleted file mode 100644
index b1b97d4..0000000
--- a/xpa/doc/pod/xpamb.pod
+++ /dev/null
@@ -1,249 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<xpamb: the XPA Message Bus>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-The xpamb program can act as a "classical" message bus interface
-between clients and servers. A client can send a data request to
-the message bus, which then interfaces with multiple servers and
-returns the data back to the client.
-
-
-
-=head1 OPTIONS
-
-
-
-
-
-For xpaset, several optional switches are used to save data and
-manipulate the stored data:
-
-
-=over 4
-
-
-
-
-
-
-=item *
-
-B<-data [name]>
-
-
-Add the supplied data buffer to a pool of stored data buffers,
-using the specified name as a unique identifier for later retrieval.
-An error occurs if the name already exists (use either B<replace>
-or B<del> to rectify this). The B<-add> switch is supported
-for backwards compatibility with xpa 2.0.
-
-
-
-
-=item *
-
-B<-replace [name]>
-
-
-Replace previously existing stored data having the same unique name
-with new data. This essentially is a combination of the B<del>
-and B<data> commands.
-
-
-
-
-=item *
-
-B<-info ["'info string'"]>
-
-
-When adding a data buffer, you can specify an informational
-string to be stored with that data.  This string will be returned
-by xpaget:
-
-  xpaget xpamb foo -info
-
-(along with other information such as the date/time of storage and the size of
-the data buffer) if the -info switch is specified. If the info string contains
-spaces, you must enclose it in B<two> sets of quotes:
-
-  cat foo | xpaset xpamb -store foo -info "'this is info on foo'"
-
-The first set of quotes is removed by the shell while the second is used to
-delineate the info string.
-
-
-
-
-=item *
-
-B<-send [name]>
-
-
-Broadcast the stored data buffer to the named template.
-
-
-
-
-=item *
-
-B<-del [name]>
-
-
-Delete the named data buffer and free all allocated space.
-
-
-=back
-
-
-
-
-Switches can be used in any combination that makes sense. For example:
-
-  cat foo.fits | xpaset xpamb -store foo -info "FITS" "DS9:*" fits foo.fits
-
-will broadcast the foo.fits image to all access points of class
-B<DS9>.  In addition, the foo.fits file will be stored under the
-name of B<foo> for later manipulation such as:
-
-  xpaset -p xpamb -send foo "DS9:*" fits foo.fits
-
-will re-broadcast the foo.fits image to all access points of class "DS9".
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-
-A "classical" message bus (such as ToolTalk) consists of servers and
-clients, along with a mediating program that transfers data between
-different processes. XPA takes a slightly different approach in that
-communication between clients and servers is direct.  This generally
-is the correct technique when there is only one connection (or even a
-small number of connections), but can become inefficient for the
-serving program if a large amount of data is being transferred to many
-clients. For example, if a real-time data acquisition program is
-broadcasting a FITS image to several clients, it would need to
-transmit that image to each client individually.  This might interfere
-with its own processing cycles.  The preferable mechanism would be to
-pass the image off to an intermediate program that can then broadcast
-the data to the several clients.
-
-The B<xpamb> program can alleviate such problems by functioning
-as a message bus in cases where such an intermediary process is
-wanted.  It pre-defines a single access point named
-B<XPAMB:xpamb> to which data can be sent for re-broadcast. You
-also can tell B<xpamb> to save the data, and associate with that
-data a new access point, so that it can be retrieved later on.
-
-
-All interaction with B<xpamb> is performed through
-B<xpaset> and B<xpaget> (or the corresponding API
-routines, B<XPASet()> and B<XPAGet()>) to the
-B<XPAMB:xpamb> access point. That is, B<xpamb> is just
-another XPA-enabled program that responds to requests from
-clients. The paramlist is used to specify the targets to which
-the data will be for re-broadcast, as well as the re-broadcast paramlist:
-
-  data | xpaset xpamb [switches] broadcast-target broadcast-paramlist
-
-Optional switches are used to store data, and manipulate stored data,
-and are described below.
-
-
-In its simplest form, you can, for example, send a FITS image to xpamb for
-broadcasting to all ds9 image simply by executing:
-
-  cat foo.fits | xpaset xpamb "DS9:*" fits foo.fits
-
-Since B<DS9> is the class name for the ds9 image display
-program, this will result in the FITS image being re-sent to all fits
-access points for all active image display programs.
-
-
-You can send stored data and new data to the same set of access points at
-the same time.  The stored data always is send first, followed by the new
-data:
-
-  cat foo2.fits | xpaset xpamb -send foo "DS9:*" fits foo.fits
-
-will first send the foo.fits file, and then the foo2.fits file to all
-access points of class B<DS9>.  Notice that in this example,
-the foo2.fits file is not stored, but it could be stored by using the
-B<-store [name]> switch on the command line.
-
-
-The B<xpaget> command can be used to retrieve a data from XPA
-access points or from a stored data buffer, or retrieve information
-about a stored data buffer.  If no arguments are given:
-
-  xpaget xpamb
-
-then information about all currently stored data buffers is returned. This
-information includes the data and time at which the data was stored, the
-size in bytes of the data, and the supplied info string.
-
-
-If arguments are specified, they will be in the form:
-
-  xpaget xpamb [-info] [-data] [name [paramlist]]
-
-If the optional B<-info> and/or B<-data> switches are specified, then
-information and/or data will be returned for the named data buffer
-following the switches. You can use either or both of these switches
-in a single command. For example, if the -info switch is used:
-
-  xpaget xpamb -info foo
-
-then the info about that stored data buffer will be returned.
-If the -data is used with a specific name:
-
-  xpaget xpamb -data foo
-
-then the stored data itself will be returned. If both are used:
-
-  xpaget xpamb -info -data foo
-
-then the info will be returned, followed by the data. Note that it is an
-error to specify one of these switches without a data buffer name and that
-the paramlist will be ignored.
-
-
-If neither the B<-info> or B<-data> switch is specified, then
-the name refers to an XPA access point (with an optional paramlist
-following).
-For example:
-
-  xpaget xpamb ds9 file
-
-is equivalent to:
-
-  xpaget ds9 file
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpamethod.pod b/xpa/doc/pod/xpamethod.pod
deleted file mode 100644
index 038ac4e..0000000
--- a/xpa/doc/pod/xpamethod.pod
+++ /dev/null
@@ -1,99 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAMethod: XPA Communication Methods>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-XPA supports both inet and unix (local) socket communication.
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-
-XPA uses sockets for communication between processes. It supports
-three methods of socket communication: inet, localhost, and unix. In
-general, the same method should be employed for all XPA processes in a
-session and the global environment variable XPA_METHOD should be used
-to set up the desired method. By default, the preferred method is
-"inet", which is appropriate for most users. You can set up a
-different method by typing something like:
-
-  setenv XPA_METHOD local              # unix csh
-  XPA_METHOD=local; export XPA_METHOD  # unix sh, bash, windows/cygwin
-  set XPA_METHOD=localhost             # dos/windows
-
-The options for XPA_METHOD are: B<inet>, B<unix> (or
-B<local>), and B<localhost>. On Unix machines, this
-environment setup command can be placed in your shell init file
-(.cshrc, .profile, .bashrc, etc.) On Windows platforms, it can be
-placed in your AUTOEXEC.BAT file (I think!).
-
-
-By default, B<inet> sockets are used by XPA. These are the standard
-Internet sockets that are used by programs such as Netscape,
-ftp. etc. Inet sockets utilize the IP address of the given machine and
-a (usually random) port number to communicate between processes on the
-same machine or between different machines on the Internet. (Note that
-XPA has an Access Control mechanism to
-prevent unauthorized access of XPA access points by other computers on
-the Net). For users connected to the Internet, this usually is the
-appropriate communication method. For more information about setting
-up XPA communication between machines, see
-Communication Between Machines.
-
-
-In you are using XPA on a machine without an Internet connection, then
-inet sockets are not appropriate. In fact, an XPA process often will
-hang for many seconds while waiting for a response from the Domain
-Name Service (DNS) when using inet sockets. Instead of inet sockets,
-users on Unix platforms can also use B<unix> sockets (also known
-as local sockets). These sockets are based on the local file system
-and do not make use of the DNS. They generally are considered to be
-faster than inet sockets, but they are not implemented under
-Windows. Use local sockets as a first resort if you are on a Unix
-machine that is not connected to the Internet.
-
-
-Users not connected to the Internet also can use B<localhost>
-sockets. These are also inet-type sockets but the IP address used for
-the local machine is the B<localhost> address, 0x7F000001, instead
-of the real IP of the machine. Depending on how sockets are set up for
-a given platform, communication with the DNS usually is not required in
-this case (though of course, XPA cannot interact with other machines).
-The localhost method will generally work on both Unix and Windows
-platforms, but whether the DNS is required or not is subject to
-individual configurations.
-
-
-A final warning/reminder: if your XPA-enabled server hangs at startup
-time and your XPA_METHOD is B<inet>, the problem probably is
-related to an incorrect Internet configuration. This can be confirmed
-by using the B<unix> method or (usually) the B<localhost>
-method. You can use these alternate methods if other hosts do not need
-access to the XPA server.
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpaname.pod b/xpa/doc/pod/xpaname.pod
deleted file mode 100644
index 7c0ea8d..0000000
--- a/xpa/doc/pod/xpaname.pod
+++ /dev/null
@@ -1,56 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAName: What does XPA stand for?>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-What does XPA stand for? Who knows anymore!
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-
-What does XPA stand for? Dunno! The XPA messaging system originally
-was built on top of the X Window System and XPA was the mnemonic for
-I<X Public Access>, to emphasize that we were providing public
-access to previously private data and algorithms in Xt programs.  Now
-that XPA no longer is tied to X, it can be argued that we ought to
-change the name (how about SPAM: simple public access mechanism
-), but XPA is in wide-spread use in the astronomical community of
-its birth, and the name has taken on a life of its own. If anyone can
-think of what XPA now means, please let us know.
-
-
-If you think this is bad, consider the MMT Telescope on Mount Hopkins,
-Arizona. When first installed twenty years ago, it featured an array
-of six 72-inch diameter mirrors. from which came its name: the
-I<Multiple Mirror Telescope>.  In spring of 1999, these mirrors
-were replaced by a single 21 and 1/2 -foot diameter primary mirror,
-the largest single-piece glass reflector on the North American
-continent. And now MMT stands for ... MMT!
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpanew.pod b/xpa/doc/pod/xpanew.pod
deleted file mode 100644
index 1a3800f..0000000
--- a/xpa/doc/pod/xpanew.pod
+++ /dev/null
@@ -1,243 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPANew: create a new XPA access point>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-  #include <xpa.h>
-
-  XPA XPANew(char *class, char *name, char *help,
-	     int (*send_callback)(),
-	     void *send_data, char *send_mode,
-	     int (*rec_callback)(),
-	     void *rec_data,  char *rec_mode);
-
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-Create a new XPA public access point with the class:name
-identifier template
-and enter this access point into the XPA name server, so that it
-can be accessed by external processes. XPANew() returns an XPA struct.
-Note that the length of the class and name designations must be less
-than or equal to 1024 characters each.
-
-
-The XPA name server daemon, xpans, will be started automatically if it
-is not running already (assuming it can be found in the path).  The
-program's ip address and listening port are specified by the
-environment variable XPA_NSINET, which takes the form :.  If
-no such environment variable exists, then xpans is started on the
-current machine listening on port 14285.  It also uses 14286 as a
-known port for its public access point (so that routines do not have
-to go to the name server to find the name server ip and port!)
-As of XPA 2.1.1, version information is exchanged between the xpans
-process and the new access point. If the access point uses an XPA
-major/minor version newer than xpans, a warning is issued by both processes,
-since mixing of new servers and old xpa programs (xpaset, xpaget,
-xpans, etc.) is not likely to work. You can turn off the warning
-message by setting the XPA_VERSIONCHECK environment variable to "false".
-
-
-The help string is meant to be returned by a request from xpaget:
-
-  xpaget class:name -help
-
-
-A send_callback and/or a receive_callback can be specified; at
-least one of them must be specified.
-
-
-A send_callback can be specified that will be executed in response to
-an external request from the xpaget program, the XPAGet() routine, or
-XPAGetFd() routine. This callback is used to send data to the
-requesting client.
-
-
-The calling sequence for send_callback() is:
-
-  int send_callback(void *send_data, void *call_data,
-    char *paramlist, char **buf, size_t *len)
-  {
-    XPA xpa = (XPA)call_data;
-    ...
-    return(stat);
-  }
-
-
-The send_mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-
-  key   	value		default		explanation
-  ------	--------	--------	-----------
-  acl		true/false	true		enable access control
-  freebuf	true/false	true		free buf after callback completes
-
-
-The call_data should be recast to the XPA struct as shown.  In
-addition, client-specific data can be passed to the callback in
-send_data.
-
-
-The paramlist will be supplied by the client as qualifying parameters
-for the callback.  There are two ways in which the send_callback()
-routine can send data back to the client:
-
-
-1. The send_callback() routine can fill in a buffer and pass back a
-pointer to this buffer. An integer len also is returned to specify the
-number of bytes of data in buf.  XPA will send this buffer to the
-client after the callback is complete.
-
-
-2. The send_callback can send data directly to the client by writing
-to the fd pointed by the macro:
-
-  xpa_datafd(xpa)
-
-
-Note that this fd is of the kind returned by socket() or open().
-
-
-If a buf has been allocated by a standard malloc routine, filled, and
-returned to XPA, then freebuf generally is set so that the buffer will
-be freed automatically when the callback is completed and data has
-been sent to the client.  If a static buf is returned, freebuf should
-be set to false to avoid a system error when freeing static storage.
-Note that default value for freebuf implies that the callback will
-allocate a buffer rather than use static storage.
-
-
-On the other hand, if buf is dynamically allocated using a method
-other than a standard malloc/calloc/realloc routine (e.g. using Perl's
-memory allocation and garbage collection scheme), then it is necessary
-to tell XPA how to free the allocated buffer. To do this, use the
-XPASetFree() routine within your callback:
-
-  void XPASetFree(XPA xpa, void (*myfree)(void *), void *myfree_ptr);
-
-The first argument is the usual XPA handle. The second argument is the
-special routine to call to free your allocated memory. The third
-argument is an optional pointer.  If not NULL, the specified free
-routine is called with that pointer as its sole argument. If NULL, the
-free routine is called with the standard buf pointer as its sole
-argument. This is useful in cases where there is a mapping between the
-buffer pointer and the actual allocated memory location, and the
-special routine is expecting to be passed the former.
-
-
-If, while the callback performs its processing, an error occurs that
-should be communicated to the client, then the routine XPAError should be
-called:
-
-  XPAError(XPA xpa, char *s);
-
-
-where s is an arbitrary error message.  The returned error message
-string will be of the form:
-
-  XPA$ERROR   [error] (class:name ip:port)
-
-
-If the callback wants to send a specific acknowledgment message back
-to the client, the routine XPAMessage can be called:
-
-  XPAMessage(XPA xpa, char *s);
-
-
-where s is an arbitrary error message.  The returned error message
-string will be of the form:
-
-  XPA$MESSAGE [message] (class:name ip:port)
-
-
-Otherwise, a standard acknowledgment is sent back to the client
-after the callback is completed.
-
-
-The callback routine should return 0 if no error occurs, or -1 to
-signal an error.
-
-
-A receive_callback can be specified that will be executed in response
-to an external request from the xpaset program, or the XPASet (or
-XPASetFd()) routine. This callback is used to process data received
-from an external process.
-
-
-The calling sequence for receive_callback is:
-
-  int receive_callback(void *receive_data, void *call_data,
-    char *paramlist, char *buf, size_t len)
-  {
-    XPA xpa = (XPA)call_data;
-    ...
-    return(stat);
-  }
-
-
-The mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-
-  key   	value		default		explanation
-  ------	--------	--------	-----------
-  acl		true/false	true		enable access control
-  buf		true/false	true		server expects data bytes from client
-  fillbuf	true/false	true		read data into buf before executing callback
-  freebuf	true/false	true		free buf after callback completes
-
-
-The call_data should be recast to the XPA struct as shown.  In
-addition, client-specific data can be passed to the callback in
-receive_data.
-
-
-The paramlist will be supplied by the client. In addition, if the
-receive_mode keywords buf and fillbuf are true, then on entry into the
-receive_callback() routine, buf will contain the data sent by the
-client. If buf is true but fillbuf is false, it becomes the callback's
-responsibility to retrieve the data from the client, using the data fd
-pointed to by the macro xpa_datafd(xpa).  If freebuf is true, then buf
-will be freed when the callback is complete.
-
-
-If, while the callback is performing its processing, an error occurs
-that should be communicated to the client, then the routine XPAError
-can be called:
-
-  XPAError(XPA xpa, char *s);
-
-
-where s is an arbitrary error message.
-
-
-The callback routine should return 0 if no error occurs, or -1 to
-signal an error.
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpans.pod b/xpa/doc/pod/xpans.pod
deleted file mode 100644
index 071dd68..0000000
--- a/xpa/doc/pod/xpans.pod
+++ /dev/null
@@ -1,226 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<xpans: the XPA Name Server>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-  xpans [-h] [-e] [-k sec] [-p port] [-l log] [-s security log] [-P n]
-
-
-
-
-=head1 OPTIONS
-
-
-
-
-
-  -h		print help message
-  -e		exit when there are no more XPA connections
-  -k		send keepalive messages every n sec
-  -l		log data base entries to specified file
-  -p		listen for connections on specified port
-  -s		log security info for each connection to specified file      
-  -P 		accept proxy requests (P=1) using separate thread (P=2)
-  --version     display version and exit
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-The xpans name server is an XPA-enabled program that is used to
-manage the names and ports of XPA access points. It is started
-automatically when an XPA access point is registered. You can access
-the name server using xpaget to get a list of registered access points.
-
-The I<xpans> name server provides a crucial link between XPA
-clients and servers.  When an XPA server defines an access point using
-XPANew(), XPACmdNew(), or XPAInfoNew(), the name of the access point
-is registered in the name service, along with connection information.
-The name server then matches class:name templates passed to it by XPA
-clients with these registered entries, so that the clients can
-communicate with the appropriate servers.
-
-
-The socket connection between an XPA-enabled program and
-I<xpans> is kept open until the former exits (or explicitly
-closes the connection). Apparently, some Internet equipment (e.g. DSL
-modems) can cause such a connection to time-out after a period of
-inactivity. To prevent this from happening, you can use the -k
-[sec] switch to send a short keep-alive message to each open
-connection after the specified time delay. (Note that this
-application level use of keep-alive is necessary only if you are
-serving XPA-enabled clients over the Internet and have to deal with
-long-term connections involving DSL or similar equipment.  XPA uses
-the ordinary socket-level keep-alive, which works for all other cases.)
-NB (12/2/2009): Out-of-band (URG) TCP data, used by xpans
-keep-alive, is changed by some Cisco routers into in-band data.
-Encountering such a router will break the keep-alive function and may
-break your XPA server as well. Proceed with caution!
-
-
-The I<xpans> program will be started automatically (assuming it
-can be found in the user's path) when the first XPA access point is
-registered.  It therefore need not be started explicitly.  However,
-when started automatically, the I<-e> switch is used, so that
-the name server will exit when there are no more XPA access points
-registered. If you wish to keep the name server running continually,
-simply start it manually without the I<-e> switch.
-
-
-The name server will keep a log of registered access points if the
-I<-l [log]> switch is used on the command line (this is the
-case for automatic start-up).  The log contains enough name and connection
-information to allow you to re-register all XPA access points in case
-the name server process is terminated prematurely. For example, after
-the ds9 access point is registered,the log will contain the entry:
-
-  add 838e2f67:1863 ds9 ds9 gs eric
-
-If I<xpans> is terminated but ds9 still is running, you
-can re-register both access points for the ds9 process by running:
-
-  xpaset -p 838e2f67:1863 -nsconnect
-
-Notice that the ip:port specifier is used with I<xpaset> to bypass
-the need for contacting the name server (which does not have the name
-registered yet!)
-
-
-The name server will keep a log of security information if the -s
-[security log] switch is used on the command line. For each
-accepted connection, (including connections via the I<xpaget>
-command), information will be logged about the host issuing the
-command and the parameters passed into the program. This is most
-useful when I<xpans> is accepting connections from untrusted
-machines.
-
-
-When an XPA access point is removed by a server using I<XPAFree()>,
-the access information is removed from the name server.  If an
-XPA-enabled process is terminated, all names registered by that process
-will be removed automatically.  The log file is always updated to
-reflect the currently registered access points.
-
-
-The name server itself has an XPA access point names I<xpans>
-registered through which you can find out information about currently
-registered access points (assuming you have access to the name server;
-see XPA Access Control for more information).
-For each registered access point, the following information is returned:
-
-  class		# class of the access point
-  name		# name of the access point
-  access	# allowed access (g=xpaget,s=xpaset,i=xpainfo)
-  id		# socket access method (host:port for inet, file for local/unix)
-  user		# user name of access point owner
-
-
-
-For example, to display all currently registered access points, simply execute:
-
-  xpaget xpans
-
-Continuing the example of ds9 above, this will return:
-
-  DS9 ds9 gs 838e2f67:1863 eric
-
-If the same program has been started with different XPA access names,
-you can look up only names matching a specified template. For example,
-assume that ds9 has been started up using:
-
-  ds9 &
-  ds9 -title ds9-1-eric &
-  ds9 -title ds9-2-eric &
-
-To lookup all ds9 access points which end in ".eric" and which can
-be accessed using I<xpaset>, use:
-
-  xpaget xpans "DS9:*.eric" "s" "*"
-
-This will return:
-
-  DS9 ds9-2-eric gs 838e29d3:42102 eric
-  DS9 ds9-1-eric gs 838e29d3:42105 eric
-
-The third argument "*" requests all access points from all users.
-You also can specify a specific user name and only access points
-registered by that user will be returned.
-
-
-The name server uses the I<XPA_METHOD> environment variable
-to determine whether it should listen for requests on INET or LOCAL
-sockets.  Since XPA access points also use this environment variable,
-the choice of socket method will be consistent.  Note that, when INET
-sockets are used, a local server can be accessed from remote machines
-if the I<XPA_NSINET> environment variable is set to point to
-the local machine.  See
-XPA Environment Variables
-for more information.
-
-
-An experimental feature of xpans is its ability to act as a proxy to
-XPA servers behind firewalls that want to communicate with external
-processes.  The basic idea is the following: an XPA server (call it
-"foo") on host1, possibly behind a firewall, makes a remote connection
-to a proxy-enabled xpans program on host2 (specifying host2's XPA method).
-For example:
-
-  xpaset -p foo -remote 'host2:28571' + -proxy   # on host1
- 
-When this is done, host2 can use xpaset, xpaget, and xpainfo calls to
-communicate with the XPA server foo. All command communication is
-performed via the xpans socket connection between foo on host1 and
-xpans on host2 (which was initiated by foo from inside the firewall).
-Data communication is similarly performed using a socket connection
-initiated on host1 (usually with a port value two greater than the
-port value of the main xpans socket connection). An xpaset or xpaget
-call on host2 contacts xpans, which performs an XPASet() or XPAGet()
-call to foo, passing commands and data back and forth between the two
-programs.
-
-
-By default, proxy connections are not allowed by xpans. If the -P switch is
-specified with a value of 1, proxy connection are allowed, but all proxy
-communication is performed in the same thread as xpans processing. If
-a value of 2 is specified, the proxy processing is performed in a
-separate thread (assuming pthreads are supported on your system).
-Because xpa callback processing of any type can take a long time and
-therefore can interfere with normal xpans processing, threaded proxy
-connections (-P 2) are recommended.  When using proxy connections, it
-might also be useful to set the XPA_IOCALLSXPA environment variable, so
-that multiple proxy requests can be handled at the same time, instead of
-serially.
-
-
-Note that this proxy interface to xpans is experimental. It is used
-to provide remote data analysis capabilities on the Chandra-Ed system
-using ds9.  (See http://chandra-ed.cfa.harvard.edu and
-http://hea-www.harvard.edu/saord/ds9 for more details). As always, please
-contact us if you have problems or questions.
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpanslookup.pod b/xpa/doc/pod/xpanslookup.pod
deleted file mode 100644
index e0f4cdc..0000000
--- a/xpa/doc/pod/xpanslookup.pod
+++ /dev/null
@@ -1,126 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPANSLookup: lookup registered XPA access points>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-  #include <xpa.h>
-
-  int XPANSLookup(XPA xpa,
-  	          char *template, char type,
-	          char ***classes, char ***names,
-	          char ***methods, char ***infos)
-
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-XPA routines act on a class:name identifier in such a way
-that all access points that match the identifier are processed.  It is
-sometimes desirable to choose specific access points from the
-candidates that match the
-template.  In order to do this, the
-XPANSLookup routine can be called to return a list of matches, so that
-specific class:name instances can then be fed to XPAGet(), XPASet(), etc.
-
- The first argument is an optional XPA struct. If non-NULL, the
-existing name server connection associated with the specified xpa is
-used to query the xpans name server for matching templates. Otherwise,
-a new (temporary) connection is established with the name server.
-
-
-The second argument to XPANSLookup is the class:name 
-template
-to match.
-
-
-The third argument for XPANSLookup() is the type of access and can be
-any combination of:
-
-  type   	explanation
-  ------	-----------
-  g		xpaget calls can be made on this access point
-  s		xpaset calls can be made on this access point
-  i		xpainfo calls can be made on this access point
-
-
-The call typically specifies only one of these at a time.
-
-
-The final arguments are pointers to arrays that will be filled
-in and returned by the name server. The name server will allocate and
-return arrays filled with the classes, names, and methods of all XPA
-access points that match the template
-and have the specified type. Also returned are info strings, which
-generally are used internally by the client routines. These can be
-ignored (but the strings must be freed).  The function returns the
-number of matches. The returned value can be used to loop through the
-matches:
-
-B<Example:>
-
-  #include <xpa.h>
-
-  char **classes;
-  char **names;
-  char **methods;
-  char **infos;
-  int i, n;
-  n = XPANSLookup(NULL, "foo*", "g", &classes, &names, &methods, &infos);
-  for(i=0; i<n; i++){
-    [more specific checks on possibilities ...]
-    [perhaps a call to XPAGet for those that pass, etc. ...]
-    /* don't forget to free alloc'ed strings when done */
-    free(classes[i]);
-    free(names[i]);
-    free(methods[i]);
-    free(infos[i]);
-  }
-  /* free up arrays alloc'ed by names server */
-  if( n > 0 ){
-    free(classes);
-    free(names);
-    free(methods);
-    free(infos);
-  }
-
-
-The specified 
-template
-also can be a host:port specification, for example:
-
-  myhost:12345
-
-
-In this case, no connection is made to the name server. Instead, the
-call will return one entry such that the ip array contains the ip for
-the specified host and the port array contains the port.  The class
-and name entries are set to the character "?", since the class and
-name of the access point are not known. 
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpaoom.pod b/xpa/doc/pod/xpaoom.pod
deleted file mode 100644
index b8b2431..0000000
--- a/xpa/doc/pod/xpaoom.pod
+++ /dev/null
@@ -1,60 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<Xpaoom: What happens when XPA runs out of memory?>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-When XPA can't allocate memory, it exits. You can arrange to have it call
-longjmp() instead.
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-
-When an XPA server or client cannot allocate memory, it will attempt to
-output an error message and then exit. If this is not satisfactory (e.g.,
-perhaps your program is interactive and can recover from OOM errors), you
-can tell XPA to call longjmp() to go to a recovery branch. To pass the 
-requisite jmp_buf variable to XPA, make the following call:
-
-  XPASaveJmp(void *env);
-
-The value of env is the address of a jmp_buf variable that was previously 
-passed to setjmp(). For example:
-
-  jmp_buf env;
-  ...
-  if( setjmp(jmp_buf) != 0 ){
-    /* out of memory -- take corrective action, if possible */
-  } else {
-    /* save env for XPA */
-    XPASaveJmp((void *)&jmp_buf);
-  }
-  // enter main loop ...
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpaopen.pod b/xpa/doc/pod/xpaopen.pod
deleted file mode 100644
index d88df02..0000000
--- a/xpa/doc/pod/xpaopen.pod
+++ /dev/null
@@ -1,69 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAOpen: allocate a persistent client handle>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-  #include <xpa.h>
-
-  XPA XPAOpen(char *mode);
-
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-XPAOpen() allocates a persistent XPA struct that can be used with
-calls to XPAGet(), XPASet(), XPAInfo(), XPAGetFd(), and
-XPASetFd(). Persistence means that a connection to an XPA server is
-not closed when one of the above calls is completed but will be
-re-used on successive calls. Using XPAOpen() therefore saves the time
-it takes to connect to a server, which could be significant with slow
-connections or if there will be a large number of exchanges with a
-given access point.  The mode argument currently is ignored ("reserved
-for future use").
-
-
-An XPA struct is returned if XPAOpen() was successful; otherwise NULL
-is returned. This returned struct can be passed as the first argument
-to XPAGet(), etc.  Those calls will update the list of active XPA
-connections.  Already connected servers (from a previous call) are
-left connected and new servers also will be connected.  Old servers
-(from a previous call) that are no longer needed are disconnected.
-The connected servers will remain connected when the next call to
-XPAGet() is made and connections are once again updated.
-
-
-B<Example:>
-
- #include <xpa.h>
-
-  XPA xpa;
-  xpa = XPAOpen(NULL);
-
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpapoll.pod b/xpa/doc/pod/xpapoll.pod
deleted file mode 100644
index 1f26ee1..0000000
--- a/xpa/doc/pod/xpapoll.pod
+++ /dev/null
@@ -1,58 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAPoll: execute existing XPA requests>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-  #include <xpa.h>
-
-  int XPAPoll(int msec, int maxreq);
-
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-It is sometimes desirable to implement a polling loop, i.e., where one
-checks for and processes XPA requests without blocking.  For this
-situation, use the XPAPoll() routine:
-
-  XPAPoll(int msec, int maxreq);
-
-
-The XPAPoll() routine will perform XPAAddSelect() and select(), but with a
-timeout specified in millisecs by the msec argument. If one or more
-XPA requests are made before the timeout expires, the XPAProcessSelect()
-routine is called to process those requests. The maxreq value determines
-how many requests will be processed: if maxreq < 0, then no events are
-processed, but instead, the return value indicates the number of events
-that are pending.  If maxreq == 0, then all currently pending requests
-will be processed.  Otherwise, up to maxreq requests will be processed.
-(The most usual values for maxreq are 0 to process all requests and 1
-to process one request).
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xparace.pod b/xpa/doc/pod/xparace.pod
deleted file mode 100644
index 418b8a0..0000000
--- a/xpa/doc/pod/xparace.pod
+++ /dev/null
@@ -1,89 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPA Race Conditions>
-
-
-
-=head1 SYNOPSIS
-
-
-
-Potential XPA race conditions and how to avoid them.
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-Currently, there is only one known circumstance in which XPA can get
-(temporarily) deadlocked in a race condition: if two or more XPA
-servers send messages to one another using an XPA client routine such
-as XPASet(), they can deadlock while each waits for the other server
-to respond.  (This can happen if the servers call XPAPoll() with a
-time limit, and send messages in between the polling call.)  The
-reason this happens is that both client routines send a string to the
-other server to establish the handshake and then wait for the server
-response. Since each client is waiting for a response, neither is able
-to enter its event-handling loop and respond to the other's
-request. This deadlock will continue until one of the timeout periods
-expire, at which point an error condition will be triggered and the
-timed-out server will return to its event loop.
-
-
-Starting with version 2.1.6, this rare race condition can be
-avoided by setting the XPA_IOCALLSXPA environment variable for servers
-that will make client calls. Setting this variable causes all XPA
-socket IO calls to process outstanding XPA requests whenever the
-primary socket is not ready for IO. This means that a server making a
-client call will (recursively) process incoming server requests while
-waiting for client completion. It also means that a server callback
-routine can handle incoming XPA messages if it makes its own XPA call.
-The semi-public routine oldvalue=XPAIOCallsXPA(newvalue) can be used
-to turn this behavior off and on temporarily. Passing a 0 will turn
-off IO processing, 1 will turn it back on. The old value is returned
-by the call.
-
-
-By default, the XPA_IOCALLSXPA option is turned off, because we judge
-that the added code complication and overhead involved will not be
-justified by the amount of its use.  Moreover, processing XPA requests
-within socket IO can lead to non-intuitive results, since incoming
-server requests will not necessarily be processed to completion in the
-order in which they are received.
-
-
-Aside from setting XPA_IOCALLSXPA, the simplest way to avoid this race
-condition is to multi-process: when you want to send a client message,
-simply start a separate process to call the client routine, so that
-the server is not stopped. It probably is fastest and easiest to use
-fork() and then have the child call the client routine and exit. But
-you also can use either the system() or popen() routine to start one
-of the command line programs and do the same thing. Alternatively, you
-can use XPA's internal launch() routine instead of system(). Based on
-fork() and exec(), this routine is more secure than system() because
-it does not call /bin/sh.
-
-
-Starting with version 2.1.5, you also can send an XPAInfo() message with
-the mode string "ack=false". This will cause the client to send a message
-to the server and then exit without waiting for any return message from
-the server. This UDP-like behavior will avoid the server deadlock when
-sending short XPAInfo messages.
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpaserver.pod b/xpa/doc/pod/xpaserver.pod
deleted file mode 100644
index 275defd..0000000
--- a/xpa/doc/pod/xpaserver.pod
+++ /dev/null
@@ -1,96 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAServer: The XPA Server-side Programming Interface>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-A description of the XPA server-side programming interface.
-
-
-
-=head1 DESCRIPTION
-
-
-
-B<Introduction to XPA Server Programming>
-
-Creating an XPA server is easy: you generally only need to call the
-XPANew() subroutine to define a named XPA access point and set up the
-send and receive callback routines.  You then enter an event loop such
-as XPAMainLoop() to field XPA requests.
-
-  #include <xpa.h>
-
-  XPA XPANew(char *class, char *name, char *help,
-      int (*send_callback)(), void *send_data, char *send_mode,
-      int (*rec_callback)(),  void *rec_data,  char *rec_mode);
-
-  XPA XPACmdNew(char *class, char *name);
-
-  XPACmd XPACmdAdd(XPA xpa,
-         char *name, char *help,
-         int (*send_callback)(), void *send_data, char *send_mode,
-         int (*rec_callback)(),  void *rec_data,  char *rec_mode);
-
-  void XPACmdDel(XPA xpa, XPACmd cmd);
-
-  XPA XPAInfoNew(char *class, char *name,
-      int (*info_callback)(), void *info_data, char *info_mode);
-
-  int XPAFree(XPA xpa);
-
-  void XPAMainLoop(void);
-
-  int XPAPoll(int msec, int maxreq);
-
-  void XPAAtExit(void);
-
-  void XPACleanup(void);
-
-
-
-B<Introduction>
-
-To use the XPA application programming interface, a software developer
-generally will include the xpa.h definitions file:
-
-  #include <xpa.h>
-
-in the software module that defines or accesses an XPA access point, and
-then will link against the libxpa.a library:
-
-  gcc -o foo foo.c libxpa.a
-
-XPA has been compiled using both C and C++ compilers.
-
-
-A server program generally defines an XPA access point by calling the
-XPANew() routine and specifies "send" and/or "receive" callback
-procedures to be executed by the program when an external process
-either sends data or commands to this access point or requests data or
-information from this access point. A program also can define several
-sub-commands for a single access point by calling XPACmdNew() and
-XPACmdAdd() instead.  Having defined one or more public access points
-in this way, an XPA server program enters its usual event loop (or
-uses the standard XPA event loop).
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpaset.pod b/xpa/doc/pod/xpaset.pod
deleted file mode 100644
index 19c2dbe..0000000
--- a/xpa/doc/pod/xpaset.pod
+++ /dev/null
@@ -1,115 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<xpaset: send data to one or more XPA servers>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-<data> | xpaset  [-h] [-i nsinet] [-m method] [-n] [-p] [-s] [-t sval,lval] [-u users] [-v] <template|host:port> [paramlist]
-
-
-
-
-
-=head1 OPTIONS
-
-
-
-
-
-  -h		print help message
-  -i		access XPA point on different machine (override XPA_NSINET)
-  -m		override XPA_METHOD environment variable
-  -n		don't wait for the status message after server completes
-  -p		don't read (or send) buf data from stdin
-  -s		enter server mode
-  -t [s,l]	set short and long timeouts (override XPA_[SHORT,LONG]_TIMEOUT)
-  -u [users]	XPA points can be from specified users (override XPA_NSUSERS)
-  -v		verify message to stdout
-  --version     display version and exit
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-Data read from stdin will be sent to access points matching the 
-template
-or host:port.
-A set of qualifying parameters can be appended.
-
-Normally, xpaset reads data input from stdin until EOF and sends those
-data to the XPA target, along with parameters entered on the command
-line. For example to send a FITS file to the ds9 image display:
-
-  cat foo.fits | xpaset ds9 fits
-
-
-Sometimes, however, it is desirable to send only parameters to an XPA
-access point, without sending data. For such cases, use the -p switch to
-indicate that there is no data being send to stdin. For example, to
-change the colormap used by the ds9 image display program, use:
-
-  csh> xpaset -p ds9 cmap Heat
-
-Of course, this also can be accomplished by sending EOF to stdin in
-any of the usual ways:
-
-  csh> echo "" | xpaset ds9 cmap Heat
-  csh> xpaget ds9 cmap Heat < /dev/null
-  csh> xpaset ds9 cmap Heat
-  ^D			# Ctl-D signals EOF
-
-
-The -s switch puts xpaset into server mode, in which commands and data
-can be sent to access points without having to run xpaset multiple times.
-(Its not clear if this buys you much!) The syntax for sending commands
-in server mode is:
-
-
-  csh> xpaset -s
-  xpaset ds9 colormap I8
-  ^D
-  xpaset ds9 regions
-  circle 200 300 40
-  circle 300 400 50
-  ^D
-etc.
-
-After the  required "xpaset" command is specified, optional ASCII data
-can be appended (as in the region example).  A single data/command set is
-delimited by ^D. Note that typing ^D when a command is expected terminates
-the program.
-
-NB: server mode only works from the terminal and only ASCII data can be
-sent in this way.
-
-B<Examples:>
-
-  csh> xpaset ds9 file < foo.fits
-  csh> echo "stop" | xpaset myhost:12345
-
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpasetfd.pod b/xpa/doc/pod/xpasetfd.pod
deleted file mode 100644
index 6a49684..0000000
--- a/xpa/doc/pod/xpasetfd.pod
+++ /dev/null
@@ -1,113 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPASetFd: send data from stdin to one or more XPA servers>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-  #include <xpa.h>
-
-  int XPASetFd(XPA xpa,
-               char *template, char *paramlist, char *mode,
-	       int fd, char **names, char **messages, int n)
-
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-Read data from a standard I/O fd and send it to one or more XPA
-servers whose class:name identifier matches the specified
-template.
-
-
-A
-template
-of the form "class1:name1" is sent to the
-XPA name server, which returns a list of at most n matching XPA
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an XPA struct is passed to the call, then the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers (which will be closed
-when the call completes).
-
-
-The XPASetFd() routine then reads bytes from the specified fd
-until EOF and sends these bytes to the XPA servers.  
-The final parameter n specifies the maximum number of servers to contact.
-A string containing the class:name and ip:port of each server is returned in
-the name array.  If a given server returned an error, then the error
-message will be stored in the associated element of the messages array.
-NB: if specified, the name and messages arrays must be of size n or greater.
-
-
-The return value will contain the actual number of servers that were
-processed.  This value thus will hold the number of valid entries in
-the names and messages arrays, and can be used to loop through these
-arrays.  In names and/or messages is NULL, no information is passed back
-in that array.
-
-
-The mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-
-  key   	value		default		explanation
-  ------	--------	--------	-----------
-  ack		true/false	true		if false, don't wait for ack from server (after callback completes)
-  verify	true/false	false		send buf from XPASet[Fd] to stdout
-
-
-The ack keyword is useful in cases where one does not want to wait for
-the server to complete, e.g. is a lot of processing needs to be done
-on the passed data or when the success of the server operation is not
-relevant to the client.
-
-
-B<Example:>
-
-  #include <xpa.h>
-
-  #define NXPA 10
-  int  i, got;
-  int fd;
-  char *names[NXPA];
-  char *messages[NXPA];
-  fd = open(...);
-  got = XPASetFd(NULL, "ds9", "fits", NULL, fd, names, messages, NXPA);
-  for(i=0; i<got; i++){
-    if( messages[i] != NULL ){
-      /* error processing */
-      fprintf(stderr, "ERROR: %s (%s)\n", messages[i], names[i]);
-    }
-    if( names[i] )
-      free(names[i]);
-    if( messages[i] )
-      free(messages[i]);
-  }
-
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-=cut
diff --git a/xpa/doc/pod/xpatcl.pod b/xpa/doc/pod/xpatcl.pod
deleted file mode 100644
index 008a4f3..0000000
--- a/xpa/doc/pod/xpatcl.pod
+++ /dev/null
@@ -1,258 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPATcl: the XPA Interface to the Tcl/Tk Environment>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-
-Tcl/Tk programs can act as XPA clients and/or servers using the Tcl
-interface to XPA that is contained in the libtclxpa.so shared object.
-
-B<Server Routines>
-
-
-  set xpa [xpanew class name help sproc sdata smode rproc rdata rmode]
-  xpafree xpa
-  set xpa [xpanew class name help iproc idata imode]
-  set xpa [xpacmdnew class name]
-  xpacmdadd xpa name help sproc sdata smode rproc rdata rmode
-  xpacmddel xpa cmd
-  set val [xparec xpa option]
-    options: name, class, method, cmdfd, datafd, cmdchan, datachan
-  xpasetbuf xpa buf len
-  xpaerror xpa message
-  xpamessage xpa message
-
-
-B<Client Routines>
-	
-
-  set xpa [xpaopen mode]
-  xpaclose xpa
-  set got [xpaget xpa template paramlist mode bufs lens names errs n]
-  set got [xpaget xpa template paramlist mode chans names errs n]
-  set got [xpaset xpa template paramlist mode buf len names errs n]
-  set got [xpasetfd xpa template paramlist mode chan names errs n]
-  set got [xpainfo xpa template paramlist mode names errs n]
-  # NB: 2.1 calling sequence change
-  # set got [xpaaccess template type] (2.0.5)
-  set got [xpaaccess xpa template paramlist mode names errs n]
-  set got [xpanslookup template type classes names methods]
-
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-
-You can call XPANew(), XPACmdNew(), or XPAInfoNew() within a C
-routine to add C-based XPA server callbacks to a TCL/Tk program that
-uses a Tcl/Tk event loop (either vwait() or the Tk event loop);
-Such a program does not need or want to use the XPA event loop.
-Therefore, in order to add XPA access points to the Tcl/Tk loop, the
-following routine should be called beforehand:
-
-  int XPATclAddInput(XPA xpa);
-
-
-Normally, the xpa argument is NULL, meaning that all current XPA
-access points are registered with the event loop.  However, if a
-single XPA access point is to be added (i.e., after the event loop is
-started) then the handle of that XPA access point can be passed to
-this routine.
-
-
-The significance of the XPA/TCL interface goes beyond the support for
-using XPA inside C code. The interface allows you to write XPA
-servers and to make calls to the XPA client interface within the Tcl
-environment using the Tcl language directly. The XPA/Tcl
-interface can be loaded using the following package command:
-
-  package require tclxpa 2.0
-
-Alternatively, you can load the shared object (called libtclxpa.so ) directly:
-
-  load .../libtclxpa.so tclxpa
-
-
-Once the tclxpa package is loaded, you can use Tcl versions of XPA
-routines to define XPA servers or make client XPA calls.  The
-interface for these routines is designed to match the Unix XPA
-interface as nearly as possible.  Please refer to
-XPA Servers
-and
-XPA Clients
-for general information about these routines.  
-
-
-The file test.tcl in the XPA source directory gives examples for using the 
-XPA/Tcl interface.
-
-
-The following notes describe the minor differences between the interfaces.
-
-B<XPANew>
-
-
-  set xpa [xpanew class name help sproc sdata smode rproc rdata rmode]
-
-
-
-rproc and sproc routines are routines.  The calling sequence of the
-rproc routine is identical to its C counterpart:
-
-  proc rec_cb { xpa client_data paramlist buf len } { ... }
-
-
-The sproc routine, however is slightly different from its C counterpart
-because of the difficulty of passing data back from the callback to C:
-
-  proc sendcb { xpa client_data paramlist } { ... }
-
-
-Note that the C-based server's char **buf and int *len arguments are
-missing from the Tcl callback. This is because we did not know how to
-fill buf with data and pass it back to the C routines for communication
-with the client.  Instead, the Tcl server callback uses the following
-routine to set buf and len:
-
-  xpasetbuf xpa buf len
-
-where:
-
-  arg   	explanation
-  ------	-----------
-  xpa		the first argument of the server callback
-  buf		the data to be returned to the client
-  len		data length in bytes, (if absent, use length of the buf object)
-
-
-When this routine is called, a copy of buf is saved for transmission to
-the client.
-
-
-The fact that buf is duplicated means that TCL server writers might wish to
-perform the I/O directly within the callback, rather than have XPA do it
-automatically at the end of the routine.  To do this, set:
-
-  fillbuf=false
-
-
-in the xpanew smode and then perform I/O through the Tcl channel
-obtained from:
-
-  set dchan [xparec $xpa datachan]
-
-
-where:
-
-  arg   	explanation
-  ------	-----------
-  xpa		the first argument of the server callback
-  datachan	literal string "datachan" that returns the data channel
-  len		data length in bytes, (if absent, use length of the buf object)
-
-
-
-NB: datachan and cmdchan are not available under Windows. It is
-necessary to use the "raw" equivalents: datafd and cmdfd.
-
-
-
-The same considerations apply to the rproc for receive servers: a copy
-of the incoming data is generated to pass to the receive callback. This
-copy again can be avoided by using "fillbuf=false" in the rmode and then
-reading the incoming data from datachan.
-
-
-The send and receive callback routines can use the xpaerror and xpamessage
-routines to send errors and messages back to the client.  If you also
-want tcl itself to field an error condition, use the standard return call:
-
-  return ?-code c? ?-errorinfo i? ?-errorcode ec? string
-
-
-See the Tcl man page for more info.
-
-B<XPARec>
-
-The Tcl xparec procedure supplies server routines with access to information 
-that is available via macros in the C interface:
-
-  set val [xparec xpa <option>]
-
-
-where option is: name, class, method, cmdfd, datafd, cmdchan,
-datachan.  Note that two additional identifiers, cmdchan and datachan,
-have been added to to provide Tcl channels corresponding to datafd and
-cmdfd.  (These latter might still be retrieved in Tcl and passed back
-to a C routines.)  An additional option called "version" can be used to
-determine the XPA version used to build the Tcl interface. Note that
-the standard options require a valid XPA handle, but "version" does
-not (since it simply reports the value of the XPA_VERSION definition
-in the XPA source include file).
-
-
-
-NB: datachan and cmdchan are not available under Windows. It is
-necessary to use the "raw" equivalents: datafd and cmdfd.
-
-
-  macro 	explanation
-  ------	-----------
-  class		class of this xpa
-  name		name of this xpa
-  method	method string (inet or local connect info)
-  cmdchan	Tcl channel of command socket
-  datachan	Tcl channel of data socket
-  cmdfd		fd of command socket
-  datafd	fd of data socket
-  sendian	endian-ness of server ("little" or "big")
-  cendian	endian-ness of client ("little" or "big"
-  version	XPA version used to build this code
-
-
-
-Under Windows, the Tcl event handler cannot automatically sense when an
-XPA socket is ready for IO (i.e. Tcl_CreateFileHandler() is not available
-under Windows). The Windows Tcl event handler therefore must be awakened
-occasionally for check for XPA events. This is done using the standard
-Tcl_SetMaxBlockTime() call. The time parameter is defined in tclloop.c
-and is currently set to 1000 microseconds (1/1000 of a second). 
-
-
-The version option can be used to differentiate between source code versions.
-It was created to support legacy Tcl code that needs to maintain the 2.0.5
-calling sequence for xpaaccess. You can use a version test such as:
-
-  if [catch { xparec "" version } version] {
-    puts "pre-2.1.0e"
-  } else {
-    puts [split $version .]
-  }
-
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpatemplate.pod b/xpa/doc/pod/xpatemplate.pod
deleted file mode 100644
index 1524934..0000000
--- a/xpa/doc/pod/xpatemplate.pod
+++ /dev/null
@@ -1,120 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPATemplate: Access Point Names and Templates>
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-XPA access points are composed of two parts: a general class and a
-specific name.  Both parts accept template characters so that you
-can send/retrieve data to/from multiple servers at one time.
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-
-When XPA servers call
-XPANew(),
-or
-XPACmdNew()
-to define XPA access points, they specify a string identifier composed of a
-class and a name. When clients communicate with XPA access points,
-they specify which access points to communicate with using
-an identifier of the form:
-
-  class:name
-
-All registered XPA access points that match the specified identifier
-will be available for communication (subject to access control rules,
-etc.)
-
-
-As of XPA 2.1.5, the length of both the class and name designations are
-limited to 1024 characters.
-
-
-The XPA class:name identifier actually is a template: it accepts wild
-cards in its syntax, so a single specifier can match more than one XPA
-access point.  (Note that the class is optional and defaults to "*".)
-The allowed syntax for clients to specify the class:name template is
-of the form shown below. (Note that "*" is used to denote a generic
-wild card, but other wild cards characters are supported, as described
-below).
-
-  template   	explanation
-  --------	-----------
-  class:name	exact match of class and name
-  name		match any class with this name
-  *:name	match any class with this name
-  class:*	match any name of this class
-  *:*		match any access point
-
-
-In general, the following wild-cards can be applied to class and name:
-
-  wildcard	explanation
-  --------	-----------
-  ?		match any character, but there must be one
-  *		match anything, or nothing
-  [...]		match an inclusive set
-
-
-Although the class:name template normally is used to refer to XPA
-access points, these also can be specified using their individual
-socket identifiers.  For inet sockets, the socket identifier is
-B<ip:port>, where ip can be the DNS-registered name,
-the ASCII IP number (e.g. 123.45.67.890) or the hex IP number
-(e.g. 838f3a60). For unix sockets, the identifier is the socket file
-name.  These socket identifiers are displayed as the fourth argument
-in the xpans display of registered access points.  For example,
-consider the ds9 program started using inet sockets. The xpans name
-server will register something like this:
-
-  csh> xpaget xpans
-  DS9 ds9 gs saord.harvard.edu:3236 eric
-
-You can access ds9 using ip:3236 in any of the three forms:
-
-  csh> xpaget saord:3236 file
-  /home/eric/data/snr.ev
-
-  csh> xpaget 123.45.67.890:3236 file
-  /home/eric/data/snr.ev
-
-  csh> xpaget 838f3a60:3236 file
-  /home/eric/data/snr.ev
-
-In the case of unix  sockets, the socket identifier is a file:
-
-  csh> xpaget xpans
-  DS9 ds9 gs /tmp/.xpa/DS9_ds9.2631 eric
-
-  csh> xpaget /tmp/.xpa/DS9_ds9.2631 file
-  /home/eric/data/snr.ev 
-
-This feature can be useful in distinguishing between multiple
-instances of a program that all have the same class:name designation.
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpausers.pod b/xpa/doc/pod/xpausers.pod
deleted file mode 100644
index 4c3353b..0000000
--- a/xpa/doc/pod/xpausers.pod
+++ /dev/null
@@ -1,76 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAUsers: Distinguishing Users>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-
-XPA normally distinguishes between users on a given host, but it is possible
-to send data to access points belonging to other users.
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-
-A single XPA name service typically serves all users on a given
-machine.  Two users can register the same XPA access points on the
-same machine without conflict, because the user's username is
-registered with each access point and, by default, programs such as
-xpaget and xpaset only process access points of the appropriate user.
-For example:
-
-  XPA xpa1 gs 838e2f67:1262 eric
-  XPA xpa2 gs 838e2f67:1266 eric
-  XPA xpa1 gs 838e2f67:2523 john
-  XPA xpa2 gs 838e2f67:2527 john
-
-Here the users "eric" and "john" both have registered the access
-points xpa1 and xpa2. When either "john" or "eric" retrieves
-information from xpa1, they will process only the access point
-registered in their user name.
-
-
-If you want to access another user's XPA access points on a single
-machine, use the -u [user] option on xpaset, xpaget, etc. For example,
-if eric executes:
-
-  xpaget -u john xpa1
-
-he will access John's xpa1 access point.Use "*" to access all users
-on a given machine:
-
-  xpaget -u "*" xpa1
-
-Note that the XPA Environment Variable
-XPA_NSUSERS can be used to specify the default list of users to
-process:
-
-  setenv XPA_NSUSERS "eric,john"
-
-will cause access points from both "eric" and "john" to be processed
-by default.
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/pod/xpaxt.pod b/xpa/doc/pod/xpaxt.pod
deleted file mode 100644
index 34e1049..0000000
--- a/xpa/doc/pod/xpaxt.pod
+++ /dev/null
@@ -1,56 +0,0 @@
-=pod
-
-=head1 NAME
-
-
-
-B<XPAXt: the XPA Interface to Xt (X Windows)>
-
-
-
-=head1 SYNOPSIS
-
-
-
-
-Describes how XPA access points can be added to X Toolkit (Xt) programs.
-
-
-
-=head1 DESCRIPTION
-
-
-
-
-
-XPA supports Xt programs: you can call XPANew(), XPACmdNew(), or
-XPAInfoNew() within any C routine to add XPA server callbacks to an Xt
-program.  Since an Xt program has its own event loop call (i.e.,
-XtAppMainLoop()), it therefore does not need or want to use the XPA
-even loop.  Thus, in order to add XPA access points to the standard Xt
-event loop, the following routine should be called before entering the
-loop:
-
-  int XPAXtAddInput(XtAppContext app, XPA xpa)
-
-
-The XPAAddAddInput() routine will add XPA access points to the Xt event
-loop by making calls to the standard XtAppAddInput() routine. (If the
-XtAppContext argument is NULL, then the alternate XtAddInput() routine
-is used instead.)  If the xpa argument is NULL, then all active XPA
-access points are added to the loop.  If xpa is not NULL, then only
-the specified access point is added.  The latter type of call is used
-to add new access points from within a callback, after the program has
-entered the XtAppMainLoop() even loop.
-
-
-
-=head1 SEE ALSO
-
-
-
-See xpa(n) for a list of XPA help pages
-
-
-
-=cut
diff --git a/xpa/doc/programs.html b/xpa/doc/programs.html
deleted file mode 100644
index b37031f..0000000
--- a/xpa/doc/programs.html
+++ /dev/null
@@ -1,274 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE>XPA Programs</TITLE>
-</HEAD>
-<BODY>
-<H2>XPA Programs</H2>
-
-<H2>Summary</H2>
-
-<P>
-Use the XPA programs to send/receive data to/from XPA servers from the
-command line or from scripts.
-
-<P>
-<PRE>
-  &lt;data&gt; | xpaset  [-h] [-i nsinet] [-m method] [-n] [-p] [-s] [-t sval,lval] [-u users] [-v] &lt;template&gt; [paramlist]
-
-  xpaget  [-h] [-i nsinet] [-m method] [-s] [-t sval,lval] [-u users] &lt;template&gt; [paramlist]
-	
-  xpainfo [-h] [-i nsinet] [-m method] [-n] [-s] [-t sval,lval] [-u users] &lt;template&gt; [paramlist]
-
-  xpaaccess [-c] [-h] [-i nsinet] [-m method] [-n] [-u users] [-v|-V] &lt;template&gt; [type]
-</PRE>
-
-<!-- =defdoc xpaset xpaset 1 -->
-
-<!-- =section xpaset NAME -->
-<H2><A NAME="xpaset">xpaset: send data to one or more XPA servers</A></H2>
-
-<!-- =section xpaset SYNOPSIS -->
-<B>
-<PRE>
-&lt;data&gt; | xpaset  [-h] [-i nsinet] [-m method] [-n] [-p] [-s] [-t sval,lval] [-u users] [-v] &lt;template|host:port&gt; [paramlist]
-</PRE>
-</B>
-
-<!-- =section xpaset OPTIONS -->
-<P>
-<PRE>
-  -h		print help message
-  -i		access XPA point on different machine (override XPA_NSINET)
-  -m		override XPA_METHOD environment variable
-  -n		don't wait for the status message after server completes
-  -p		don't read (or send) buf data from stdin
-  -s		enter server mode
-  -t [s,l]	set short and long timeouts (override XPA_[SHORT,LONG]_TIMEOUT)
-  -u [users]	XPA points can be from specified users (override XPA_NSUSERS)
-  -v		verify message to stdout
-  --version     display version and exit
-</PRE>
-
-<!-- =section xpaset DESCRIPTION -->
-<P>
-Data read from stdin will be sent to access points matching the 
-<A HREF="./template.html">template</A>
-or host:port.
-A set of qualifying parameters can be appended.
-<P>
-Normally, xpaset reads data input from stdin until EOF and sends those
-data to the XPA target, along with parameters entered on the command
-line. For example to send a FITS file to the ds9 image display:
-<PRE>
-  cat foo.fits | xpaset ds9 fits
-</PRE>
-<P>
-Sometimes, however, it is desirable to send only parameters to an XPA
-access point, without sending data. For such cases, use the -p switch to
-indicate that there is no data being send to stdin. For example, to
-change the colormap used by the ds9 image display program, use:
-<PRE>
-  csh> xpaset -p ds9 cmap Heat
-</PRE>
-Of course, this also can be accomplished by sending EOF to stdin in
-any of the usual ways:
-<PRE>
-  csh> echo "" | xpaset ds9 cmap Heat
-  csh> xpaget ds9 cmap Heat < /dev/null
-  csh> xpaset ds9 cmap Heat
-  ^D			# Ctl-D signals EOF
-</PRE>
-<P>
-The -s switch puts xpaset into server mode, in which commands and data
-can be sent to access points without having to run xpaset multiple times.
-(Its not clear if this buys you much!) The syntax for sending commands
-in server mode is:
-<P>
-<PRE>
-  csh> xpaset -s
-  xpaset ds9 colormap I8
-  ^D
-  xpaset ds9 regions
-  circle 200 300 40
-  circle 300 400 50
-  ^D
-etc.
-</PRE>
-After the  required "xpaset" command is specified, optional ASCII data
-can be appended (as in the region example).  A single data/command set is
-delimited by ^D. Note that typing ^D when a command is expected terminates
-the program.
-<P>
-NB: server mode only works from the terminal and only ASCII data can be
-sent in this way.
-<P>
-<B>Examples:</B>
-<PRE>
-  csh> xpaset ds9 file < foo.fits
-  csh> echo "stop" | xpaset myhost:12345
-</PRE>
-
-<!-- =defdoc xpaget xpaget 1 -->
-
-<!-- =section xpaget NAME -->
-<H2><A NAME="xpaget">xpaget: retrieve data from one or more XPA servers</A></H2>
-
-<!-- =section xpaget SYNOPSIS -->
-<B>
-<PRE>
-xpaget [-h] [-i nsinet] [-m method] [-s] [-t sval,lval] [-u users] &lt;template|host:port&gt; [paramlist]
-</PRE>
-</B>
-
-<!-- =section xpaget OPTIONS -->
-<P>
-<PRE>
-  -h		print help message
-  -i		access XPA point on different machine (override XPA_NSINET)
-  -m		override XPA_METHOD environment variable
-  -n		don't wait for the status message after server completes
-  -s		enter server mode
-  -t [s,l]	set short and long timeouts (override XPA_[SHORT,LONG]_TIMEOUT)
-  -u [users]	XPA points can be from specified users (override XPA_NSUSERS)
-  --version     display version and exit
-</PRE>
-
-<!-- =section xpaget DESCRIPTION -->
-<P>
-Data will be retrieved from access points matching the 
-<A HREF="./template.html">template</A>
-or host:port.
-A set of qualifying parameters can be appended.
-<P>
-<B>Examples:</B>
-<PRE>
-  csh> xpaget ds9 images
-  csh> xpaget myhost.harvard.edu:12345
-</PRE>
-
-<!-- =defdoc xpainfo xpainfo 1 -->
-
-<!-- =section xpainfo NAME -->
-<H2><A NAME="xpainfo">xpainfo: send short message to one or more XPA servers</A></H2>
-
-<!-- =section xpainfo SYNOPSIS -->
-<B>
-<PRE>
-xpainfo [-h] [-i nsinet] [-m method] [-n] [-s] [-t sval,lval] [-u users] &lt;template|host:port&gt; [paramlist]
-</PRE>
-</B>
-
-<!-- =section xpainfo OPTIONS -->
-<P>
-<PRE>
-  -h		print help message
-  -i		access XPA point on different machine (override XPA_NSINET)
-  -m		override XPA_METHOD environment variable
-  -n		don't wait for the status message after server completes
-  -s		enter server mode
-  -t [s,l]	set short and long timeouts (override XPA_[SHORT,LONG]_TIMEOUT)
-  -u [users]	XPA points can be from specified users (override XPA_NSUSERS)
-  --version     display version and exit
-</PRE>
-
-<!-- =section xpainfo DESCRIPTION -->
-<P>
-Info will be sent to access points matching the
-<A HREF="./template.html">template</A>
-or host:port.
-A set of qualifying parameters can be appended.
-<P>
-<B>Examples:</B>
-<PRE>
-  csh> xpainfo IMAGE ds9 image
-</PRE>
-
-<!-- =defdoc xpaaccess xpaaccess 1 -->
-
-<!-- =section xpaaccess NAME -->
-<H2><A NAME="xpaaccess">xpaaccess: see if template matches registered XPA access points</A></H2>
-
-<!-- =section xpaaccess SYNOPSIS -->
-<B>
-<PRE>
-xpaaccess [-c] [-h] [-i nsinet] [-m method] [-n] [-t sval,lval] [-u users] -v &lt;template&gt; [type]
-</PRE>
-</B>
-
-<!-- =section xpaaccess OPTIONS -->
-<P>
-<PRE>
-  -c		contact each access point individually
-  -h		print help message
-  -i		access XPA point on different machine (override XPA_NSINET)
-  -m		override XPA_METHOD environment variable
-  -n		return number of matches instead of "yes" or "no"
-  -t [s,l]	set short and long timeouts (override XPA_[SHORT,LONG]_TIMEOUT)
-  -u [users]	XPA points can be from specified users (override XPA_NSUSERS)
-  -v		print info about each successful access point
-  -V		print info or error about each access point
-  --version     display version and exit
-</PRE>
-
-<!-- =section xpaaccess DESCRIPTION -->
-<P>
-xpaaccess returns "yes" to stdout (with a return error code if 1) if there are
-existing XPA access points that match the 
-<A HREF="./template.html">template</A>
-(and optional access type: g,i,s). Otherwise, it returns "no" (with a
-return error code of 0).  If -n is specified, the number of matches is
-returned instead (both to stdout and in the returned error code). If
--v is specified, each access point is displayed to stdout instead of
-the number of matches.
-
-<P>
-By default, xpaaccess simply contacts the xpans name server to find
-the list of registered access points that match the specified
-template. It also checks to make sure the specified types are
-supported by that access point. This is the fastest way to determine
-available access points. However, an access point might registered but
-not yet available, if, for example, the server program has not entered
-its event loop to process XPA requests. To find access points that are
-guaranteed to be available for processing, use the -c (contact)
-switch.  With this switch, xpaaccess contacts each matching XPA server
-(rather than the name server) to make sure the registered access point
-really is ready for processing. In this mode, if an access point is
-registered but not available, xpaaccess will pause for a period of
-time equal to the XPA_LONG_TIMEOUT, in order to give the server a
-chance to ready itself. By default, this timeout is 30 seconds. You
-can shorten the time of delay using the -t "short,long" switch. For
-example, to shorten the delay time to 2 seconds, use:
-<PRE>
-  xpaaccess -c -t "2,2" ds9
-</PRE>
-The first argument is the short delay value, and is ignored in this
-operation. The second is the long delay timeout.
-
-<P>
-Note also that the default xpaaccess method (no -c switch) does not
-check access control (acls) but rather only checks whether the access
-point is both registered with the xpans name server and provides the
-specified type of access. In other words, the default xpaaccess could
-return 'yes' when you might not actually have access. This mode also
-always returns 'yes' for the xpans name server itself, regardless of
-whether the name server is active. The -c (contact) switch, which
-contacts the access point directly, can and does check the access
-control (only for servers using version 2.1 and above) and also
-returns the real status of xpans.
-
-<!-- =section xpaget SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpaset SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpainfo SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpaaccess SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: September 10, 2003</H5>
-</BODY>
-</HTML>
diff --git a/xpa/doc/server.html b/xpa/doc/server.html
deleted file mode 100644
index 2e10b11..0000000
--- a/xpa/doc/server.html
+++ /dev/null
@@ -1,833 +0,0 @@
-<!-- =defdoc xpaserver xpaserver 3 -->
-<HTML>
-<HEAD>
-<TITLE>XPA Server API</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpaserver NAME -->
-<H2><A NAME="xpaserver">XPAServer: The XPA Server-side Programming Interface</A></H2>
-
-<!-- =section xpaserver SYNOPSIS -->
-<H2>Summary</H2>
-A description of the XPA server-side programming interface.
-
-<!-- =section xpaserver DESCRIPTION -->
-<H2><A NAME="intro">Introduction to XPA Server Programming</H2></A>
-<P>
-Creating an XPA server is easy: you generally only need to call the
-XPANew() subroutine to define a named XPA access point and set up the
-send and receive callback routines.  You then enter an event loop such
-as XPAMainLoop() to field XPA requests.
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  XPA <A HREF="./server.html#xpanew">XPANew</A>(char *class, char *name, char *help,
-      int (*send_callback)(), void *send_data, char *send_mode,
-      int (*rec_callback)(),  void *rec_data,  char *rec_mode);
-
-  XPA <A HREF="./server.html#xpacmdnew">XPACmdNew</A>(char *class, char *name);
-
-  XPACmd <A HREF="./server.html#xpacmdadd">XPACmdAdd</A>(XPA xpa,
-         char *name, char *help,
-         int (*send_callback)(), void *send_data, char *send_mode,
-         int (*rec_callback)(),  void *rec_data,  char *rec_mode);
-
-  void <A HREF="./server.html#xpacmddel">XPACmdDel</A>(XPA xpa, XPACmd cmd);
-
-  XPA <A HREF="./server.html#xpainfonew">XPAInfoNew</A>(char *class, char *name,
-      int (*info_callback)(), void *info_data, char *info_mode);
-
-  int <A HREF="./server.html#xpafree">XPAFree</A>(XPA xpa);
-
-  void <A HREF="./server.html#xpamainloop">XPAMainLoop</A>(void);
-
-  int <A HREF="./server.html#xpapoll">XPAPoll</A>(int msec, int maxreq);
-
-  void <A HREF="./server.html#xpaatexit">XPAAtExit</A>(void);
-
-  void <A HREF="./server.html#xpacleanup">XPACleanup</A>(void);
-
-</PRE>
-
-<H2>Introduction</H2>
-
-To use the XPA application programming interface, a software developer
-generally will include the xpa.h definitions file:
-<PRE>
-  #include &lt;xpa.h&gt;
-</PRE>
-in the software module that defines or accesses an XPA access point, and
-then will link against the libxpa.a library:
-<PRE>
-  gcc -o foo foo.c libxpa.a
-</PRE>
-XPA has been compiled using both C and C++ compilers.
-
-<P>
-A server program generally defines an XPA access point by calling the
-XPANew() routine and specifies "send" and/or "receive" callback
-procedures to be executed by the program when an external process
-either sends data or commands to this access point or requests data or
-information from this access point. A program also can define several
-sub-commands for a single access point by calling XPACmdNew() and
-XPACmdAdd() instead.  Having defined one or more public access points
-in this way, an XPA server program enters its usual event loop (or
-uses the standard XPA event loop).
-
-<!-- =defdoc xpanew xpanew 3 -->
-
-<!-- =section xpanew NAME -->
-<H2><A NAME="xpanew">XPANew: create a new XPA access point</A></H2>
-
-<!-- =section xpanew SYNOPSIS -->
-<B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  XPA XPANew(char *class, char *name, char *help,
-	     int (*send_callback)(),
-	     void *send_data, char *send_mode,
-	     int (*rec_callback)(),
-	     void *rec_data,  char *rec_mode);
-</PRE>
-</B>
-
-<!-- =section xpanew DESCRIPTION -->
-<P>
-Create a new XPA public access point with the class:name
-identifier <A HREF="./template.html">template</A>
-and enter this access point into the XPA name server, so that it
-can be accessed by external processes. XPANew() returns an XPA struct.
-Note that the length of the class and name designations must be less
-than or equal to 1024 characters each.
-
-<P>
-The XPA name server daemon, xpans, will be started automatically if it
-is not running already (assuming it can be found in the path).  The
-program's ip address and listening port are specified by the
-environment variable XPA_NSINET, which takes the form <ip>:<port>.  If
-no such environment variable exists, then xpans is started on the
-current machine listening on port 14285.  It also uses 14286 as a
-known port for its public access point (so that routines do not have
-to go to the name server to find the name server ip and port!)
-As of XPA 2.1.1, version information is exchanged between the xpans
-process and the new access point. If the access point uses an XPA
-major/minor version newer than xpans, a warning is issued by both processes,
-since mixing of new servers and old xpa programs (xpaset, xpaget,
-xpans, etc.) is not likely to work. You can turn off the warning
-message by setting the XPA_VERSIONCHECK environment variable to "false".
-
-<P>
-The help string is meant to be returned by a request from xpaget:
-<PRE>
-  xpaget class:name -help
-</PRE>
-<P>
-A send_callback and/or a receive_callback can be specified; at
-least one of them must be specified.
-
-<P>
-A send_callback can be specified that will be executed in response to
-an external request from the xpaget program, the XPAGet() routine, or
-XPAGetFd() routine. This callback is used to send data to the
-requesting client.
-
-<P>
-The calling sequence for send_callback() is:
-<PRE>
-  int send_callback(void *send_data, void *call_data,
-    char *paramlist, char **buf, size_t *len)
-  {
-    XPA xpa = (XPA)call_data;
-    ...
-    return(stat);
-  }
-</PRE>
-<P>
-The send_mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-<PRE>
-  key   	value		default		explanation
-  ------	--------	--------	-----------
-  acl		true/false	true		enable access control
-  freebuf	true/false	true		free buf after callback completes
-</PRE>
-<P>
-The call_data should be recast to the XPA struct as shown.  In
-addition, client-specific data can be passed to the callback in
-send_data.
-
-<P>
-The paramlist will be supplied by the client as qualifying parameters
-for the callback.  There are two ways in which the send_callback()
-routine can send data back to the client:
-
-<P>
-1. The send_callback() routine can fill in a buffer and pass back a
-pointer to this buffer. An integer len also is returned to specify the
-number of bytes of data in buf.  XPA will send this buffer to the
-client after the callback is complete.
-
-<P>
-2. The send_callback can send data directly to the client by writing
-to the fd pointed by the macro:
-<PRE>
-  xpa_datafd(xpa)
-</PRE>
-<P>
-Note that this fd is of the kind returned by socket() or open().
-
-<P>
-If a buf has been allocated by a standard malloc routine, filled, and
-returned to XPA, then freebuf generally is set so that the buffer will
-be freed automatically when the callback is completed and data has
-been sent to the client.  If a static buf is returned, freebuf should
-be set to false to avoid a system error when freeing static storage.
-Note that default value for freebuf implies that the callback will
-allocate a buffer rather than use static storage.
-
-<P>
-On the other hand, if buf is dynamically allocated using a method
-other than a standard malloc/calloc/realloc routine (e.g. using Perl's
-memory allocation and garbage collection scheme), then it is necessary
-to tell XPA how to free the allocated buffer. To do this, use the
-XPASetFree() routine within your callback:
-<PRE>
-  void XPASetFree(XPA xpa, void (*myfree)(void *), void *myfree_ptr);
-</PRE>
-The first argument is the usual XPA handle. The second argument is the
-special routine to call to free your allocated memory. The third
-argument is an optional pointer.  If not NULL, the specified free
-routine is called with that pointer as its sole argument. If NULL, the
-free routine is called with the standard buf pointer as its sole
-argument. This is useful in cases where there is a mapping between the
-buffer pointer and the actual allocated memory location, and the
-special routine is expecting to be passed the former.
-
-<P>
-If, while the callback performs its processing, an error occurs that
-should be communicated to the client, then the routine XPAError should be
-called:
-<PRE>
-  XPAError(XPA xpa, char *s);
-</PRE>
-<P>
-where s is an arbitrary error message.  The returned error message
-string will be of the form:
-<PRE>
-  XPA$ERROR   [error] (class:name ip:port)
-</PRE>
-<P>
-If the callback wants to send a specific acknowledgment message back
-to the client, the routine XPAMessage can be called:
-<PRE>
-  XPAMessage(XPA xpa, char *s);
-</PRE>
-<P>
-where s is an arbitrary error message.  The returned error message
-string will be of the form:
-<PRE>
-  XPA$MESSAGE [message] (class:name ip:port)
-</PRE>
-<P>
-Otherwise, a standard acknowledgment is sent back to the client
-after the callback is completed.
-
-<P>
-The callback routine should return 0 if no error occurs, or -1 to
-signal an error.
-
-<P>
-A receive_callback can be specified that will be executed in response
-to an external request from the xpaset program, or the XPASet (or
-XPASetFd()) routine. This callback is used to process data received
-from an external process.
-
-<P>
-The calling sequence for receive_callback is:
-<PRE>
-  int receive_callback(void *receive_data, void *call_data,
-    char *paramlist, char *buf, size_t len)
-  {
-    XPA xpa = (XPA)call_data;
-    ...
-    return(stat);
-  }
-</PRE>
-<P>
-The mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-<PRE>
-  key   	value		default		explanation
-  ------	--------	--------	-----------
-  acl		true/false	true		enable access control
-  buf		true/false	true		server expects data bytes from client
-  fillbuf	true/false	true		read data into buf before executing callback
-  freebuf	true/false	true		free buf after callback completes
-</PRE>
-<P>
-The call_data should be recast to the XPA struct as shown.  In
-addition, client-specific data can be passed to the callback in
-receive_data.
-
-<P>
-The paramlist will be supplied by the client. In addition, if the
-receive_mode keywords buf and fillbuf are true, then on entry into the
-receive_callback() routine, buf will contain the data sent by the
-client. If buf is true but fillbuf is false, it becomes the callback's
-responsibility to retrieve the data from the client, using the data fd
-pointed to by the macro xpa_datafd(xpa).  If freebuf is true, then buf
-will be freed when the callback is complete.
-
-<P>
-If, while the callback is performing its processing, an error occurs
-that should be communicated to the client, then the routine XPAError
-can be called:
-<PRE>
-  XPAError(XPA xpa, char *s);
-</PRE>
-<P>
-where s is an arbitrary error message.
-
-<P>
-The callback routine should return 0 if no error occurs, or -1 to
-signal an error.
-
-<!-- =defdoc xpacmdnew xpacmdnew 3 -->
-
-<!-- =section xpacmdnew NAME -->
-<H2><A NAME="xpacmdnew">XPACmdNew: create a new XPA public access point for commands</A></H2>
-
-<!-- =section xpacmdnew SYNOPSIS -->
-<B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  XPA XPACmdNew(char *class, char *name);
-</PRE>
-</B>
-
-<!-- =section xpacmdnew DESCRIPTION -->
-<P>
-Create a new XPA public access point for commands that will share a
-common identifier class:name. Enter this access point into the XPA
-name server, so that it can be accessed by external processes.
-XPACmdNew() returns an XPA struct.
-
-<P>
-It often is more convenient to have one public access point that can
-manage a number of commands, rather than having individual access
-points for each command. For example, it is easier to command the
-ds9 image display using:
-<PRE>
-  echo "colormap I8"   | xpaset ds9
-  echo "scale log"     | xpaset ds9
-  echo "file foo.fits" | xpaset ds9
-</PRE>
-<P>
-then to use:
-<PRE>
-  echo "I8"       | xpaset ds9_colormap
-  echo "log"      | xpaset ds9_scale
-  echo "foo.fits" | xpaset ds9_file
-</PRE>
-<P>
-In the first case, the commands remain the same regardless of the
-target XPA name.  In the second case, the command names must change
-for each instance of ds9.  That is, if a second instance of ds9
-called DS9 were running, it would be commanded either as:
-<PRE>
-  echo "colormap I8"   | xpaset DS9
-  echo "scale log"     | xpaset DS9
-  echo "file foo.fits" | xpaset DS9
-</PRE>
-<P>
-or as:
-<PRE>
-  echo "I8"       | xpaset DS9_colormap
-  echo "log"      | xpaset DS9_scale
-  echo "foo.fits" | xpaset DS9_file
-</PRE>
-<P>
-Thus, in cases where a program is going to manage many commands, it
-generally is easier to define them as commands associated with the
-XPACmdNew() routine, rather than as separate access points using
-XPANew().
-
-<P>
-When XPACmdNew() is called, only the class:name identifier is
-specified.  Each sub-command is subsequently defined using the
-XPACmdAdd() routine.
-
-<!-- =defdoc xpacmdadd xpacmdadd 3 -->
-
-<!-- =section xpacmdadd NAME -->
-<H2><A NAME="xpacmdadd">XPACmdAdd: add a command to an XPA command public access point</A></H2>
-
-<!-- =section xpacmdadd SYNOPSIS -->
-<B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  XPACmd XPACmdAdd(XPA xpa, char *name, char *help,
-	           int (*send_callback)(),
-		   void *send_data, char *send_mode,
-         	   int (*rec_callback)(),
-		   void *rec_data,  char *rec_mode);
-</PRE>
-</B>
-
-<!-- =section xpacmdadd DESCRIPTION -->
-<P>
-Add a command to an XPA command access point. The XPA argument specifies the
-XPA struct returned by a call to XPANewCmd(). The name argument is the
-name of the command. The other arguments function identically to the
-arguments in the XPANew() command, i.e., the send_callback and rec_callback
-routines have identical calling sequences to their XPANew() counterparts,
-with the exceptions noted below.
-
-<P>
-When help is requested for a command access point using:
-<PRE>
-  xpaget -h class:name
-</PRE>
-<P>
-all of the command help strings are listed.  To get help for a given
-command, use:
-<PRE>
-  xpaget -h class:name cmd
-</PRE>
-<P>
-Also, the acl keyword in the send_mode and receive_mode strings is
-global to the access point, not local to the command.  Thus, the value
-for the acl mode should be the same in all send_mode (or receive_mode)
-strings for each command in a command access point. (The acl for
-send_mode need not be the same as the acl for receive_mode, though).
-
-<!-- =defdoc xpacmddel xpacmddel 3 -->
-
-<!-- =section xpacmddel NAME -->
-<H2><A NAME="xpacmddel">XPACmdDel: remove a command from an XPA command public access point</A></H2>
-
-<!-- =section xpacmddel SYNOPSIS -->
-<B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  void XPACmdDel(XPA xpa, XPACmd cmd);
-</PRE>
-</B>
-
-<!-- =section xpacmddel DESCRIPTION -->
-<P>
-This routine removes a command from the list of available commands in
-a given XPA.  That command will no longer be available for processing.
-
-<!-- =defdoc xpainfonew xpainfonew 3 -->
-
-<!-- =section xpainfonew NAME -->
-<H2><A NAME="xpainfonew">XPAInfoNew: define an XPA info public access point</A></H2>
-
-<!-- =section xpainfonew SYNOPSIS -->
-<B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  XPA XPAInfoNew(char *class, char *name,
-	         int (*info_callback)(),
-		 void *info_data, char *info_mode);
-</PRE>
-</B>
-
-<!-- =section xpainfonew DESCRIPTION -->
-<P>
-[NB: this is an experimental interface, new to XPA 2.0, whose value
-and best use is evolving.]
-
-<P>
-A program can register interest in receiving a short message about a
-particular topic from any other process that cares to send such a
-message.  Neither has to be an XPA server.  For example, if a user
-starts to work with a new image file called new.fits, she might
-wish to alert interested programs about this new file by sending a
-short message using xpainfo:
-<PRE>
-  xpainfo IMAGEFILE /data/new.fits
-</PRE>
-
-<P>
-In this example, each process that has used the XPAInfoNew() call to
-register interest in messages associated with the identifier IMAGEFILE
-will have its info_callback() executed with the following calling
-sequence:
-<PRE>
-  int info_cb(void *info_data, void *call_data, char *paramlist)
-  {
-    XPA xpa = (XPA)call_data;
-  }
-</PRE>
-<P>
-The arguments passed to this routine are equivalent to those sent in
-the send_callback() routine.  The main difference is that there is no
-buf sent to the info callback: this mechanism is meant for short
-announcement of messages of interest to many clients.
-
-<P>
-The mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-<PRE>
-  key   	value		default		explanation
-  ------	--------	--------	-----------
-  acl		true/false	true		enable access control
-</PRE>
-<P>
-Because no buf is passed to this callback, the usual buf-related keywords
-are not applicable here.
-
-<P>
-The information sent in the parameter list is arbitrary.  However, we
-envision sending information such as file names or XPA access points
-from which to collect more data.  Note that the xpainfo program and
-the XPAInfo() routine that cause the info_callback to execute do not
-wait for the callback to complete before returning.
-
-<!-- =defdoc xpafree xpafree 3 -->
-
-<!-- =section xpafree NAME -->
-<H2><A NAME="xpafree">XPAFree: remove an XPA public access point</A></H2>
-
-<!-- =section xpafree SYNOPSIS -->
-<PRE>
-<B>
-  #include &lt;xpa.h&gt;
-
-  int XPAFree(XPA xpa);
-</B>
-</PRE>
-
-<!-- =section xpafree DESCRIPTION -->
-<P>
-Remove the specified XPA public access point from the name server and
-free all associated storage.  Note that removal from the name server
-happens automatically when the process terminates, so this call is not
-generally needed.  It is used when public access points are being
-defined temporarily and then destroyed when no longer needed.  For
-example, ds9 temporarily creates a public access point when it
-loads a new image for display and destroys it when the image is
-unloaded.
-
-<!-- =defdoc xpamainloop xpamainloop 3 -->
-
-<!-- =section xpamainloop NAME -->
-<H2><A NAME="xpamainloop">XPAMainLoop: optional main loop for XPA</A></H2>
-
-<!-- =section xpamainloop SYNOPSIS -->
-<B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  void XPAMainLoop();
-</PRE>
-</B>
-
-<!-- =section xpamainloop DESCRIPTION -->
-<P>
-Once XPA access points have been defined, a program must enter an
-event loop to watch for requests from external programs. This can be
-done in a variety of ways, depending on whether the event loop is
-processing events other than XPA events.  In cases where there are no
-non-XPA events to be processed, the program can simply call the
-XPAMainLoop() event loop.  This loop is implemented essentially as
-follows (error checking is simplified in this example):
-<PRE>
-  FD_ZERO(&readfds);
-  while( XPAAddSelect(NULL, &readfds) ){
-    if( sgot = select(swidth, &readfds, NULL, NULL, NULL) >0 )
-      XPAProcessSelect(&readfds, 0);
-    else
-      break;
-    FD_ZERO(&readfds);
-  }
-</PRE>
-<P>
-The XPAAddSelect() routine sets up the select() readfds variable so
-that select() will wait for I/O on all the active XPA channels.  It
-returns the number of XPAs that are active; the loop will end when
-there are no active XPAs. The standard select() routine is called to
-wait for an external I/O request.  Since no timeout struct is passed
-in argument 5, the select() call hangs until there is an external
-request.  When an external I/O request is made, the XPAProcessSelect()
-routine is executed to process the pending requests.  In this routine,
-the maxreq value determines how many requests will be processed: if
-maxreq <=0, then all currently pending requests will be processed.
-Otherwise, up to maxreq requests will be processed.  (The most usual
-values for maxreq is 0 to process all requests.)
-
-<P>
-If a program has its own Unix select() loop, then XPA access points can
-be added to it by using a variation of the standard XPAMainLoop:
-<PRE>
-  XPAAddSelect(xpa, &readfds);
-  [app-specific ...]
-  if( select(width, &readfds, ...) ){
-    XPAProcessSelect(&readfds, maxreq);
-    [app-specific ...]
-    FD_ZERO(&readfds);
-  }
-</PRE>
-<P>
-XPAAddSelect() is called before select() to add the access points.
-If the first argument is NULL, then all active XPA access points
-are added. Otherwise only the specified access point is added.
-After select() is called, the XPAProcessSelect() routine can be called
-to process XPA requests.  Once again, the maxreq value determines how
-many requests will be processed: if maxreq <=0, then all currently
-pending requests will be processed.  Otherwise, up to maxreq requests
-will be processed.
-
-<P>
-XPA access points can be added to
-<A HREF="./xt.html">Xt event loops</A> (using XtAppMainLoop())
-and
-<A HREF="./tcl.html">Tcl/Tk event loops</A> (using vwait and the Tk loop).
-When using XPA with these event loops, you only need to call:
-<PRE>
-int XPAXtAddInput(XtAppContext app, XPA xpa)
-</PRE>
-or
-<PRE>
-  int XPATclAddInput(XPA xpa)
-</PRE>
-respectively before entering the loop.
-
-<!-- =defdoc xpapoll xpapoll 3 -->
-
-<!-- =section xpapoll NAME -->
-<H2><A NAME="xpapoll">XPAPoll: execute existing XPA requests</A></H2>
-
-<!-- =section xpapoll SYNOPSIS -->
-<B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  int XPAPoll(int msec, int maxreq);
-</PRE>
-</B>
-
-<!-- =section xpapoll DESCRIPTION -->
-<P>
-It is sometimes desirable to implement a polling loop, i.e., where one
-checks for and processes XPA requests without blocking.  For this
-situation, use the XPAPoll() routine:
-<PRE>
-  XPAPoll(int msec, int maxreq);
-</PRE>
-<P>
-The XPAPoll() routine will perform XPAAddSelect() and select(), but with a
-timeout specified in millisecs by the msec argument. If one or more
-XPA requests are made before the timeout expires, the XPAProcessSelect()
-routine is called to process those requests. The maxreq value determines
-how many requests will be processed: if maxreq < 0, then no events are
-processed, but instead, the return value indicates the number of events
-that are pending.  If maxreq == 0, then all currently pending requests
-will be processed.  Otherwise, up to maxreq requests will be processed.
-(The most usual values for maxreq are 0 to process all requests and 1
-to process one request).
-
-<!-- =defdoc xpaatexit xpaatexit 3 -->
-
-<!-- =section xpaatexit NAME -->
-<H2><A NAME="xpaatexit">XPAAtExit: install exit handler</A></H2>
-
-<!-- =section xpaatexit SYNOPSIS -->
-<PRE>
-<B>
-  #include &lt;xpa.h&gt;
-
-  void XPAAtExit(void);
-</B>
-</PRE>
-
-<!-- =section xpaatexit DESCRIPTION -->
-<P>
-XPAAtExit() will install an exit handler using atexit() to run XPAFree on all
-XPA access points. This might be useful in cases where Unix sockets are being
-used: if an explicit call to XPAFree() is not made by the program, the Unix
-socket file will not be deleted immediately without an atexit handler. (NB: this
-call should not be made in a Tcl/Tk application. Accessing the Tcl native file
-system after Tcl has shut down all file systems causes the Tcl/Tl program to
-crash).
-
-<!-- =defdoc xpacleanup xpacleanup 3 -->
-
-<!-- =section xpacleanup NAME -->
-<H2><A NAME="xpacleanup">XPACleanup: release reserved XPA memory</A></H2>
-
-<!-- =section xpacleanup SYNOPSIS -->
-<PRE>
-<B>
-  #include &lt;xpa.h&gt;
-
-  void XPACleanup(void);
-</B>
-</PRE>
-
-<!-- =section xpacleanup DESCRIPTION -->
-<P>
-When XPA is initialized, it allocates a small amount of memory for the
-access control list, temp directory path, and reserved commands. This
-memory is found by valgrind to be "still reachable", meaning that "your
-program didn't free some memory it could have". Calling the
-XPACleanup() routine before exiting the program will free this memory
-and make valgrind happy.
-
-<!-- =defdoc xpamacros xpamacros 3 -->
-
-<!-- =section xpamacros NAME -->
-<H2><A NAME="macros">XPA Server Callback Macros</A></H2>
-
-<!-- =section xpamacros SYNOPSIS -->
-<B>
-<PRE>
-  #include &lt;xpa.h&gt;
-
-  xpa_class, xpa_name, xpa_method, xpa_cmdfd, xpa_datafd,
-  xpa_sendian, xpa_cendian
-</PRE>
-</B>
-
-<!-- =section xpamacros DESCRIPTION -->
-<P>
-Server routines have  access to information about the XPA being called via
-the following macros (each of which takes the xpa handle as an argument):
-<PRE>
-  macro		 	explanation
-  ------		-----------
-  xpa_class		class of this xpa
-  xpa_name		name of this xpa
-  xpa_method		method string (inet or local connect info)
-  xpa_cmdfd		fd of command socket
-  xpa_datafd		fd of data socket
-  xpa_sendian		endian-ness of server ("little" or "big")
-  xpa_cendian		endian-ness of client ("little" or "big"
-</PRE>
-<P>
-The argument to these macros is the call_data pointer that is passed
-to the server procedure.  This pointer should be type case to XPA
-in the server routine:
-<PRE>
-  XPA xpa = (XPA)call_data;
-</PRE>
-
-<P>
-The most important of these macros is xpa_datafd().  A server routine
-that sets "fillbuf=false" in receive_mode or send_mode can use this
-macro to perform I/O directly to/from the client, rather than using
-buf.
-
-<P>
-The xpa_cendian and xpa_sendian macros can be used together to determine
-if the data transferred from the client is byte swapped with respect
-to the server. Values for these macros are: "little", "big", or "?".
-In order to do a proper conversion, you still need to know the format
-of the data (i.e., byte swapping is dependent on the size of the data
-element being converted).
-
-<!-- =defdoc xparace xparace 3 -->
-
-<!-- =section xparace NAME -->
-<H2><A NAME="race">XPA Race Conditions</A></H2>
-
-<!-- =section xparace SYNOPSIS -->
-Potential XPA race conditions and how to avoid them.
-
-<!-- =section xparace DESCRIPTION -->
-<P>
-Currently, there is only one known circumstance in which XPA can get
-(temporarily) deadlocked in a race condition: if two or more XPA
-servers send messages to one another using an XPA client routine such
-as XPASet(), they can deadlock while each waits for the other server
-to respond.  (This can happen if the servers call XPAPoll() with a
-time limit, and send messages in between the polling call.)  The
-reason this happens is that both client routines send a string to the
-other server to establish the handshake and then wait for the server
-response. Since each client is waiting for a response, neither is able
-to enter its event-handling loop and respond to the other's
-request. This deadlock will continue until one of the timeout periods
-expire, at which point an error condition will be triggered and the
-timed-out server will return to its event loop.
-
-<P>
-Starting with version 2.1.6, this rare race condition can be
-avoided by setting the XPA_IOCALLSXPA environment variable for servers
-that will make client calls. Setting this variable causes all XPA
-socket IO calls to process outstanding XPA requests whenever the
-primary socket is not ready for IO. This means that a server making a
-client call will (recursively) process incoming server requests while
-waiting for client completion. It also means that a server callback
-routine can handle incoming XPA messages if it makes its own XPA call.
-The semi-public routine oldvalue=XPAIOCallsXPA(newvalue) can be used
-to turn this behavior off and on temporarily. Passing a 0 will turn
-off IO processing, 1 will turn it back on. The old value is returned
-by the call.
-
-<P>
-By default, the XPA_IOCALLSXPA option is turned off, because we judge
-that the added code complication and overhead involved will not be
-justified by the amount of its use.  Moreover, processing XPA requests
-within socket IO can lead to non-intuitive results, since incoming
-server requests will not necessarily be processed to completion in the
-order in which they are received.
-
-<P>
-Aside from setting XPA_IOCALLSXPA, the simplest way to avoid this race
-condition is to multi-process: when you want to send a client message,
-simply start a separate process to call the client routine, so that
-the server is not stopped. It probably is fastest and easiest to use
-fork() and then have the child call the client routine and exit. But
-you also can use either the system() or popen() routine to start one
-of the command line programs and do the same thing. Alternatively, you
-can use XPA's internal launch() routine instead of system(). Based on
-fork() and exec(), this routine is more secure than system() because
-it does not call /bin/sh.
-
-<P>
-Starting with version 2.1.5, you also can send an XPAInfo() message with
-the mode string "ack=false". This will cause the client to send a message
-to the server and then exit without waiting for any return message from
-the server. This UDP-like behavior will avoid the server deadlock when
-sending short XPAInfo messages.
-
-<!-- =section xpaserver SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpanew SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpacmdnew SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpacmdadd SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpacmddel SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpainfonew SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpafree SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpacleanup SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpamainloop SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpapoll SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xpamacros SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =section xparace SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: September 10, 2003</H5>
-</BODY>
-</HTML>
diff --git a/xpa/doc/sman/xpa4.index b/xpa/doc/sman/xpa4.index
deleted file mode 100644
index 7c5a98a..0000000
Binary files a/xpa/doc/sman/xpa4.index and /dev/null differ
diff --git a/xpa/doc/sman/xpa4.index.prop b/xpa/doc/sman/xpa4.index.prop
deleted file mode 100644
index 0d0dd69..0000000
Binary files a/xpa/doc/sman/xpa4.index.prop and /dev/null differ
diff --git a/xpa/doc/sman/xpa4.index.version b/xpa/doc/sman/xpa4.index.version
deleted file mode 100644
index accb620..0000000
--- a/xpa/doc/sman/xpa4.index.version
+++ /dev/null
@@ -1,2 +0,0 @@
-SMAN_DATA_VERSION 1.2
-VERSION 1.01
diff --git a/xpa/doc/sman/xpa8.index b/xpa/doc/sman/xpa8.index
deleted file mode 100644
index e9f998c..0000000
Binary files a/xpa/doc/sman/xpa8.index and /dev/null differ
diff --git a/xpa/doc/sman/xpa8.index.prop b/xpa/doc/sman/xpa8.index.prop
deleted file mode 100644
index 54b3108..0000000
Binary files a/xpa/doc/sman/xpa8.index.prop and /dev/null differ
diff --git a/xpa/doc/sman/xpa8.index.version b/xpa/doc/sman/xpa8.index.version
deleted file mode 100644
index accb620..0000000
--- a/xpa/doc/sman/xpa8.index.version
+++ /dev/null
@@ -1,2 +0,0 @@
-SMAN_DATA_VERSION 1.2
-VERSION 1.01
diff --git a/xpa/doc/sman_conf.tmpl b/xpa/doc/sman_conf.tmpl
deleted file mode 100644
index abac8e4..0000000
--- a/xpa/doc/sman_conf.tmpl
+++ /dev/null
@@ -1,96 +0,0 @@
-# $Id: sman-defaults.conf,v 1.33 2006/05/02 02:09:18 joshr Exp $
-# by Josh Rabinowitz, 2005-2006. <joshr>
-# this is the default sman configuration file.
-# if you need to make changes, copy this file to
-# /usr/local/etc/sman.conf and make changes to that file.
-# NOTE: if you do use a custom sman.conf you may need to manually 
-# NOTE: merge changes from this file to your configuration file 
-# NOTE: after upgrading sman versions
-
-# See 'perldoc sman.conf' for more documentation
-
-# sman-defaults.conf
-# holds the defaults for sman.
-# the directive names are case-insensitive
-
-SWISHECMD @SW@  -v 0
-
-# MANCMD specifies how to manually convert the manpages to 
-# ASCII. For 'manual' parsing.
-# %F is the quoted full [F]ilename of the manpage (ie, '/usr/share/man/man1/ls.1.gz)
-# %S is the quoted [S]ection of the manpage (ie, '1')
-# %C is the quoted (apparent) [C]ommand of the manpage (ie, 'ls')
-
-# NOTE: lack of a MANCMD (or a value of AUTOCONFIG) causes sman-update 
-# to autoconfigure the value of MANCMD. It will most likely choose 
-# one of the below: 
-
-# this works for most linuxes we've tested. ie 'man /man/man1/ls.1'
-# MANCMD man -c %F 
-# this works for freebsd 4.4 and Mac OS X. ie 'man 1 ls'
-#MANCMD man -c %S %C
-# -c means reparse man page sources (for line re-wrapping)
-
-# works for Solaris and OS X
-MANCMD man -s %S %C
-
-# the COL program is used to strip out backspaces and 
-# such from the MAN output.
-
-COLCMD col -b
-
-# all vars starting with ENV_ get set in the 
-# environment, sans the ENV_ prefix.
-
-# Try to make MAN wrap lines at 256 chars (not 80!)
-ENV_MANWIDTH 256
-
-# where to put sman's temp files. 
-#  (Use SWISHE_TMPDIR to set affect SWISH-E at index time) 
-
-TMPDIR /tmp
-
-# meta and property aliases. If your XML has different tags.
-# refentrytitle, manvolnum and refpurpose are the names from rman
-# each ALIASES line turns into 2 lines for SWISH-E like this:
-#MetaNameAlias     swishtitle refentrytitle 
-#PropertyNameAlias swishtitle refentrytitle 
-
-TITLEALIASES RefEntryTitle 
-SECALIASES ManVolNum 
-DESCALIASES RefPurpose
-#MANPAGEALIASES swishdefault
-
-# All parameters beginning with SWISHE_ have the SWISHE_ prefix stripped 
-# and are written into a tmp config file for SWISH-E at index time.
-
-# SWISHE_IndexFile is also used by sman as which index to search.
-
-# SWISHE_IndexFile specifies which index to create and search
-# NOTE: if the containing dir (ie, /var/lib/sman) is owned by an unprivileged
-# user, then sman-update can be run as that user.
-
-SWISHE_IndexFile /var/lib/sman/sman.index
-
-# these have 'SWISHE_' stripped off and are used 
-# when indexing the man pages.
-
-SWISHE_IndexComments      no 
- # don't index text in comments
-
-# These are important! You probably don't want to mess with these.
-SWISHE_IndexPointer "format=%V;"	
-	# for future use. %V becomes $Sman::SMAN_DATA_VERSION 
-#SWISHE_FuzzyIndexingMode   Stem	
-	# above was deprecated in 2.4.3, does not work in 2.4.4
-SWISHE_FuzzyIndexingMode   Stemming_en2
-SWISHE_MetaNames          desc sec swishtitle   manpage digest
-SWISHE_PropertyNames      desc sec              manpage digest
-
-# SWISHE_IgnoreWords File: ./stopwords/english.txt
-#   allow _ and : but not /
-# .'s in middle of word are word chars, for files like 'named.conf'.
-SWISHE_WordCharacters   0123456789abcdefghijklmnopqrstuvwxyz_:.
-SWISHE_BeginCharacters  0123456789abcdefghijklmnopqrstuvwxyz_:
-SWISHE_EndCharacters    0123456789abcdefghijklmnopqrstuvwxyz_: 
-SWISHE_IgnoreTotalWordCountWhenRanking 0
diff --git a/xpa/doc/szlong.c b/xpa/doc/szlong.c
deleted file mode 100644
index b0e84bc..0000000
--- a/xpa/doc/szlong.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include <stdio.h>
-
-int main(int argc, char **argv)
-{
-  fprintf(stdout, "%d\n", (int)sizeof(long));
-  return 0;
-}
-
diff --git a/xpa/doc/tcl.html b/xpa/doc/tcl.html
deleted file mode 100644
index 8feb46a..0000000
--- a/xpa/doc/tcl.html
+++ /dev/null
@@ -1,249 +0,0 @@
-<!-- =defdoc xpatcl xpatcl n -->
-<HTML>
-<HEAD>
-<TITLE>XPA/Tcl Interface</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpatcl NAME -->
-<H2><A NAME="xpatcl">XPATcl: the XPA Interface to the Tcl/Tk Environment</A></H2>
-
-<!-- =section xpatcl SYNOPSIS -->
-<H2>Summary</H2>
-
-<P>
-Tcl/Tk programs can act as XPA clients and/or servers using the Tcl
-interface to XPA that is contained in the libtclxpa.so shared object.
-
-<H2>Server Routines</H2>
-
-<PRE>
-  set xpa [xpanew class name help sproc sdata smode rproc rdata rmode]
-  xpafree xpa
-  set xpa [xpanew class name help iproc idata imode]
-  set xpa [xpacmdnew class name]
-  xpacmdadd xpa name help sproc sdata smode rproc rdata rmode
-  xpacmddel xpa cmd
-  set val [xparec xpa option]
-    options: name, class, method, cmdfd, datafd, cmdchan, datachan
-  xpasetbuf xpa buf len
-  xpaerror xpa message
-  xpamessage xpa message
-</PRE>
-
-<H2>Client Routines</H2>
-	
-<PRE>
-  set xpa [xpaopen mode]
-  xpaclose xpa
-  set got [xpaget xpa template paramlist mode bufs lens names errs n]
-  set got [xpaget xpa template paramlist mode chans names errs n]
-  set got [xpaset xpa template paramlist mode buf len names errs n]
-  set got [xpasetfd xpa template paramlist mode chan names errs n]
-  set got [xpainfo xpa template paramlist mode names errs n]
-  # NB: 2.1 calling sequence change
-  # set got [xpaaccess template type] (2.0.5)
-  set got [xpaaccess xpa template paramlist mode names errs n]
-  set got [xpanslookup template type classes names methods]
-</PRE>
-
-<!-- =section xpatcl DESCRIPTION -->
-<H2>Description</H2>
-<P>
-You can call XPANew(), XPACmdNew(), or XPAInfoNew() within a C
-routine to add C-based XPA server callbacks to a TCL/Tk program that
-uses a Tcl/Tk event loop (either vwait() or the Tk event loop);
-Such a program does not need or want to use the XPA event loop.
-Therefore, in order to add XPA access points to the Tcl/Tk loop, the
-following routine should be called beforehand:
-<PRE>
-  int XPATclAddInput(XPA xpa);
-</PRE>
-<P>
-Normally, the xpa argument is NULL, meaning that all current XPA
-access points are registered with the event loop.  However, if a
-single XPA access point is to be added (i.e., after the event loop is
-started) then the handle of that XPA access point can be passed to
-this routine.
-
-<P>
-The significance of the XPA/TCL interface goes beyond the support for
-using XPA inside C code. The interface allows you to write XPA
-servers and to make calls to the XPA client interface within the Tcl
-environment using the Tcl language directly. The XPA/Tcl
-interface can be loaded using the following package command:
-<PRE>
-  package require tclxpa 2.0
-</PRE>
-Alternatively, you can load the shared object (called libtclxpa.so ) directly:
-<PRE>
-  load .../libtclxpa.so tclxpa
-</PRE>
-<P>
-Once the tclxpa package is loaded, you can use Tcl versions of XPA
-routines to define XPA servers or make client XPA calls.  The
-interface for these routines is designed to match the Unix XPA
-interface as nearly as possible.  Please refer to
-<A HREF="./server.html">XPA Servers</A>
-and
-<A HREF="./client.html">XPA Clients</A>
-for general information about these routines.  
-
-<P>
-The file test.tcl in the XPA source directory gives examples for using the 
-XPA/Tcl interface.
-
-<P>
-The following notes describe the minor differences between the interfaces.
-
-<H2><A NAME="xpanew">XPANew</A></H2>
-<PRE>
-<B>
-  set xpa [xpanew class name help sproc sdata smode rproc rdata rmode]
-</B>
-</PRE>
-<P>
-rproc and sproc routines are routines.  The calling sequence of the
-rproc routine is identical to its C counterpart:
-<PRE>
-  proc rec_cb { xpa client_data paramlist buf len } { ... }
-</PRE>
-<P>
-The sproc routine, however is slightly different from its C counterpart
-because of the difficulty of passing data back from the callback to C:
-<PRE>
-  proc sendcb { xpa client_data paramlist } { ... }
-</PRE>
-<P>
-Note that the C-based server's char **buf and int *len arguments are
-missing from the Tcl callback. This is because we did not know how to
-fill buf with data and pass it back to the C routines for communication
-with the client.  Instead, the Tcl server callback uses the following
-routine to set buf and len:
-<PRE>
-  xpasetbuf xpa buf len
-</PRE>
-where:
-<PRE>
-  arg   	explanation
-  ------	-----------
-  xpa		the first argument of the server callback
-  buf		the data to be returned to the client
-  len		data length in bytes, (if absent, use length of the buf object)
-</PRE>
-<P>
-When this routine is called, a copy of buf is saved for transmission to
-the client.
-
-<P>
-The fact that buf is duplicated means that TCL server writers might wish to
-perform the I/O directly within the callback, rather than have XPA do it
-automatically at the end of the routine.  To do this, set:
-<PRE>
-  fillbuf=false
-</PRE>
-<P>
-in the xpanew smode and then perform I/O through the Tcl channel
-obtained from:
-<PRE>
-  set dchan [xparec $xpa datachan]
-</PRE>
-<P>
-where:
-<PRE>
-  arg   	explanation
-  ------	-----------
-  xpa		the first argument of the server callback
-  datachan	literal string "datachan" that returns the data channel
-  len		data length in bytes, (if absent, use length of the buf object)
-</PRE>
-<P>
-<B>
-NB: datachan and cmdchan are not available under Windows. It is
-necessary to use the "raw" equivalents: datafd and cmdfd.
-</B>
-
-<P>
-The same considerations apply to the rproc for receive servers: a copy
-of the incoming data is generated to pass to the receive callback. This
-copy again can be avoided by using "fillbuf=false" in the rmode and then
-reading the incoming data from datachan.
-
-<P>
-The send and receive callback routines can use the xpaerror and xpamessage
-routines to send errors and messages back to the client.  If you also
-want tcl itself to field an error condition, use the standard return call:
-<PRE>
-  return ?-code c? ?-errorinfo i? ?-errorcode ec? string
-</PRE>
-<P>
-See the Tcl man page for more info.
-
-<H2><A NAME="xpanew">XPARec</A></H2>
-<P>
-The Tcl xparec procedure supplies server routines with access to information 
-that is available via macros in the C interface:
-<PRE>
-  set val [xparec xpa &lt;option&gt;]
-</PRE>
-<P>
-where option is: name, class, method, cmdfd, datafd, cmdchan,
-datachan.  Note that two additional identifiers, cmdchan and datachan,
-have been added to to provide Tcl channels corresponding to datafd and
-cmdfd.  (These latter might still be retrieved in Tcl and passed back
-to a C routines.)  An additional option called "version" can be used to
-determine the XPA version used to build the Tcl interface. Note that
-the standard options require a valid XPA handle, but "version" does
-not (since it simply reports the value of the XPA_VERSION definition
-in the XPA source include file).
-
-<P>
-<B>
-NB: datachan and cmdchan are not available under Windows. It is
-necessary to use the "raw" equivalents: datafd and cmdfd.
-</B>
-<PRE>
-  macro 	explanation
-  ------	-----------
-  class		class of this xpa
-  name		name of this xpa
-  method	method string (inet or local connect info)
-  cmdchan	Tcl channel of command socket
-  datachan	Tcl channel of data socket
-  cmdfd		fd of command socket
-  datafd	fd of data socket
-  sendian	endian-ness of server ("little" or "big")
-  cendian	endian-ness of client ("little" or "big"
-  version	XPA version used to build this code
-</PRE>
-
-<p>
-Under Windows, the Tcl event handler cannot automatically sense when an
-XPA socket is ready for IO (i.e. Tcl_CreateFileHandler() is not available
-under Windows). The Windows Tcl event handler therefore must be awakened
-occasionally for check for XPA events. This is done using the standard
-Tcl_SetMaxBlockTime() call. The time parameter is defined in tclloop.c
-and is currently set to 1000 microseconds (1/1000 of a second). 
-
-<P>
-The version option can be used to differentiate between source code versions.
-It was created to support legacy Tcl code that needs to maintain the 2.0.5
-calling sequence for xpaaccess. You can use a version test such as:
-<PRE>
-  if [catch { xparec "" version } version] {
-    puts "pre-2.1.0e"
-  } else {
-    puts [split $version .]
-  }
-<PRE>
-
-<!-- =section xpatcl SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: September 10, 2003</H5>
-</BODY>
-</HTML>
diff --git a/xpa/doc/template.html b/xpa/doc/template.html
deleted file mode 100644
index 6a9a0d0..0000000
--- a/xpa/doc/template.html
+++ /dev/null
@@ -1,112 +0,0 @@
-<!-- =defdoc xpatemplate xpatemplate n -->
-<HTML>
-<HEAD>
-<TITLE>Access Point Names and Templates</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpatemplate NAME -->
-<H2><A NAME="xpatemplate">XPATemplate: Access Point Names and Templates</A></H2>
-<!-- =section xpatemplate SYNOPSIS -->
-<H2>Summary</H2>
-<P>
-XPA access points are composed of two parts: a general class and a
-specific name.  Both parts accept template characters so that you
-can send/retrieve data to/from multiple servers at one time.
-
-<!-- =section xpatemplate DESCRIPTION -->
-<H2>Description</H2>
-<P>
-When XPA servers call
-<A HREF="./server.html#xpanew">XPANew(),</A>
-or
-<A HREF="./server.html#xpacmdnew">XPACmdNew()</A>
-to define XPA access points, they specify a string identifier composed of a
-class and a name. When clients communicate with XPA access points,
-they specify which access points to communicate with using
-an identifier of the form:
-<PRE>
-  class:name
-</PRE>
-All registered XPA access points that match the specified identifier
-will be available for communication (subject to access control rules,
-etc.)
-
-<P>
-As of XPA 2.1.5, the length of both the class and name designations are
-limited to 1024 characters.
-
-<P>
-The XPA class:name identifier actually is a template: it accepts wild
-cards in its syntax, so a single specifier can match more than one XPA
-access point.  (Note that the class is optional and defaults to "*".)
-The allowed syntax for clients to specify the class:name template is
-of the form shown below. (Note that "*" is used to denote a generic
-wild card, but other wild cards characters are supported, as described
-below).
-<PRE>
-  template   	explanation
-  --------	-----------
-  class:name	exact match of class and name
-  name		match any class with this name
-  *:name	match any class with this name
-  class:*	match any name of this class
-  *:*		match any access point
-</PRE>
-<P>
-In general, the following wild-cards can be applied to class and name:
-<PRE>
-  wildcard	explanation
-  --------	-----------
-  ?		match any character, but there must be one
-  *		match anything, or nothing
-  [...]		match an inclusive set
-</PRE>
-<P>
-Although the class:name template normally is used to refer to XPA
-access points, these also can be specified using their individual
-socket identifiers.  For inet sockets, the socket identifier is
-<B>ip:port</B>, where ip can be the DNS-registered name,
-the ASCII IP number (e.g. 123.45.67.890) or the hex IP number
-(e.g. 838f3a60). For unix sockets, the identifier is the <B>socket file
-name</B>.  These socket identifiers are displayed as the fourth argument
-in the xpans display of registered access points.  For example,
-consider the ds9 program started using inet sockets. The xpans name
-server will register something like this:
-<PRE>
-  csh> xpaget xpans
-  DS9 ds9 gs saord.harvard.edu:3236 eric
-</PRE>
-You can access ds9 using ip:3236 in any of the three forms:
-<PRE>
-  csh> xpaget saord:3236 file
-  /home/eric/data/snr.ev
-
-  csh> xpaget 123.45.67.890:3236 file
-  /home/eric/data/snr.ev
-
-  csh> xpaget 838f3a60:3236 file
-  /home/eric/data/snr.ev
-</PRE>
-In the case of unix  sockets, the socket identifier is a file:
-<PRE>
-  csh> xpaget xpans
-  DS9 ds9 gs /tmp/.xpa/DS9_ds9.2631 eric
-
-  csh> xpaget /tmp/.xpa/DS9_ds9.2631 file
-  /home/eric/data/snr.ev 
-</PRE>
-This feature can be useful in distinguishing between multiple
-instances of a program that all have the same class:name designation.
-
-<!-- =section xpatemplate SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: September 10, 2003</H5>
-</BODY>
-</HTML>
-
diff --git a/xpa/doc/users.html b/xpa/doc/users.html
deleted file mode 100644
index a849442..0000000
--- a/xpa/doc/users.html
+++ /dev/null
@@ -1,67 +0,0 @@
-<!-- =defdoc xpausers xpausers n -->
-<HTML>
-<HEAD>
-<TITLE>Distinguishing Users</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpausers NAME -->
-<H2><A NAME="xpausers">XPAUsers: Distinguishing Users</A></H2>
-
-<!-- =section xpausers SYNOPSIS -->
-<H2>Summary</H2>
-<P>
-XPA normally distinguishes between users on a given host, but it is possible
-to send data to access points belonging to other users.
-
-<!-- =section xpausers DESCRIPTION -->
-<H2>Description</H2>
-<P>
-A single XPA name service typically serves all users on a given
-machine.  Two users can register the same XPA access points on the
-same machine without conflict, because the user's username is
-registered with each access point and, by default, programs such as
-xpaget and xpaset only process access points of the appropriate user.
-For example:
-<PRE>
-  XPA xpa1 gs 838e2f67:1262 eric
-  XPA xpa2 gs 838e2f67:1266 eric
-  XPA xpa1 gs 838e2f67:2523 john
-  XPA xpa2 gs 838e2f67:2527 john
-</PRE>
-Here the users "eric" and "john" both have registered the access
-points xpa1 and xpa2. When either "john" or "eric" retrieves
-information from xpa1, they will process only the access point
-registered in their user name.
-
-<P>
-If you want to access another user's XPA access points on a single
-machine, use the -u [user] option on xpaset, xpaget, etc. For example,
-if eric executes:
-<PRE>
-  xpaget -u john xpa1
-</PRE>
-he will access John's xpa1 access point.Use "*" to access all users
-on a given machine:
-<PRE>
-  xpaget -u "*" xpa1
-</PRE>
-Note that the <A HREF="./env.html">XPA Environment Variable</A>
-XPA_NSUSERS can be used to specify the default list of users to
-process:
-<PRE>
-  setenv XPA_NSUSERS "eric,john"
-</PRE>
-will cause access points from both "eric" and "john" to be processed
-by default.
-
-<!-- =section xpausers SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: September 10, 2003</H5>
-</BODY>
-</HTML>
diff --git a/xpa/doc/xpa.pdf b/xpa/doc/xpa.pdf
deleted file mode 100644
index e2c4855..0000000
Binary files a/xpa/doc/xpa.pdf and /dev/null differ
diff --git a/xpa/doc/xpa.ps b/xpa/doc/xpa.ps
deleted file mode 100644
index 21d4910..0000000
--- a/xpa/doc/xpa.ps
+++ /dev/null
@@ -1,5294 +0,0 @@
-%!PS
-%%Title: The XPA Help Facility
-%%Creator: html2ps version 1.0 beta5
-%%EndComments
-save
-2000 dict begin
-/d {bind def} bind def
-/D {def} d
-/t true D
-/f false D
-/FL [/Times-Roman
-/Times-Italic
-/Times-Bold
-/Times-BoldItalic
-/Courier
-/Courier-Oblique
-/Courier-Bold
-/Courier-BoldOblique
-/Helvetica
-/Helvetica-Oblique
-/Helvetica-Bold
-/Helvetica-BoldOblique] D
-/WF t D
-/WI 0 D
-/F 1 D
-/IW 471 F div D
-/IL 621 F div D
-/PS 791 D
-/EF [0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 2 2] D
-/EZ [11 9 19 17 15 13 12 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 8 8] D
-/Ey [0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] D
-/EG [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1] D
-/Tm [1 1 0.8 0.8 0.8 0.8 0.8 0.8 0 0 0 0 0 0 0.5 1 1 1 1 0 0 1.3 0 0] D
-/Bm [1 1 0.5 0.5 0.5 0.5 0.5 0.5 0 0 0 0 0 0 0.5 1 1 1 1 0 0 1 0 0] D
-/Lm [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 0 0 2 0 0 0] D
-/Rm [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0] D
-/EU [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0] D
-/NO t D
-/YY [[{()}1][{()}0][{()}2]] D
-/ZZ [[{()}1][{()}0][{()}2]] D
-/Ts EZ 0 get D
-/TU f D
-/Xp t D
-/AU t D
-/SN 0 D
-/Cf f D
-/Tp f D
-/Fe f D
-/TI 1 Ts mul D
-/Fm 14 D
-/xL 71 D
-/xR 71 D
-/yL 706 D
-/yR 706 D
-/Wl 471 F div D
-/Wr 471 F div D
-/hL 621 F div D
-/hR 621 F div D
-/FE {newpath Fm neg Fm M CP BB IW Fm add Fm L IW Fm add IL Fm add neg L CP BB
- Fm neg IL Fm add neg L closepath} D
-/LA {PM 0 eq{/IW Wl D /IL hL D}{/IW Wr D /IL hR D}ie /W IW D /LL W D /LS W D
- TU PM 0 eq and{IW 56 F div add SA{Sf div}if 0 translate}
- {PM 0 eq{xL yL}{xR yR}ie translate F SA{Sf mul}if dup scale
- CS CF FS Cf{CA CL get VC}if /Bb f D}ie 0 0 M
- TF not Tc or {Cf{gsave SA{1 Sf div dup scale}if Cb VC FE fill grestore}if}if}D
-/Pi 0 Ts mul D
-/SG [0.8 1 1] D
-/Ab 15 D
-/J 0 D
-/Tc t D
-/NH 6 D
-/Nf f D
-/Pa f D
-/LH 1.2 D
-/XR f D
-/Xr {/pN E D ( [p ) WB pN WB (] )WB} D
-/Db [16#FF 16#FF 16#FF] D
-/Dt [16#00 16#00 16#00] D
-/eA f D
-/Fi f D
-/bT f D
-/Lc t D
-/Dl [16#00 16#00 16#00] D
-/LX f D
-/Br 0.25 D
-/IA ([IMAGE]) D
-/DS {/PF f D()WB NL NP()pop RC ZF} D
-/Gb f D
-/Mb t D
-/Hc [16#00 16#00 16#00] D
-/Bl 3 D
-/MI -15.2 D
-/DX (DRAFT) D
-/Di 0 D
-/Tt 113.385826771654 D
-/Th {()2 Al()BR (
-      ) 0 1 -1 H()4 FZ Ti ES()EH (
-      ) 0 2 -1 H() ME 0 get join EH()Ea()BR()} D
-/tH {()0 1 -1 H (Table of Contents) EH()} D
-/FD 2 D
-/Dy 2 D
-/cD [16#F0 16#F0 16#F0] D
-/FW 0.6 D
-/FU [16#00 16#00 16#00] D
-/ET {/RM f D /A0 0 D /PN SN D /OU t D /Ou t D /W IW D /LL W D D1
- Ms not TP and{Ip}if /TF f D} D
-[{true statusdict/setduplexmode get exec} stopped cleartomark
-%-- End of variable part --
-/MySymbol 10 dict dup begin
- /FontType 3 D /FontMatrix [.001 0 0 .001 0 0 ] D /FontBBox [25 -10 600 600] D
- /Encoding 256 array D 0 1 255{Encoding exch /.notdef put}for
- Encoding (e) 0 get /euro put
- /Metrics 2 dict D Metrics begin
-  /.notdef 0 D
-  /euro 651 D
- end
- /BBox 2 dict D BBox begin
-  /.notdef [0 0 0 0] D
-  /euro [25 -10 600 600] D
- end
- /CharacterDefs 2 dict D CharacterDefs begin
-  /.notdef {} D
-  /euro{newpath 114 600 moveto 631 600 lineto 464 200 lineto 573 200 lineto
-   573 0 lineto -94 0 lineto 31 300 lineto -10 300 lineto closepath clip
-   50 setlinewidth newpath 656 300 moveto 381 300 275 0 360 arc stroke
-   -19 350 moveto 600 0 rlineto -19 250 moveto 600 0 rlineto stroke}d
- end
- /BuildChar{0 begin
-  /char E D /fontdict E D /charname fontdict /Encoding get char get D
-  fontdict begin
-   Metrics charname get 0 BBox charname get aload pop setcachedevice
-   CharacterDefs charname get exec
-  end
- end}D
- /BuildChar load 0 3 dict put /UniqueID 1 D
-end
-definefont pop
-
-/Cd {aload length 2 idiv dup dict begin {D} repeat currentdict end} D
-/EX {EC cvx exec} D
-/DU {} d
-/BB {pop pop}d
-/ie {ifelse} d
-/E {exch} d
-/M {moveto} d
-/R {rmoveto} d
-/L {lineto} d
-/RL {rlineto} d
-/CP {currentpoint} d
-/SW {stringwidth} d
-/GI {getinterval} d
-/PI {putinterval} d
-/Sg {setgray} d
-/LW {setlinewidth} d
-/S {dup () ne OU and{0 Co R AT 3 eq LB and HF not and A1 0 ne A2 0 ne or and
- {A2 0 32 A1 0 6 -1 roll awidthshow}{show}ie 0 Co neg R}{pop}ie
- OU PH 3 eq or{/Ms t D}if} D
-/U {OU{gsave CP currentfont /FontInfo get /UnderlinePosition get
- 0 E currentfont /FontMatrix get dtransform E pop add newpath M dup SW pop
- CJ 0 RL stroke grestore}if} D
-/B {OU Br 0 gt and{CP Ts neg Ts .33 mul R gsave 0 Sg
- CP newpath Ts Br mul 0 360 arc closepath UI 2 mod 0 eq{stroke}{fill}ie
- grestore M CP E Ts Br 1 add mul sub E BB /Ms t D}if}D
-/NP {Ms TP not or PA and OU and{TP{OR}if f1{mF k2 /mF E D /YC 0 D}if
- TP TU not PM 0 eq or and{showpage}if DU Ip TE not{LA}if 0.6 LW
- /CI 0 D /TP t D /Hs f D /hl 6 D /Hv 6 D /HI hi D /Ms f D}if Bs XO BO M} D
-/Np {LE sub CP E pop gt PL 0 eq and{NP}if}D
-/Ip {/PN PN 1 add D /Pn RM{1}{4}ie PN Ns D /PM PN SN sub 2 mod D} D
-/GP {E dup 3 -1 roll get PN 1 add 2 mod get dup type /integertype eq
- {get 0 get}{E pop}ie}d
-/Fc {dup 2 GP exec SW pop /S1 E D dup 1 GP exec SW pop /S2 E D 0 GP exec SW
- pop /S3 E D S1 0 gt{S2 2 mul S1 add S3 2 mul S1 add 2 copy lt{E}if pop}{0}ie
- S2 S3 add 2 copy lt{E}if pop IW .9 mul div dup 1 gt{1 E div}{pop 1}ie}D
-/OR {Df{Sd}if tp not{gsave SA{1 Sf div dup scale}if Fe{Cf{FU VC}if FW LW
- 1 setlinejoin FE stroke}if /YO {60 F div dup 40 gt{pop 40}if}D /cs CS D
- /cf CF D /CF 0 D /pf PF D /PF f D /Fn FN D /At AT D /AT 0 D /FN EF Hf 1 add
- get D Fz Fs FS ZZ Fc Fz mul Fs FS EU Hf 1 add get dup type /arraytype eq
- Cf and{VC}{pop 0 Sg}ie IW IL neg YO sub M ZZ 1 GP exec dup SW pop neg 0 R Sh
- 0 IL neg YO sub M ZZ 0 GP exec Sh ZZ 2 GP exec dup SW pop IW E sub 2 div
- IL neg YO sub M Sh Fz Fs FS NO{/AW IW Pn SW pop sub D AW 2 div IL neg YO sub
- S1 0 gt S2 AW .45 mul gt or S3 AW .45 mul gt or{Fz 2 mul sub}if M Pn Sh}if
- EU Hf get dup type /arraytype eq Cf and{VC}{pop 0 Sg}ie YY Fc /FN EF Hf get D
- Hz mul HS FS IW YO M YY 1 GP exec dup SW pop neg 0 R Sh 0 YO M YY 0 GP exec Sh
- YY 2 GP exec dup SW pop IW E sub 2 div YO M Sh /FN Fn D /AT At D t Pb XO SZ
- SL get neg R /PF pf D grestore /CF 0 D cs cf FS}if}D
-/Sh {dup () ne{CP Hz 4 div sub BB show CP CS add BB}{pop}ie}D
-/Pb {/OU E D /Ou OU D /PB t D 0 0 M Ba{/Sa save D /BP t D /Fl t D RC /PL 0 D
- /PH 0 D /W IW D /LE IL .7 mul D /EO 0 D SI ZF /YA 0 D /BO 0 D /C1 () D
- BA 0 Ts neg R Bb{Xl Yl Xh Yh}if Bb CP Sa restore M
- {/Yh E D /Xh E D /Yl E D /Xl E D}if /Fl t D}if
- BL /OU t D /HM f D /Ou t D /PB f D} D
-/Bs {/BP Ba not D}D
-/reencodeISO {
- dup dup findfont dup length dict begin{1 index /FID ne{D}{pop pop}ie}forall
- /Encoding ISOLatin1Encoding D currentdict end definefont} D
-/ISOLatin1Encoding [
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
-/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright
-/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash
-/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon
-/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N
-/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright
-/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m
-/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/space/exclamdown/cent/sterling/currency/yen/brokenbar
-/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot
-/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior
-/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine
-/guillemotright/onequarter/onehalf/threequarters/questiondown
-/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla
-/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
-/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
-/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute
-/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis
-/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave
-/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex
-/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis
-/yacute/thorn/ydieresis
-] D
-[128/backslash 129/parenleft 130/parenright 141/circumflex 142/tilde
-143/perthousand 144/dagger 145/daggerdbl 146/Ydieresis 147/scaron 148/Scaron
-149/oe 150/OE 151/guilsinglleft 152/guilsinglright 153/quotesinglbase
-154/quotedblbase 155/quotedblleft 156/quotedblright 157/endash 158/emdash
-159/trademark]
-aload length 2 idiv 1 1 3 -1 roll{pop ISOLatin1Encoding 3 1 roll put}for
-/colorimage where{pop}{
- /colorimage {
-  pop pop /Pr E D {/Cv Pr D /Gr Cv length 3 idiv string D 0 1 Gr length 1 sub
-   {Gr E dup /i E 3 mul D Cv i get 0.299 mul Cv i 1 add get 0.587 mul add
-    Cv i 2 add get 0.114 mul add cvi put}for Gr} image} D
-}ie
-/pdfmark where{pop}{userdict /pdfmark /cleartomark load put}ie
-WF{FL{reencodeISO D}forall}{4 1 FL length 1 sub{FL E get reencodeISO D}for}ie
-/Symbol dup dup findfont dup length dict begin
- {1 index /FID ne{D}{pop pop}ie}forall /Encoding [Encoding aload pop]
- dup 128 /therefore put D currentdict end definefont D
-
-/SF {/CS E D SZ SL CS put FO SL FN put /YI CS LH neg mul D dup ST cvs ( ) join
- CS ST cvs join C1 E join ( NF ) join /C1 E D CS NF /Wf WF FN 0 gt or D
- /BW Wf{( ) SW pop}{0}ie D}D
-/NF {/cS E D /cF E D cF 0 ge{FL cF get}{cF -1 eq{/Symbol}{/MySymbol}ie}ie
- findfont cS scalefont setfont} D
-/FS {CF or /CF E D FR SL CF put CF CF 0 ge{FN 4 mul add}if E SF} D
-/PC {SH /BP f D fin not GL not and{NL}if /HM t D /LL LS D} D
-/BS {/TX E D Wf{/fin f D /CW 0 D /LK 0 D /SC 0 D
- /RT TX D {RT ( ) search{/NW E D pop /RT E D /WH NW SW pop D CW WH add LL gt
- {TX SC LK SC sub 1 sub NN GI GL{SH cF cS OC
- 2 copy cS ne E cF ne or{NF}{pop pop}ie}{PC /CW WH BW add D}ie
- /SC LK D}
- {GL{JC}if
- /CW CW WH add BW add D /HM t D}ie /GL f D /Ph f D
- /LK LK NW length 1 add add D}{pop exit}ie}loop
- /fin t D TX SC LK SC sub GI SH RT () ne{GL not{CC}if}if
- /LC TX length D /WH RT SW pop D CW WH add Hy{HC SW pop add}if LL gt
- {RT GL{SH cF cS OC 2 copy cS ne E cF ne or{NF}{pop pop}ie
- Hy{/Ph t D}if /LL LS D}{NL /LL LS D SH}ie}
- {RT PC Hy{CC}if /Ph Ph Hy or D}ie RT () ne{/GL t D /HM t D}if}
- {TX SW pop LL le{TX SH}{/NW () D 0 2 TX length 1 sub
- {/CW E D TX 0 CW GI dup SW pop LL gt{pop NW SH /HM t D NL/LL W XO sub MR sub D
- /CW CW 2 sub NN D /TX TX CW TX length CW sub GI D TX BS exit}
- {/NW E D}ie}for}ie}ie /HM t D}D
-/CC {C0 length 0 gt{JC}if /C0 [C1 L1 YA YB Mf NS NB TB AF Bw] D
- /C1 () D /L0 L1 D /YA 0 D /YB 0 D /Mf 0 D /NS 0 D /NB 0 D}D
-/JC {C0 aload length 0 gt{pop pop pop NB add /NB E D NS add /NS E D
- dup Mf gt{/Mf E D}{pop}ie dup YB gt{/YB E D}{pop}ie
- dup YA gt{/YA E D}{pop}ie pop C1 join /C1 E D /C0 [] D}if}D
-/OC {C0 length 0 gt{C1 L1 L0 sub YA YB Mf NS NB TB AF Bw GL C0 aload pop
- /Bw E D /AF E D /TB E D /NB E D /NS E D /Mf E D /YB E D /YA E D /C0 [] D
- /L1 E D /C1 E D Ph{HC SH}if NL /GL E D /Bw E D /AF E D /TB E D /NB E D /NS E D
- /Mf E D /YB E D /YA E D /L1 E D /LL W L1 sub XO sub MR sub WH sub D /CW 0 D
- C1 E join /C1 E D}if}D
-/BT {/LB t D dup length string copy RS dup dup () ne E ( ) ne and
- {/CI 0 D /LS LL D /LL W L1 sub XO sub MR sub D BS}
- {dup ( ) eq{/GL f D}if dup () eq L1 0 eq or{pop}{SH /BP f D /Ph f D}ie}ie
- /LB f D} D
-/BL {CP E pop XO E M} D
-/NL {JC /GL f D /SK W XO sub MR sub L1 sub TB{Bw add}if D
- /YA LF{Mf HM Fl not and PF or{LH mul}if}{0 /LF t D}ie YA 2 copy lt{E}if pop D
- C1 () ne{/FB YB Mf SA{Sf mul}if 4 div 2 copy lt{E}if pop D}if Fl{/Ya YA D}if
- CP E pop YA sub YB sub LE neg lt Fl not and PB not and{NP}if NT TL BL
- OU PF not and PB or{/RE L1 TB{Bw sub}if
- W XO sub MR sub div YA YB add LE BO add div 2 copy lt{E}if pop D
- RE 1 gt{BL 1 RE div dup scale}if}if
- AT 2 le{SK AT mul 2 div YA neg R}if
- AT 3 eq{0 YA neg R TB{/NB NB 1 sub D /NS NS 1 sub D}if /NB NB 1 sub NN D
- /A3 NS 6 mul NB add D NS NB add 0 eq
-  {/A1 0 D /A2 0 D}
-  {NS 0 eq{/A1 SK NB div dup J gt{pop 0}if D /A2 0 D}{J A3 mul SK lt
-   {/A1 J D /A2 SK J NB mul sub NS div dup Ab gt{/A1 0 D pop 0}if D}
-   {/A1 SK A3 div D /A2 A1 6 mul D}ie}ie}ie /A1 A1 NN D /A2 A2 NN D}if
- AT 4 eq{0 YA neg R PH 2 le{PD 0 lt{/PD L1 D}if PD M1 gt{/M1 PD D}if
- L1 PD sub M2 gt{/M2 L1 PD sub D}if}{DV ID 1 sub get 0 ge{Lo 0 R}if}ie}if
- F0 cF ne Cs cS ne or{F0 Cs NF}if
- /ms Ms D /Ms f D CP FB sub
- C1 cvx exec XO EO sub L1 add TB{BW sub}if dup LM gt{/LM E D}{pop}ie
- PH 0 eq PH 4 eq or Ms and{HF not{/PO t D /AH t D}if
- BB CP YA add E AT 3 eq LB and{A1 sub}if TB{BW sub}if E BB}
- {pop pop}ie Ms HM PH 3 eq and or{/BP f D /Fl f D}if
- /Lo 0 D /L1 0 D /F0 cF D /Cs cS D BP not{0 YB NN neg R}if
- OU f1 and mF not and{k2 /f1 f D}if
- OU PF not and PB or{RE 1 gt{RE dup scale}if}if /Ms ms Ms or D
- /C1 AF{(Cp )}{()}ie D /YA 0 D /YB 0 D BL
- AT 4 eq LB not and PH 3 ge and
- {ID DV length lt{DV ID get dup 0 ge{DO E sub /Lo E D /L1 Lo D}{pop}ie
- /ID ID 1 add D}if}if /T t D CD{/LN LN 1 add D PD}if
- /PD -1 D /NS 0 D /NB 0 D /TB f D /Ph f D /Mf 0 D /HM f D} D
-/RS {/TM E D /CN 0 D TM{10 eq{TM CN ( ) PI}if /CN CN 1 add D}forall
- /CN 0 D /BK HM EN and{0}{1}ie D TM
- {dup 32 ne{TM CN 3 2 roll put /CN CN 1 add D /BK 0 D}
- {pop BK 0 eq{TM CN 32 put /CN CN 1 add D}if /BK 1 D}ie}forall
- TM 0 CN GI dup dup () ne E ( ) ne and
- {dup CN 1 sub get 32 eq{/EN f D}{/EN t D}ie}if} D
-/join {2 copy length E length add string dup 4 2 roll 2 index 0 3 index
- PI E length E PI}d
-/WR {(\n) search{dup () ne BP not or
- {Li 4 le CP E pop YI Li mul add LE add 0 lt and PL 0 eq and{NP}if
- SH NL pop /Li Li 1 sub D WR}{pop pop WR}ie}{SH}ie /CI 0 D /BP f D} D
-/SH {dup dup () ne E ( ) ne and PF or CS Mf gt and{/Mf CS D}if
- T not Wf and{( ) E join /T t D}if dup BP{/MF CS D}if
- AT 3 eq{2 copy length dup 0 gt{/NB E NB add D
- {( ) search{/NS NS 1 add D pop pop}{pop exit}ie}loop}{pop pop}ie}if
- CD PD 0 lt and{dup DC search{SW pop /PD E L1 add D pop pop}{pop}ie}if
- 0 Np dup SW pop L1 add /L1 E D dup () ne
- {C1 (\() join E join (\)) join AU AF and UF or Wf and{( U ) join}if
- sF{( s ) join}if ( S ) join
- /C1 E D dup length 1 sub get 32 eq /TB E D /Bw BW D}{pop pop}ie} D
-/BG {AI LG BC add add 0 eq} D
-/ON {OU{Ty AR AI NN get dup 1 add Ln Ns Ty 2 mod 0 eq{(.  )}{(\)  )}ie join
- dup SW pop neg 0 R CP E 0 lt{0 E M}{pop}ie CP BB show /Ms t D}if} D
-/Ln {AR AI 3 -1 roll put}D
-/SP {dup CI lt BP not and{dup CI sub 0 E R /CI E D}{pop}ie} D
-/BN {PF{WR /HM f D}{BT NL}ie} D
-/NN {dup 0 lt{pop 0}if} D
-/h {(h) HI ST cvs join cvx exec dup 1 get E Nf{0 get E join}{pop}ie} D
-/H {/fn FN D /Hi E 1 add D 1 sub /HL E D /H2 HL 2 add D /GS EZ H2 get D
- E Tm H2 get GS mul BE dup 0 gt{1 sub}{pop EG H2 get dup 0 lt{pop AT}if}ie NA
- WW Np /SL SL 1 add D /FN EF H2 get D GS Ey H2 get FS
- EU H2 get Sc Hs not HL Hl lt and Hs HL hl lt and or Hi 0 eq or
- {/HI Hi D /Hs t D /hl HL D /Hv HL D}if HL Hl lt{/hi Hi D}if
- Nf HI 0 gt and{(h) Hi ST cvs join cvx exec 0 get WB}if
- /HF t D /AH f D /PO f D} D
-/EH {Bm H2 get GS mul BE OA /SL SL 1 sub NN D /CF 0 D /FN fn D
- SZ SL get FR SL get FS /HF f D /GS Ts D ()Ec} D
-/P {E PF{WR}{PO{EP}{BN}ie Ts 4 mul Np AE not{Tm 0 get Ts mul neg SP}if
- dup 0 ge AH and{Pi Pd}if}ie 1 sub dup 0 lt{pop AV AL get}if /AT E D /PO t D} D
-/EP {PF{WR}{BN Ts 4 mul Np}ie AE not{Bm 0 get Ts mul neg SP}if
- /AT AV AL get D /PO f D} D
-/BE {E PO{EP}{BN}ie Ts 4 mul Np neg SP} D
-/HR {/Aw W EO sub D /RW E dup 0 gt{Aw mul}{neg}ie dup Aw gt{pop Aw}if D /RZ E D
- E BN Ts neg SP 1 sub 2 div Aw RW sub mul EO add CP E pop M PF{0 Ps neg R}if
- 0 Np OU{gsave RZ LW Cf{Hc VC}{0 Sg}ie CP BB RW 0 RL CP BB stroke grestore}if
- /CI 0 D /BP f D PF not{Ts neg SP}if /Ms t D} D
-/AD {I NL EG 14 get dup 0 lt{pop AT}if NA /AE t D Tm 14 get Ts mul neg SP
- Cf{EU 14 get dup -1 eq{pop CA CL get}if Sc}if} D
-/DA {BN ()ES OA /AE f D ()Ec Bm 14 get Ts mul neg SP} D
-/PR {/MW E D /Li E D Tm 1 get Ps mul BE 0 NA /FN Fp D /PF t D SI /SL SL 1 add D
- /CF 0 D Ps CS mul Ts div MW WC mul CS mul Ts div dup LL gt PL 0 eq and
- {LL div div}{pop}ie Ey 1 get FS CP E pop LE add YI neg div cvi dup Li lt
- AH and{4 lt YI Li mul 5 mul LE add 0 gt or PL 0 eq and{NP}if}{pop}ie
- EU 1 get Sc /GS Ps D}D
-/RP {WR NL () /PF f D SI /FN 0 D ES Bm 1 get Ps mul neg SP OA /GS Ts D} D
-/SI {/XO Lm 15 get BC NN mul Lm 16 get AI UI sub NN mul add
- Lm 17 get UI NN mul add Lm 20 get LG NN mul add Ts mul
- PF{Lm 1 get Ps mul add}if EO add D
- /MR Rm 15 get BC NN mul Rm 16 get AI UI sub NN mul add
- Rm 17 get UI NN mul add Rm 20 get LG NN mul add Ts mul
- PF{Rm 1 get Ps mul add}if D /LL W XO sub MR sub D} D
-/DT {/cC E D BN /LG LG 1 sub D SI /LG LG 1 add D WW 2 div Np BL} D
-/DD {WB Cc 0 eq cC 0 eq and L1 0 eq or Lm 20 get Ts mul L1 sub TB{BW add}if
- Ts 2 div lt or NL /LF E D SI BL /cC 0 D} D
-/DL {Dc LG Cc put /Cc E D BG{Tm 18 get Ts mul BE}{BN}ie /LG LG 1 add D BL} D
-/LD {BN LG 0 gt{/LG LG 1 sub D}if /Cc Dc LG get D SI
- BG{()Bm 18 get Ts mul BE}if BL} D
-/UL {BG{Tm 17 get Ts mul BE}{BN}ie NR AI NN 0 put /UI UI 1 add D
- /AI AI 1 add D SI BL} D
-/LU {BN /UI UI 1 sub D /AI AI 1 sub D SI BG{()Bm 17 get Ts mul BE}if BL} D
-/OL {E BG{Tm 16 get Ts mul BE}{BN}ie TR AI NN Ty put /Ty E D NR AI NN 1 put
- /AI AI 1 add D SI BL 1 Ln} D
-/LO {BN /AI AI 1 sub D /Ty TR AI get D SI BG{()Bm 16 get Ts mul BE}if BL} D
-/LI {E BN -1 SP /BP f D /CI 0 D 0 Np NR AI 1 sub NN get 1 eq
- {dup dup 0 gt E 4 le and{/Ty E D}{pop}ie
- /L1 L1 Ty AR AI NN get Ns SW pop XO sub dup 0 lt{pop 0}if add D ( ON )}
- {pop ( B )}ie C1 E join /C1 E D CS Mf gt{/Mf CS D}if BL} D
-/BQ {Tm 15 get Ts mul BE /BC BC 1 add D SI BL} D
-/QB {Bm 15 get Ts mul BE /BC BC 1 sub D SI BL} D
-/Al {E EP 1 sub dup 0 lt{pop AV AL get}if NA} D
-/Ea {EP OA} D
-/WB {PF{WR}{BT}ie} D
-/F1 {WB /FN 0 D CS 0 FS} D
-/F2 {WB /FN WI D CS 0 FS} D
-/HY {/Hy t D WB /Hy f D} D
-/YH {WB} D
-/A {/LT E D LT 1 eq{/RN E D}if /Lh E D WB /C1 C1 ( Cp ) join D
- Lc AF not and{Cl Sc}if /AF t D} D
-/EA {Lc AF and{Ec}{WB}ie TL Pa AF and Lh 0 ne and
- {( \() Lh join (\)) join /AF f D WB}if /AF f D} D
-/TL {C1 ( Tl ) apa /C1 E D} d
-/apa {AF OU and Lh 0 ne LT 1 eq or and{LT 1 eq{RN ( /) E ST cvs join}
- {(\() Lh join (\)) join}ie E join join}{pop}ie} d
-/Cp {/Xc CP /Yc E D D} D
-/SS {Cf{dup 0 ge{EU E get dup -1 eq{pop CA CL get}if}{pop CA CL get}ie Sc}
- {pop}ie SZ SL get /SL SL 1 add D} D
-/I {WB 8 SS 1 FS} D
-/EM {WB 8 SS /CF CF 1 xor D 0 FS} D
-/BD {WB 9 SS 2 FS} D
-/TT {WB 10 SS /FN Fp D 0 FS} D
-/KB {WB 11 SS /FN Fp D 2 FS} D
-/CT {WB 12 SS 1 FS} D
-/SM {WB 13 SS /FN Fp D 0 FS} D
-/Q {/QL QL 1 add D QO QL 2 mod get La get join WB} D
-/EQ {QC QL 2 mod get La get join WB /QL QL 1 sub D} D
-/RO {WB -1 SS /CF 0 D 0 FS} D
-/SY {WB -1 SS -1 FS} D
-/MY {WB -1 SS -2 FS} D
-/ES {WB /SL SL 1 sub NN D /CF 0 D /FN FO SL get D SZ SL get FR SL get FS ()Ec}D
-/FZ {3 sub 1.2 E exp GS mul E WB TL /C1 C1 ( Cp ) join D /SL SL 1 add D 0 FS} D
-/Ef {WB TL ()ES /C1 C1 ( Cp ) join D} D
-/BZ {dup /Bf E D FZ}D
-/Sc {dup -1 ne Cf and{/CL CL 1 add D dup 0 eq{pop [0 0 0]}if
- dup CA E CL E put VS ( VC ) join C1 E join /C1 E D}{pop}ie} D
-/Ec {WB Cf{/CL CL 1 sub NN D CA CL get VS ( VC ) join C1 E join /C1 E D}if} D
-/VS {dup type /arraytype eq{([) E {ST cvs join ( ) join}forall (]) join}if} D
-/VC {{255 div}forall setrgbcolor} D
-/Sl {dup type /integertype ne{Ds}if /La E D WB}d
-/UN {WB /UF t D} D
-/NU {WB /UF f D} D
-/SE {WB /sF t D} D
-/XE {WB /sF f D} D
-/sM {/C1 C1 ( k1 ) join D}d
-/eM {/C1 C1 ( k2 ) join D}d
-/k1 {/YC CP E pop Ts add D /mF t D /f1 t D}d
-/k2 {gsave 3 LW -9 CP E pop Ts 0.2 mul sub M -9 YC L stroke grestore /mF f D}d
-/Ac {/AC E D WB}d
-/Ca {eA{( \()join AC join(\) )join}if WB}d
-/s {OU{gsave 0 CS .25 mul R dup SW pop CJ 0 RL stroke grestore}if}D
-/CJ {AT 3 eq LB and{E dup dup length 1 sub A1 mul E
- {( ) search{pop pop E A2 add E}{pop exit}ie}loop 3 -1 roll add
- W CP pop sub 2 copy gt{E}if pop}if}D
-/So {/Co E D} D
-/SO {C1 Yo ST cvs join ( So ) join /C1 E D (j) SW pop 2 div Pd} D
-/Se {E WB CS E div Pd}D
-/Pd {dup type /stringtype eq{SW pop}if dup /L1 E L1 add D
- ST cvs ( 0 R ) join C1 E join /C1 E D} D
-/Sp {0.35 CO} D
-/Sb {-0.2 CO} D
-/CO {OV Io Yo put /Yo E CS mul Yo add D /Io Io 1 add D -1.5 Io mul 3 add FZ SO
- CS Yo add dup YA gt{/YA E D}{pop}ie
- Yo neg dup YB gt{/YB E D}{pop}ie} D
-/Es {ES /Io Io 1 sub NN D /Yo OV Io get D SO} D
-/SB {/N2 0 D 0 1 NI{/N E D{IX N2 get 0 lt{/N2 N2 1 add D}{exit}ie}loop
- /K WS N get FC N get mul D /NY AY N2 get D /BV NY array D
- 0 1 NY 1 sub{/TM K string D currentfile TM readhexstring pop pop BV E TM put}
- for BM N BV put /N2 N2 1 add D}for} D
-/IC [{/MA E D /MB 0 D}{2 div /MA E D /MB MA D}{/MB E CS sub D /MA CS D}
- {pop /MA YS AB mul D /MB 1 AB sub YS mul D}{pop /MA 0 D /MB 0 D}] D
-/IP {BV N get /N N 1 add D} D
-/II {/K E D IX K get 0 lt{/EC E D}if /TY E D
- TY 4 eq{/Y E D /X E D}if TY 3 eq{/AB E D}if
- /XW AX K get D /YW AY K get D /IS SG IT K get get D /XS XW IS mul D
- /YS YW IS mul D YS IC TY get exec /MA MA Fl not{3 add}if D} D
-/IM {II /ty TY D /xs XS D /ys YS D /ya YA D /yb YB D /ma MA D /mb MB D /k K D
- /ec EC D /BP f D /CI 0 D WB TL L1 xs add dup XO add MR add W gt
- {pop /ma ma Fl{3 add}if D NL /YA ma D /YB mb D /YS ys D /L1 xs D}
- {/L1 E D ma YA gt{/YA ma D}if mb YB gt{/YB mb D}if}ie /TB f D
- OU{CP E pop YS sub LE neg lt Fl not and PB not and{NP /YA ma D /YB mb D}if
- /BP f D ty ST cvs ( ) join IX k get 0 lt{(\() join ec join (\) ) join}if
- k ST cvs join ty 3 eq{AB ST cvs ( ) join E join}if
- ty 4 eq{X ST cvs ( ) join Y ST cvs join ( ) join E join}if C1 E join
- ( DI ) join FP 2 eq FP 1 eq AF and or{( FM ) join}if
- ( Il Cp ) apa /C1 E D /EN f D}if /HM t D /T f D} D
-/DI {II /Xc CP /Yc E D D /YN YW neg D /HM t D /CI 0 D /K2 IX K get D gsave
- TY 4 eq{OX X IS mul add OY FY add YS sub Y IS mul sub}
- {/FY YS D CP MB sub 2 copy /OY E D /OX E D}ie
- translate K2 0 ge{/DP AZ K2 get D /BV BM K2 get D XS YS scale /N 0 D XW YW DP
- [XW 0 0 YN 0 YW] {IP} FC K2 get 1 eq{image}{f 3 colorimage}ie}
- {EX}ie grestore XS 0 R /Ms t D} D
-/FM {gsave 0 Sg CP MB sub translate XS neg 0 M 0 YS RL XS 0 RL 0 YS neg RL
- XS neg 0 RL stroke grestore} D
-/NA {/AT E D /AL AL 1 add D AV AL AT put} D
-/OA {AL 0 gt{/AL AL 1 sub D /AT AV AL get D}if} D
-/D1 {/BR {CP E pop E BN Mb{CP E pop eq{0 YI R}if}{pop}ie} D
- /Sn {OU{C1 E ST cvs join ( Ld ) join /C1 E D}{pop}ie} D} D
-/D1 {/BR {BN} D /Sn {OU {C1 E ST cvs join ( Ld ) join /C1 E D} {pop} ie} D} D
-/TC {/TF t D /ML 0 D HN{SW pop dup ML gt{/ML E D}{pop}ie}forall NP /RM RM not D
- RC /OU Tc D Ep /PN 0 D Ms not TP and{Ip}if /W IW ML sub Ts sub D
- /A0 0 D TH{/BR {( ) join BT} D /Sn {pop} D /Au () D}if} D
-/TN {0 eq{E EA PF HF or not XR and{HN E get Xr}{pop}ie}
- {OU{Tn 0 ge{() BN}if /Tn E D}{pop}ie WB}ie} D
-/NT {OU LB not and Tn 0 ge and{PL 0 eq{Ms not{CS CF FS}if CP dup
- /y E YA sub D W 9 sub CS -1.8 mul XO L1 add 2 add{y M (.) show}for
- HN Tn get dup SW pop IW E sub y M show CP BB M}if /Tn -1 D}if} D
-/Ld {/DN E D HN DN Pn put [/View [/XYZ -4 Fl{PS}{CP YA add US E pop}ie null]
- /Dest DN ST cvs cvn /DEST pdfmark} D
-/C {ND 1 eq{1 sub}if TI mul /XO E D NL Nf not{pop()}if 0 3 -1 roll 1 A} D
-/OP {BP not{NP}if PN 2 mod 0 eq{/Ms t D NP}if}D
-/Ep {Xp PN 2 mod 0 eq and OU and{/Pn (-) D showpage /PM 1 D LA}if}D
-/Dg [73 86 88 76 67 68 77] D
-/Rd [0 [1 1 0][2 1 0][3 1 0][2 1 1][1 1 1][2 2 1][3 3 1][4 4 1][2 1 2]] D
-/Ns {/m E D /c E 32 mul D /j m 1000 idiv D /p j 12 add string D
- c 96 le m 0 gt and{c 32 le {/i 0 D /d 77 D /l 100 D /m m j 1000 mul sub D
-  j -1 1 {pop p i d c add put /i i 1 add D}for
-  4 -2 0 {/j E D /n m l idiv D /m m n l mul sub D /d Dg j get D
-   n 0 gt {/x Rd n get D x 0 get -1 1 {pop p i d c add put /i i 1 add D}for
-   p i x 1 get sub Dg x 2 get j add get c add put}if /l l 10 idiv D
-  }for p 0 i GI}
-  {/i ST length 1 sub D m {1 sub dup 0 ge{dup 26 mod c add 1 add
-   ST i 3 -1 roll put 26 idiv dup 0 eq{pop exit}if}if /i i 1 sub D}loop
-   ST i ST length i sub GI}ie}
- {m p cvs}ie} D
-/US {matrix currentmatrix matrix defaultmatrix matrix invertmatrix
- matrix concatmatrix transform} D
-/GB {Gb{US}if}D
-/Tl {/Rn E D Xc CP pop ne{
- [/Rect [Xc 1 sub Yc cS 0.25 mul sub GB CP E 1 add E cS 0.85 mul add GB]
-  /Subtype /Link /Border [0 0 Cf Lc and LX and AU or{0}{1}ie] Rn type
-  /nametype eq {/Dest Rn}{/Action [/Subtype /URI /URI Rn] Cd}ie
-  /ANN pdfmark}if} D
-/Il {/Rn E D [/Rect [Xc Yc GB Xc XS add Yc YS add GB] /Subtype /Link
- /Border [0 0 0] Rn type /nametype eq{/Dest Rn}
- {/Action [/Subtype /URI /URI Rn] Cd}ie /ANN pdfmark} D
-/XP {[{/Z Bz 2 div D Z 0 R Z Z RL Z neg Z RL Z neg Z neg RL Z Z neg RL
- Fi cH 1 eq and{fill}if} {Bz 0 RL 0 Bz RL Bz neg 0 RL 0 Bz neg RL
- Fi cH 1 eq and{fill}if} {0 -5 R Bz 0 RL 0 21 RL Bz neg 0 RL 0 -21 RL}]} D
-/MS {/Sm E D WB}D
-/O {BN()Sm BX} D
-/O {BN()0 Sm BX} D
-/BX {/Bt E D Bt 2 lt{/Ch E D CS 0.8 mul}{11 mul}ie W XO sub MR sub
- 2 copy gt{E}if pop /HZ E D Bt 2 eq{Fi not{pop()}if ( )E join /Ft E D TT
- /PF t D /MW 1 D /Li 1 D /Fw Ft SW pop D Fw HZ gt{/HZ Fw 8 add D}if
- HZ ST cvs( )join}{WB Ch ST cvs( )join}ie L1 HZ add XO add MR add W gt{NL}if
- Bt 2 eq{Ft ES Fw neg HM{CS sub}if Pd}if Bt ST cvs join( Bx )join
- Bt 2 eq HM and{CS Pd}if C1 E join /C1 E D /L1 L1 HZ add D /T f D
- ( ) Pd /PF f D Bt 2 lt{YA CS .8 mul lt{/YA CS .8 mul D}if}
- {YB 5 lt{/YB 5 D}if YA 21 lt{/YA 21 D}if}ie /CI 0 D} D
-/Bx {dup 2 eq{E /Bz E D}{E /cH E D /Bz CS .8 mul D}ie
- OU {gsave 0 Sg XP E get exec stroke grestore}{pop}ie Bz 0 R /Ms t D}D
-/SD {FD 4 mul Dy add DZ NF newpath 0 0 M DX t charpath pathbbox
- 3 -1 roll sub /DY E D E dup /X1 E D sub WM mul WX DY mul add WM DG mul E div
- /DF E D /DR WX DF mul DY mul WM div 2 div D} d
-/Sd {gsave 0 IL Di mul neg translate IL IW atan Di 0 eq{neg}if rotate
- FD 4 mul Dy add DZ NF DR X1 sub DY 2 div neg M cD VC DX show grestore} d
-/Pt {/tp t D Tp{NP /Pn (TP) D 0 Tt neg R Th BN NP Ep ET RC ZF}if /tp f D} D
-/RC {/AI 0 D /LG 0 D /BC 0 D /UI 0 D /PF f D /Cc 0 D /cC 0 D /Dc 10 array D
- /NR [0 1 9{pop 0}for] D /La Ds D /AR 10 array D /TR 10 array D /AV 30 array D
- SI /AL -1 D /AT A0 D AT NA /OV 9 array D /Yo 0 D /Co 0 D /Io 0 D /Hy f D
- /Ph f D /CL -1 D Ct Sc}D
-/ZF {/FR [0 1 30{pop 0}for] D /SZ [0 1 30{pop 0}for] D /FO [0 1 30{pop 0}for] D
- /SL 0 D /CF 0 D /FN 0 D 0 Ts SF}D
-/QO [[(\234)(\233)(\253\240)(\232)(\273)(\253)][(')(`)(\253\240)(\231)(\273)(\253)]] D
-/QC [[(\234)(\234)(\240\273)(\233)(\253)(\273)][(')(')(\240\273)(`)(\253)(\273)]] D
-/Hf EF length 2 sub D
-/Hz EZ Hf get D
-/HS Ey Hf get D
-/Fz EZ Hf 1 add get D
-/Fs Ey Hf 1 add get D
-/LE IL D
-/Ps EZ 1 get D
-/Fp EF 1 get D
-/XO 0 D
-/YI 0 D
-/CI 0 D
-/FP 0 D
-/WW Ts 7 mul D
-/Mf 0 D
-/YA 0 D
-/YB 0 D
-/Cs Ts D
-/GS Ts D
-/F0 0 D
-/NS 0 D
-/NB 0 D
-/N 0 D
-/C0 [] D
-/C1 () D
-/Lo 0 D
-/L1 0 D
-/LM 0 D
-/PH 0 D
-/EC 0 D
-/Lh 0 D
-/LT 0 D
-/CH 1 string D
-/ST 16 string D
-/CA 9 array D
-/HC (\255) D
-/HM f D
-/PF f D
-/EN f D
-/TB f D
-/UF f D
-/sF f D
-/AE f D
-/AF f D
-/BP t D
-/CD f D
-/PA t D
-/GL f D
-/T t D
-/HF f D
-/AH f D
-/SA f D
-/PB f D
-/f1 f D
-/mF f D
-/OX 0 D
-/OY 0 D
-/FY 0 D
-/EO 0 D
-/FB 0 D
-/PL 0 D
-/Bw 0 D
-/PD -1 D
-/TP f D
-/tp f D
-/TH f D
-/Ty 4 D
-/Tn -1 D
-/Fl t D
-/LB t D
-/PM 1 D
-/Ms f D
-/Ba f D
-/Bb f D
-/Hl 3 D
-/hl 6 D
-/Hv 6 D
-/Hs f D
-/HI 0 D
-/hi 0 D
-/PO t D
-/TE f D
-/LF t D
-/BO 0 D
-/Sm 1 D
-/Bf 3 D
-/A1 0 D
-/A2 0 D
-/Ds 1 D
-/QL -1 D
-/Cb Db D
-/Ct Dt D
-/Cl Dl D
-[/Creator (html2ps version 1.0 beta5) /Author () /Keywords () /Subject ()
- /Title (The XPA Help Facility) /DOCINFO pdfmark
-/ND 22 D
-/HN [(1) (1) (1) (3) (5) (8) (10) (14) (15) (16) (15) (16) (17) (19) (22) (25)
-(26) (29) (30) (30) (31) (32) (32) (33) (34) (34) (35) (37) (38) (46) (46)
-(39) (40) (42) (43) (44) (47) (48) (50) (51) (55) (61) (63) (75) (76) (77)
-(80) (1) (1) (1) (2) (1) (??) (??) (1) (1) (1) (2) (3) (3) (3) (3) (4) (5)
-(5) (5) (5) (7) (8) (8) (8) (8) (9) (10) (10) (10) (10) (10) (11) (12) (13)
-(14) (14) (14) (14) (14) (15) (15) (15) (16) (16) (17) (18) (19) (19) (19)
-(19) (20) (21) (22) (22) (22) (24) (25) (25) (33) (25) (25) (25) (25) (26)
-(29) (30) (30) (31) (32) (32) (33) (33) (34) (34) (35) (36) (37) (37) (37)
-(37) (37) (38) (38) (38) (38) (38) (38) (39) (40) (42) (43) (44) (46) (46)
-(47) (48) (49) (50) (50) (50) (50) (50) (51) (53) (51) (51) (51) (51) (51)
-(52) (53) (54) (55) (55) (55) (55) (60) (61) (61) (61) (61) (62) (63) (63)
-(63) (63) (63) (63) (64) (64) (64) (65) (65) (66) (67) (67) (67) (68) (68)
-(68) (68) (69) (69) (69) (70) (70) (70) (70) (70) (71) (71) (71) (71) (72)
-(72) (73) (73) (73) (74) (74) (74) (74) (75) (75) (75) (75) (75) (76) (76)
-(76) (76) (76) (77) (77) (77) (77) (79) (80) (80) (80) (80) (80)] D
-/h0 [()(Table of Contents)] D
-/h1 [(0.1\240\240)(XPA: Public Access to Data and Algorithms)] D
-/h2 [(0.2\240\240)(Summary)] D
-/h3 [(0.3\240\240)(Description)] D
-/h4 [(0.3.0.0.1\240\240)(Last updated: September 10, 2003)] D
-/h5 [(0.4\240\240)(XPAIntro: Introduction to the XPA Messaging System)] D
-/h6 [(0.5\240\240)(Summary)] D
-/h7 [(0.6\240\240)(Description)] D
-/h8 [(0.6.0.0.1\240\240)(Last updated: March 10, 2007)] D
-/h9 [(0.7\240\240)(XPATemplate: Access Point Names and Templates)] D
-/h10 [(0.8\240\240)(Summary)] D
-/h11 [(0.9\240\240)(Description)] D
-/h12 [(0.9.0.0.1\240\240)(Last updated: September 10, 2003)] D
-/h13 [(0.10\240\240)(XPACommon: Getting Common Information About Access Points)] D
-/h14 [(0.11\240\240)(Summary)] D
-/h15 [(0.12\240\240)(Description)] D
-/h16 [(0.12.0.0.1\240\240)(Last updated: September 10, 2003)] D
-/h17 [(0.13\240\240)(XPAMethod: XPA Communication Methods)] D
-/h18 [(0.14\240\240)(Summary)] D
-/h19 [(0.15\240\240)(Description)] D
-/h20 [(0.15.0.0.1\240\240)(Last updated: September 10, 2003)] D
-/h21 [(0.16\240\240)(XPAInet: XPA Communication Between Hosts)] D
-/h22 [(0.17\240\240)(Summary)] D
-/h23 [(0.18\240\240)(Description)] D
-/h24 [(0.19\240\240)(Manual Registration)] D
-/h25 [(0.20\240\240)(Remote Registration)] D
-/h26 [(0.21\240\240)(XPANS Proxy Registration)] D
-/h27 [(0.21.0.0.1\240\240)(Last updated: September 10, 2003)] D
-/h28 [(0.22\240\240)(XPAUsers: Distinguishing Users)] D
-/h29 [(0.23\240\240)(Summary)] D
-/h30 [(0.24\240\240)(Description)] D
-/h31 [(0.24.0.0.1\240\240)(Last updated: September 10, 2003)] D
-/h32 [(0.25\240\240)(XPA Programs)] D
-/h33 [(0.26\240\240)(Summary)] D
-/h34 [(0.27\240\240)(xpaset: send data to one or more XPA servers)] D
-/h35 [(0.28\240\240)(xpaget: retrieve data from one or more XPA servers)] D
-/h36 [(0.29\240\240)(xpainfo: send short message to one or more XPA servers)] D
-/h37 [(0.30\240\240)(xpaaccess: see if template matches registered XPA access points)] D
-/h38 [(0.30.0.0.1\240\240)(Last updated: September 10, 2003)] D
-/h39 [(0.31\240\240)(xpamb: the XPA Message Bus)] D
-/h40 [(0.32\240\240)(Summary)] D
-/h41 [(0.33\240\240)(Description)] D
-/h42 [(0.34\240\240)(Options)] D
-/h43 [(0.34.0.0.1\240\240)(Last updated: September 10, 2003)] D
-/h44 [(0.35\240\240)(xpans: the XPA Name Server)] D
-/h45 [(0.36\240\240)(Summary)] D
-/h46 [(0.36.0.0.1\240\240)(Last updated: January 24, 2005)] D
-/h47 [(0.37\240\240)(XPAServer: The XPA Server-side Programming Interface)] D
-/h48 [(0.38\240\240)(Summary)] D
-/h49 [(0.39\240\240)(Introduction to XPA Server Programming)] D
-/h50 [(0.40\240\240)(Introduction)] D
-/h51 [(0.41\240\240)(XPANew: create a new XPA access point)] D
-/h52 [(0.42\240\240)(XPACmdNew: create a new XPA public access point for commands)] D
-/h53 [(0.43\240\240)(XPACmdAdd: add a command to an XPA command public access point)] D
-/h54 [(0.44\240\240)(XPACmdDel: remove a command from an XPA command public access point)] D
-/h55 [(0.45\240\240)(XPAInfoNew: define an XPA info public access point)] D
-/h56 [(0.46\240\240)(XPAFree: remove an XPA public access point)] D
-/h57 [(0.47\240\240)(XPAMainLoop: optional main loop for XPA)] D
-/h58 [(0.48\240\240)(XPAPoll: execute existing XPA requests)] D
-/h59 [(0.49\240\240)(XPAAtExit: install exit handler)] D
-/h60 [(0.50\240\240)(XPACleanup: release reserved XPA memory)] D
-/h61 [(0.51\240\240)(XPA Server Callback Macros)] D
-/h62 [(0.52\240\240)(XPA Race Conditions)] D
-/h63 [(0.52.0.0.1\240\240)(Last updated: September 10, 2003)] D
-/h64 [(0.53\240\240)(Xpaoom: What happens when XPA runs out of memory?)] D
-/h65 [(0.54\240\240)(Summary)] D
-/h66 [(0.55\240\240)(Description)] D
-/h67 [(0.55.0.0.1\240\240)(Last updated: April 7, 2009)] D
-/h68 [(0.56\240\240)(XPAClient: The XPA Client-side Programming Interface)] D
-/h69 [(0.57\240\240)(Summary)] D
-/h70 [(0.58\240\240)(Introduction to XPA Client Programming)] D
-/h71 [(0.59\240\240)(Introduction)] D
-/h72 [(0.60\240\240)(XPAGet: retrieve data from one or more XPA servers)] D
-/h73 [(0.61\240\240)(XPASet: send data to one or more XPA servers)] D
-/h74 [(0.62\240\240)(XPAInfo: send short message to one or more XPA servers)] D
-/h75 [(0.63\240\240)(XPAGetFd: retrieve data from one or more XPA servers and write to files)] D
-/h76 [(0.64\240\240)(XPASetFd: send data from stdin to one or more XPA servers)] D
-/h77 [(0.65\240\240)(XPAOpen: allocate a persistent client handle)] D
-/h78 [(0.66\240\240)(XPAClose: close a persistent XPA client handle)] D
-/h79 [(0.67\240\240)(XPANSLookup: lookup registered XPA access points)] D
-/h80 [(0.68\240\240)(XPAAccess: return XPA access points matching template \(XPA 2.1 and above\))] D
-/h81 [(0.68.0.0.1\240\240)(Last updated: March 10, 2007)] D
-/h82 [(0.69\240\240)(XPAXt: the XPA Interface to Xt \(X Windows\))] D
-/h83 [(0.70\240\240)(Summary)] D
-/h84 [(0.71\240\240)(Description)] D
-/h85 [(0.71.0.0.1\240\240)(Last updated: September 10, 2003)] D
-/h86 [(0.72\240\240)(XPATcl: the XPA Interface to the Tcl/Tk Environment)] D
-/h87 [(0.73\240\240)(Summary)] D
-/h88 [(0.74\240\240)(Server Routines)] D
-/h89 [(0.75\240\240)(Client Routines)] D
-/h90 [(0.76\240\240)(Description)] D
-/h91 [(0.77\240\240)(XPANew)] D
-/h92 [(0.78\240\240)(XPARec)] D
-/h93 [(0.78.0.0.1\240\240)(Last updated: September 10, 2003)] D
-/h94 [(0.79\240\240)(XPAEnv: Environment Variables for XPA Messaging)] D
-/h95 [(0.80\240\240)(Summary)] D
-/h96 [(0.81\240\240)(Description)] D
-/h97 [(0.81.0.0.1\240\240)(Last updated: December 23, 2009)] D
-/h98 [(0.82\240\240)(XPAAcl: Access Control for XPA Messaging)] D
-/h99 [(0.83\240\240)(Summary)] D
-/h100 [(0.84\240\240)(Description)] D
-/h101 [(0.84.0.0.1\240\240)(Last updated: September 10, 2003)] D
-/h102 [(0.85\240\240)(XPA ChangeLog)] D
-/h103 [(0.86\240\240)(Public Release 2.1.15 \(July 23, 2013\))] D
-/h104 [(0.87\240\240)(Public Release 2.1.14 \(June 7, 2012\))] D
-/h105 [(0.88\240\240)(Public Release 2.1.13 \(April 14, 2011\))] D
-/h106 [(0.89\240\240)(Public Release 2.1.12 \(January 26, 2010\))] D
-/h107 [(0.90\240\240)(Public Release 2.1.11 \(December 7, 2009\))] D
-/h108 [(0.91\240\240)(Public Release 2.1.10 \(September 1, 2009\))] D
-/h109 [(0.92\240\240)(Internal Release 2.1.9)] D
-/h110 [(0.93\240\240)(Public Release 2.1.8 \(1 November 2007\))] D
-/h111 [(0.94\240\240)(Patch Release 2.1.7b[1,2] \(Feb 22, 2006; March 8, 2007\))] D
-/h112 [(0.95\240\240)(Patch Release 2.1.6 \(4 May 2005\))] D
-/h113 [(0.96\240\240)(Patch Release 2.1.5 \(12 January 2004\))] D
-/h114 [(0.97\240\240)(Patch Release 2.1.4 \(24 March 2003\))] D
-/h115 [(0.98\240\240)(Patch Release 2.1.3 \(26 September 2002\))] D
-/h116 [(0.99\240\240)(Patch Release 2.1.2 \(18 July 2002\))] D
-/h117 [(0.100\240\240)(Patch Release 2.1.1 \(20 June 2002\))] D
-/h118 [(0.101\240\240)(Public Release 2.1.0 \(22 April 2002\))] D
-/h119 [(0.102\240\240)(Pre-Release 2.1.0e \(2 April 2002\))] D
-/h120 [(0.103\240\240)(Pre-Release 2.1.0e \(1 April 2002\))] D
-/h121 [(0.104\240\240)(Pre-Release 2.1.0e \(25 March 2002\))] D
-/h122 [(0.105\240\240)(Pre-Release 2.1.0e \(19 March 2002\))] D
-/h123 [(0.106\240\240)(Pre-Release 2.1.0e \(14 February 2002\))] D
-/h124 [(0.107\240\240)(Pre-Release 2.1.0e \(11 February 2002\))] D
-/h125 [(0.108\240\240)(Beta Release 2.1.0b10 \(31 January 2002\))] D
-/h126 [(0.109\240\240)(Beta Release 2.1.0b9 \(26 January 2002\))] D
-/h127 [(0.110\240\240)(Beta Release 2.1.0b8 \(4 January 2002\))] D
-/h128 [(0.111\240\240)(Beta Release 2.1.0b7 \(21 December 2001\))] D
-/h129 [(0.112\240\240)(Beta Release 2.1.0b6 \(29 October 2001\))] D
-/h130 [(0.113\240\240)(Beta Release 2.1.0b5 \(22 October 2001\))] D
-/h131 [(0.114\240\240)(Beta Release 2.1.0b4 \(24 September 2001\))] D
-/h132 [(0.115\240\240)(Beta Release 2.1.0b3 \(6 September 2001\))] D
-/h133 [(0.116\240\240)(Beta Release 2.1.0b2 \(17 August 2001\))] D
-/h134 [(0.117\240\240)(Beta Release 2.1.0b1 \(6 August 2001\))] D
-/h135 [(0.118\240\240)(Patch Release 2.0.5 \(10 November 2000\))] D
-/h136 [(0.119\240\240)(Patch Release 2.0.4 \(20 September 2000\))] D
-/h137 [(0.120\240\240)(Patch Release 2.0.3 \(15 June 2000\))] D
-/h138 [(0.121\240\240)(Patch Release 2.0.2 \(9 September 1999\))] D
-/h139 [(0.122\240\240)(Patch Release 2.0.1 \(6 August 1999\))] D
-/h140 [(0.123\240\240)(Public Release 2.0 \(27 May 1999\))] D
-/h141 [(0.123.0.0.1\240\240)(Last updated: 22 April 2002)] D
-/h142 [(0.124\240\240)(XPACode: Where to Find Example/Test Code)] D
-/h143 [(0.125\240\240)(Summary)] D
-/h144 [(0.126\240\240)(Description)] D
-/h145 [(0.126.0.0.1\240\240)(Last updated: September 10, 2003)] D
-/h146 [(0.127\240\240)(XPA Changes: Changes For Users from XPA 1.0 and 2.0)] D
-/h147 [(0.128\240\240)(Summary)] D
-/h148 [(0.129\240\240)(Description)] D
-/h149 [(0.129.0.0.1\240\240)(Last updated: September 10, 2003)] D
-/h150 [(0.130\240\240)(XPAConvert: Converting the XPA API to 2.0)] D
-/h151 [(0.131\240\240)(Summary)] D
-/h152 [(0.132\240\240)(Description)] D
-/h153 [(0.132.0.0.1\240\240)(Last updated: September 10, 2003)] D
-/h154 [(0.133\240\240)(XPAName: What does XPA stand for?)] D
-/h155 [(0.134\240\240)(Summary)] D
-/h156 [(0.135\240\240)(Description)] D
-/h157 [(0.135.0.0.1\240\240)(Last updated: September 10, 2003)] D
-/Hr [-47 47 48 49 -50 -50 50 -54 54 55 56 -57 -57 57 -59 59 60 61 -62 -62
-62 -64 64 65 66 -67 -67 67 -69 69 70 71 -72 -72 72 -74 74 75 76 77 78 79
--80 -80 80 -82 82 83 84 -85 -85 85 -86 86 87 88 89 90 91 -92 -92 92 -94
-94 95 96 97 -98 -98 98 -100 100 101 -102 -102 102 -106 106 107 108 109 110
-111 112 113 114 115 116 117 118 119 120 121 -122 -122 122 -124 124 125 126
--127 -127 127 -130 130 131 132 133 134 135 136 137 138 139 140 141 142 -143
--143 143 -145 145 146 147 -148 -148 148 -151 151 152 153 154 155 156 157
--158 -158 158 -160 160 161 162 -163 -163 163 -165 165 166 167 -168 -168
-168 -169 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
-185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
-203 204 205 206 207 -208 -208 208 -210 210 211 212 -213 -213 213 -215 215
-216 217 -218 -218 218 -220 220 221 222 -223 -223 223 -225 225 226 227 -228
--228 228]D
-/HV [1 2 2 2 3 4 5 1 2 2 2 3 4 5 1 2 2 2 3 4 5 1 2 2 2 3 4 5 1 2 2 2 3
-4 5 1 2 2 2 2 2 2 3 4 5 1 2 2 2 3 4 5 1 2 2 2 2 2 2 3 4 5 1 2 2 2 2 3 4
-5 1 2 2 3 4 5 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 4 5 1 2 2 2 3 4 5 1 2
-2 2 2 2 2 2 2 2 2 2 2 2 3 4 5 1 2 2 2 3 4 5 1 2 2 2 2 2 2 2 3 4 5 1 2 2
-2 3 4 5 1 2 2 2 3 4 5 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 4 5 1 2 2 2 3 4 5 1 2 2 2 3 4 5 1 2 2 2
-3 4 5 1 2 2 2 3 4 5]D
-/Cn [3 0 0 1 1 1 0 3 0 0 1 1 1 0 3 0 0 1 1 1 0 3 0 0 1 1 1 0 3 0 0 1 1
-1 0 6 0 0 0 0 0 1 1 1 0 3 0 0 1 1 1 0 6 0 0 0 0 0 1 1 1 0 4 0 0 0 1 1 1
-0 2 0 1 1 1 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 3 0 0 1 1 1 0 13
-0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 3 0 0 1 1 1 0 7 0 0 0 0 0 0 1 1 1 0 3 0
-0 1 1 1 0 3 0 0 1 1 1 0 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 3 0 0 1 1 1 0 3 0 0 1 1 1 0 3 0 0
-1 1 1 0 3 0 0 1 1 1 0]D
-Hr length 0 gt{[/PageMode /UseOutlines /DOCVIEW pdfmark}if
-/Hn 1 D
-0 1 Hr length 1 sub{
- /Bn E D [Cn Bn get dup 0 gt{/Count E HV Bn get Bl ge{neg}if}{pop}ie
- /Dest Hr Bn get dup abs ST cvs cvn E 0 ge{(h)Hn ST cvs join cvx exec
- dup 1 get E Nf{0 get E join}{pop}ie /Hn Hn 1 add D}{()}ie
- /Title E dup length 255 gt{0 255 getinterval}if /OUT pdfmark}for
-ZF /FN Fp D Ps 0 FS /WC Wf{( )}{<A1A1>}ie SW pop D
-ET RC ZF
-/Df f D
-/R1 (http://hea-www.harvard.edu/RD/xpa/changelog.html) D
-/Ba f D /BO 0 D Bs
-/UR (help.html) D
-/Ti (The XPA Help Facility) D
-/Au () D
-/Df f D
-/ME [()] D
- TC
-
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-
-/Ba f D /BO 0 D Bs
-/UR (help.html) D
-/Ti (The XPA Help Facility) D
-/Au () D
-/Df f D
-/ME [()] D
- TC
-
-NP RC ZF
-()1 Sl()WB 0 Sn(
-
-
-)0 2 0 H(XPA:)WB 47 Sn()WB 1 Sn( Public Access to Data and Algorithms)EA()EH(
-
-
-)0 2 1 H(Summary)WB 48 Sn()EH(
-This document is the Table of Contents for XPA.
-
-
-)0 2 2 H(Description)WB 49 Sn()EH(
-)0 P(The XPA messaging system provides seamless communication between many
-kinds of Unix programs, including X programs and Tcl/Tk programs.  It
-also provides an easy way for users to communicate with XPA-enabled
-programs by executing XPA client commands in the shell or by utilizing
-such commands in scripts.  Because XPA works both at the programming
-level and the shell level, it is a powerful tool for unifying any
-analysis environment: users and programmers have great flexibility in
-choosing the best level or levels at which to access XPA services, and
-client access can be extended or modified easily at any time.
-
-)0 P(A program becomes an XPA-enabled server by defining named points of
-public access through which data and commands can be exchanged with
-other client programs \201and users\202.  Using standard TCP sockets as a
-transport mechanism, XPA supports both single-point and broadcast
-messaging to and from these servers.  It supports direct communication
-between clients and servers, or indirect communication via an
-intermediate message bus emulation program. Host-based access control
-is implemented, as is as the ability to communicate with XPA servers
-across a network.
-
-)0 P(XPA implements a layered interface that is designed to be useful both
-to software developers and to users.  The interface consists of a
-library of XPA client and server routines for use in C/C++ programs and
-a suite of high-level user programs built on top of these libraries.
-Using the XPA library, access points can be added to Tcl/Tk programs,
-Xt programs, or to Unix programs that use the XPA event loop or any
-event loop based on select\201\202.  Client access subroutines can be added
-to any Tcl/Tk, Xt, or Unix program. Client access also is supported at
-the command line via a suite of high-level programs.
-
-)0 P(Choose from the following topics:
-
-)UL( 
-)-1 LI()0 2 1 A(Introduction to XPA)2 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 3 1 A(Access Point Names and Templates)3 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 4 1 A(Getting Common Information About Access Points)4 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 5 1 A(Communication Methods)5 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 6 1 A(Communication Between Hosts)6 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 7 1 A(Distinguishing Users)7 1 TN TL()Ec /AF f D(
-
-
-)-1 LI()0 8 1 A(XPA User Programs)8 1 TN TL()Ec /AF f D(
-)UL()-1 LI()0 9 1 A(xpaget: get data and info)9 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 10 1 A(xpaset: send data and info)10 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 11 1 A(xpainfo: send info alert)11 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 12 1 A(xpaaccess: get access point info)12 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 13 1 A(xpamb: message bus emulation)13 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 14 1 A(xpans: the XPA name server)14 1 TN TL()Ec /AF f D(
-)LU(
-
-)-1 LI()0 15 1 A(XPA Server Routines)15 1 TN TL()Ec /AF f D(
-)UL()-1 LI()0 16 1 A(XPANew: define a new access point)16 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 17 1 A(XPACmdNew: define a new command access point)17 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 18 1 A(XPACmdAdd: add a command)18 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 19 1 A(XPACmdDel: delete a command)19 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 20 1 A(XPAInfoNew: define an info access point)20 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 21 1 A(XPAFree: free an access point)21 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 22 1 A(XPAMainLoop: event loop for select server)22 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 23 1 A(XPAPoll: poll for XPA events)23 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 24 1 A(XPACleanup: release reserved XPA memory)24 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 25 1 A(XPA Server Macros: accessing structure internals)25 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 26 1 A(XPA Race Conditions: how to avoid them)26 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 27 1 A(XPA Out of Memory \201OOM\202 errors)27 1 TN TL()Ec /AF f D(
-)LU(
-
-)-1 LI()0 28 1 A(XPA Client Routines)28 1 TN TL()Ec /AF f D(
-)UL()-1 LI()0 29 1 A(XPAOpen: open a persistent client connection)29 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 30 1 A(XPAClose: close persistent client connection)30 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 31 1 A(XPAGet: get data)31 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 32 1 A(XPASet: send data or commands)32 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 33 1 A(XPAInfo: send an info alert)33 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 34 1 A(XPAGetFd: get data and write to an fd)34 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 35 1 A(XPASetFd: read data from and fd and send)35 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 36 1 A(XPANSLookup: look up an access point)36 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 37 1 A(XPAAccess: get access info)37 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 38 1 A(The XPA/Xt Interface: Xt interface to XPA)38 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 39 1 A(The XPA/Tcl Interface: Tcl interface to XPA)39 1 TN TL()Ec /AF f D(
-)LU(
-
-)-1 LI( Tailoring the XPA Environment
-)UL()-1 LI()0 40 1 A(Environment Variables)40 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 41 1 A(Access Control)41 1 TN TL()Ec /AF f D(
-)LU(
-
-)-1 LI( Miscellaneous
-)UL(
-)-1 LI()0 42 1 A(XPA ChangeLog)42 1 TN TL()Ec /AF f D(
-
-)-1 LI()0 43 1 A(Where to Find Example/Test Code)43 1 TN TL()Ec /AF f D(
-)-1 LI()0 44 1 A(User Changes Between XPA 1.0 and 2.0)44 1 TN TL()Ec /AF f D(
-)-1 LI()0 45 1 A(API Changes Between XPA 1.0 and 2.0)45 1 TN TL()Ec /AF f D(
-)-1 LI()0 46 1 A(What Does XPA Stand For, Anyway?)46 1 TN TL()Ec /AF f D()LU(
-)LU( 
-
-
-
-)0 5 3 H(Last)WB 50 Sn( updated: September 10, 2003)EH(
-)WB NL NP Ep ET /Tc f D
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (intro.html) D
-/Ti (Introduction to XPA) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 2 Sn(
-
-
-)0 2 4 H(XPAIntro:)WB 54 Sn()WB 51 Sn( Introduction to the XPA Messaging System)EA()EH(
-
-
-)0 2 5 H(Summary)WB 55 Sn()EH(
-)0 P(A brief introduction to the XPA messaging system, which provides
-seamless communication between all kinds of Unix event-driven
-programs, including X programs, Tcl/Tk programs, and Perl programs.
-
-
-)0 2 6 H(Description)WB 56 Sn()EH(
-)0 P(The XPA messaging system provides seamless communication between all
-kinds of Unix programs, including X programs, Tcl/Tk programs, and
-Perl programs.  It also provides an easy way for users to communicate
-with these XPA-enabled programs by executing XPA client commands in
-the shell or by utilizing such commands in scripts.  Because XPA works
-both at the programming level and the shell level, it is a powerful
-tool for unifying any analysis environment: users and programmers have
-great flexibility in choosing the best level or levels at which to
-access XPA services, and client access can be extended or modified
-easily at any time.
-
-)0 P(A program becomes an XPA-enabled server by defining named points of
-public access through which data and commands can be exchanged with
-other client programs \201and users\202.  Using standard TCP sockets as
-a transport mechanism, XPA supports both single-point and broadcast
-messaging to and from these servers.  It supports direct communication
-between clients and servers, or indirect communication via an
-intermediate message bus emulation program. Host-based access control
-is implemented, as is as the ability to communicate with XPA servers
-across a network.
-
-)0 P(XPA implements a layered interface that is designed to be useful both
-to software developers and to users.  The interface consists of a
-library of XPA client and server routines for use in programs and a
-suite of high-level user programs built on top of these libraries.
-Using the XPA library, access points can be added to
-)0 52 1 A(Tcl/Tk)52 0 TN TL()Ec /AF f D(
-programs, 
-)0 53 1 A(Xt)53 0 TN TL()Ec /AF f D(
-programs, or to Unix programs that use the XPA event loop or any
-event loop based on select\201\202.  Client access subroutines can be added
-to any Tcl/Tk or Unix program. Client access also is supported at the
-command line via a suite of high-level programs. 
-
-)0 P(The major components of the XPA layered interface are:
-)UL()-1 LI(A set of XPA server routines, centered on 
-)0 16 1 A(XPANew\201\202,)16 0 TN TL()Ec /AF f D(
-which are used by XPA server programs to tag public access points with
-string identifiers and to register send and receive callbacks for
-these access points.
-
-)-1 LI(A set of XPA client routines, centered on the 
-)0 32 1 A(XPASet\201\202)32 0 TN TL()Ec /AF f D(
-and
-)0 31 1 A(XPAGet\201\202,)31 0 TN TL()Ec /AF f D(
-which are used by external client applications to exchange data and
-commands with an XPA server.
-
-)-1 LI(High-level programs, centered on
-)0 10 1 A(xpaset)10 0 TN TL()Ec /AF f D(
-and
-)0 9 1 A(xpaget,)9 0 TN TL()Ec /AF f D(
-which allow data
-and information to be exchanged with XPA server programs from the
-command line and from scripts.  These programs have the command syntax:
-) 2 35 PR(  [data] | xpaset  [qualifiers ...]
-           xpaget  [qualifiers ...])RP(
-)-1 LI(An XPA name server program, 
-)0 14 1 A(xpans,)14 0 TN TL()Ec /AF f D(
-through which XPA access point names are
-registered by servers and distributed to clients.)LU(
-
-)0 P(Defining an XPA access point is easy: a server application calls
-)0 16 1 A(XPANew\201\202,)16 0 TN TL()Ec /AF f D(
-)0 17 1 A(XPACmdNew\201\202,)17 0 TN TL()Ec /AF f D(
-or the experimental
-)0 20 1 A(XPAInfoNew\201\202)20 0 TN TL()Ec /AF f D(
-routine to
-create a named public access point.  An XPA service can specify "send"
-and "receive" callback procedures \201or an "info" procedure in the case
-of XPAInfoNew\201\202\202 to be executed by the program when an external
-process either sends data or commands to this access point or requests
-data or information from this access point.  Either of the callbacks
-can be omitted, so that a particular access point can be specified as
-read-only, read-write, or write-only.  Application-specific client
-data can be associated with these callbacks.  Having defined one or
-more public access points in this way, an XPA server program enters
-its usual event loop \201or uses the standard XPA event loop\202.
-
-)0 P(Clients communicate with these XPA public access points
-using programs such as
-)0 9 1 A(xpaget)9 0 TN TL()Ec /AF f D(,
-)0 10 1 A(xpaset)10 0 TN TL()Ec /AF f D(, and
-)0 11 1 A(xpainfo)11 0 TN TL()Ec /AF f D(
-\201at the command line\202,
-or routines such as
-)0 31 1 A(XPAGet\201\202,)31 0 TN TL()Ec /AF f D(
-)0 32 1 A(XPASet\201\202,)32 0 TN TL()Ec /AF f D(
-and
-)0 33 1 A(XPAInfo\201\202)33 0 TN TL()Ec /AF f D(
-within a program.  Both methods require specification of the name of
-the access point.  The xpaget program returns data or other
-information from an XPA server to its standard output, while the
-xpaset program sends data or commands from its standard input to an
-XPA application. The corresponding API routines set/get data to/from
-memory, returning error messages and other info as needed.  If a
-)0 3 1 A(template)3 0 TN TL()Ec /AF f D(
-is used to specify the access point name \201e.g., "ds9*"\202, then
-communication will take place with all servers matching that template.
-
-)0 P(Please note that XPA currently is not thread-safe. All XPA calls must be
-in the same thread.
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 7 H(Last)WB 57 Sn( updated: March 10, 2007)EH(
-
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (template.html) D
-/Ti (Access Point Names and Templates) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 3 Sn(
-
-
-)0 2 8 H(XPATemplate:)WB 59 Sn()WB 58 Sn( Access Point Names and Templates)EA()EH(
-
-)0 2 9 H(Summary)WB 60 Sn()EH(
-)0 P(XPA access points are composed of two parts: a general class and a
-specific name.  Both parts accept template characters so that you
-can send/retrieve data to/from multiple servers at one time.
-
-
-)0 2 10 H(Description)WB 61 Sn()EH(
-)0 P(When XPA servers call
-)0 16 1 A(XPANew\201\202,)16 0 TN TL()Ec /AF f D(
-or
-)0 17 1 A(XPACmdNew\201\202)17 0 TN TL()Ec /AF f D(
-to define XPA access points, they specify a string identifier composed of a
-class and a name. When clients communicate with XPA access points,
-they specify which access points to communicate with using
-an identifier of the form:
-) 1 12 PR(  class:name)RP(
-All registered XPA access points that match the specified identifier
-will be available for communication \201subject to access control rules,
-etc.\202
-
-)0 P(As of XPA 2.1.5, the length of both the class and name designations are
-limited to 1024 characters.
-
-)0 P(The XPA class:name identifier actually is a template: it accepts wild
-cards in its syntax, so a single specifier can match more than one XPA
-access point.  \201Note that the class is optional and defaults to "*".\202
-The allowed syntax for clients to specify the class:name template is
-of the form shown below. \201Note that "*" is used to denote a generic
-wild card, but other wild cards characters are supported, as described
-below\202.
-) 7 46 PR(  template      explanation
-  --------      -----------
-  class:name    exact match of class and name
-  name          match any class with this name
-  *:name        match any class with this name
-  class:*       match any name of this class
-  *:*           match any access point)RP(
-)0 P(In general, the following wild-cards can be applied to class and name:
-) 5 58 PR(  wildcard      explanation
-  --------      -----------
-  ?             match any character, but there must be one
-  *             match anything, or nothing
-  [...]         match an inclusive set)RP(
-)0 P(Although the class:name template normally is used to refer to XPA
-access points, these also can be specified using their individual
-socket identifiers.  For inet sockets, the socket identifier is
-)BD(ip:port)ES(, where ip can be the DNS-registered name,
-the ASCII IP number \201e.g. 123.45.67.890\202 or the hex IP number
-\201e.g. 838f3a60\202. For unix sockets, the identifier is the )BD(socket file
-name)ES(.  These socket identifiers are displayed as the fourth argument
-in the xpans display of registered access points.  For example,
-consider the ds9 program started using inet sockets. The xpans name
-server will register something like this:
-) 2 40 PR(  csh> xpaget xpans
-  DS9 ds9 gs saord.harvard.edu:3236 eric)RP(
-You can access ds9 using ip:3236 in any of the three forms:
-) 8 37 PR(  csh> xpaget saord:3236 file
-  /home/eric/data/snr.ev
-
-  csh> xpaget 123.45.67.890:3236 file
-  /home/eric/data/snr.ev
-
-  csh> xpaget 838f3a60:3236 file
-  /home/eric/data/snr.ev)RP(
-In the case of unix  sockets, the socket identifier is a file:
-) 5 41 PR(  csh> xpaget xpans
-  DS9 ds9 gs /tmp/.xpa/DS9_ds9.2631 eric
-
-  csh> xpaget /tmp/.xpa/DS9_ds9.2631 file
-  /home/eric/data/snr.ev)RP(
-This feature can be useful in distinguishing between multiple
-instances of a program that all have the same class:name designation.
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 11 H(Last)WB 62 Sn( updated: September 10, 2003)EH(
-
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (info.html) D
-/Ti (Getting Common Information About Access Points) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 4 Sn(
-
-
-)0 2 12 H(XPACommon:)WB 64 Sn()WB 63 Sn( Getting Common Information About Access Points)EA()EH(
-
-
-)0 2 13 H(Summary)WB 65 Sn()EH(
-)0 P(There are various kinds of generic information you can retrieve about
-an XPA access point by using the xpaget command.
-
-
-)0 2 14 H(Description)WB 66 Sn()EH(
-)0 P(You can find out which XPA access points have been registered with
-the currently running 
-)0 14 1 A(XPA name server)14 0 TN TL()Ec /AF f D(
-by executing the
-)0 9 1 A(xpaget)9 0 TN TL()Ec /AF f D(
-command to retrieve info from the XPA name server:
-) 1 14 PR(  xpaget xpans)RP(
-If, for example, the
-)0 43 1 A(stest)43 0 TN TL()Ec /AF f D( test server program
-is running, the following XPA access points will be returned \201the specifics
-of the returned info will vary for different machines and users\202:
-) 4 33 PR(  XPA xpa gs 838e2f67:1262 eric
-  XPA xpa1 gs 838e2f67:1266 eric
-  XPA c_xpa gs 838e2f67:1267 eric
-  XPA i_xpa i 838e2f67:1268 eric)RP(
-Note that access to this information is subject to the usual
-)0 41 1 A(XPA Access Control)41 0 TN TL()Ec /AF f D( restrictions.
-
-)0 P(Each XPA access point supports a number of reserved sub-commands that provide
-access to different kinds of information, e.g. the access control for
-that access point.  These sub-commands can be executed by using
-)0 10 1 A(xpaset)10 0 TN TL()Ec /AF f D(
-or
-)0 9 1 A(xpaget)9 0 TN TL()Ec /AF f D(
-at the command line, or
-)0 31 1 A(XPAGet\201\202)31 0 TN TL()Ec /AF f D(
-or
-)0 32 1 A(XPASet\201\202)32 0 TN TL()Ec /AF f D(
-in programs, e.g:
-) 5 30 PR(  xpaget ds9 -acl
-  xpaget ds9 -help
-  xpaget ds9 env FOO
-
-  xpaset -p ds9 env FOO foofoo)RP(
-With the exception of )BD(-help)ES( and )BD(-version)ES(, reserved
-sub-commands are available only on the machine on which the XPA server
-itself is running.
-
-The following reserved sub-commands are defined for all access points:
-)0 DL(
-)0 P()0 DT()BD(-acl)ES( get \201set\202 the access control list [options: host type acl, for set]
-)DD( 
-The 'xpaset' option allows you to add a new acl for a given host, or change
-the acl for an existing host. See
-)0 41 1 A(XPA Access Control)41 0 TN TL()Ec /AF f D(
-for more information.
-This access point is available only on the server machine.
-
-)0 P()0 DT()BD(-env)ES( get \201set\202 an environment variable [options: name \201value, for set\202]
-)DD(The 'xpaget' option will return the value of the named environment
-variable.  The 'xpaset' option will set the value of the names
-variable to the specified value.
-This access point is available only on the server machine.
-\201Please be advised that we have had problems setting environment
-variables in static Tcl/Tk programs such as ds9 running under Linux.\202
-
-)0 P()0 DT( )BD(-clipboard)ES( set\201get\202 information on a named clipboard
-)DD( Clients can store ASCII state information on any number of named
-clipboards. Clipboards of the same name created by clients on
-different machines are kept separate.  The syntax for creating a
-clipboard is:
-) 2 65 PR(  [data] | xpaset [server] -clipboard add|append [clipboard_name]
-  xpaset -p [server] -clipboard delete [clipboard_name])RP(
-Use "add" to create a new clipboard or replace the contents of an existing
-one. Use "append" to append to an existing clipboard.
-)0 P(Information on a named clipboard is retrieved using:
-) 1 45 PR(  xpaget [server] -clipboard [clipboard_name])RP(
-)0 P()0 DT()BD(-exec)ES( set: execute commands from buffer [options: none]
-)DD(If -exec is specified in the paramlist of an 'xpaset' call, then further
-sub-commands will be retrieved from the data buffer.
-
-)0 P()0 DT()BD(-help)ES( get: return help string for this XPA or sub-command [options: name \201for sub-commands\202]
-)DD(Each XPA access point and each XPA sub-command can have a help string
-associated with it that is specified when the access point is defined.
-The -help option will return this help string.  For XPA access points
-that contain user-defined sub-commands, you can get the help string
-for a particular sub-command by specifying its name, or else get the
-help strings for all sub-commands if not name is specified.
-
-)0 P()0 DT()BD(-ltimeout)ES( get \201set\202 the long timeout value [options: seconds|reset]
-)DD(The 'xpaget' option will return the value of the long timeout \201in seconds\202.
-The 'xpaset' option will set the value of the long timeout. If "reset" is
-specified, then the timeout value will be reset to the default value.
-
-)0 P()0 DT()BD(-nsconnect)ES( set: re-establish name server connection to all XPA's [options: none]
-)DD(If the 
-)0 14 1 A(XPA Name Server \201xpans\202)14 0 TN TL()Ec /AF f D(
-process has terminated unexpectedly and then re-started, this
-sub-command can be used to re-establish the connection.  You use it by
-sending the command to the [name:port] or [file] of the access point
-instead of to the XPA name \201since the latter requires the xpans
-connection!\202:
-) 1 36 PR(  xpaset -p 838e2f67:1268 -nsconnect)RP(
-See )0 14 1 A(xpans)14 0 TN TL()Ec /AF f D( for more information.
-
-)0 P()0 DT()BD(-nsdisconnect)ES( set: break name server connection to all XPA's [options: none]
-)DD(This sub-command will terminate the connection to the
-)0 14 1 A(XPA Name Server \201xpans\202)14 0 TN TL()Ec /AF f D(, thereby making
-all access points inaccessible except through their underlying [name:port]
-or [file] identifiers.  I forget why we added it, it seems pretty useless.
-
-)0 P()0 DT()BD(-stimeout)ES( get \201set\202 the short timeout value [options: seconds|reset]
-)DD(The 'xpaget' option will return the value of the short timeout \201in seconds\202.
-The 'xpaset' option will set the value of the short timeout. If "reset" is
-specified, then the timeout value will be reset to the default value.
-
-)0 P()0 DT()BD(-remote)ES( set: register xpa with remote server [options: host[:port] [acl]] [-proxy]
-)DD(This sub-command will register the XPA access point with the XPA name
-server \201xpans\202 on the specified host \201which must already be running\202.
-The specified host also is given access control to the access point,
-using the specified acl or the default acl of "+" \201meaning the remote
-host can xpaset, xpaget, xpainfo or xpaaccess\202. If the acl is
-specified as "-", then the access point is unregistered. 
-See )0 6 1 A(Communication Between Machines)6 0 TN TL()Ec /AF f D(
-for more information on how this sub-command is used.
-
-)0 P()0 DT()BD(-version)ES( get: return XPA version string [options: none]
-)DD(The version refers to the version of XPA used to define this access point
-\201currently something like 2.0\202.
-)LD(
-
-)0 P(You can add your own reserved commands to all XPA access points by using the
-)0 18 1 A(XPACmdAdd\201\202)18 0 TN TL()Ec /AF f D(
-routine, passing the XPA handle returned by )EM(XPA XPAGetReserved\201void\202)ES(
-as the first argument. Note again that these will only be available on the
-machine where the XPA service is running.
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 15 H(Last)WB 67 Sn( updated: September 10, 2003)EH(
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (method.html) D
-/Ti (XPA Communication Methods) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 5 Sn(
-
-
-)0 2 16 H(XPAMethod:)WB 69 Sn()WB 68 Sn( )EA(XPA Communication Methods)EH(
-
-
-)0 2 17 H(Summary)WB 70 Sn()EH(
-)0 P(XPA supports both inet and unix \201local\202 socket communication.
-
-
-)0 2 18 H(Description)WB 71 Sn()EH(
-)0 P(XPA uses sockets for communication between processes. It supports
-three methods of socket communication: inet, localhost, and unix. In
-general, the same method should be employed for all XPA processes in a
-session and the global environment variable XPA_METHOD should be used
-to set up the desired method. By default, the preferred method is
-"inet", which is appropriate for most users. You can set up a
-different method by typing something like:
-) 3 70 PR(  setenv XPA_METHOD local              # unix csh
-  XPA_METHOD=local; export XPA_METHOD  # unix sh, bash, windows/cygwin
-  set XPA_METHOD=localhost             # dos/windows)RP(
-The options for XPA_METHOD are: )BD(inet)ES(, )BD(unix)ES( \201or
-)BD(local)ES(\202, and )BD(localhost)ES(. On Unix machines, this
-environment setup command can be placed in your shell init file
-\201.cshrc, .profile, .bashrc, etc.\202 On Windows platforms, it can be
-placed in your AUTOEXEC.BAT file \201I think!\202.
-
-)0 P(By default, )BD(inet)ES( sockets are used by XPA. These are the standard
-Internet sockets that are used by programs such as Netscape,
-ftp. etc. Inet sockets utilize the IP address of the given machine and
-a \201usually random\202 port number to communicate between processes on the
-same machine or between different machines on the Internet. \201Note that
-XPA has an )0 41 1 A(Access Control)41 0 TN TL()Ec /AF f D( mechanism to
-prevent unauthorized access of XPA access points by other computers on
-the Net\202. For users connected to the Internet, this usually is the
-appropriate communication method. For more information about setting
-up XPA communication between machines, see
-)0 6 1 A(Communication Between Machines)6 0 TN TL()Ec /AF f D(.
-
-)0 P(In you are using XPA on a machine without an Internet connection, then
-inet sockets are not appropriate. In fact, an XPA process often will
-hang for many seconds while waiting for a response from the Domain
-Name Service \201DNS\202 when using inet sockets. Instead of inet sockets,
-users on Unix platforms can also use )BD(unix)ES( sockets \201also known
-as local sockets\202. These sockets are based on the local file system
-and do not make use of the DNS. They generally are considered to be
-faster than inet sockets, but they are not implemented under
-Windows. Use local sockets as a first resort if you are on a Unix
-machine that is not connected to the Internet.
-
-)0 P(Users not connected to the Internet also can use )BD(localhost)ES(
-sockets. These are also inet-type sockets but the IP address used for
-the local machine is the )BD(localhost)ES( address, 0x7F000001, instead
-of the real IP of the machine. Depending on how sockets are set up for
-a given platform, communication with the DNS usually is not required in
-this case \201though of course, XPA cannot interact with other machines\202.
-The localhost method will generally work on both Unix and Windows
-platforms, but whether the DNS is required or not is subject to
-individual configurations.
-
-)0 P(A final warning/reminder: if your XPA-enabled server hangs at startup
-time and your XPA_METHOD is )BD(inet)ES(, the problem probably is
-related to an incorrect Internet configuration. This can be confirmed
-by using the )BD(unix)ES( method or \201usually\202 the )BD(localhost)ES(
-method. You can use these alternate methods if other hosts do not need
-access to the XPA server.
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 19 H(Last)WB 72 Sn( updated: September 10, 2003)EH(
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (inet.html) D
-/Ti (XPA Communication Between Hosts) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 6 Sn(
-
-
-)0 2 20 H(XPAInet:)WB 74 Sn()WB 73 Sn( XPA Communication Between Hosts)EA()EH(
-
-
-)0 2 21 H(Summary)WB 75 Sn()EH(
-XPA uses standard inet sockets to support communication between two or
-more host computers.
-
-
-)0 2 22 H(Description)WB 76 Sn()EH(
-)0 P(When the )0 5 1 A(Communication Method)5 0 TN TL()Ec /AF f D( is set to
-)BD(inet)ES( \201as it is by default\202, XPA can be used to communicate
-between different computers on the Internet.  INET sockets utilize the
-IP address of the given machine and a \201usually random\202 port number to
-communicate between processes on the same machine or between different
-machines on the Internet.  These standard Internet sockets are also
-used by programs such as Netscape, ftp. etc.
-
-)0 P(XPA supports a host-based )0 41 1 A(Access Control)41 0 TN TL()Ec /AF f D( mechanism
-to prevent unauthorized access of XPA access points by other computers
-on the Net.  By default, only the machine on which the XPA server is
-running can access XPA services. Therefore, setting up communication
-between a local XPA server machine and a remote client machine
-requires a two-part registration process:
-
-)UL()-1 LI( the XPA service on the local machine must be made known to the 
-remote machine
-)-1 LI( the remote machine must be given permission to access the local
-XPA service)LU(
-
-Three methods by which this remote registration can be accomplished
-are described below.
-
-)0 2 23 H(Manual)WB 77 Sn( Registration)EH(
-
-The first method is the most basic and does not require the remote
-client to have xpans running.  To use it, the local server simply
-gives a remote client machine access to one or more XPA access points
-using xpaset and the )BD(-acl)ES( sub-command. For example,
-consider the XPA test program "stest" running on a local machine.  By
-default the access control for the access point named "xpa" is
-restricted to that machine:
-) 3 25 PR(  [sh]$ xpaget xpa -acl
-  *:* 123.456.78.910 gisa
-  *:* localhost gisa)RP(
-Using xpaset and the )BD(-acl)ES( sub-command, a remote client
-machine can be given permission to perform xpaget, xpaset, xpaaccess,
-or xpainfo operations.  For example, to allow the xpaget operation, the
-following command can be issued on the local machine:
-) 1 45 PR(  [sh]$ xpaset -p xpa -acl "remote_machine g")RP(
-This results in the following access permissions on the local machine:
-) 4 26 PR(  [sh]$ xpaget xpa -acl
-  XPA:xpa 234.567.89.012 g
-  *:* 123.456.78.910 gisa
-  *:* localhost gisa)RP(
-
-The remote client can now use the local server's xpans name server to
-establish communication with the local XPA service. This can be done
-on a call-by-call basis using the )BD(-i)ES( switch on xpaset, xpaget, etc:
-) 6 43 PR(  [sh]$ xpaget -i "local_machine:12345" xpa
-  class: XPA
-  name: xpa
-  method: 88877766:2778
-  sendian: little
-  cendian: big)RP(
-Alternatively, the XPA_NSINET variable on the remote machine can be
-set to point directly to xpans on the local machine, removing
-the need to override this value each time an XPA program is run:
-) 7 42 PR(  [csh]$ setenv XPA_NSINET 'karapet:$port'
-  [csh]$ xpaget xpa
-  class: XPA
-  name: xpa
-  method: 88877766:2778
-  sendian: little
-  cendian: big)RP(
-Here, '$port' means to use the default XPA name service port \20114285\202.
-not a port environment variable.
-
-)0 P(Access permission for remote client machines can be stored in a file
-on the local machine pointed to by the )BD(XPA_ACLFILE)ES( environment
-variable or using the )BD(XPA_DEFACL)ES( environment variable. See )0 41 1 A(XPA Access Control)41 0 TN TL()Ec /AF f D( for more information.
-
-)0 2 24 H(Remote)WB 78 Sn( Registration)EH(
-
-If xpans is running on the remote client machine, then a local xpaset
-command can be used with the )BD(-remote)ES( sub-command to
-register the local XPA service in the remote name service, while at
-the same time giving the remote machine permission to access the local
-service.  For example, assume again that "stest" is running on the
-local machine and that xpans is also running on the remote machine.
-To register access of this local xpa on the remote machine, use 
-the xpaset and the )BD(-remote)ES( sub-command:
-) 1 56 PR(  [sh]$ ./xpaset -p xpa -remote 'remote_machine:$port' +)RP(
-To register the local xpa access point on the remote machine with xpaget
-access only, execute:
-) 1 56 PR(  [sh]$ ./xpaset -p xpa -remote 'remote_machine:$port' g)RP(
-Once the remote registration command is executed, the remote client
-machine will have an entry such as the following in its own xpans name
-service:
-) 2 31 PR(  [csh]$ xpaget xpans
-  XPA xpa gs 88877766:2839 eric)RP(
-The xpa access point can now be utilized on the remote machine without
-further setup:
-) 6 23 PR(  [csh]$ xpaget xpa
-  class: XPA
-  name: xpa
-  method: 838e2f68:2839
-  sendian: little
-  cendian: big)RP(
-To unregister remote access from the local machine, use the same
-command but with a '-' argument:
-) 1 54 PR(  [sh]$ xpaset -p xpa -remote 'remote_machine:$port' -)RP(
-The benefit of using remote registration is that communication with
-remote access points can be mixed with that of other access points
-on the remote machine.  Using )0 3 1 A(Access Point
-Names and Templates)3 0 TN TL()Ec /AF f D(, one XPA command can be used to send or
-receive messages to the remote and local services.
-
-)0 2 25 H(XPANS)WB 79 Sn( Proxy Registration)EH(
-
-The two methods described above are useful when the local and remote
-machines are able to communicate freely to one another. This would be
-the case on most Local Area Networks \201LANs\202 where all machines are
-behind the same firewall and there is no port blocking between
-machines on the same LAN.  The situation is more complicated when the
-XPA server is behind a firewall, where outgoing connections are
-allowed, but incoming port blocking is implemented to prevent machines
-outside the firewall from connecting to machines inside the
-firewall. Such incoming port blocking will prevent xpaset and xpaget
-from connecting to an XPA server inside a firewall.
-
-)0 P(To allow locally fire-walled XPA services to register with remote
-machines, we have implemented a proxy service within the xpans name
-server. To register remote proxy service, xpaset and the
-)BD(-remote)ES( sub-command is again used, but with an additional
-)BD(-proxy)ES( argument added to the end of the command:
-) 1 63 PR(  [sh]$ ./xpaset -p xpa -remote 'remote_machine:$port' g -proxy)RP(
-Once a remote proxy registration command is executed, the remote
-machine will have an entry such as the following in its own xpans name
-service:
-) 2 32 PR(  [csh]$ xpaget xpans
-  XPA xpa gs @88877766:2839 eric)RP(
-The '@' sign in the name service entry indicates that xpans proxy
-processing is being used for this access point. Other than that, from
-the user's point of view, there is no difference in how this XPA
-access point is contacted using XPA programs \201xpaset, xpaget, etc.\202 or
-libraries:
-) 6 23 PR(  [csh]$ xpaget xpa
-  class: XPA
-  name: xpa
-  method: 88877766:3053
-  sendian: little
-  cendian: big)RP(
-)0 P(Of course, the underlying processing of the XPA requests is very much
-different when xpans proxy is involved. Instead of an XPA program such
-contacting the XPA service directly, it contacts the local xpans.
-Acting as a proxy server, xpans communicates with the XPA service
-using the command channel established at registration time. Commands
-\201including establishing a new data channel\202 are sent between xpans and
-the XPA service to set up a new message transfer, and then data is fed
-to/from the xpa request, through xpans, from/to the XPA service. In
-this way, it can be arranged so that connections between the
-fire-walled XPA service and the remote client are always initiated by
-the XPA service itself. Thus, incoming connections that would be
-blocked by the firewall are avoided. Note that there is a performance
-penalty for using the xpans/proxy service.  Aside from extra overhead
-to set up proxy communication, all data must be sent through the
-intermediate proxy process.
-
-)0 P(The xpans proxy scheme requires that the remote client allow the local
-XPA server machine to connect to the remote xpans/proxy server. If the
-remote client machine also is behind a port-blocking firewall, such
-connections will be disallowed. In this case, the only solution is to
-open up some ports on the remote client machine to allow incoming
-connections to xpans/proxy. Two ports must be opened \201for command and
-data channel connections\202. By default, these two ports are 14285 and
-14287. The port numbers can be changed using the )BD(XPA_NSINET)ES(
-environment variable. This variable takes the form:
-) 1 49 PR(  setenv XPA_NSINET machine:port1[,port2[,port3]])RP(
-where port1 is the main connecting port, port2 is the XPA access port,
-and port3 is the secondary data connecting port. The second and third
-ports are optional and default to port1+1 and port1+2, respectively.
-It is port1 and port3 that must be left open for incoming connections.
-
-)0 P(For example, to change the port assignments so that xpans listens
-for registration commands on port 12345 and data commands on port 28573:
-) 1 32 PR(  setenv XPA_NSINET myhost:12345)RP(
-Alternatively, all three ports can be assigned explicitly:
-) 1 43 PR(  setenv XPA_NSINET remote:12345,3000,12346)RP(
-In this case 12345 and 12346 should be open for incoming connections.
-The XPA access port \201which need not be open to the outside
-world\202 is set to 3000.
-
-)0 P(Finally, note that we currently have no mechanism to cope with
-Internet proxy servers \201such as SOCKS servers\202. If an XPA service is
-running on a machine that cannot connect directly to outside machines,
-but goes through a proxy server instead, there currently is no way to
-register that XPA service with a remote machine.  We hope to implement
-support for SOCKS proxy in a future release.
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 26 H(Last)WB 80 Sn( updated: September 10, 2003)EH(
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (users.html) D
-/Ti (Distinguishing Users) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 7 Sn(
-
-
-)0 2 27 H(XPAUsers:)WB 82 Sn()WB 81 Sn( Distinguishing Users)EA()EH(
-
-
-)0 2 28 H(Summary)WB 83 Sn()EH(
-)0 P(XPA normally distinguishes between users on a given host, but it is possible
-to send data to access points belonging to other users.
-
-
-)0 2 29 H(Description)WB 84 Sn()EH(
-)0 P(A single XPA name service typically serves all users on a given
-machine.  Two users can register the same XPA access points on the
-same machine without conflict, because the user's username is
-registered with each access point and, by default, programs such as
-xpaget and xpaset only process access points of the appropriate user.
-For example:
-) 4 32 PR(  XPA xpa1 gs 838e2f67:1262 eric
-  XPA xpa2 gs 838e2f67:1266 eric
-  XPA xpa1 gs 838e2f67:2523 john
-  XPA xpa2 gs 838e2f67:2527 john)RP(
-Here the users "eric" and "john" both have registered the access
-points xpa1 and xpa2. When either "john" or "eric" retrieves
-information from xpa1, they will process only the access point
-registered in their user name.
-
-)0 P(If you want to access another user's XPA access points on a single
-machine, use the -u [user] option on xpaset, xpaget, etc. For example,
-if eric executes:
-) 1 21 PR(  xpaget -u john xpa1)RP(
-he will access John's xpa1 access point.Use "*" to access all users
-on a given machine:
-) 1 20 PR(  xpaget -u "*" xpa1)RP(
-Note that the )0 40 1 A(XPA Environment Variable)40 0 TN TL()Ec /AF f D(
-XPA_NSUSERS can be used to specify the default list of users to
-process:
-) 1 32 PR(  setenv XPA_NSUSERS "eric,john")RP(
-will cause access points from both "eric" and "john" to be processed
-by default.
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 30 H(Last)WB 85 Sn( updated: September 10, 2003)EH(
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (programs.html) D
-/Ti (XPA Programs) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 8 Sn(
-)0 2 31 H(XPA)WB 86 Sn( Programs)EH(
-
-)0 2 32 H(Summary)WB 87 Sn()EH(
-
-)0 P(Use the XPA programs to send/receive data to/from XPA servers from the
-command line or from scripts.
-
-)0 P() 7 116 PR(  <data> | xpaset  [-h] [-i nsinet] [-m method] [-n] [-p] [-s] [-t sval,lval] [-u users] [-v] <template> [paramlist]
-
-  xpaget  [-h] [-i nsinet] [-m method] [-s] [-t sval,lval] [-u users] <template> [paramlist]
-        
-  xpainfo [-h] [-i nsinet] [-m method] [-n] [-s] [-t sval,lval] [-u users] <template> [paramlist]
-
-  xpaaccess [-c] [-h] [-i nsinet] [-m method] [-n] [-u users] [-v|-V] <template> [type])RP(
-
-
-
-
-)0 2 33 H(xpaset:)WB 88 Sn()WB 10 Sn( send data to one or more XPA servers)EA()EH(
-
-
-)BD() 1 124 PR(<data> | xpaset  [-h] [-i nsinet] [-m method] [-n] [-p] [-s] [-t sval,lval] [-u users] [-v] <template|host:port> [paramlist])RP()ES(
-
-
-)0 P() 10 79 PR(  -h            print help message
-  -i            access XPA point on different machine \201override XPA_NSINET\202
-  -m            override XPA_METHOD environment variable
-  -n            don't wait for the status message after server completes
-  -p            don't read \201or send\202 buf data from stdin
-  -s            enter server mode
-  -t [s,l]      set short and long timeouts \201override XPA_[SHORT,LONG]_TIMEOUT\202
-  -u [users]    XPA points can be from specified users \201override XPA_NSUSERS\202
-  -v            verify message to stdout
-  --version     display version and exit)RP(
-
-
-)0 P(Data read from stdin will be sent to access points matching the 
-)0 3 1 A(template)3 0 TN TL()Ec /AF f D(
-or host:port.
-A set of qualifying parameters can be appended.
-)0 P(Normally, xpaset reads data input from stdin until EOF and sends those
-data to the XPA target, along with parameters entered on the command
-line. For example to send a FITS file to the ds9 image display:
-) 1 32 PR(  cat foo.fits | xpaset ds9 fits)RP(
-)0 P(Sometimes, however, it is desirable to send only parameters to an XPA
-access point, without sending data. For such cases, use the -p switch to
-indicate that there is no data being send to stdin. For example, to
-change the colormap used by the ds9 image display program, use:
-) 1 30 PR(  csh> xpaset -p ds9 cmap Heat)RP(
-Of course, this also can be accomplished by sending EOF to stdin in
-any of the usual ways:
-) 4 43 PR(  csh> echo "" | xpaset ds9 cmap Heat
-  csh> xpaget ds9 cmap Heat < /dev/null
-  csh> xpaset ds9 cmap Heat
-  ^D                    # Ctl-D signals EOF)RP(
-)0 P(The -s switch puts xpaset into server mode, in which commands and data
-can be sent to access points without having to run xpaset multiple times.
-\201Its not clear if this buys you much!\202 The syntax for sending commands
-in server mode is:
-)0 P() 8 24 PR(  csh> xpaset -s
-  xpaset ds9 colormap I8
-  ^D
-  xpaset ds9 regions
-  circle 200 300 40
-  circle 300 400 50
-  ^D
-etc.)RP(
-After the  required "xpaset" command is specified, optional ASCII data
-can be appended \201as in the region example\202.  A single data/command set is
-delimited by ^D. Note that typing ^D when a command is expected terminates
-the program.
-)0 P(NB: server mode only works from the terminal and only ASCII data can be
-sent in this way.
-)0 P()BD(Examples:)ES(
-) 2 40 PR(  csh> xpaset ds9 file < foo.fits
-  csh> echo "stop" | xpaset myhost:12345)RP(
-
-
-
-
-)0 2 34 H(xpaget:)WB 89 Sn()WB 9 Sn( retrieve data from one or more XPA servers)EA()EH(
-
-
-)BD() 1 99 PR(xpaget [-h] [-i nsinet] [-m method] [-s] [-t sval,lval] [-u users] <template|host:port> [paramlist])RP()ES(
-
-
-)0 P() 8 79 PR(  -h            print help message
-  -i            access XPA point on different machine \201override XPA_NSINET\202
-  -m            override XPA_METHOD environment variable
-  -n            don't wait for the status message after server completes
-  -s            enter server mode
-  -t [s,l]      set short and long timeouts \201override XPA_[SHORT,LONG]_TIMEOUT\202
-  -u [users]    XPA points can be from specified users \201override XPA_NSUSERS\202
-  --version     display version and exit)RP(
-
-
-)0 P(Data will be retrieved from access points matching the 
-)0 3 1 A(template)3 0 TN TL()Ec /AF f D(
-or host:port.
-A set of qualifying parameters can be appended.
-)0 P()BD(Examples:)ES(
-) 2 38 PR(  csh> xpaget ds9 images
-  csh> xpaget myhost.harvard.edu:12345)RP(
-
-
-
-
-)0 2 35 H(xpainfo:)WB 90 Sn()WB 11 Sn( send short message to one or more XPA servers)EA()EH(
-
-
-)BD() 1 105 PR(xpainfo [-h] [-i nsinet] [-m method] [-n] [-s] [-t sval,lval] [-u users] <template|host:port> [paramlist])RP()ES(
-
-
-)0 P() 8 79 PR(  -h            print help message
-  -i            access XPA point on different machine \201override XPA_NSINET\202
-  -m            override XPA_METHOD environment variable
-  -n            don't wait for the status message after server completes
-  -s            enter server mode
-  -t [s,l]      set short and long timeouts \201override XPA_[SHORT,LONG]_TIMEOUT\202
-  -u [users]    XPA points can be from specified users \201override XPA_NSUSERS\202
-  --version     display version and exit)RP(
-
-
-)0 P(Info will be sent to access points matching the
-)0 3 1 A(template)3 0 TN TL()Ec /AF f D(
-or host:port.
-A set of qualifying parameters can be appended.
-)0 P()BD(Examples:)ES(
-) 1 30 PR(  csh> xpainfo IMAGE ds9 image)RP(
-
-
-
-
-)0 2 36 H(xpaaccess:)WB 91 Sn()WB 12 Sn( see if template matches registered XPA access points)EA()EH(
-
-
-)BD() 1 95 PR(xpaaccess [-c] [-h] [-i nsinet] [-m method] [-n] [-t sval,lval] [-u users] -v <template> [type])RP()ES(
-
-
-)0 P() 10 79 PR(  -c            contact each access point individually
-  -h            print help message
-  -i            access XPA point on different machine \201override XPA_NSINET\202
-  -m            override XPA_METHOD environment variable
-  -n            return number of matches instead of "yes" or "no"
-  -t [s,l]      set short and long timeouts \201override XPA_[SHORT,LONG]_TIMEOUT\202
-  -u [users]    XPA points can be from specified users \201override XPA_NSUSERS\202
-  -v            print info about each successful access point
-  -V            print info or error about each access point
-  --version     display version and exit)RP(
-
-
-)0 P(xpaaccess returns "yes" to stdout \201with a return error code if 1\202 if there are
-existing XPA access points that match the 
-)0 3 1 A(template)3 0 TN TL()Ec /AF f D(
-\201and optional access type: g,i,s\202. Otherwise, it returns "no" \201with a
-return error code of 0\202.  If -n is specified, the number of matches is
-returned instead \201both to stdout and in the returned error code\202. If
--v is specified, each access point is displayed to stdout instead of
-the number of matches.
-
-)0 P(By default, xpaaccess simply contacts the xpans name server to find
-the list of registered access points that match the specified
-template. It also checks to make sure the specified types are
-supported by that access point. This is the fastest way to determine
-available access points. However, an access point might registered but
-not yet available, if, for example, the server program has not entered
-its event loop to process XPA requests. To find access points that are
-guaranteed to be available for processing, use the -c \201contact\202
-switch.  With this switch, xpaaccess contacts each matching XPA server
-\201rather than the name server\202 to make sure the registered access point
-really is ready for processing. In this mode, if an access point is
-registered but not available, xpaaccess will pause for a period of
-time equal to the XPA_LONG_TIMEOUT, in order to give the server a
-chance to ready itself. By default, this timeout is 30 seconds. You
-can shorten the time of delay using the -t "short,long" switch. For
-example, to shorten the delay time to 2 seconds, use:
-) 1 27 PR(  xpaaccess -c -t "2,2" ds9)RP(
-The first argument is the short delay value, and is ignored in this
-operation. The second is the long delay timeout.
-
-)0 P(Note also that the default xpaaccess method \201no -c switch\202 does not
-check access control \201acls\202 but rather only checks whether the access
-point is both registered with the xpans name server and provides the
-specified type of access. In other words, the default xpaaccess could
-return 'yes' when you might not actually have access. This mode also
-always returns 'yes' for the xpans name server itself, regardless of
-whether the name server is active. The -c \201contact\202 switch, which
-contacts the access point directly, can and does check the access
-control \201only for servers using version 2.1 and above\202 and also
-returns the real status of xpans.
-
-
-
-
-
-
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 37 H(Last)WB 92 Sn( updated: September 10, 2003)EH(
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (xpamb.html) D
-/Ti (The XPA Message Bus \201xpamb\202) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 13 Sn(
-
-
-)0 2 38 H(xpamb:)WB 94 Sn()WB 93 Sn( the XPA Message Bus)EA()EH(
-
-
-)0 2 39 H(Summary)WB 95 Sn()EH(
-)0 P(The xpamb program can act as a "classical" message bus interface
-between clients and servers. A client can send a data request to
-the message bus, which then interfaces with multiple servers and
-returns the data back to the client.
-
-
-)0 2 40 H(Description)WB 96 Sn()EH(
-)0 P(A "classical" message bus \201such as ToolTalk\202 consists of servers and
-clients, along with a mediating program that transfers data between
-different processes. XPA takes a slightly different approach in that
-communication between clients and servers is direct.  This generally
-is the correct technique when there is only one connection \201or even a
-small number of connections\202, but can become inefficient for the
-serving program if a large amount of data is being transferred to many
-clients. For example, if a real-time data acquisition program is
-broadcasting a FITS image to several clients, it would need to
-transmit that image to each client individually.  This might interfere
-with its own processing cycles.  The preferable mechanism would be to
-pass the image off to an intermediate program that can then broadcast
-the data to the several clients.
-)0 P(The )BD(xpamb)ES( program can alleviate such problems by functioning
-as a message bus in cases where such an intermediary process is
-wanted.  It pre-defines a single access point named
-)BD(XPAMB:xpamb)ES( to which data can be sent for re-broadcast. You
-also can tell )BD(xpamb)ES( to save the data, and associate with that
-data a new access point, so that it can be retrieved later on.
-
-)0 P(All interaction with )BD(xpamb)ES( is performed through
-)BD(xpaset)ES( and )BD(xpaget)ES( \201or the corresponding API
-routines, )BD(XPASet\201\202)ES( and )BD(XPAGet\201\202)ES(\202 to the
-)BD(XPAMB:xpamb)ES( access point. That is, )BD(xpamb)ES( is just
-another XPA-enabled program that responds to requests from
-clients. The paramlist is used to specify the targets to which
-the data will be for re-broadcast, as well as the re-broadcast paramlist:
-) 1 69 PR(  data | xpaset xpamb [switches] broadcast-target broadcast-paramlist)RP(
-Optional switches are used to store data, and manipulate stored data,
-and are described below.
-
-)0 P(In its simplest form, you can, for example, send a FITS image to xpamb for
-broadcasting to all ds9 image simply by executing:
-) 1 51 PR(  cat foo.fits | xpaset xpamb "DS9:*" fits foo.fits)RP(
-Since )BD(DS9)ES( is the class name for the ds9 image display
-program, this will result in the FITS image being re-sent to all fits
-access points for all active image display programs.
-
-)0 P(You can send stored data and new data to the same set of access points at
-the same time.  The stored data always is send first, followed by the new
-data:
-) 1 62 PR(  cat foo2.fits | xpaset xpamb -send foo "DS9:*" fits foo.fits)RP(
-will first send the foo.fits file, and then the foo2.fits file to all
-access points of class )BD(DS9)ES(.  Notice that in this example,
-the foo2.fits file is not stored, but it could be stored by using the
-)BD(-store [name])ES( switch on the command line.
-
-)0 P(The )BD(xpaget)ES( command can be used to retrieve a data from XPA
-access points or from a stored data buffer, or retrieve information
-about a stored data buffer.  If no arguments are given:
-) 1 14 PR(  xpaget xpamb)RP(
-then information about all currently stored data buffers is returned. This
-information includes the data and time at which the data was stored, the
-size in bytes of the data, and the supplied info string.
-
-)0 P(If arguments are specified, they will be in the form:
-) 1 49 PR(  xpaget xpamb [-info] [-data] [name [paramlist]])RP(
-If the optional )BD(-info)ES( and/or )BD(-data)ES( switches are specified, then
-information and/or data will be returned for the named data buffer
-following the switches. You can use either or both of these switches
-in a single command. For example, if the -info switch is used:
-) 1 24 PR(  xpaget xpamb -info foo)RP(
-then the info about that stored data buffer will be returned.
-If the -data is used with a specific name:
-) 1 24 PR(  xpaget xpamb -data foo)RP(
-then the stored data itself will be returned. If both are used:
-) 1 30 PR(  xpaget xpamb -info -data foo)RP(
-then the info will be returned, followed by the data. Note that it is an
-error to specify one of these switches without a data buffer name and that
-the paramlist will be ignored.
-
-)0 P(If neither the )BD(-info)ES( or )BD(-data)ES( switch is specified, then
-the name refers to an XPA access point \201with an optional paramlist
-following\202.
-For example:
-) 1 23 PR(  xpaget xpamb ds9 file)RP(
-is equivalent to:
-) 1 17 PR(  xpaget ds9 file)RP(
-
-
-)0 2 41 H(Options)WB 97 Sn()EH(
-)0 P(For xpaset, several optional switches are used to save data and
-manipulate the stored data:
-)0 DL(
-)0 P()0 DT()BD(-data [name])ES(
-)DD( Add the supplied data buffer to a pool of stored data buffers,
-using the specified name as a unique identifier for later retrieval.
-An error occurs if the name already exists \201use either )BD(replace)ES(
-or )BD(del)ES( to rectify this\202. The )BD(-add)ES( switch is supported
-for backwards compatibility with xpa 2.0.
-
-)0 P()0 DT()BD(-replace [name])ES(
-)DD( Replace previously existing stored data having the same unique name
-with new data. This essentially is a combination of the )BD(del)ES(
-and )BD(data)ES( commands.
-
-)0 P()0 DT()BD(-info ["'info string'"])ES(
-)DD( When adding a data buffer, you can specify an informational
-string to be stored with that data.  This string will be returned
-by xpaget:
-) 1 24 PR(  xpaget xpamb foo -info)RP(
-\201along with other information such as the date/time of storage and the size of
-the data buffer\202 if the -info switch is specified. If the info string contains
-spaces, you must enclose it in )BD(two)ES( sets of quotes:
-) 1 65 PR(  cat foo | xpaset xpamb -store foo -info "'this is info on foo'")RP(
-The first set of quotes is removed by the shell while the second is used to
-delineate the info string.
-
-)0 P()0 DT()BD(-send [name])ES(
-)DD( Broadcast the stored data buffer to the named template.
-
-)0 P()0 DT()BD(-del [name])ES(
-)DD( Delete the named data buffer and free all allocated space.)LD(
-
-)0 P(Switches can be used in any combination that makes sense. For example:
-) 1 75 PR(  cat foo.fits | xpaset xpamb -store foo -info "FITS" "DS9:*" fits foo.fits)RP(
-will broadcast the foo.fits image to all access points of class
-)BD(DS9)ES(.  In addition, the foo.fits file will be stored under the
-name of )BD(foo)ES( for later manipulation such as:
-) 1 49 PR(  xpaset -p xpamb -send foo "DS9:*" fits foo.fits)RP(
-will re-broadcast the foo.fits image to all access points of class "DS9".
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 42 H(Last)WB 98 Sn( updated: September 10, 2003)EH(
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (xpans.html) D
-/Ti (The XPA Name Server \201xpans\202) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 14 Sn(
-
-
-)0 2 43 H(xpans:)WB 100 Sn()WB 99 Sn( the XPA Name Server)EA()EH(
-
-
-)0 2 44 H(Summary)WB 101 Sn()EH(
-) 1 70 PR(  xpans [-h] [-e] [-k sec] [-p port] [-l log] [-s security log] [-P n])RP(
-
-
-)0 P() 8 71 PR(  -h            print help message
-  -e            exit when there are no more XPA connections
-  -k            send keepalive messages every n sec
-  -l            log data base entries to specified file
-  -p            listen for connections on specified port
-  -s            log security info for each connection to specified file      
-  -P            accept proxy requests \201P=1\202 using separate thread \201P=2\202
-  --version     display version and exit)RP(
-
-
-)0 P(The xpans name server is an XPA-enabled program that is used to
-manage the names and ports of XPA access points. It is started
-automatically when an XPA access point is registered. You can access
-the name server using xpaget to get a list of registered access points.
-)0 P(The )EM(xpans)ES( name server provides a crucial link between XPA
-clients and servers.  When an XPA server defines an access point using
-XPANew\201\202, XPACmdNew\201\202, or XPAInfoNew\201\202, the name of the access point
-is registered in the name service, along with connection information.
-The name server then matches class:name templates passed to it by XPA
-clients with these registered entries, so that the clients can
-communicate with the appropriate servers.
-
-)0 P(The socket connection between an XPA-enabled program and
-)EM(xpans)ES( is kept open until the former exits \201or explicitly
-closes the connection\202. Apparently, some Internet equipment \201e.g. DSL
-modems\202 can cause such a connection to time-out after a period of
-inactivity. To prevent this from happening, you can use the )EM(-k
-[sec])ES( switch to send a short keep-alive message to each open
-connection after the specified time delay. \201Note that this
-application level use of keep-alive is necessary only if you are
-serving XPA-enabled clients over the Internet and have to deal with
-long-term connections involving DSL or similar equipment.  XPA uses
-the ordinary socket-level keep-alive, which works for all other cases.\202
-)BD(NB \20112/2/2009\202: Out-of-band \201URG\202 TCP data, used by xpans
-keep-alive, is changed by some Cisco routers into in-band data.
-Encountering such a router will break the keep-alive function and may
-break your XPA server as well. Proceed with caution!)ES(
-
-)0 P(The )EM(xpans)ES( program will be started automatically \201assuming it
-can be found in the user's path\202 when the first XPA access point is
-registered.  It therefore need not be started explicitly.  However,
-when started automatically, the )EM(-e)ES( switch is used, so that
-the name server will exit when there are no more XPA access points
-registered. If you wish to keep the name server running continually,
-simply start it manually without the )EM(-e)ES( switch.
-
-)0 P(The name server will keep a log of registered access points if the
-)EM(-l [log])ES( switch is used on the command line \201this is the
-case for automatic start-up\202.  The log contains enough name and connection
-information to allow you to re-register all XPA access points in case
-the name server process is terminated prematurely. For example, after
-the ds9 access point is registered,the log will contain the entry:
-) 1 35 PR(  add 838e2f67:1863 ds9 ds9 gs eric)RP(
-If )EM(xpans)ES( is terminated but ds9 still is running, you
-can re-register both access points for the ds9 process by running:
-) 1 36 PR(  xpaset -p 838e2f67:1863 -nsconnect)RP(
-Notice that the ip:port specifier is used with )EM(xpaset)ES( to bypass
-the need for contacting the name server \201which does not have the name
-registered yet!\202
-
-)0 P(The name server will keep a log of security information if the )EM(-s
-[security log])ES( switch is used on the command line. For each
-accepted connection, \201including connections via the )EM(xpaget)ES(
-command\202, information will be logged about the host issuing the
-command and the parameters passed into the program. This is most
-useful when )EM(xpans)ES( is accepting connections from untrusted
-machines.
-
-)0 P(When an XPA access point is removed by a server using )EM(XPAFree\201\202)ES(,
-the access information is removed from the name server.  If an
-XPA-enabled process is terminated, all names registered by that process
-will be removed automatically.  The log file is always updated to
-reflect the currently registered access points.
-
-)0 P(The name server itself has an XPA access point names )EM(xpans)ES(
-registered through which you can find out information about currently
-registered access points \201assuming you have access to the name server;
-see )0 41 1 A(XPA Access Control)41 0 TN TL()Ec /AF f D( for more information\202.
-For each registered access point, the following information is returned:
-) 5 80 PR(  class         # class of the access point
-  name          # name of the access point
-  access        # allowed access \201g=xpaget,s=xpaset,i=xpainfo\202
-  id            # socket access method \201host:port for inet, file for local/unix\202
-  user          # user name of access point owner)RP(
-
-)0 P(For example, to display all currently registered access points, simply execute:
-) 1 14 PR(  xpaget xpans)RP(
-Continuing the example of ds9 above, this will return:
-) 1 31 PR(  DS9 ds9 gs 838e2f67:1863 eric)RP(
-If the same program has been started with different XPA access names,
-you can look up only names matching a specified template. For example,
-assume that ds9 has been started up using:
-) 3 25 PR(  ds9 &
-  ds9 -title ds9-1-eric &
-  ds9 -title ds9-2-eric &)RP(
-To lookup all ds9 access points which end in ".eric" and which can
-be accessed using )EM(xpaset)ES(, use:
-) 1 35 PR(  xpaget xpans "DS9:*.eric" "s" "*")RP(
-This will return:
-) 2 39 PR(  DS9 ds9-2-eric gs 838e29d3:42102 eric
-  DS9 ds9-1-eric gs 838e29d3:42105 eric)RP(
-The third argument "*" requests all access points from all users.
-You also can specify a specific user name and only access points
-registered by that user will be returned.
-
-)0 P(The name server uses the )EM(XPA_METHOD)ES( environment variable
-to determine whether it should listen for requests on INET or LOCAL
-sockets.  Since XPA access points also use this environment variable,
-the choice of socket method will be consistent.  Note that, when INET
-sockets are used, a local server can be accessed from remote machines
-if the )EM(XPA_NSINET)ES( environment variable is set to point to
-the local machine.  See
-)0 40 1 A(XPA Environment Variables)40 0 TN TL()Ec /AF f D(
-for more information.
-
-)0 P(An experimental feature of xpans is its ability to act as a proxy to
-XPA servers behind firewalls that want to communicate with external
-processes.  The basic idea is the following: an XPA server \201call it
-"foo"\202 on host1, possibly behind a firewall, makes a remote connection
-to a proxy-enabled xpans program on host2 \201specifying host2's XPA method\202.
-For example:
-) 1 59 PR(  xpaset -p foo -remote 'host2:28571' + -proxy   # on host1)RP( 
-When this is done, host2 can use xpaset, xpaget, and xpainfo calls to
-communicate with the XPA server foo. All command communication is
-performed via the xpans socket connection between foo on host1 and
-xpans on host2 \201which was initiated by foo from inside the firewall\202.
-Data communication is similarly performed using a socket connection
-initiated on host1 \201usually with a port value two greater than the
-port value of the main xpans socket connection\202. An xpaset or xpaget
-call on host2 contacts xpans, which performs an XPASet\201\202 or XPAGet\201\202
-call to foo, passing commands and data back and forth between the two
-programs.
-
-)0 P(By default, proxy connections are not allowed by xpans. If the -P switch is
-specified with a value of 1, proxy connection are allowed, but all proxy
-communication is performed in the same thread as xpans processing. If
-a value of 2 is specified, the proxy processing is performed in a
-separate thread \201assuming pthreads are supported on your system\202.
-Because xpa callback processing of any type can take a long time and
-therefore can interfere with normal xpans processing, threaded proxy
-connections \201-P 2\202 are recommended.  When using proxy connections, it
-might also be useful to set the XPA_IOCALLSXPA environment variable, so
-that multiple proxy requests can be handled at the same time, instead of
-serially.
-
-)0 P(Note that this proxy interface to xpans is experimental. It is used
-to provide remote data analysis capabilities on the Chandra-Ed system
-using ds9.  \201See http://chandra-ed.cfa.harvard.edu and
-http://hea-www.harvard.edu/saord/ds9 for more details\202. As always, please
-contact us if you have problems or questions.
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 45 H(Last)WB 102 Sn( updated: January 24, 2005)EH(
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (server.html) D
-/Ti (XPA Server API) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 15 Sn(
-
-
-)0 2 46 H(XPAServer:)WB 106 Sn()WB 103 Sn( The XPA Server-side Programming Interface)EA()EH(
-
-
-)0 2 47 H(Summary)WB 107 Sn()EH(
-A description of the XPA server-side programming interface.
-
-
-)0 2 48 H(Introduction)WB 108 Sn()WB 104 Sn( to XPA Server Programming)EH()EA(
-)0 P(Creating an XPA server is easy: you generally only need to call the
-XPANew\201\202 subroutine to define a named XPA access point and set up the
-send and receive callback routines.  You then enter an event loop such
-as XPAMainLoop\201\202 to field XPA requests.
-) 27 66 PR(  #include <xpa.h>
-
-  XPA )0 16 1 A(XPANew)16 0 TN TL()Ec /AF f D(\201char *class, char *name, char *help,
-      int \201*send_callback\202\201\202, void *send_data, char *send_mode,
-      int \201*rec_callback\202\201\202,  void *rec_data,  char *rec_mode\202;
-
-  XPA )0 17 1 A(XPACmdNew)17 0 TN TL()Ec /AF f D(\201char *class, char *name\202;
-
-  XPACmd )0 18 1 A(XPACmdAdd)18 0 TN TL()Ec /AF f D(\201XPA xpa,
-         char *name, char *help,
-         int \201*send_callback\202\201\202, void *send_data, char *send_mode,
-         int \201*rec_callback\202\201\202,  void *rec_data,  char *rec_mode\202;
-
-  void )0 19 1 A(XPACmdDel)19 0 TN TL()Ec /AF f D(\201XPA xpa, XPACmd cmd\202;
-
-  XPA )0 20 1 A(XPAInfoNew)20 0 TN TL()Ec /AF f D(\201char *class, char *name,
-      int \201*info_callback\202\201\202, void *info_data, char *info_mode\202;
-
-  int )0 21 1 A(XPAFree)21 0 TN TL()Ec /AF f D(\201XPA xpa\202;
-
-  void )0 22 1 A(XPAMainLoop)22 0 TN TL()Ec /AF f D(\201void\202;
-
-  int )0 23 1 A(XPAPoll)23 0 TN TL()Ec /AF f D(\201int msec, int maxreq\202;
-
-  void )0 105 1 A(XPAAtExit)105 0 TN TL()Ec /AF f D(\201void\202;
-
-  void )0 24 1 A(XPACleanup)24 0 TN TL()Ec /AF f D(\201void\202;)RP(
-
-)0 2 49 H(Introduction)WB 109 Sn()EH(
-
-To use the XPA application programming interface, a software developer
-generally will include the xpa.h definitions file:
-) 1 18 PR(  #include <xpa.h>)RP(
-in the software module that defines or accesses an XPA access point, and
-then will link against the libxpa.a library:
-) 1 27 PR(  gcc -o foo foo.c libxpa.a)RP(
-XPA has been compiled using both C and C++ compilers.
-
-)0 P(A server program generally defines an XPA access point by calling the
-XPANew\201\202 routine and specifies "send" and/or "receive" callback
-procedures to be executed by the program when an external process
-either sends data or commands to this access point or requests data or
-information from this access point. A program also can define several
-sub-commands for a single access point by calling XPACmdNew\201\202 and
-XPACmdAdd\201\202 instead.  Having defined one or more public access points
-in this way, an XPA server program enters its usual event loop \201or
-uses the standard XPA event loop\202.
-
-
-
-
-)0 2 50 H(XPANew:)WB 110 Sn()WB 16 Sn( create a new XPA access point)EA()EH(
-
-
-)BD() 7 49 PR(  #include <xpa.h>
-
-  XPA XPANew\201char *class, char *name, char *help,
-             int \201*send_callback\202\201\202,
-             void *send_data, char *send_mode,
-             int \201*rec_callback\202\201\202,
-             void *rec_data,  char *rec_mode\202;)RP()ES(
-
-
-)0 P(Create a new XPA public access point with the class:name
-identifier )0 3 1 A(template)3 0 TN TL()Ec /AF f D(
-and enter this access point into the XPA name server, so that it
-can be accessed by external processes. XPANew\201\202 returns an XPA struct.
-Note that the length of the class and name designations must be less
-than or equal to 1024 characters each.
-
-)0 P(The XPA name server daemon, xpans, will be started automatically if it
-is not running already \201assuming it can be found in the path\202.  The
-program's ip address and listening port are specified by the
-environment variable XPA_NSINET, which takes the form :.  If
-no such environment variable exists, then xpans is started on the
-current machine listening on port 14285.  It also uses 14286 as a
-known port for its public access point \201so that routines do not have
-to go to the name server to find the name server ip and port!\202
-As of XPA 2.1.1, version information is exchanged between the xpans
-process and the new access point. If the access point uses an XPA
-major/minor version newer than xpans, a warning is issued by both processes,
-since mixing of new servers and old xpa programs \201xpaset, xpaget,
-xpans, etc.\202 is not likely to work. You can turn off the warning
-message by setting the XPA_VERSIONCHECK environment variable to "false".
-
-)0 P(The help string is meant to be returned by a request from xpaget:
-) 1 25 PR(  xpaget class:name -help)RP(
-)0 P(A send_callback and/or a receive_callback can be specified; at
-least one of them must be specified.
-
-)0 P(A send_callback can be specified that will be executed in response to
-an external request from the xpaget program, the XPAGet\201\202 routine, or
-XPAGetFd\201\202 routine. This callback is used to send data to the
-requesting client.
-
-)0 P(The calling sequence for send_callback\201\202 is:
-) 7 53 PR(  int send_callback\201void *send_data, void *call_data,
-    char *paramlist, char **buf, size_t *len\202
-  {
-    XPA xpa = \201XPA\202call_data;
-    ...
-    return\201stat\202;
-  })RP(
-)0 P(The send_mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-) 4 81 PR(  key           value           default         explanation
-  ------        --------        --------        -----------
-  acl           true/false      true            enable access control
-  freebuf       true/false      true            free buf after callback completes)RP(
-)0 P(The call_data should be recast to the XPA struct as shown.  In
-addition, client-specific data can be passed to the callback in
-send_data.
-
-)0 P(The paramlist will be supplied by the client as qualifying parameters
-for the callback.  There are two ways in which the send_callback\201\202
-routine can send data back to the client:
-
-)0 P(1. The send_callback\201\202 routine can fill in a buffer and pass back a
-pointer to this buffer. An integer len also is returned to specify the
-number of bytes of data in buf.  XPA will send this buffer to the
-client after the callback is complete.
-
-)0 P(2. The send_callback can send data directly to the client by writing
-to the fd pointed by the macro:
-) 1 17 PR(  xpa_datafd\201xpa\202)RP(
-)0 P(Note that this fd is of the kind returned by socket\201\202 or open\201\202.
-
-)0 P(If a buf has been allocated by a standard malloc routine, filled, and
-returned to XPA, then freebuf generally is set so that the buffer will
-be freed automatically when the callback is completed and data has
-been sent to the client.  If a static buf is returned, freebuf should
-be set to false to avoid a system error when freeing static storage.
-Note that default value for freebuf implies that the callback will
-allocate a buffer rather than use static storage.
-
-)0 P(On the other hand, if buf is dynamically allocated using a method
-other than a standard malloc/calloc/realloc routine \201e.g. using Perl's
-memory allocation and garbage collection scheme\202, then it is necessary
-to tell XPA how to free the allocated buffer. To do this, use the
-XPASetFree\201\202 routine within your callback:
-) 1 69 PR(  void XPASetFree\201XPA xpa, void \201*myfree\202\201void *\202, void *myfree_ptr\202;)RP(
-The first argument is the usual XPA handle. The second argument is the
-special routine to call to free your allocated memory. The third
-argument is an optional pointer.  If not NULL, the specified free
-routine is called with that pointer as its sole argument. If NULL, the
-free routine is called with the standard buf pointer as its sole
-argument. This is useful in cases where there is a mapping between the
-buffer pointer and the actual allocated memory location, and the
-special routine is expecting to be passed the former.
-
-)0 P(If, while the callback performs its processing, an error occurs that
-should be communicated to the client, then the routine XPAError should be
-called:
-) 1 29 PR(  XPAError\201XPA xpa, char *s\202;)RP(
-)0 P(where s is an arbitrary error message.  The returned error message
-string will be of the form:
-) 1 42 PR(  XPA$ERROR   [error] \201class:name ip:port\202)RP(
-)0 P(If the callback wants to send a specific acknowledgment message back
-to the client, the routine XPAMessage can be called:
-) 1 31 PR(  XPAMessage\201XPA xpa, char *s\202;)RP(
-)0 P(where s is an arbitrary error message.  The returned error message
-string will be of the form:
-) 1 44 PR(  XPA$MESSAGE [message] \201class:name ip:port\202)RP(
-)0 P(Otherwise, a standard acknowledgment is sent back to the client
-after the callback is completed.
-
-)0 P(The callback routine should return 0 if no error occurs, or -1 to
-signal an error.
-
-)0 P(A receive_callback can be specified that will be executed in response
-to an external request from the xpaset program, or the XPASet \201or
-XPASetFd\201\202\202 routine. This callback is used to process data received
-from an external process.
-
-)0 P(The calling sequence for receive_callback is:
-) 7 59 PR(  int receive_callback\201void *receive_data, void *call_data,
-    char *paramlist, char *buf, size_t len\202
-  {
-    XPA xpa = \201XPA\202call_data;
-    ...
-    return\201stat\202;
-  })RP(
-)0 P(The mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-) 6 92 PR(  key           value           default         explanation
-  ------        --------        --------        -----------
-  acl           true/false      true            enable access control
-  buf           true/false      true            server expects data bytes from client
-  fillbuf       true/false      true            read data into buf before executing callback
-  freebuf       true/false      true            free buf after callback completes)RP(
-)0 P(The call_data should be recast to the XPA struct as shown.  In
-addition, client-specific data can be passed to the callback in
-receive_data.
-
-)0 P(The paramlist will be supplied by the client. In addition, if the
-receive_mode keywords buf and fillbuf are true, then on entry into the
-receive_callback\201\202 routine, buf will contain the data sent by the
-client. If buf is true but fillbuf is false, it becomes the callback's
-responsibility to retrieve the data from the client, using the data fd
-pointed to by the macro xpa_datafd\201xpa\202.  If freebuf is true, then buf
-will be freed when the callback is complete.
-
-)0 P(If, while the callback is performing its processing, an error occurs
-that should be communicated to the client, then the routine XPAError
-can be called:
-) 1 29 PR(  XPAError\201XPA xpa, char *s\202;)RP(
-)0 P(where s is an arbitrary error message.
-
-)0 P(The callback routine should return 0 if no error occurs, or -1 to
-signal an error.
-
-
-
-
-)0 2 51 H(XPACmdNew:)WB 111 Sn()WB 17 Sn( create a new XPA public access point for commands)EA()EH(
-
-
-)BD() 3 41 PR(  #include <xpa.h>
-
-  XPA XPACmdNew\201char *class, char *name\202;)RP()ES(
-
-
-)0 P(Create a new XPA public access point for commands that will share a
-common identifier class:name. Enter this access point into the XPA
-name server, so that it can be accessed by external processes.
-XPACmdNew\201\202 returns an XPA struct.
-
-)0 P(It often is more convenient to have one public access point that can
-manage a number of commands, rather than having individual access
-points for each command. For example, it is easier to command the
-ds9 image display using:
-) 3 35 PR(  echo "colormap I8"   | xpaset ds9
-  echo "scale log"     | xpaset ds9
-  echo "file foo.fits" | xpaset ds9)RP(
-)0 P(then to use:
-) 3 39 PR(  echo "I8"       | xpaset ds9_colormap
-  echo "log"      | xpaset ds9_scale
-  echo "foo.fits" | xpaset ds9_file)RP(
-)0 P(In the first case, the commands remain the same regardless of the
-target XPA name.  In the second case, the command names must change
-for each instance of ds9.  That is, if a second instance of ds9
-called DS9 were running, it would be commanded either as:
-) 3 35 PR(  echo "colormap I8"   | xpaset DS9
-  echo "scale log"     | xpaset DS9
-  echo "file foo.fits" | xpaset DS9)RP(
-)0 P(or as:
-) 3 39 PR(  echo "I8"       | xpaset DS9_colormap
-  echo "log"      | xpaset DS9_scale
-  echo "foo.fits" | xpaset DS9_file)RP(
-)0 P(Thus, in cases where a program is going to manage many commands, it
-generally is easier to define them as commands associated with the
-XPACmdNew\201\202 routine, rather than as separate access points using
-XPANew\201\202.
-
-)0 P(When XPACmdNew\201\202 is called, only the class:name identifier is
-specified.  Each sub-command is subsequently defined using the
-XPACmdAdd\201\202 routine.
-
-
-
-
-)0 2 52 H(XPACmdAdd:)WB 112 Sn()WB 18 Sn( add a command to an XPA command public access point)EA()EH(
-
-
-)BD() 7 52 PR(  #include <xpa.h>
-
-  XPACmd XPACmdAdd\201XPA xpa, char *name, char *help,
-                   int \201*send_callback\202\201\202,
-                   void *send_data, char *send_mode,
-                   int \201*rec_callback\202\201\202,
-                   void *rec_data,  char *rec_mode\202;)RP()ES(
-
-
-)0 P(Add a command to an XPA command access point. The XPA argument specifies the
-XPA struct returned by a call to XPANewCmd\201\202. The name argument is the
-name of the command. The other arguments function identically to the
-arguments in the XPANew\201\202 command, i.e., the send_callback and rec_callback
-routines have identical calling sequences to their XPANew\201\202 counterparts,
-with the exceptions noted below.
-
-)0 P(When help is requested for a command access point using:
-) 1 22 PR(  xpaget -h class:name)RP(
-)0 P(all of the command help strings are listed.  To get help for a given
-command, use:
-) 1 26 PR(  xpaget -h class:name cmd)RP(
-)0 P(Also, the acl keyword in the send_mode and receive_mode strings is
-global to the access point, not local to the command.  Thus, the value
-for the acl mode should be the same in all send_mode \201or receive_mode\202
-strings for each command in a command access point. \201The acl for
-send_mode need not be the same as the acl for receive_mode, though\202.
-
-
-
-
-)0 2 53 H(XPACmdDel:)WB 113 Sn()WB 19 Sn( remove a command from an XPA command public access point)EA()EH(
-
-
-)BD() 3 38 PR(  #include <xpa.h>
-
-  void XPACmdDel\201XPA xpa, XPACmd cmd\202;)RP()ES(
-
-
-)0 P(This routine removes a command from the list of available commands in
-a given XPA.  That command will no longer be available for processing.
-
-
-
-
-)0 2 54 H(XPAInfoNew:)WB 114 Sn()WB 20 Sn( define an XPA info public access point)EA()EH(
-
-
-)BD() 5 51 PR(  #include <xpa.h>
-
-  XPA XPAInfoNew\201char *class, char *name,
-                 int \201*info_callback\202\201\202,
-                 void *info_data, char *info_mode\202;)RP()ES(
-
-
-)0 P([NB: this is an experimental interface, new to XPA 2.0, whose value
-and best use is evolving.]
-
-)0 P(A program can register interest in receiving a short message about a
-particular topic from any other process that cares to send such a
-message.  Neither has to be an XPA server.  For example, if a user
-starts to work with a new image file called new.fits, she might
-wish to alert interested programs about this new file by sending a
-short message using xpainfo:
-) 1 34 PR(  xpainfo IMAGEFILE /data/new.fits)RP(
-
-)0 P(In this example, each process that has used the XPAInfoNew\201\202 call to
-register interest in messages associated with the identifier IMAGEFILE
-will have its info_callback\201\202 executed with the following calling
-sequence:
-) 4 64 PR(  int info_cb\201void *info_data, void *call_data, char *paramlist\202
-  {
-    XPA xpa = \201XPA\202call_data;
-  })RP(
-)0 P(The arguments passed to this routine are equivalent to those sent in
-the send_callback\201\202 routine.  The main difference is that there is no
-buf sent to the info callback: this mechanism is meant for short
-announcement of messages of interest to many clients.
-
-)0 P(The mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-) 3 69 PR(  key           value           default         explanation
-  ------        --------        --------        -----------
-  acl           true/false      true            enable access control)RP(
-)0 P(Because no buf is passed to this callback, the usual buf-related keywords
-are not applicable here.
-
-)0 P(The information sent in the parameter list is arbitrary.  However, we
-envision sending information such as file names or XPA access points
-from which to collect more data.  Note that the xpainfo program and
-the XPAInfo\201\202 routine that cause the info_callback to execute do not
-wait for the callback to complete before returning.
-
-
-
-
-)0 2 55 H(XPAFree:)WB 115 Sn()WB 21 Sn( remove an XPA public access point)EA()EH(
-
-
-) 3 23 PR()BD(  #include <xpa.h>
-
-  int XPAFree\201XPA xpa\202;)ES()RP(
-
-
-)0 P(Remove the specified XPA public access point from the name server and
-free all associated storage.  Note that removal from the name server
-happens automatically when the process terminates, so this call is not
-generally needed.  It is used when public access points are being
-defined temporarily and then destroyed when no longer needed.  For
-example, ds9 temporarily creates a public access point when it
-loads a new image for display and destroys it when the image is
-unloaded.
-
-
-
-
-)0 2 56 H(XPAMainLoop:)WB 116 Sn()WB 22 Sn( optional main loop for XPA)EA()EH(
-
-
-)BD() 3 21 PR(  #include <xpa.h>
-
-  void XPAMainLoop\201\202;)RP()ES(
-
-
-)0 P(Once XPA access points have been defined, a program must enter an
-event loop to watch for requests from external programs. This can be
-done in a variety of ways, depending on whether the event loop is
-processing events other than XPA events.  In cases where there are no
-non-XPA events to be processed, the program can simply call the
-XPAMainLoop\201\202 event loop.  This loop is implemented essentially as
-follows \201error checking is simplified in this example\202:
-) 8 62 PR(  FD_ZERO\201&readfds\202;
-  while\201 XPAAddSelect\201NULL, &readfds\202 \202{
-    if\201 sgot = select\201swidth, &readfds, NULL, NULL, NULL\202 >0 \202
-      XPAProcessSelect\201&readfds, 0\202;
-    else
-      break;
-    FD_ZERO\201&readfds\202;
-  })RP(
-)0 P(The XPAAddSelect\201\202 routine sets up the select\201\202 readfds variable so
-that select\201\202 will wait for I/O on all the active XPA channels.  It
-returns the number of XPAs that are active; the loop will end when
-there are no active XPAs. The standard select\201\202 routine is called to
-wait for an external I/O request.  Since no timeout struct is passed
-in argument 5, the select\201\202 call hangs until there is an external
-request.  When an external I/O request is made, the XPAProcessSelect\201\202
-routine is executed to process the pending requests.  In this routine,
-the maxreq value determines how many requests will be processed: if
-maxreq <=0, then all currently pending requests will be processed.
-Otherwise, up to maxreq requests will be processed.  \201The most usual
-values for maxreq is 0 to process all requests.\202
-
-)0 P(If a program has its own Unix select\201\202 loop, then XPA access points can
-be added to it by using a variation of the standard XPAMainLoop:
-) 7 39 PR(  XPAAddSelect\201xpa, &readfds\202;
-  [app-specific ...]
-  if\201 select\201width, &readfds, ...\202 \202{
-    XPAProcessSelect\201&readfds, maxreq\202;
-    [app-specific ...]
-    FD_ZERO\201&readfds\202;
-  })RP(
-)0 P(XPAAddSelect\201\202 is called before select\201\202 to add the access points.
-If the first argument is NULL, then all active XPA access points
-are added. Otherwise only the specified access point is added.
-After select\201\202 is called, the XPAProcessSelect\201\202 routine can be called
-to process XPA requests.  Once again, the maxreq value determines how
-many requests will be processed: if maxreq <=0, then all currently
-pending requests will be processed.  Otherwise, up to maxreq requests
-will be processed.
-
-)0 P(XPA access points can be added to
-)0 38 1 A(Xt event loops)38 0 TN TL()Ec /AF f D( \201using XtAppMainLoop\201\202\202
-and
-)0 39 1 A(Tcl/Tk event loops)39 0 TN TL()Ec /AF f D( \201using vwait and the Tk loop\202.
-When using XPA with these event loops, you only need to call:
-) 1 44 PR(int XPAXtAddInput\201XtAppContext app, XPA xpa\202)RP(
-or
-) 1 29 PR(  int XPATclAddInput\201XPA xpa\202)RP(
-respectively before entering the loop.
-
-
-
-
-)0 2 57 H(XPAPoll:)WB 117 Sn()WB 23 Sn( execute existing XPA requests)EA()EH(
-
-
-)BD() 3 36 PR(  #include <xpa.h>
-
-  int XPAPoll\201int msec, int maxreq\202;)RP()ES(
-
-
-)0 P(It is sometimes desirable to implement a polling loop, i.e., where one
-checks for and processes XPA requests without blocking.  For this
-situation, use the XPAPoll\201\202 routine:
-) 1 32 PR(  XPAPoll\201int msec, int maxreq\202;)RP(
-)0 P(The XPAPoll\201\202 routine will perform XPAAddSelect\201\202 and select\201\202, but with a
-timeout specified in millisecs by the msec argument. If one or more
-XPA requests are made before the timeout expires, the XPAProcessSelect\201\202
-routine is called to process those requests. The maxreq value determines
-how many requests will be processed: if maxreq < 0, then no events are
-processed, but instead, the return value indicates the number of events
-that are pending.  If maxreq == 0, then all currently pending requests
-will be processed.  Otherwise, up to maxreq requests will be processed.
-\201The most usual values for maxreq are 0 to process all requests and 1
-to process one request\202.
-
-
-
-
-)0 2 58 H(XPAAtExit:)WB 118 Sn()WB 105 Sn( install exit handler)EA()EH(
-
-
-) 3 23 PR()BD(  #include <xpa.h>
-
-  void XPAAtExit\201void\202;)ES()RP(
-
-
-)0 P(XPAAtExit\201\202 will install an exit handler using atexit\201\202 to run XPAFree on all
-XPA access points. This might be useful in cases where Unix sockets are being
-used: if an explicit call to XPAFree\201\202 is not made by the program, the Unix
-socket file will not be deleted immediately without an atexit handler. \201NB: this
-call should not be made in a Tcl/Tk application. Accessing the Tcl native file
-system after Tcl has shut down all file systems causes the Tcl/Tl program to
-crash\202.
-
-
-
-
-)0 2 59 H(XPACleanup:)WB 119 Sn()WB 24 Sn( release reserved XPA memory)EA()EH(
-
-
-) 3 24 PR()BD(  #include <xpa.h>
-
-  void XPACleanup\201void\202;)ES()RP(
-
-
-)0 P(When XPA is initialized, it allocates a small amount of memory for the
-access control list, temp directory path, and reserved commands. This
-memory is found by valgrind to be "still reachable", meaning that "your
-program didn't free some memory it could have". Calling the
-XPACleanup\201\202 routine before exiting the program will free this memory
-and make valgrind happy.
-
-
-
-
-)0 2 60 H(XPA)WB 120 Sn()WB 25 Sn( Server Callback Macros)EA()EH(
-
-
-)BD() 4 57 PR(  #include <xpa.h>
-
-  xpa_class, xpa_name, xpa_method, xpa_cmdfd, xpa_datafd,
-  xpa_sendian, xpa_cendian)RP()ES(
-
-
-)0 P(Server routines have  access to information about the XPA being called via
-the following macros \201each of which takes the xpa handle as an argument\202:
-) 9 66 PR(  macro                 explanation
-  ------                -----------
-  xpa_class             class of this xpa
-  xpa_name              name of this xpa
-  xpa_method            method string \201inet or local connect info\202
-  xpa_cmdfd             fd of command socket
-  xpa_datafd            fd of data socket
-  xpa_sendian           endian-ness of server \201"little" or "big"\202
-  xpa_cendian           endian-ness of client \201"little" or "big")RP(
-)0 P(The argument to these macros is the call_data pointer that is passed
-to the server procedure.  This pointer should be type case to XPA
-in the server routine:
-) 1 27 PR(  XPA xpa = \201XPA\202call_data;)RP(
-
-)0 P(The most important of these macros is xpa_datafd\201\202.  A server routine
-that sets "fillbuf=false" in receive_mode or send_mode can use this
-macro to perform I/O directly to/from the client, rather than using
-buf.
-
-)0 P(The xpa_cendian and xpa_sendian macros can be used together to determine
-if the data transferred from the client is byte swapped with respect
-to the server. Values for these macros are: "little", "big", or "?".
-In order to do a proper conversion, you still need to know the format
-of the data \201i.e., byte swapping is dependent on the size of the data
-element being converted\202.
-
-
-
-
-)0 2 61 H(XPA)WB 121 Sn()WB 26 Sn( Race Conditions)EA()EH(
-
-
-Potential XPA race conditions and how to avoid them.
-
-
-)0 P(Currently, there is only one known circumstance in which XPA can get
-\201temporarily\202 deadlocked in a race condition: if two or more XPA
-servers send messages to one another using an XPA client routine such
-as XPASet\201\202, they can deadlock while each waits for the other server
-to respond.  \201This can happen if the servers call XPAPoll\201\202 with a
-time limit, and send messages in between the polling call.\202  The
-reason this happens is that both client routines send a string to the
-other server to establish the handshake and then wait for the server
-response. Since each client is waiting for a response, neither is able
-to enter its event-handling loop and respond to the other's
-request. This deadlock will continue until one of the timeout periods
-expire, at which point an error condition will be triggered and the
-timed-out server will return to its event loop.
-
-)0 P(Starting with version 2.1.6, this rare race condition can be
-avoided by setting the XPA_IOCALLSXPA environment variable for servers
-that will make client calls. Setting this variable causes all XPA
-socket IO calls to process outstanding XPA requests whenever the
-primary socket is not ready for IO. This means that a server making a
-client call will \201recursively\202 process incoming server requests while
-waiting for client completion. It also means that a server callback
-routine can handle incoming XPA messages if it makes its own XPA call.
-The semi-public routine oldvalue=XPAIOCallsXPA\201newvalue\202 can be used
-to turn this behavior off and on temporarily. Passing a 0 will turn
-off IO processing, 1 will turn it back on. The old value is returned
-by the call.
-
-)0 P(By default, the XPA_IOCALLSXPA option is turned off, because we judge
-that the added code complication and overhead involved will not be
-justified by the amount of its use.  Moreover, processing XPA requests
-within socket IO can lead to non-intuitive results, since incoming
-server requests will not necessarily be processed to completion in the
-order in which they are received.
-
-)0 P(Aside from setting XPA_IOCALLSXPA, the simplest way to avoid this race
-condition is to multi-process: when you want to send a client message,
-simply start a separate process to call the client routine, so that
-the server is not stopped. It probably is fastest and easiest to use
-fork\201\202 and then have the child call the client routine and exit. But
-you also can use either the system\201\202 or popen\201\202 routine to start one
-of the command line programs and do the same thing. Alternatively, you
-can use XPA's internal launch\201\202 routine instead of system\201\202. Based on
-fork\201\202 and exec\201\202, this routine is more secure than system\201\202 because
-it does not call /bin/sh.
-
-)0 P(Starting with version 2.1.5, you also can send an XPAInfo\201\202 message with
-the mode string "ack=false". This will cause the client to send a message
-to the server and then exit without waiting for any return message from
-the server. This UDP-like behavior will avoid the server deadlock when
-sending short XPAInfo messages.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 62 H(Last)WB 122 Sn( updated: September 10, 2003)EH(
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (oom.html) D
-/Ti (Out of Memory) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 27 Sn(
-
-
-)0 2 63 H(Xpaoom:)WB 124 Sn()WB 123 Sn( What happens when XPA runs out of memory?)EA()EH(
-
-
-)0 2 64 H(Summary)WB 125 Sn()EH(
-)0 P(When XPA can't allocate memory, it exits. You can arrange to have it call
-longjmp\201\202 instead.
-
-
-)0 2 65 H(Description)WB 126 Sn()EH(
-)0 P(When an XPA server or client cannot allocate memory, it will attempt to
-output an error message and then exit. If this is not satisfactory \201e.g.,
-perhaps your program is interactive and can recover from OOM errors\202, you
-can tell XPA to call longjmp\201\202 to go to a recovery branch. To pass the 
-requisite jmp_buf variable to XPA, make the following call:
-) 1 24 PR(  XPASaveJmp\201void *env\202;)RP(
-The value of env is the address of a jmp_buf variable that was previously 
-passed to setjmp\201\202. For example:
-) 9 62 PR(  jmp_buf env;
-  ...
-  if\201 setjmp\201jmp_buf\202 != 0 \202{
-    /* out of memory -- take corrective action, if possible */
-  } else {
-    /* save env for XPA */
-    XPASaveJmp\201\201void *\202&jmp_buf\202;
-  }
-  // enter main loop ...)RP(
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 66 H(Last)WB 127 Sn( updated: April 7, 2009)EH(
-
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (client.html) D
-/Ti (XPA Client API) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 28 Sn(
-
-
-)0 2 67 H(XPAClient:)WB 130 Sn()WB 128 Sn( The XPA Client-side Programming Interface)EA()EH(
-
-
-)0 2 68 H(Summary)WB 131 Sn()EH(
-A description of the XPA client-side programming interface.
-
-
-)0 2 69 H(Introduction)WB 132 Sn()WB 129 Sn( to XPA Client Programming)EH()EA(
-)0 P(Sending/receiving data to/from an XPA access point is easy: you
-generally only need to call the XPAGet\201\202 or XPASet\201\202 subroutines.
-) 33 71 PR(  #include <xpa.h>
-
-  int )0 31 1 A(XPAGet)31 0 TN TL()Ec /AF f D(\201XPA xpa,
-      char *template, char *paramlist, char *mode,
-      char **bufs, size_t *lens, char **names, char **messages, int n\202;
-
-  int )0 32 1 A(XPASet)32 0 TN TL()Ec /AF f D(\201XPA xpa,
-      char *template, char *paramlist, char *mode,
-      char *buf, size_t len, char **names, char **messages, int n\202;
-
-  int )0 33 1 A(XPAInfo)33 0 TN TL()Ec /AF f D(\201XPA xpa,
-      char *template, char *paramlist, char *mode,
-      char **names, char **messages, int n\202;
-
-  int )0 37 1 A(XPAAccess)37 0 TN TL()Ec /AF f D(\201XPA xpa,
-      char *template, char *paramlist, char *mode,
-      char **names, char **messages, int n\202;
-
-  int )0 34 1 A(XPAGetFd)34 0 TN TL()Ec /AF f D(\201XPA xpa,
-      char *template, char *paramlist, char *mode,
-      int *fds, char **names, char **messages, int n\202;
-
-  int )0 35 1 A(XPASetFd)35 0 TN TL()Ec /AF f D(\201XPA xpa,
-      char *template, char *paramlist, char *mode,
-      int fd, char **names, char **messages, int n\202;
-
-  XPA )0 29 1 A(XPAOpen)29 0 TN TL()Ec /AF f D(\201char *mode\202;
-
-  void )0 30 1 A(XPAClose)30 0 TN TL()Ec /AF f D(\201XPA xpa\202;
-
-  int )0 36 1 A(XPANSLookup)36 0 TN TL()Ec /AF f D(\201XPA xpa,)WR(
-      char *template, char *type,
-      char ***classes, char ***names, char ***methods, char ***infos\202;)RP(
-
-)0 2 70 H(Introduction)WB 133 Sn()EH(
-
-To use the XPA application programming interface, a software developer
-generally will include the xpa.h definitions file:
-) 1 18 PR(  #include <xpa.h>)RP(
-in the software module that defines or accesses an XPA access point and
-then will link against the libxpa.a library:
-) 1 27 PR(  gcc -o foo foo.c libxpa.a)RP(
-XPA has been compiled using both C and C++ compilers.
-)0 P(Client communication with XPA public access points generally is
-accomplished using XPAGet\201\202 or XPASet\201\202 within a program \201or xpaget
-and xpaset at the command line\202.  Both routines require specification
-of the name of the access point.  If a )0 3 1 A(template)3 0 TN TL()Ec /AF f D(
-is used to specify the access point name \201e.g., "ds9*"\202, then
-communication will take place with all servers matching that template.
-
-
-
-
-)0 2 71 H(XPAGet:)WB 134 Sn()WB 31 Sn( retrieve data from one or more XPA servers)EA()EH(
-
-
-)BD() 6 70 PR(  #include <xpa.h>
-
-  int XPAGet\201XPA xpa,
-             char *template, char *paramlist, char *mode,
-             char **bufs, size_t *lens, char **names, char **messages,
-             int n\202;)RP()ES(
-
-
-)0 P(Retrieve data from one or more XPA servers whose class:name identifier
-matches the specified template.
-
-)0 P(A 
-)0 3 1 A(template)3 0 TN TL()Ec /AF f D(
-of the form "class1:name1" is sent to the
-XPA name server, which returns a list of at most n matching XPA
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an XPA struct is passed to the call, then the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers \201which will be closed
-when the call completes\202.
-
-)0 P(The XPAGet\201\202 routine then retrieves data from at most n XPA servers,
-places these data into n allocated buffers and places the buffer
-pointers in the bufs array. The length of each buffer is stored in the
-lens array. A string containing the class:name and ip:port is stored
-in the name array.  If a given server returned an error or the server
-callback sends a message back to the client, then the message will be
-stored in the associated element of the messages array.  NB: if
-specified, the name and messages arrays must be of size n or greater.
-
-)0 P(The returned message string will be of the form:
-) 1 46 PR(  XPA$ERROR error-message \201class:name ip:port\202)RP(
-or
-) 1 42 PR(  XPA$MESSAGE message \201class:name ip:port\202)RP(
-)0 P(Note that when there is an error stored in an messages entry, the
-corresponding bufs and lens entry may or may not be NULL and 0
-\201respectively\202, depending on the particularities of the server.
-
-)0 P(The return value will contain the actual number of servers that were
-processed.  This value thus will hold the number of valid entries in
-the bufs, lens, names, and messages arrays, and can be used to loop
-through these arrays.  In names and/or messages is NULL, no information is
-passed back in that array.
-
-)0 P(The bufs, names, and messages arrays should be freed upon completion \201if
-they are not NULL\202;
-
-)0 P(The mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-) 4 115 PR(  key           value           default         explanation
-  ------        --------        --------        -----------
-  ack           true/false      true            if false, don't wait for ack from server \201after callback completes\202
-  doxpa         true/false      true            client processes xpa requests)RP(
-)0 P(The ack keyword is not very useful, since the server completes the callback
-in order to return the data anyway.  It is here for completion \201and perhaps
-for future usefulness\202.
-
-)0 P(Normally, an XPA client will process incoming XPA server requests
-while awaiting the completion of the client request.  Setting this
-variable to "false" will prevent XPA server requests from being
-processed by the client.
-        
-)0 P()BD(Example:)ES(
-) 25 70 PR(  #include <xpa.h>
-
-  #define NXPA 10
-  int  i, got;
-  size_t  lens[NXPA];
-  char *bufs[NXPA];
-  char *names[NXPA];
-  char *messages[NXPA];
-  got = XPAGet\201NULL, "ds9", "file", NULL, bufs, lens, names, messages,
-  NXPA\202;
-  for\201i=0; i<got; i++\202{
-    if\201 messages[i] == NULL \202{
-      /* process buf contents */
-      ProcessImage\201bufs[i], ...\202;
-      free\201bufs[i]\202;
-    }
-    else{
-      /* error processing */
-      fprintf\201stderr, "ERROR: %s \201%s\202\200n", messages[i], names[i]\202;
-    }
-    if\201 names[i] \202
-      free\201names[i]\202;
-    if\201 messages[i] \202
-      free\201messages[i]\202;
-  })RP(
-
-
-
-
-)0 2 72 H(XPASet:)WB 135 Sn()WB 32 Sn( send data to one or more XPA servers)EA()EH(
-
-
-)BD() 6 66 PR(  #include <xpa.h>
-
-  int XPASet\201XPA xpa,
-             char *template, char *paramlist, char *mode,
-             char *buf, size_t len, char **names, char **messages,
-             int n\202;)RP()ES(
-
-
-)0 P(Send data to one or more XPA servers whose class:name identifier
-matches the specified template.
-
-)0 P(A 
-)0 3 1 A(template)3 0 TN TL()Ec /AF f D(
-of the form "class1:name1" is sent to the
-XPA name server, which returns a list of at most n matching XPA
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an XPA struct is passed to the call, the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers \201which will be closed
-when the call completes\202.
-
-)0 P(The XPASet\201\202 routine transfers data from buf to the XPA servers.
-The length of buf \201in bytes\202 should be placed in the len variable.
-
-)0 P(A string containing the class:name and ip:port of each of these server
-is returned in the name array.  If a given server returned an error or
-the server callback sends a message back to the client, then the
-message will be stored in the associated element of the messages
-array. NB: if specified, the name and messages arrays must be of size
-n or greater.
-
-)0 P(The returned message string will be of the form:
-
-) 1 42 PR(  XPA$ERROR   [error] \201class:name ip:port\202)RP(
-or
-) 1 44 PR(  XPA$MESSAGE [message] \201class:name ip:port\202)RP(
-)0 P(The return value will contain the actual number of servers that were
-processed.  This value thus will hold the number of valid entries in
-the names and messages arrays, and can be used to loop through these
-arrays.  In names and/or messages is NULL, no information is passed back
-in that particular array.
-
-)0 P(The mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-) 5 115 PR(  key           value           default         explanation
-  ------        --------        --------        -----------
-  ack           true/false      true            if false, don't wait for ack from server \201after callback completes\202
-  verify        true/false      false           send buf from XPASet[Fd] to stdout
-  doxpa         true/false      true            client processes xpa requests)RP(
-)0 P(The ack keyword is useful in cases where one does not want to wait for
-the server to complete, e.g. if a lot of processing needs to be done
-by the server on the passed data or when the success of the server
-operation is not relevant to the client.
-
-)0 P(Normally, an XPA client will process incoming XPA server requests
-while awaiting the completion of the client request.  Setting this
-variable to "false" will prevent XPA server requests from being
-processed by the client.
-        
-)0 P()BD(Example:)ES(
-) 21 75 PR(  #include <xpa.h>
-
-  #define NXPA 10
-  int  i, got;
-  size_t  len;
-  char *buf;
-  char *names[NXPA];
-  char *messages[NXPA];
-  ...
-  [fill buf with data and set len to the length, in bytes, of the data]
-  ...
-  /* send data to all access points */
-  got = XPASet\201NULL, "ds9", "fits", NULL, buf, len, names, messages, NXPA\202;
-  /* error processing */
-  for\201i=0; i<got; i++\202{
-    if\201 messages[i] \202{
-      fprintf\201stderr, "ERROR: %s \201%s\202\200n", messages[i], names[i]\202;
-    }
-    if\201 names[i] \202    free\201names[i]\202;
-    if\201 messages[i] \202 free\201messages[i]\202;
-  })RP(
-        
-
-
-
-)0 2 73 H(XPAInfo:)WB 136 Sn()WB 33 Sn( send short message to one or more XPA servers)EA()EH(
-
-
-)BD() 5 58 PR(  #include <xpa.h>
-
-  int XPAInfo\201XPA xpa,
-              char *template, char *paramlist, char *mode,
-              char **names, char **messages, int n\202;)RP()ES(
-
-
-)0 P(Send a short paramlist message to one or more XPA servers whose
-class:name identifier matches the specified
-)0 3 1 A(template)3 0 TN TL()Ec /AF f D(.
-
-)0 P(A
-)0 3 1 A(template)3 0 TN TL()Ec /AF f D(
-of the form "class1:name1" is sent to the
-XPA name server, which returns a list of at most n matching XPA
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an XPA struct is passed to the call, then the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers \201which will be closed
-when the call completes\202.
-
-)0 P(The XPAInfo\201\202 routine does not send data from a buf to the XPA
-servers. Only the paramlist is sent.  The semantics of the paramlist
-is not formalized, but at a minimum is should tell the server how to
-get more information.  For example, it might contain the class:name
-of the XPA access point from which the server \201acting as a client\202
-can obtain more info using XPAGet.
-
-)0 P(A string containing the class:name and ip:port of each server is
-returned in the name array.  If a given server returned an error or
-the server callback sends a message back to the client, then the
-message will be stored in the associated element of the messages
-array.  The returned message string will be of the form:
-) 1 48 PR(  XPA$ERROR   error-message \201class:name ip:port\202)RP(
-or
-) 1 46 PR(  XPA$MESSAGE message     \201class:name ip:port\202)RP(
-)0 P(The return value will contain the actual number of servers that were
-processed.  This value thus will hold the number of valid entries in
-the names and messages arrays, and can be used to loop through these
-arrays.  In names and/or messages is NULL, no information is passed back
-in that array.
-
-)0 P(The following keywords are recognized:
-) 3 88 PR(  key           value           default         explanation
-  ------        --------        --------        -----------
-  ack           true/false      true            if false, don't wait for ack from server)RP(
-)0 P(When ack is false, XPAInfo\201\202 will not wait for an error return from the XPA
-server. This means, in effect, that XPAInfo will send its paramlist string
-to the XPA server and then exit: no information will be sent from the server
-to the client. This UDP-like behavior is essential to avoid race
-conditions in cases where XPA servers are sending info messages to
-other servers. If two servers try to send each other an info message
-at the same time and then wait for an ack, a race condition will result and
-one or both will time out.
-
-)0 P()BD(Example:)ES(
-) 1 65 PR(  \201void\202XPAInfo\201NULL, "IMAGE", "ds9 image", NULL, NULL, NULL, 0\202;)RP(
-        
-
-
-
-)0 2 74 H(XPAGetFd:)WB 137 Sn()WB 34 Sn( retrieve data from one or more XPA servers and write to files)EA()EH(
-
-
-)BD() 5 63 PR(  #include <xpa.h>
-
-  int XPAGetFd\201XPA xpa,
-               char *template, char *paramlist, char *mode,
-               int *fds, char **names, char **messages, int n\202;)RP()ES(
-
-
-)0 P(Retrieve data from one or more XPA servers whose class:name identifier
-matches the specified
-)0 3 1 A(template)3 0 TN TL()Ec /AF f D(
-and write it to files associated with
-one or more standard I/O fds \201i.e, handles returned by open\201\202\202.
-
-)0 P(A 
-)0 3 1 A(template)3 0 TN TL()Ec /AF f D(
-of the form "class1:name1" is sent to the
-XPA name server, which returns a list of at most ABS\201n\202 matching XPA
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an XPA struct is passed to the call, then the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers \201which will be closed
-when the call completes\202.
-
-)0 P(The XPAGetFd\201\202 routine then retrieves data from the XPA servers,
-and write these data to the fds associated with one or more fds
-\201i.e., results from open\202. Is n is positive, then there will be n fds
-and the data from each server will be sent to a separate fd. If n is
-negative, then there is only 1 fd and all data is sent to this single
-fd. \201The latter is how xpaget is implemented.\202
-
-)0 P(A string containing the class:name and ip:port is stored in the name
-array.  If a given server returned an error or the server callback
-sends a message back to the client, then the message will be stored in
-the associated element of the messages array.  NB: if specified, the
-name and messages arrays must be of size n or greater.
-
-)0 P(The returned message string will be of the form:
-) 1 48 PR(  XPA$ERROR   error-message \201class:name ip:port\202)RP(
-or
-) 1 46 PR(  XPA$MESSAGE message     \201class:name ip:port\202)RP(
-)0 P(Note that when there is an error stored in an messages entry, the
-corresponding bufs and lens entry may or may not be NULL and 0
-\201respectively\202, depending on the particularities of the server.
-
-)0 P(The return value will contain the actual number of servers that were
-processed.  This value thus will hold the number of valid entries in
-the bufs, lens, names, and messages arrays, and can be used to loop
-through these arrays.  In names and/or messages is NULL, no information is
-passed back in that array.
-
-)0 P(The mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-) 3 115 PR(  key           value           default         explanation
-  ------        --------        --------        -----------
-  ack           true/false      true            if false, don't wait for ack from server \201after callback completes\202)RP(
-)0 P(The ack keyword is not very useful, since the server completes the callback
-in order to return the data anyway.  It is here for completion \201and perhaps
-for future usefulness\202.
-        
-)0 P()BD(Example:)ES(
-) 19 72 PR(  #include <xpa.h>
-  #define NXPA 10
-  int  i, got;
-  int fds[NXPA];
-  char *names[NXPA];
-  char *messages[NXPA];
-  for\201i=0; i<NXPA; i++\202
-    fds[i] = open\201...\202;
-  got = XPAGetFd\201NULL, "ds9", "file", NULL, fds, names, messages, NXPA\202;
-  for\201i=0; i<got; i++\202{
-    if\201 messages[i] != NULL \202{
-      /* error processing */
-      fprintf\201stderr, "ERROR: %s \201%s\202\200n", messages[i], names[i]\202;
-    }
-    if\201 names[i] \202
-      free\201names[i]\202;
-    if\201 messages[i] \202
-      free\201messages[i]\202;
-  })RP(
-
-
-
-
-)0 2 75 H(XPASetFd:)WB 138 Sn()WB 35 Sn( send data from stdin to one or more XPA servers)EA()EH(
-
-)ES(
-) 5 60 PR(  #include <xpa.h>
-
-  int XPASetFd\201XPA xpa,
-               char *template, char *paramlist, char *mode,
-               int fd, char **names, char **messages, int n\202)RP()ES(
-
-
-)0 P(Read data from a standard I/O fd and send it to one or more XPA
-servers whose class:name identifier matches the specified
-)0 3 1 A(template.
-
-)0 P(A
-)0 3 1 A(template)3 0 TN TL()Ec /AF f D(
-of the form "class1:name1" is sent to the
-XPA name server, which returns a list of at most n matching XPA
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an XPA struct is passed to the call, then the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers \201which will be closed
-when the call completes\202.
-
-)0 P(The XPASetFd\201\202 routine then reads bytes from the specified fd
-until EOF and sends these bytes to the XPA servers.  
-The final parameter n specifies the maximum number of servers to contact.
-A string containing the class:name and ip:port of each server is returned in
-the name array.  If a given server returned an error, then the error
-message will be stored in the associated element of the messages array.
-NB: if specified, the name and messages arrays must be of size n or greater.
-
-)0 P(The return value will contain the actual number of servers that were
-processed.  This value thus will hold the number of valid entries in
-the names and messages arrays, and can be used to loop through these
-arrays.  In names and/or messages is NULL, no information is passed back
-in that array.
-
-)0 P(The mode string is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-) 4 115 PR(  key           value           default         explanation
-  ------        --------        --------        -----------
-  ack           true/false      true            if false, don't wait for ack from server \201after callback completes\202
-  verify        true/false      false           send buf from XPASet[Fd] to stdout)RP(
-)0 P(The ack keyword is useful in cases where one does not want to wait for
-the server to complete, e.g. is a lot of processing needs to be done
-on the passed data or when the success of the server operation is not
-relevant to the client.
-
-)0 P()BD(Example:)ES(
-) 19 71 PR(  #include <xpa.h>
-
-  #define NXPA 10
-  int  i, got;
-  int fd;
-  char *names[NXPA];
-  char *messages[NXPA];
-  fd = open\201...\202;
-  got = XPASetFd\201NULL, "ds9", "fits", NULL, fd, names, messages, NXPA\202;
-  for\201i=0; i<got; i++\202{
-    if\201 messages[i] != NULL \202{
-      /* error processing */
-      fprintf\201stderr, "ERROR: %s \201%s\202\200n", messages[i], names[i]\202;
-    }
-    if\201 names[i] \202
-      free\201names[i]\202;
-    if\201 messages[i] \202
-      free\201messages[i]\202;
-  })RP(
-
-
-
-
-)0 2 76 H(XPAOpen:)WB 139 Sn()WB 29 Sn( allocate a persistent client handle)3 0 TN TL()Ec /AF f D()EH(
-
-
-)BD() 3 26 PR(  #include <xpa.h>
-
-  XPA XPAOpen\201char *mode\202;)RP()ES(
-
-
-)0 P(XPAOpen\201\202 allocates a persistent XPA struct that can be used with
-calls to XPAGet\201\202, XPASet\201\202, XPAInfo\201\202, XPAGetFd\201\202, and
-XPASetFd\201\202. Persistence means that a connection to an XPA server is
-not closed when one of the above calls is completed but will be
-re-used on successive calls. Using XPAOpen\201\202 therefore saves the time
-it takes to connect to a server, which could be significant with slow
-connections or if there will be a large number of exchanges with a
-given access point.  The mode argument currently is ignored \201"reserved
-for future use"\202.
-
-)0 P(An XPA struct is returned if XPAOpen\201\202 was successful; otherwise NULL
-is returned. This returned struct can be passed as the first argument
-to XPAGet\201\202, etc.  Those calls will update the list of active XPA
-connections.  Already connected servers \201from a previous call\202 are
-left connected and new servers also will be connected.  Old servers
-\201from a previous call\202 that are no longer needed are disconnected.
-The connected servers will remain connected when the next call to
-XPAGet\201\202 is made and connections are once again updated.
-
-)0 P()BD(Example:)ES(
-) 4 22 PR( #include <xpa.h>
-
-  XPA xpa;
-  xpa = XPAOpen\201NULL\202;)RP(
-
-
-
-
-)0 2 77 H(XPAClose:)WB 140 Sn()WB 30 Sn( close a persistent XPA client handle)EA()EH(
-
-
-)BD() 3 25 PR(  #include <xpa.h>
-
-  void XPAClose\201XPA xpa\202;)RP()ES(
-
-
-)0 P(XPAClose closes the persistent connections associated with this XPA struct
-and frees all allocated space. It also closes the open sockets connections
-to all XPA servers that were opened using this handle.
-
-)0 P()BD(Example:)ES(
-) 4 18 PR(  #include <xpa.h>
-
-  XPA xpa;
-  XPAClose\201xpa\202;)RP(
-
-
-
-
-)0 2 78 H(XPANSLookup:)WB 141 Sn()WB 36 Sn( lookup registered XPA access points)EA()EH(
-
-
-)BD() 6 49 PR(  #include <xpa.h>
-
-  int XPANSLookup\201XPA xpa,
-                  char *template, char type,
-                  char ***classes, char ***names,
-                  char ***methods, char ***infos\202)RP()ES(
-
-
-)0 P(XPA routines act on a class:name identifier in such a way
-that all access points that match the identifier are processed.  It is
-sometimes desirable to choose specific access points from the
-candidates that match the
-)0 3 1 A(template)3 0 TN TL()Ec /AF f D(.  In order to do this, the
-XPANSLookup routine can be called to return a list of matches, so that
-specific class:name instances can then be fed to XPAGet\201\202, XPASet\201\202, etc.
-
-)0 P( The first argument is an optional XPA struct. If non-NULL, the
-existing name server connection associated with the specified xpa is
-used to query the xpans name server for matching templates. Otherwise,
-a new \201temporary\202 connection is established with the name server.
-
-)0 P(The second argument to XPANSLookup is the class:name 
-)0 3 1 A(template)3 0 TN TL()Ec /AF f D(
-to match.
-
-)0 P(The third argument for XPANSLookup\201\202 is the type of access and can be
-any combination of:
-) 5 62 PR(  type          explanation
-  ------        -----------
-  g             xpaget calls can be made on this access point
-  s             xpaset calls can be made on this access point
-  i             xpainfo calls can be made on this access point)RP(
-)0 P(The call typically specifies only one of these at a time.
-
-)0 P(The final arguments are pointers to arrays that will be filled
-in and returned by the name server. The name server will allocate and
-return arrays filled with the classes, names, and methods of all XPA
-access points that match the )0 3 1 A(template)3 0 TN TL()Ec /AF f D(
-and have the specified type. Also returned are info strings, which
-generally are used internally by the client routines. These can be
-ignored \201but the strings must be freed\202.  The function returns the
-number of matches. The returned value can be used to loop through the
-matches:
-
-)BD(Example:)ES(
-) 24 73 PR(  #include <xpa.h>
-
-  char **classes;
-  char **names;
-  char **methods;
-  char **infos;
-  int i, n;
-  n = XPANSLookup\201NULL, "foo*", "g", &classes, &names, &methods, &infos\202;
-  for\201i=0; i<n; i++\202{
-    [more specific checks on possibilities ...]
-    [perhaps a call to XPAGet for those that pass, etc. ...]
-    /* don't forget to free alloc'ed strings when done */
-    free\201classes[i]\202;
-    free\201names[i]\202;
-    free\201methods[i]\202;
-    free\201infos[i]\202;
-  }
-  /* free up arrays alloc'ed by names server */
-  if\201 n > 0 \202{
-    free\201classes\202;
-    free\201names\202;
-    free\201methods\202;
-    free\201infos\202;
-  })RP(
-)0 P(The specified 
-)0 3 1 A(template)3 0 TN TL()Ec /AF f D(
-also can be a host:port specification, for example:
-) 1 14 PR(  myhost:12345)RP(
-)0 P(In this case, no connection is made to the name server. Instead, the
-call will return one entry such that the ip array contains the ip for
-the specified host and the port array contains the port.  The class
-and name entries are set to the character "?", since the class and
-name of the access point are not known. 
-
-
-
-
-)0 2 79 H(XPAAccess:)WB 142 Sn()WB 37 Sn( return XPA access points matching
-template \201XPA 2.1 and above\202)EA()EH(
-
-
-)BD() 5 60 PR(  #include <xpa.h>
-
-  int XPAAccess\201XPA xpa,
-                char *template, char *paramlist, char *mode,
-                char **names, char **messages, int n\202;)RP()ES(
-
-
-)0 P(The XPAAccess routine returns the public access points that match the
-specified second argument )0 3 1 A(template)3 0 TN TL()Ec /AF f D( and
-have the specified access type.
-
-)0 P(A
-)0 3 1 A(template)3 0 TN TL()Ec /AF f D(
-of the form "class1:name1" is sent to the
-XPA name server, which returns a list of at most n matching XPA
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an XPA struct is passed to the call, then the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers \201which will be closed
-when the call completes\202.
-
-)0 P(The XPAAccess\201\202 routine retrieves names from at most n XPA servers
-that match the specified template and that were checked for access
-using the specified mode.  The return string contains both the
-class:name and ip:port.  If a given server returned an error or the
-server callback sends a message back to the client, then the message
-will be stored in the associated element of the messages array.
-NB: if specified, the name and messages arrays must be of size n or greater.
-
-)0 P(The returned message string will be of the form:
-) 1 46 PR(  XPA$ERROR error-message \201class:name ip:port\202)RP(
-)0 P(Note that names of matching registered access points are always
-returned but may not be valid; it is not sufficient to assume that the
-returned number of access points is the number of valid access points.
-Rather, it is essential to check the messages array for error
-messages.  Any string in the messages array is an error message and
-indicated that the associated access point is not available.
-
-)0 P(For example, assume that a server registers a number of access points
-but delays entering its event loop. If a call to XPAAccess\201\202 is made
-before the event loop is entered, the call will timeout \201after waiting
-for the long timeout period\202 and return an error of the form:
-) 1 65 PR(  XPA$ERROR: timeout waiting for server authentication \201XPA:xpa1\202)RP(
-The error means that the XPA access point has been registered but is
-not yet available \201because events are not being processed\202. When the
-server finally enters its event loop, subsequent calls to XPAAccess\201\202
-will return successfully.
-
-)0 P(NB: This routine only works with XPA servers built with XPA 2.1.x and later.
-Servers with older versions of XPA will return the error message:
-
-  XPA$ERROR invalid xpa command in initialization string
-
-If you get this error message, then the old server actually is ready
-for access, since it got to the point of fielding the query! The
-xpaaccess program, for example, ignores this message in order to work
-properly with older servers.
-
-)0 P(The third argument for XPAAccess\201\202 is the type of access and can be
-any combination of:
-) 5 62 PR(  type          explanation
-  ------        -----------
-  g             xpaget calls can be made on this access point
-  s             xpaset calls can be made on this access point
-  i             xpainfo calls can be made on this access point)RP(
-)0 P(The mode string argument is of the form: "key1=value1,key2=value2,..."
-The following keywords are recognized:
-) 3 115 PR(  key           value           default         explanation
-  ------        --------        --------        -----------
-  ack           true/false      true            if false, don't wait for ack from server \201after callback completes\202)RP(
-)0 P(The ack keyword is not very useful, since the server completes the callback
-in order to return the data anyway.  It is here for completion \201and perhaps
-for future usefulness\202.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 80 H(Last)WB 143 Sn( updated: March 10, 2007)EH(
-
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (xt.html) D
-/Ti (XPA/Xt Interface) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 38 Sn(
-
-
-)0 2 81 H(XPAXt:)WB 145 Sn()WB 144 Sn( the XPA Interface to Xt \201X Windows\202)EA()EH(
-
-
-)0 2 82 H(Summary)WB 146 Sn()EH(
-Describes how XPA access points can be added to X Toolkit \201Xt\202 programs.
-
-
-)0 2 83 H(Description)WB 147 Sn()EH(
-)0 P(XPA supports Xt programs: you can call XPANew\201\202, XPACmdNew\201\202, or
-XPAInfoNew\201\202 within any C routine to add XPA server callbacks to an Xt
-program.  Since an Xt program has its own event loop call \201i.e.,
-XtAppMainLoop\201\202\202, it therefore does not need or want to use the XPA
-even loop.  Thus, in order to add XPA access points to the standard Xt
-event loop, the following routine should be called before entering the
-loop:
-) 1 46 PR(  int XPAXtAddInput\201XtAppContext app, XPA xpa\202)RP(
-)0 P(The XPAAddAddInput\201\202 routine will add XPA access points to the Xt event
-loop by making calls to the standard XtAppAddInput\201\202 routine. \201If the
-XtAppContext argument is NULL, then the alternate XtAddInput\201\202 routine
-is used instead.\202  If the xpa argument is NULL, then all active XPA
-access points are added to the loop.  If xpa is not NULL, then only
-the specified access point is added.  The latter type of call is used
-to add new access points from within a callback, after the program has
-entered the XtAppMainLoop\201\202 even loop.
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 84 H(Last)WB 148 Sn( updated: September 10, 2003)EH(
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (tcl.html) D
-/Ti (XPA/Tcl Interface) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 39 Sn(
-
-
-)0 2 85 H(XPATcl:)WB 151 Sn()WB 149 Sn( the XPA Interface to the Tcl/Tk Environment)EA()EH(
-
-
-)0 2 86 H(Summary)WB 152 Sn()EH(
-
-)0 P(Tcl/Tk programs can act as XPA clients and/or servers using the Tcl
-interface to XPA that is contained in the libtclxpa.so shared object.
-
-)0 2 87 H(Server)WB 153 Sn( Routines)EH(
-
-) 11 70 PR(  set xpa [xpanew class name help sproc sdata smode rproc rdata rmode]
-  xpafree xpa
-  set xpa [xpanew class name help iproc idata imode]
-  set xpa [xpacmdnew class name]
-  xpacmdadd xpa name help sproc sdata smode rproc rdata rmode
-  xpacmddel xpa cmd
-  set val [xparec xpa option]
-    options: name, class, method, cmdfd, datafd, cmdchan, datachan
-  xpasetbuf xpa buf len
-  xpaerror xpa message
-  xpamessage xpa message)RP(
-
-)0 2 88 H(Client)WB 154 Sn( Routines)EH(
- 
-) 11 69 PR(  set xpa [xpaopen mode]
-  xpaclose xpa
-  set got [xpaget xpa template paramlist mode bufs lens names errs n]
-  set got [xpaget xpa template paramlist mode chans names errs n]
-  set got [xpaset xpa template paramlist mode buf len names errs n]
-  set got [xpasetfd xpa template paramlist mode chan names errs n]
-  set got [xpainfo xpa template paramlist mode names errs n]
-  # NB: 2.1 calling sequence change
-  # set got [xpaaccess template type] \2012.0.5\202
-  set got [xpaaccess xpa template paramlist mode names errs n]
-  set got [xpanslookup template type classes names methods])RP(
-
-
-)0 2 89 H(Description)WB 155 Sn()EH(
-)0 P(You can call XPANew\201\202, XPACmdNew\201\202, or XPAInfoNew\201\202 within a C
-routine to add C-based XPA server callbacks to a TCL/Tk program that
-uses a Tcl/Tk event loop \201either vwait\201\202 or the Tk event loop\202;
-Such a program does not need or want to use the XPA event loop.
-Therefore, in order to add XPA access points to the Tcl/Tk loop, the
-following routine should be called beforehand:
-) 1 30 PR(  int XPATclAddInput\201XPA xpa\202;)RP(
-)0 P(Normally, the xpa argument is NULL, meaning that all current XPA
-access points are registered with the event loop.  However, if a
-single XPA access point is to be added \201i.e., after the event loop is
-started\202 then the handle of that XPA access point can be passed to
-this routine.
-
-)0 P(The significance of the XPA/TCL interface goes beyond the support for
-using XPA inside C code. The interface allows you to write XPA
-servers and to make calls to the XPA client interface within the Tcl
-environment using the Tcl language directly. The XPA/Tcl
-interface can be loaded using the following package command:
-) 1 28 PR(  package require tclxpa 2.0)RP(
-Alternatively, you can load the shared object \201called libtclxpa.so \202 directly:
-) 1 30 PR(  load .../libtclxpa.so tclxpa)RP(
-)0 P(Once the tclxpa package is loaded, you can use Tcl versions of XPA
-routines to define XPA servers or make client XPA calls.  The
-interface for these routines is designed to match the Unix XPA
-interface as nearly as possible.  Please refer to
-)0 15 1 A(XPA Servers)15 0 TN TL()Ec /AF f D(
-and
-)0 28 1 A(XPA Clients)28 0 TN TL()Ec /AF f D(
-for general information about these routines.  
-
-)0 P(The file test.tcl in the XPA source directory gives examples for using the 
-XPA/Tcl interface.
-
-)0 P(The following notes describe the minor differences between the interfaces.
-
-)0 2 90 H(XPANew)WB 156 Sn()WB 150 Sn()EA()EH(
-) 1 70 PR()BD(  set xpa [xpanew class name help sproc sdata smode rproc rdata rmode])ES()RP(
-)0 P(rproc and sproc routines are routines.  The calling sequence of the
-rproc routine is identical to its C counterpart:
-) 1 59 PR(  proc rec_cb { xpa client_data paramlist buf len } { ... })RP(
-)0 P(The sproc routine, however is slightly different from its C counterpart
-because of the difficulty of passing data back from the callback to C:
-) 1 51 PR(  proc sendcb { xpa client_data paramlist } { ... })RP(
-)0 P(Note that the C-based server's char **buf and int *len arguments are
-missing from the Tcl callback. This is because we did not know how to
-fill buf with data and pass it back to the C routines for communication
-with the client.  Instead, the Tcl server callback uses the following
-routine to set buf and len:
-) 1 23 PR(  xpasetbuf xpa buf len)RP(
-where:
-) 5 79 PR(  arg           explanation
-  ------        -----------
-  xpa           the first argument of the server callback
-  buf           the data to be returned to the client
-  len           data length in bytes, \201if absent, use length of the buf object\202)RP(
-)0 P(When this routine is called, a copy of buf is saved for transmission to
-the client.
-
-)0 P(The fact that buf is duplicated means that TCL server writers might wish to
-perform the I/O directly within the callback, rather than have XPA do it
-automatically at the end of the routine.  To do this, set:
-) 1 15 PR(  fillbuf=false)RP(
-)0 P(in the xpanew smode and then perform I/O through the Tcl channel
-obtained from:
-) 1 34 PR(  set dchan [xparec $xpa datachan])RP(
-)0 P(where:
-) 5 79 PR(  arg           explanation
-  ------        -----------
-  xpa           the first argument of the server callback
-  datachan      literal string "datachan" that returns the data channel
-  len           data length in bytes, \201if absent, use length of the buf object\202)RP(
-)0 P()BD(NB: datachan and cmdchan are not available under Windows. It is
-necessary to use the "raw" equivalents: datafd and cmdfd.)ES(
-
-)0 P(The same considerations apply to the rproc for receive servers: a copy
-of the incoming data is generated to pass to the receive callback. This
-copy again can be avoided by using "fillbuf=false" in the rmode and then
-reading the incoming data from datachan.
-
-)0 P(The send and receive callback routines can use the xpaerror and xpamessage
-routines to send errors and messages back to the client.  If you also
-want tcl itself to field an error condition, use the standard return call:
-) 1 56 PR(  return ?-code c? ?-errorinfo i? ?-errorcode ec? string)RP(
-)0 P(See the Tcl man page for more info.
-
-)0 2 91 H(XPARec)WB 157 Sn()WB 150 Sn()EA()EH(
-)0 P(The Tcl xparec procedure supplies server routines with access to information 
-that is available via macros in the C interface:
-) 1 31 PR(  set val [xparec xpa <option>])RP(
-)0 P(where option is: name, class, method, cmdfd, datafd, cmdchan,
-datachan.  Note that two additional identifiers, cmdchan and datachan,
-have been added to to provide Tcl channels corresponding to datafd and
-cmdfd.  \201These latter might still be retrieved in Tcl and passed back
-to a C routines.\202  An additional option called "version" can be used to
-determine the XPA version used to build the Tcl interface. Note that
-the standard options require a valid XPA handle, but "version" does
-not \201since it simply reports the value of the XPA_VERSION definition
-in the XPA source include file\202.
-
-)0 P()BD(NB: datachan and cmdchan are not available under Windows. It is
-necessary to use the "raw" equivalents: datafd and cmdfd.)ES(
-) 12 58 PR(  macro         explanation
-  ------        -----------
-  class         class of this xpa
-  name          name of this xpa
-  method        method string \201inet or local connect info\202
-  cmdchan       Tcl channel of command socket
-  datachan      Tcl channel of data socket
-  cmdfd         fd of command socket
-  datafd        fd of data socket
-  sendian       endian-ness of server \201"little" or "big"\202
-  cendian       endian-ness of client \201"little" or "big"
-  version       XPA version used to build this code)RP(
-
-)0 P(Under Windows, the Tcl event handler cannot automatically sense when an
-XPA socket is ready for IO \201i.e. Tcl_CreateFileHandler\201\202 is not available
-under Windows\202. The Windows Tcl event handler therefore must be awakened
-occasionally for check for XPA events. This is done using the standard
-Tcl_SetMaxBlockTime\201\202 call. The time parameter is defined in tclloop.c
-and is currently set to 1000 microseconds \2011/1000 of a second\202. 
-
-)0 P(The version option can be used to differentiate between source code versions.
-It was created to support legacy Tcl code that needs to maintain the 2.0.5
-calling sequence for xpaaccess. You can use a version test such as:
-) 12 44 PR(  if [catch { xparec "" version } version] {
-    puts "pre-2.1.0e"
-  } else {
-    puts [split $version .]
-  }
-) 7 32 PR(
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 92 H(Last)WB 158 Sn( updated: September 10, 2003)EH(
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (env.html) D
-/Ti (The XPA Environment) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 40 Sn(
-
-
-)0 2 93 H(XPAEnv:)WB 160 Sn()WB 159 Sn( Environment Variables for XPA Messaging)EA()EH(
-
-
-)0 2 94 H(Summary)WB 161 Sn()EH(
-Describes the environment variables which can be used to tailor the overall
-XPA environment.
-
-
-)0 2 95 H(Description)WB 162 Sn()EH(
-)0 P(The following environment variables are supported by XPA:
-)0 DL()0 P()0 DT()BD(XPA_ACL)ES(
-)DD( If )EM(XPA_ACL)ES( is )EM(true)ES(, then 
-host-based )0 41 1 A(XPA Access Control)41 0 TN TL()Ec /AF f D(
-is turned on and only specified machines can access specified access
-points.  If )EM(false)ES(, then access control is turned off and any
-machine can access point. The default is turn turn access control on.
-
-)0 P()0 DT()BD(XPA_ACLFILE)ES(
-)DD( If
-)0 41 1 A(XPA Access Control)41 0 TN TL()Ec /AF f D(
-is turned on, this variable specifies the name of the file containing
-access control information for all access points started by this user.
-The default file name is: )EM($HOME/acls.xpa)ES(.
-
-)0 P()0 DT()BD(XPA_CONNECT_TIMEOUT)ES(
-)DD( When an XPA server first starts up, it immediately tries to
-connect to the XPA name server program \201xpans\202 on the host specified by
-the )EM(XPA_NSINET)ES( variable. \201If this connection fails on the
-local host, and if xpans can be found in the path, then the name
-server is started automatically.\202  Unfortunately, a mis-configured
-network can cause this connect attempt to hang for many seconds while
-the connect\201\202 system call times out. Therefore, an alarm is started
-to interrupt the connect\201\202 call and prevent a long hang.  The initial
-value of the alarm timeout is 10 seconds, but can be changed by setting
-this environment variable. If you want to disable the alarm and allow
-the initial connect\201\202 to time out, set the value of this variable to
-0. Normally, users would not change this variable at all.
-
-)0 P()0 DT()BD(XPA_CLIENT_DOXPA)ES(
-)DD( Normally, an XPA client \201xpaget, xpaset, etc.\202 will process incoming
-XPA server requests while awaiting the completion of the client request.
-Setting this variable to "false" will prevent XPA server requests from
-being processed by the client.
-
-)0 P()0 DT()BD(XPA_DEFACL)ES(
-)DD( If
-)0 41 1 A(XPA Access Control)41 0 TN TL()Ec /AF f D(
-is turned on, this variable specifies the default access control
-condition for all access points, if the )EM(XPA_ACLFILE)ES( file does
-not exist.  The default acl is: )EM($host:* $host +)ES(, meaning that
-all processes on the host machine have full access to all access points.
-
-)0 P()0 DT()BD(XPA_HOST)ES(
-)DD(For the INET socket method, XPA utilizes the canonical hostname \201as
-returned by the gethostname\201\202 routine\202 to construct the IP part of the
-method id. Under some circumstances, this might not be a correct choice
-of name and IP. For example, if an XPA server is started on a machine
-running VPN, you might want to use the VPN name and IP instead of the
-canonical host name, so that other machines in the VPN network can
-access the server. In this case, you can set the XPA_HOST to be
-the VPN name \201if resolvable\202 or, more easily, the VPN IP.
-
-)0 P()0 DT()BD(XPA_IOCALLSXPA)ES(
-)DD( 
-Setting this variable causes all XPA socket IO calls to process
-outstanding XPA requests whenever the primary socket is not ready for
-IO. This means that a server making a client call will \201recursively\202
-process incoming server requests while waiting for client completion.
-This inter-IO XPA processing avoids a rare
-)0 26 1 A(XPA Race Condition)26 0 TN TL()Ec /AF f D(: two or more
-XPA servers sending messages to one another using an XPA client
-routine such as XPASet\201\202 can deadlock while each waits for the other
-server to respond. This can happen, for example, if the servers call
-XPAPoll\201\202 with a time limit, and send messages in between the polling call.
-
-)0 P(By default, this option is turned off, because we judge that the added
-code complication and overhead involved will not be justified by the
-amount of its use.  Moreover, processing XPA requests within socket IO
-can lead to non-intuitive results, since incoming server requests will
-not necessarily be processed to completion in the order in which they
-are received.
-
-)0 P()0 DT()BD(XPA_LOGNAME)ES(
-)DD(XPA preferentially uses the de facto standard environment variable
-LOGNAME to determine the username when registering an access point in
-the name server. If this environment variable has been used for
-something other than the actual user name \201such as a log file name\202,
-unexpected results can ensue. In such cases, use the XPA_LOGNAME
-variable to set the user name. \201If neither exists, then getpwuid\201geteuid\201\202\202
-is used as a last resort\202.
-
-)0 P()0 DT()BD(XPA_LONG_TIMEOUT)ES(
-)DD( XPA is designed to allow data to be sent from one process to
-another over a long period of time \201i.e., a program that generates
-image data sends that data to an image display, but slowly\202 but it
-also seeks to prevent hangs. This is done by supporting 2 timeout
-periods: a )EM(short)ES( timeout for protocol communication
-and a )EM(long)ES( for data communication.
-)0 P(The )EM(XPA_LONG_TIMEOUT)ES( variable controls the )EM(long)ES(
-timeout and is used to prevent hangs in cases where communication
-between the client and server that is )EM(not)ES( controlled by the
-XPA interface itself. Transfer of data between client and server, or a
-client's wait for a status message after completion of the server
-callback, are two examples of this sort of communication. By default,
-the )EM(long)ES( timeout is set to 180 seconds.
-Setting the value to -1 will disable )EM(long)ES( timeouts and allow
-an infinite amount of time.
-
-)0 P()0 DT()BD(XPA_MAXHOSTS)ES(
-)DD( The maximum number of access points that the programs 
-)EM(xpaset)ES(, )EM(xpaget)ES(, and )EM(xpainfo)ES( will
-communicate with at one time. The default is 64, meaning, for
-example, that the )EM(xpaset)ES( program will not send a message
-to more than 100 access points at one time and )EM(xpaget)ES( will
-not retrieve from more than 100 access points at one time.
-
-)0 P()0 DT()BD(XPA_METHOD)ES(
-)DD(Determines the socket connection method used by this session of XPA.
-The choices are: )EM(inet)ES( \201to use INET or Internet-based
-sockets\202, )EM(localhost)ES( \201to use the machines localhost inet
-socket\202, or )EM(local \201unix\202)ES( \201to use UNIX sockets\202. The default
-is )EM(INET)ES(.  Using the )EM(inet)ES( method will allow access
-from other machines \201subject to access controls\202 but using
-)EM(localhost)ES( or )EM(local)ES( will not. Localhost is most useful
-for private access and when the machine in question is not connected
-to the Internet. The unix method also can be used for private access
-and non-Internet connections \201Unix platforms only\202.
-)0 P(Once defined, the first registration of an XPA access point will
-ensure that an instance of the
-)0 14 1 A(XPA Name Server \201xpans\202)14 0 TN TL()Ec /AF f D(
-is running that handles that connection method. All new access points
-will use the new connection method but existing access points will use
-the original method.
-
-)0 P()0 DT()BD(XPA_NSINET)ES(
-)DD( For the )EM(inet)ES( method of socket connection, this variable
-specifies the host and port on which the 
-)0 14 1 A(XPA Name Server \201xpans\202)14 0 TN TL()Ec /AF f D(
-is listens for new access points. The default is )EM($host:$port)ES(,
-meaning that the default XPA port \20114285\202 on the current machine
-\201as returned by gethostname\201\202\202 is used. If several machines were all
-accessing the same XPA access points, you would use this variable to
-specify that they all use the same name server to find out about these
-access points.  For example, a value of )EM(myhost:$port)ES( would
-mean that the xpans name server is running on myhost and uses the
-default port 12345.  All machines would then get the XPA access points
-registered with that name server, subject to access controls.
-)0 P(The port used by xpans to register its XPA access point normally is
-taken to be one greater than the port on which it receives new access
-points from XPA servers. You can specify a specific access point port
-using the syntax machine:port1,port2, i.e., the access point port is
-specified after the comma.  For example, $host:12345,23456 will listen
-for new access ports on 12345 and will accept XPA commands on 23456.
-
-)0 P()0 DT()BD(XPA_NSREGISTER)ES(
-)DD(This boolean variable specifies whether a server registers its XPA
-access point with the specified xpans name server. The default is
-)EM(true)ES(.  If set to )EM(false)ES(, the access point still is
-set up but it is not registered with xpans and therefore cannot be
-accessed by name. \201It can be accessed by method, if the latter is
-known.\202 Note that an access point can be registered later on \201using
--remote or -proxy, for example\202. This variable mainly is useful in
-cases where the Internet configuration is broken \201so that registration
-causes a DNS hang\202 but you still wish to and can use the server with a
-remote xpans \201e.g., ds9's Virtual Observatory capability\202.
-
-)0 P()0 DT()BD(XPA_NSUNIX)ES(
-)DD( For the )EM(local)ES( method of socket connection, this variable
-specifies the name of the Unix file that will be used to access the
-)0 14 1 A(XPA Name Server \201xpans\202)14 0 TN TL()Ec /AF f D(. The default is
-)EM(xpans_unix)ES(. This variable is not usually needed. Note that
-is the )EM(local)ES( socket method is used, then remote machines will
-not be able to access the xpans name server or the registered XPA access
-points.
-
-)0 P()0 DT()BD(XPA_NSUSERS)ES(
-)DD(This variable specifies whether other users' access points will be
-returned by the
-)0 14 1 A(XPA Name Server \201xpans\202)14 0 TN TL()Ec /AF f D( for use by
-)EM(xpaget)ES(, )EM(xpaset)ES(, etc.
-Generally speaking, it is sufficient to run one xpans name server per
-machine and register the access points for all users with that xpans.
-This means, for example, that if you request information from
-ds9 by running:
-) 1 21 PR(  xpaget ds9 colormap)RP(
-you might get information from your own ds9 as well as
-from another user running ds9 on the same machine.  The
-)EM(XPA_NSUSERS)ES( variable controls whether you want such access 
-to the access points of other users.
-By default, only your own access points are returned, so
-that, in the example above, you would only get the colormap information
-from the ds9 you registered. If, however, you had set the value of the
-)EM(XPA_NSUSERS)ES( variable to )EM(eric,fred)ES(, then you would be
-able to communicate with both eric and fred's access points. Note that
-this variable can be overridden using the )EM(-u)ES( switch on the
-)EM(xpaget)ES(, )EM(xpaset)ES(, and )EM(xpainfo)ES( programs.
-
-)0 P()0 DT()BD(XPA_PORT)ES(
-)DD( 
-A semi-colon delimited list of user specified ports to use for specific
-XPA access points. The format is each specification is:
-) 1 28 PR(class:template port1[ port2])RP(
-where )BD(port1)ES( is the main \201command\202 port for the access point and
-)BD(port2)ES( is the \201secondary\202 data port. If port2 is not specified,
-it defaults to a value of 0 \201meaning the system assigns the port\202.
-
-)0 P(Specification of specific ports is useful, for example, when a machine
-outside a firewall needs to communicate with a machine inside a
-firewall. In such a case, the firewall should be configured to allow
-socket connections to both the command and data port from the outside
-machine, and the inside XPA program should be started up with the
-outside machine in its ACL list. Then, when the inside program is
-started with specified ports, outside XPA programs can use
-"machine:port" to contact the inside access points, instead of the
-access point names. That is, the machine outside the firewall does not
-need access to the XPA name server:
-) 2 62 PR(export XPA_PORT="DS9:ds9 12345 12346"   # on machine "inside"
-cat foo.fits | xpaset inside:12345 fits # on machine "outside")RP(
-Note that 2 ports are required for full XPA communication and
-therefore 2 ports should be specified to go through a firewall.  The
-second port assignment is not important if you simply are assigning
-the command port in order to communicate commands with a known
-port \201e.g., to bypass the xpans name server\202. If only one \201command\202
-port is specified, the system will negotiate a random data port and
-everything will work properly.
-
-)0 P(This support is somewhat experimental. If you run into problems, please
-let us know.
-
-)0 P()0 DT()BD(XPA_PORTFILE)ES(
-)DD( 
-A list of user-specified port to use for specific xpa access points.
-The format of the file is:
-) 1 28 PR(class:template port1 [port2])RP(
-where )BD(port1)ES( is the main port for the access point and
-)BD(port2)ES( is the data port. If port2 is not specified, it defaults
-to a value of 0 \201meaning the system assigns the port\202.  See
-)BD(XPA_PORT)ES( above for an explanation of user-specified ports.
-
-)0 P()0 DT()BD(XPA_SHORT_TIMEOUT)ES(
-)DD( XPA is designed to allow data to be sent from one process to
-another over a long period of time \201i.e., a program that generates
-image data sends that data to an image display, but slowly\202 but it
-also seeks to prevent hangs. This is done by supporting 2 timeout
-periods: a )EM(short)ES( timeout for protocol communication
-and a )EM(long)ES( for data communication.
-)0 P(The )EM(XPA_SHORT_TIMEOUT)ES( variable
-controls the )EM(short)ES( timeout and is used to prevent hangs
-in cases where the XPA protocol requires internal communication between
-the client and server that is controlled by the XPA interface
-itself. Authentication is an example of this sort of communication,
-as is the establishment of a data channel between the two processes.
-The default value for the )EM(short)ES( is 30 seconds \201which is
-a pretty long time, actually\202. Setting the value to -1 will disable
-)EM(short)ES( timeouts and allow an infinite amount of time.
-
-)0 P()0 DT()BD(XPA_SIGUSR1)ES(
-)DD( If the value of this variable is )EM(true)ES(, then XPA will
-catch SIGUSR1 signals when performing an I/O operation in order to
-curtail that operation. This facility allows users to send a SIGUSR1
-signal to an XPA server if a client is hanging up the server by
-sending or receiving data too slowly \201timeouts also can be used -- see
-above\202. When enabled in this way, the SIGUSR1 signal is ignored at all other
-times, so that its safe to send the signal at any time.  If the
-variable is set to )EM(false)ES(, then SIGUSR1 is not used at
-all. Turning off SIGUSR1 would be desired in cases there the program
-uses SIGUSR1 for some other reason and does not want XPA interfering.
-The default is to use the signal.
-
-)0 P()0 DT()BD(XPA_TIMESTAMP_ERRORS)ES(
-)DD( If )EM(XPA_TIMESTAMP_ERRORS)ES( is )EM(true)ES(, then error
-messages will include a date/time string.  This can be useful when
-XPA errors are being saved in an error log \201e.g. Web/CGI use\202. The
-default is false.)LD(
-
-)0 P()0 DT()BD(XPA_TMPDIR)ES(
-)DD( This variable specifies the directory into which XPA logs, Unix
-socket files \201when )EM(XPA_METHOD)ES( is )EM(local)ES(\202, etc. are
-stored. The default is )EM(/tmp/.xpa)ES(.
-
-)0 P()0 DT()BD(XPA_VERBOSITY)ES(
-)DD( Specify the verbosity level of error messages. If the value is
-set to )EM(0)ES(, )EM(false)ES(, or )EM(off)ES(, then no error
-messages are printed to stderr.  If the value is )EM(1)ES(, then
-important XPA error messages will be output.  If the value is
-set to )EM(2)ES(, XPA warnings about out-of-sync messages will also
-be output.  These latter almost always can be ignored.
-
-)0 P()0 DT()BD(XPA_VERSIONCHECK)ES(
-)DD( Specify whether a new access point should check its major and minor XPA
-version number against the version used by the xpans name server at
-registration time. The default is )EM(true)ES(. When checking is
-performed, a warning is issued if the server major version is found to
-be greater than the xpans version. Note that the check is performed
-both by the XPA server and by the xpans process and warnings will be
-issued by each.  Also, instead of the values of )EM(true)ES( or
-)EM(false)ES(, you can give this variable an integer value n. In this
-case, each version checking process \201i.e., the XPA-enabled server or
-xpans\202 will print out a maximum of n warning messages \201after which
-version warnings are silently swallowed\202.
-)0 P(In general, it is a bad idea to run an XPA-enabled server program
-using a version of XPA newer than the basic xpaset, xpaget, xpaaccess,
-xpans programs. This sort of mismatch usually will not work due to
-protocol changes.
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 96 H(Last)WB 163 Sn( updated: December 23, 2009)EH(
-
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (acl.html) D
-/Ti (XPA Access Control) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 41 Sn(
-
-
-)0 2 97 H(XPAAcl:)WB 165 Sn()WB 164 Sn( Access Control for XPA Messaging)EA()EH(
-
-
-)0 2 98 H(Summary)WB 166 Sn()EH(
-)0 P(XPA supports host-based access control for each XPA access point.  You
-can enable/disable access control using the XPA_ACL environment
-variable. You can specify access to specific XPA access points for
-specific machines using the XPA_DEFACL and XPA_ACLFILE environment
-variables. By default, an XPA access point is accessible only to
-processes running on the same machine \201same as X Windows\202.
-
-
-)0 2 99 H(Description)WB 167 Sn()EH(
-)0 P(When INET sockets are in use \201the default, as specified by the
-)EM(XPA_METHOD)ES( environment variable\202, XPA supports a host-based
-access control mechanism for individual access points. This mean that
-access can be specified for get, set, or info operations for each
-access point on a machine by machine basis.  For LOCAL sockets, access
-is restricted \201by definition\202 to the host machine.
-
-)0 P(XPA access control is enabled by default, but can be turned off by
-setting the )EM(XPA_ACL)ES( environment variable to )EM(false)ES(.
-In this case, any process can access any XPA server.
-
-)0 P(Assuming that access control is turned on, the ACL for an individual
-XPA access point is set up when that access point is registered
-\201although it can be changed later on; see below\202. This can be done in
-one of two ways:
-
-Firstly, the )EM(XPA_ACLFILE)ES( environment variable can defined to
-point to a file of access controls for individual access points. The format
-of this file is:
-) 1 18 PR( class:name ip acl)RP(
-The first argument is a template that specifies the class:name of the
-access point covered by this ACL. See
-)0 3 1 A(XPA Access Points and Templates)3 0 TN TL()Ec /AF f D(
-for more information about xpa templates.
-
-)0 P(The second argument is the IP address \201in human-readable format\202 of
-the machine which is being given access.  This argument can be
-)EM(*)ES( to match all IP addresses.  It also can be )EM($host)ES(
-to match the IP address of the current host.
-
-)0 P(The third argument is a string combination of )EM(s)ES(, )EM(g)ES(,
-or )EM(i)ES( to allow )EM(xpaset)ES(, )EM(xpaget)ES(, or
-)EM(xpainfo)ES( access respectively.  The ACL argument can be
-)EM(+)ES( to give )EM(sgi)ES( access or it can be )EM(-)ES( to turn
-off all access.
-
-)0 P(For example,
-) 3 21 PR(  *:xpa1  somehost sg
-  *:xpa1  myhost +
-  * * g)RP(
-will allow processes on the machine somehost to make xpaget and xpaset calls,
-allow processes on myhost to make any call, and allow all other hosts to
-make xpaget \201but not xpaset\202 calls.
-
-Secondly, if the )EM(XPA_ACLFILE)ES( does not exist, then a single
-default value for all access points can be specified using the
-)EM(XPA_DEFACL)ES( environment variable.  The default value for this
-variable is:
-) 1 34 PR(  #define XPA_DEFACL "*:* $host +")RP(
-meaning that all access points are fully accessible to all processes
-on the current host. Thus, in the absence of any ACL environment variables,
-processes on the current host have full access to all access points
-created on that host. This parallels the X11 xhost mechanism.
-
-)0 P(Access to an individual XPA access point can be changed using the -acl
-parameter for that access point.  For example:
-) 1 34 PR(  xpaset -p xpa1 -acl "somehost -")RP(
-will turn off all access control for somehost to the xpa1 access point, while:
-) 1 38 PR(  xpaset -p XPA:xpa1 -acl "beberly gs")RP(
-will give beberly xpaget and xpaset access to the access point whose
-class is XPA and whose name is xpa1.
-)0 P(Similarly, the current ACL for a given access point can be retrieved using:
-) 1 18 PR(  xpaget xpa1 -acl)RP(
-Of course, you must have xpaget access to this XPA access point to
-retrieve its ACL.
-
-)0 P(Note that the XPA access points registered in the )EM(xpans)ES(
-program also behave according to the ACL rules.  That is, you cannot
-use xpaget to view the access points registered with xpans unless
-you have the proper ACL.
-
-)0 P(Note also when a client request is made to an XPA server, the access
-control is checked when the initial connection is established.  This
-access in effect at this time remains in effect so long as the client
-connection is maintained, regardless of whether the access fro that
-XPA is changed later on.
-
-)0 P(We recognize that host-based access control is only relatively secure
-and will consider more stringent security \201e.g., private key\202 in the
-future if the community requires such support.
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 100 H(Last)WB 168 Sn( updated: September 10, 2003)EH(
-
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (changelog.html) D
-/Ti (XPA ChangeLog) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 42 Sn(
-)0 2 101 H(XPA)WB 169 Sn( ChangeLog)EH(
-
-)0 P(This ChangeLog covers the XPA 2 implementation. It will be updated
-as we continue to develop and improve XPA.  The up-to-date version can be 
-found )R1 2 A(here)EA(.
-
-)0 2 102 H()WB 170 Sn( Public Release 2.1.15 \201July 23, 2013\202)EH(
-)UL()0 P()-1 LI( Added support for large data transfers
-)0 P()-1 LI( XPAGet and XPASet now pass size_t instead of int for lengths
-)0 P()-1 LI( Send and receive callbacks now pass size_t instead of int for lengths
-)0 P()-1 LI( Port to mingw \201Windows\202)LU(
-
-
-)0 2 103 H()WB 171 Sn( Public Release 2.1.14 \201June 7, 2012\202)EH(
-)UL()0 P()-1 LI( Fixed several memory leaks in the Tcl wrappers \201tcl.c\202.
-)0 P()-1 LI( Use Tcl stubs library for linking shared Tcl, if available.)LU(
-
-)0 2 104 H()WB 172 Sn( Public Release 2.1.13 \201April 14, 2011\202)EH(
-)UL()0 P()-1 LI( An atexit handler is no longer installed automatically \201it crashes
-Tcl 8.5.8 applications\202. Call XPAAtExit\201void\202 to install the handler.
-)0 P()-1 LI( Removed permission checking from Find\201\202 on cygwin systems. This was broken
-by Windows 7.
-)0 P()-1 LI( Removed addition of -no-cpp-precomp flag from gcc 4.2 and beyond \201Mac\202.)LU(
-
-)0 2 105 H()WB 173 Sn( Public Release 2.1.12 \201January 26, 2010\202)EH(
-)UL()0 P()-1 LI( Added XPA_HOST environment variable to allow users to specify
-the hostname \201and hence, ip\202 component of the INET method id. This is
-useful, for example, if you want to register an access point using a
-VPN-generated IP instead of the canonical IP.
-)0 P()-1 LI( Fix typo in Tcl binding to xpainfo causing a crash after 2 invocations.)LU(
-
-)0 2 106 H()WB 174 Sn( Public Release 2.1.11 \201December 7, 2009\202)EH(
-)UL()0 P()-1 LI( Generalized XPANSKeepAlive\201\202 to send messages to xpans, proxy xpans, or
-both. The default is to send just to proxies \201e.g. chandra-ed\202.
-)0 P()-1 LI( Changed XPANSKeepAlive\201\202 to send an in-band new-line char to
-xpans, changed xpans to handle an in-band new-line as a keep-alive
-message. Necessitated by Cisco routers that clear the URG flag in
-a TCP packet, breaking OOB data transfer for the whole Internet, as
-well as the OOB-based keep-alive implemented in xpans.
-)0 P()-1 LI( In xpans, print warning when the keep-alive option switch is used.
-)0 P()-1 LI( Port to mingw \201thanks to B.Schoenhammer\202
-)0 P()-1 LI( Change OOB character sent by xpans keepalive to a space, trying to working around cisco routers that force OOB data into the inbound stream.
-)0 P()-1 LI( fix gcc fprintf warning in xpans.c)LU(
-
-)0 2 107 H()WB 175 Sn( Public Release 2.1.10 \201September 1, 2009\202)EH(
-)UL()0 P()-1 LI( Update mklib and configure.ac to support 64-bit builds on Macs.
-)0 P()-1 LI( Fixed bug in XPAAccess\201\202 in which the returned names could have an extra
-\201bogus\202 character when the target is an explicit ip:port or local socket file.
-)0 P()-1 LI( Add setjmp/longjmp support to xalloc.
-)0 P()-1 LI( Add XPASaveJmp\201void *env\202 as a high-level interface to xalloc_savejmp\201\202;)LU(
-
-)0 2 108 H()WB 176 Sn( Internal Release 2.1.9)EH(
-)UL()0 P()-1 LI( Fixed a bug that prevented an access point starting with a number
-from being recognized peoperly. NB: a pure number still signifies a
-port on the current machine. Also num:num signifies ip:port, where ip
-can be a pure hex value or the canonical form vvv.xxx.yyy.zzz.
-)0 P()-1 LI( Modified internal Launch\201\202 routine to use posix_spawn\201\202, if necessary.
-This is required for OS X 10.5 \201leopard\202, which frowns upon use of fork\201\202
-and exec\201\202. Also modified zprocess routines to use Launch\201\202.
-)0 P()-1 LI( Added XPASetFree\201xpa, void \201*myfree\202\201void *\202\202 routine to allow callbacks
-to specify a free routine other than malloc free \201e.g. Perl garbage collection\202.
-)0 P()-1 LI( XPACmdAdd\201\202 now checks to ensure that it was passed an XPA struct created
-by XPACmdNew\201\202.
-)0 P()-1 LI( Change launch.h to xlaunch.h to avoid conflict with OS X.)LU(
-
-)0 2 109 H()WB 177 Sn( Public Release 2.1.8 \2011 November 2007\202)EH(
-)UL()0 P()-1 LI( A public release to complete current XPA development work.)LU(
-
-)0 2 110 H()WB 178 Sn( Patch Release 2.1.7b[1,2] \201Feb 22, 2006; March 8, 2007\202)EH(
-)UL(
-)0 P()-1 LI( Added a convenience null to the end of the buffers returned by XPAGet.
-
-)0 P()-1 LI( Added code to avoid calling atexit routine if a fork'ed child
-calls exit\201\202 instead of _exit\201\202.
-
-)0 P()-1 LI( Added XPA_CLIENT_DOXPA environment variable to turn off client
-processing of xpa server requests.
-
-)0 P()-1 LI( Added --version to xpaset, xpaget, xpainfo, xpaaccess, xpans to
-display XPA version and exit.
-
-)0 P()-1 LI( Added support for integrating XPA into a Gtk loop.
-
-)0 P()-1 LI( xpaaccess now returns its answer in the error code as well as to stdout
-\201without the -n switch, it returns 1 for a match, with the -n switch,
-the number of matches is returned\202.
-
-)0 P()-1 LI( Fixed bug which prevented xpans from being started up automatically
-by an xpa server if its pathname contained a space character.
-
-)0 P()-1 LI( Fixed bug in MINGW port of xpans in which an XPA server that
-terminated via an interrupt was not being properly removed from the
-list of registered access points.
-
-)0 P()-1 LI( Added XPA_LOGNAME to override LOGNAME when registering username
-
-)0 P()-1 LI( Upgraded swish-e indexing code to 2.4.5.
-)LU(
-
-)0 2 111 H()WB 179 Sn( Patch Release 2.1.6 \2014 May 2005\202)EH(
-)UL(
-)0 P()-1 LI( Added -P switch to xpans to enable experimental proxy support
-\201default is disabled\202.  An argument of 1 processes proxy requests in
-the same thread as xpans requests, while an argument of 2 processes
-proxy requests in a separate thread. \201The latter is recommended to
-avoid xpans timeouts, since xpa callback processing can take a long
-time.\202
-
-)0 P( 
-)-1 LI( Added ability to build shared libraries \201done automatically with
-configure --enable-shared\202 with compilers other than gcc.
-
-)0 P()-1 LI( Made yet another attempt to build shared libraries under OS X.
-
-)0 P()-1 LI( Fixed a server bug in Tcl support under Windows \201introduced early
-in 2.1.6\202 which caused an occasional SEGV.
-
-)0 P()-1 LI( Fixed race condition in cases where 2 or more servers makes client calls
-to one another.
-
-)0 P()-1 LI( Fixed bug in the XPA handler routine in which an access point was
-turned off if an error occurred in that routine \201as opposed to the
-user-defined callback routine\202.
-
-)0 P()-1 LI( Fixed race condition when "ack=false" flag \201or -n\202 is used with XPASet\201\202
-\201or xpaset\202.
-
-)0 P()-1 LI( Added defensive code to XPA handler to ensure that the passed XPA record
-is valid.
-
-)0 P()-1 LI( Tcl/XPA servers such as ds9 were not turning off select\201\202 on the
-xpa channels inside an xpa callback, as required. This is now fixed.
-
-)0 P()-1 LI( Added timestamps to most server and client error messages if the
-XPA_TIMESTAMP_ERRORS variable is set. This is useful when XPA errors are
-being logged in an error log \201e.g. Web/CGI use\202.
-
-)0 P()-1 LI( Generated PostScript and PDF versions of the help pages.
-
-)0 P()-1 LI( Moved OPTIONS section before \201often-lengthy\202 DESCRIPTION section in
-man pages.
-
-)0 P()-1 LI( All memory allocation now performs error checking on the result.
-
-)0 P()-1 LI( Removed some compiler warnings that surfaced when using gcc -O2.
- 
-)0 P()-1 LI( Updated configure.ac to better support Tcl in Panther with Apple
-Frameworks.
-)LU(
-
-)0 2 112 H()WB 180 Sn( Patch Release 2.1.5 \20112 January 2004\202)EH(
-)UL(
-)0 P()-1 LI( Fixed bug in XPAPoll\201\202. Erroneously, no requests were being
-processed when maxreq==0. Now, all pending events are processed, as
-per the documentation.
-
-)0 P()-1 LI( Added ack=false to XPAInfo\201\202 \201and corresponding -n to xpainfo\202
-so that client does not wait for a response from the server. This is
-essential in cases where XPA servers wish to send info messages to
-one another without causing a race condition.
-
-)0 P()-1 LI( Generated man pages from the html pages. These are installed
-automatically at build time.
-
-)0 P()-1 LI( The xpans program with Unix sockets now uses a lock file to signal
-that it is running, in order to avoid a potential \201but rare\202 race
-condition at startup.
-
-)0 P()-1 LI( Code that calls Unix-type bind\201\202 now manipulate umask\201\202 to ensure that
-all users have write permissions to the socket file \201OS X apparently uses
-these permissions while previous platforms ignore them\202.
-
-)0 P()-1 LI( Configure now checks for socklen_t type \201OS X does not define it\202.
-
-)0 P( 
-)-1 LI( Added an atexit function to run XPAFree. The aim here is to delete Unix
-socket files on exiting.
-
-)0 P()-1 LI( Under Windows, the Tcl event-handling code now blocks for 1/1000 of a
-second instead of not blocking at all \201which inadvertently used 100% of cpu\202.
-
-)0 P()-1 LI( Upgraded Tcl/Tk support to 8.4.
-
-)0 P()-1 LI( Made another round of checks was made through all instances of
-strcat, strcpy, etc. to look for potential buffer overflows.  Changed
-all instances of sprintf\201\202 to snprintf\201\202.
-
-)0 P()-1 LI( Class and name designators are now limited to 1024 characters, for
-no particular reason.
-
-)0 P()-1 LI( The obsolete $SAORD_BIN variable was being added to the path when
-searching for xpans. This is no longer the case.
-
-)0 P()-1 LI( Fixed non-ANSI compiler errors in both xpa.c and xpans.c.
-
-)0 P()-1 LI( Fixed minor problems to support compilation with g++.
-
-)0 P()-1 LI( Ported to Intel icc and gcc 3.3 compilers.
-
-)0 P()-1 LI( Upgraded autoconf to 2.57. Included in this upgrade is a change that
-makes gcc the default compiler \201use "configure CC=cc" to change this\202.
-Also, by default, the Tcl shared object is no longer automatically built
-if the Tcl libraries are used. Use the --enable-tclshlib switch in 
-configure to enable this feature.
-
-)0 P()-1 LI(  Changed license from public domain to GNU GPL.
-)LU(
-
-)0 2 113 H()WB 181 Sn( Patch Release 2.1.4 \20124 March 2003\202)EH(
-)UL(
-)0 P()-1 LI( Made inet method unique, even when hosts are behind a firewall using
-the same ports \201on different local machines\202.
-
-)0 P()-1 LI( The initial connection from an xpa server to a local xpans now is
-controlled by a timeout \201default 5 sec, controlled by XPA_CONNECT_TIMEOUT
-variable\202. This should prevent a hang on connect\201\202 if the network
-is not set up correctly.
-
-)0 P()-1 LI( Fixed rare race condition when an XPA server callback performed its own
-XPAGet or XPASet call to another XPA server.
-
-)0 P()-1 LI( Use POSIX O_NONBLOCK for non-blocking I/O in fcntl call if it
-exists, instead of O_NDELAY.
-)LU(
-
-)0 2 114 H()WB 182 Sn( Patch Release 2.1.3 \20126 September 2002\202)EH(
-)UL(
-)0 P()-1 LI( Added -k [sec] switch to xpans to support sending one-byte keepalive
-messages from xpans to registered xpa servers.
-
-)0 P()-1 LI( Added XPANSKeepAlive routine \201and Tcl equivalent\202 to allow
-xpa servers to send a one-byte keepalive message to xpans.
-)LU(
-
-)0 2 115 H()WB 183 Sn( Patch Release 2.1.2 \20118 July 2002\202)EH(
-)UL(
-)0 P()-1 LI( The "-help" reserved command now also displays the XPA version, if
-no explicit sub-commands are specified.
-
-)0 P()-1 LI( Change internal state of xpans proxy to save ip:port value of a
-server behind a NAT firewall. This is required to give some hope of
-distinguishing multiple instances of ds9 running behind NAT.
-)LU(
-
-)0 2 116 H()WB 184 Sn( Patch Release 2.1.1 \20120 June 2002\202)EH(
-)UL(
-)0 P()-1 LI( Added a version check between xpans and an access point,
-performed when it gets registered by an XPA server.  If the server
-has a version greater than the xpans version, a warning is issued by
-both programs.
-
-)0 P()-1 LI( Added a boolean XPA_NSREGISTER environment variable to allow an
-XPA server to skip xpans registration. The default is to register with
-the name server.  If set to "false", the access point still is set up
-but it is not registered with an xpans. It can be registered later on
-\201using -remote or -proxy, for example\202.
-
-)0 P()-1 LI( Fixed bug in which xpans was still listening on any interface when
-XPA_METHOD was localhost \201instead of just listening on localhost\202.
-)LU(
-
-)0 2 117 H()WB 185 Sn( Public Release 2.1.0 \20122 April 2002\202)EH(
-
-)0 P(New features include:
-
-)UL()0 P()-1 LI( Support for proxy access to XPA servers \201e.g. ds9\202 situated
-behind a firewall \201useful for NVO-type applications\202.
-
-)0 P()-1 LI( Improved support for allowing remote machines access rights to the
-XPA access points \201useful for NVO-type applications\202.
-
-)0 P()-1 LI( Ability for XPAAccess\201\202 routine and xpaaccess program to contact XPA
- directly.
-
-)0 P()-1 LI( Support for a clipboard access point that allows clients to store ASCII
-state information in an XPA-enabled server.
-
-)0 P()-1 LI( Improved support for Windows platform, as well as new support for Mac OSX.)LU(
-
-)0 2 118 H()WB 186 Sn( Pre-Release 2.1.0e \2012 April 2002\202)EH(
-)UL(
-)0 P()-1 LI( Removed the environment variable generated by each XPA access
-point \201of the form XPA_name=method\202. The putenv\201\202 call was causing ds9
-to crash under both Linux and LinuxPPC during a socket operation. We
-suspect a bug in putenv but cannot prove it and this feature is not
-essential, so ...
-)LU(
-
-)0 2 119 H()WB 187 Sn( Pre-Release 2.1.0e \2011 April 2002\202)EH(
-)UL(
-)0 P()-1 LI( Fixed an uninitialized variable in xpamb which prevented it from
-working at all on some systems.
-
-)0 P()-1 LI( Changed xpamb switch from "-add" to "-data" \201to store named data\202.
-
-)0 P()-1 LI( Changed how xpamb works with xpaget so that xpamb can return data
-from XPA access points as well as from stored data. \201Previous versions
-only returned stored data.\202 Now, you can retrieve stored data
-explicitly using the -info and/or -data switches. For example:
-) 1 24 PR(  xpaget xpamb -info foo)RP(
-will return info about the previously stored data named foo. If
-neither switch is present, then the name is assumed to be an XPA access
-point.)LU(
-
-)0 2 120 H()WB 188 Sn( Pre-Release 2.1.0e \20125 March 2002\202)EH(
-)UL(
-)0 P()-1 LI( Changed symbol for default port from "*" to "$port" to avoid
-a syntactical conflict between class:* and machine:* when processing an
-XPA access point class:name specification. Thus, the default inet
-method now is '$host:$port' instead of '$host:*'.
-)LU(
-
-)0 2 121 H()WB 189 Sn( Pre-Release 2.1.0e \20119 March 2002\202)EH(
-)UL(
-)0 P()-1 LI( Removed timeout check when reading data \201in clients using xpaget
-and servers filling the data buffer\202. We have more and more cases
-where we need to wait a long time to retrieve data \201e.g., slow
-networks or receiving data being compressed on the fly\202.
-
-)0 P()-1 LI( Moved call to sigaction\201SIGCHLD,...\202 out of XPAOpen\201\202, so that it
-is only executed when needed by XPAGet\201\202/XPASet\201\202 routines called from
-within xpans/proxy. But then changed logic to use a double fork\201\202 instead
-of sigaction\201\202 to prevent zombies \201Stevens Adv. Programming p 202\202.
-
-)0 P()-1 LI( Each XPA access point now generates an environment variable of the
-form XPA_name=method so that children can communicate with the parent access
-point more easily.
-
-)0 P()-1 LI( Added version option to Tcl xparec:
-) 5 44 PR(  if [catch { xparec "" version } version] {
-    puts "pre-2.1.0e"
-  } else {
-    puts [split $version .]
-  })RP(
-to help differentiate between XPA versions within Tcl code.
-)LU(
-
-)0 2 122 H()WB 190 Sn( Pre-Release 2.1.0e \20114 February 2002\202)EH(
-)UL()0 P()-1 LI( Fixed client handling of out-of-sync messages.)LU(
-
-)0 2 123 H()WB 191 Sn( Pre-Release 2.1.0e \20111 February 2002\202)EH(
-)UL(
-)0 P()-1 LI( Fixed client.c/xopen\201\202 so that it does not open an extra socket.
-
-)0 P()-1 LI( Fixed xpainfo/xopen\201\202 to prevent client from hanging waiting for ack.
-
-)0 P( 
-)-1 LI( Modified stest to generate xpaaccess points xpa, xpa1, c_xpa, and
-i_xpa \201or more generally, , 1, c_, i\202 to allow
-more flexible testing of templates. Also added -a for testing XPAAccess\201\202.
-)LU(
-
-)0 2 124 H()WB 192 Sn( Beta Release 2.1.0b10 \20131 January 2002\202)EH(
-)UL(
-)0 P()-1 LI( Added support for Mac OSX/Darwin to configure file.
-)LU(
-
-)0 2 125 H()WB 193 Sn( Beta Release 2.1.0b9 \20126 January 2002\202)EH(
-)UL(
-)0 P()-1 LI( Fixed bug in client library that caused XPAAccess\201\202 call to hang.
-)LU(
-
-)0 2 126 H()WB 194 Sn( Beta Release 2.1.0b8 \2014 January 2002\202)EH(
-)UL(
-)0 P()-1 LI( Made modifications to Makefile.in to make releases easier.
-
-)0 P()-1 LI( Added instructions to Makefile.in so that xpa.h will always have
-correct #defines for XPA_VERSION, XPA_MAJOR_VERSION, XPA_MINOR_VERSION,
-and XPA_PATCH_LEVEL.
-)LU(
-
-)0 2 127 H()WB 195 Sn( Beta Release 2.1.0b7 \20121 December 2001\202)EH(
-)UL(
-)0 P()-1 LI( Added -proxy switch to -remote sub-command to allow remote access
-through a firewall, using xpans as a proxy server. The support for proxy
-processing required a change to the client/server protocol. This means
-that new xpa servers will not work with old xpa clients \201although new
-xpa clients will work with old xpa servers\202. For details about proxy
-firewall support, see http://hea-www.harvard.edu/RD/xpa/inet.html.
-
-)0 P()-1 LI( Fixed Tcl support for XPA under Windows/Cygwin by re-writing
-the code used to add XPA to the Tcl event loop. This fix makes ds9
-support for XPA much more stable under Windows.
-
-)0 P()-1 LI( Added the shutdown\201\202 call to XPA under Cygwin/Windows before
-closing send\201\202 sockets. It appears that a Cygwin recv\201\202 socket call
-does not always sense when the other end closes the socket using
-close\201\202. This measure must be considered a hack, since the actual
-problem was never resolved.
-
-)0 P()-1 LI( Added code to protect accept\201\202 and select\201\202 calls from interrupts.
-
-)0 P()-1 LI( Extended syntax of the environment variable XPA_NSINET to:
-) 1 43 PR(  setenv XPA_NSINET host:port[,port[,port]])RP(
-to allow specification of the XPA access point port for xpans,
-as well as the proxy data port.
-
-)0 P()-1 LI( Modified xpans log file so that it contains the xpaset commands
-required to reconnect with xpa servers.
-
-)0 P()-1 LI( xpans now deletes its Unix socket files.
-)LU(
-
-)0 2 128 H()WB 196 Sn( Beta Release 2.1.0b6 \20129 October 2001\202)EH(
-)UL(
-)0 P()-1 LI( Implemented a reserve public access point named -clipboard so
-that clients can store ASCII state information on any number of named
-clipboards. Clipboards of the same name created by clients on
-different machines are kept separate.  The syntax for creating a
-clipboard is:
-) 3 65 PR(  [data] | xpaset [server] -clipboard add|append [clipboard_name]
-  xpaset -p [server] -clipboard delete [clipboard_name]
-  xpaget [server] -clipboard [clipboard_name])RP(
-Use "add" to create a new clipboard or replace the contents of an existing
-one. Use "append" to append to an existing clipboard.
-)LU(
-
-)0 2 129 H()WB 197 Sn( Beta Release 2.1.0b5 \20122 October 2001\202)EH(
-)UL(
-)0 P()-1 LI( Use FD_SETSIZE instead of getdtablesize\201\202 to determine how many files
-to check during select\201\202;
-
-)0 P()-1 LI( Under Cygwin, the launch\201\202 routine now uses the Cygwin spawnvp\201\202
-instead of fork\201\202/exec\201\202 where possible \201i.e., if no stdfiles are
-being redirected\202. This is recommended by Cygwin's \201skimpy\202 on-line
-documentation and seems to fix the problems ds9 had when starting xpans
-automatically.
-
-)0 P()-1 LI( Added error check to select\201\202 call in xpans.
-)LU(
-
-)0 2 130 H()WB 198 Sn( Beta Release 2.1.0b4 \20124 September 2001\202)EH(
-)UL(
-)0 P()-1 LI( The launch\201\202 now can return an error code if the execv\201\202 system
-call fails \201something system\201\202 does not do\202.
-
-)0 P()-1 LI( INET socket calls between xpa clients and servers now will use
-localhost if they are on the same machine. This protects against
-Linux systems where the hostname is hardwired \201wrongly\202 in a DHCP
-environment.
-)LU(
-
-)0 2 131 H()WB 199 Sn( Beta Release 2.1.0b3 \2016 September 2001\202)EH(
-)UL(
-)0 P()-1 LI( Modified xpans so that, in the case of a firewall, it tries to
-correct the specified ip:port by matching against the ip found in
-the socket packet at accept\201\202 time.
-
-)0 P()-1 LI( Replaced system\201\202 call used to start xpans automatically with
-a special launch\201\202 call, which performs execvp\201\202 directly without going
-through sh. \201launch\201\202 works under DOS and has fewer security problems.\202
-
-)0 P()-1 LI( Fixed bug in xpans in which its xpa port was always being set to 14286.
-)LU(
-
-)0 2 132 H()WB 200 Sn( Beta Release 2.1.0b2 \20117 August 2001\202)EH(
-)UL(
-)0 P()-1 LI(Added support for -remote command, which registers the access
-point in the XPA name server of the specified remote server, and gives
-the remote server access rights to the access point. This is used, for
-example, to give data servers xpa access to ds9 so that data can be
-sent to ds9 as a result of a CGI-based Web query.
-
-)0 P()-1 LI(Reserved commands \201except "-help" and "-version"\202 now can only be
-executed on the machine on which the xpa service is running \201not
-through -remote servers\202.
-
-)0 P()-1 LI(Fixed bug in xpans in which a bad telnet command could hang the program.
-
-)0 P()-1 LI(Added -s [security file] to xpans to allow logging of all external
-connections.
-)LU(
-
-)0 2 133 H()WB 201 Sn( Beta Release 2.1.0b1 \2016 August 2001\202)EH(
-)UL()0 P()-1 LI( The xpaaccess client program and XPAAccess\201\202 client subroutine
-were modified so that an access-type query can directly contact the
-xpa servers matching the requested xpa template, instead of just
-querying the name server for registered access points. This avoid the
-race condition in which an access point is registered but is not yet
-available, perhaps because the server has not yet entered its event
-loop.  Note that the calling sequence of the XPAAccess\201\202 routine was
-changed to return all matching access points and their availability
-status \201instead of just returning the number of registered access
-points\202. Because of this, we are calling this a minor release instead
-of a patch.
-
-)0 P()-1 LI( Added support for XPA_PORT and XPA_PORTFILE environment variables
-to allow specification of the port to be used by the command channel
-\201and data channel, if an optional second port is specified\202 for a given
-access point.
-
-)0 P()-1 LI( Added -m switch to xpaget, xpaset, xpainfo, xpaaccess to allow
-override of the XPA_METHOD environment variable.
-
-)0 P()-1 LI( Changed the default name of the ACL file from xpa.acl to acls.xpa.
-
-)0 P()-1 LI( Fixed bug in which it was not possible to send a "set ACL"
-command to an XPA server which did not have a receive callback \201i.e.,
-did not allow xpaset\202. The xpans program is one such server. It now is
-possible to set the ACL on xpans.
-
-)0 P()-1 LI( We have discovered that Tcl support for datachan and cmdchan is
-broken under Windows due to an unexplained incompatibility between
-Cygwin sockets and Win32 sockets. We therefore have removed datachan
-and cmdchan from the Windows/Tcl support until further notice.
-
-)0 P()-1 LI( Extended the behavior of the XPA_DEFACL environment variable so that
-it can support more than one acl, using a list of semi-colon delimited
-controls such as: setenv XPA_DEFACL '*:* $host +; *:foo1 otherhost +'.
-
-)0 P()-1 LI( Fixed bug in which the class:name specifier "*:*" was erroneously
-trying to access the xpans name server, instead of accessing all
-access points.
-
-)0 P()-1 LI( Support TMPDIR and TMP environment variables as well as XPA_TMPDIR.
-)LU(
-
-)0 2 134 H()WB 202 Sn( Patch Release 2.0.5 \20110 November 2000\202)EH(
-)UL()0 P()-1 LI( Added support for Tcl on Windows where there is no select\201\202-based
-event loop \201i.e., where there is no Tcl_CreateFileHandler call in Tcl\202
-)0 P()-1 LI( Minor fixes in Makefile for installing on Windows
-)0 P()-1 LI( Minor compiler fixes from gcc -Wall.)LU(
-
-)0 2 135 H()WB 203 Sn( Patch Release 2.0.4 \20120 September 2000\202 )EH(
-)UL()0 P()-1 LI( Removed extraneous include of varargs.h from find.c.
-)0 P()-1 LI( Ported to SGI C compiler, which caught lots of unused variables, etc.
-)0 P()-1 LI( Ported to Cygwin/Windows, which required that we change socket read\201\202
-and write\201\202 calls to recv\201\202 and send\201\202 respectively. Also had to ensure that
-we only did socket I/O on sockets \201no fileio\202.)LU(
-
-)0 2 136 H()WB 204 Sn( Patch Release 2.0.3 \20115 June 2000\202 )EH(
-)UL( 
-)0 P()-1 LI( Fixed the client XPASet\201\202 and XPASetFd\201\202 calls to handle the specified
-max number of connections \201they were ignoring this argument, leading to
-memory overwrites\202.
-)0 P()-1 LI( Fixed Makefile.in so that CFLAGS and LDFLAGS are not hard-wired values.
-)0 P()-1 LI( Fixed word.h to load malloc.h and stdlib.h only if they exist.
-)0 P()-1 LI( Documentation fixes to programs.html \201in xpaaccess\202 and client.html
-\201XPANSLookup\202.
-)0 P()-1 LI( Added explicit typecast to strlen\201\202 argument to MAX #define in
-XPAClientStart \201strlen\201\202 is unsigned in Linux, which can break MAX\202.
-)0 P()-1 LI( Removed bogus Imakefile from directory.
-)0 P()-1 LI( Changed directory name to include patch level \201i.e., xpa-2.0.3\202.)LU(
-
-)0 2 137 H()WB 205 Sn( Patch Release 2.0.2 \2019 September 1999\202)EH(
-)UL( 
-)0 P()-1 LI( Fixed server mode \201-s\202 in the xpaset program by properly cleaning up
-the input buffers \201sending commands and data in server mode was broken\202.)LU(
-
-)0 2 138 H()WB 206 Sn( Patch Release 2.0.1 \2016 August 1999\202)EH(
-)UL( 
-)0 P()-1 LI( Fixed the Tcl binding code \201tcl.c\202 for 64-bit machines \201Dec Alpha\202
-\201erroneously used %x instead of %p when converting pointers to ASCII\202.
-)0 P()-1 LI( Got rid of a few compiler warnings on 64-bit machines \201a few are
-unavoidable since we must cast int to void * and back when passing around
-client data\202.)LU(
-
-)0 2 139 H()WB 207 Sn( Public Release 2.0 \20127 May 1999\202)EH(
-)UL( 
-)0 P()-1 LI( "a new day with no mistakes ... yet")LU(
-
-)2 1 1 HR()0 P()0 0 1 A(Index to the XPA Help Pages)0 0 TN TL()Ec /AF f D(
-
-)2 1 1 HR()0 5 140 H(Last)WB 208 Sn( updated: 22 April 2002)EH(
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (examples.html) D
-/Ti (Where to Find Example/Test Code) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 43 Sn(
-
-
-)0 2 141 H(XPACode:)WB 210 Sn()WB 209 Sn( Where to Find Example/Test Code)EA()EH(
-
-
-)0 2 142 H(Summary)WB 211 Sn()EH(
-)0 P(The XPA source code directory contains two test programs,
-)EM(stest.c)ES(, and )EM(ctest.c)ES( that can serve as
-examples for writing XPA servers and clients, respectively.
-They also can be used to test various features of XPA.
-
-
-)0 2 143 H(Description)WB 212 Sn()EH(
-)0 P(To build the XPA test programs, execute:
-) 1 11 PR(   make All)RP(
-in the XPA source directory to generate the )EM(stest)ES( and
-)EM(ctest)ES( programs.  \201NB: this should work on all platforms,
-although we have had problems with unresolved externals on one
-Sun/Solaris machine, for reasons still unknown.\202
-)0 P(The stest program can be executed with no arguments to start
-an XPA server that contains the access points: xpa, xpa1,
-c_xpa \201containing sub-commands cmd1 and cmd2\202, and i_xpa.
-You then can use xpaset and xpaget to interact with these access points:
-) 4 57 PR(  cat xpa.c | xpaset xpa      # send to xpa
-  cat xpa.c | xpaset "xpa*"   # send to xpa and xpa1
-  xpaget xpa                  # receive from xpa
-  xpaget xpa*                 # receive from xpa and xpa1)RP(
-etc. You also can use ctest to do the same thing, or to iterate:
-) 4 66 PR(  ctest -s -l 100 xpa        # send to xpa 100 times
-  ctest -s -l 100 "xpa*"     # send to xpa and xpa1 100 times
-  ctest -g -l 100 xpa        # receive from xpa 100 times
-  ctest -g -l 100 "xpa*"     # receive from xpa and xpa1 100 times)RP(
-More options are available: see the stest.c and ctest.c code itself, which
-were used extensively to debug XPA.
-
-)0 P(The file test.tcl in the XPA source directory gives examples for using the 
-)0 39 1 A(XPATcl)39 0 TN TL()Ec /AF f D(Interface.
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 144 H(Last)WB 213 Sn( updated: September 10, 2003)EH(
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (changes.html) D
-/Ti (Changes For Users from XPA 1.0 and 2.0) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 44 Sn(
-
-
-)0 2 145 H(XPA)WB 215 Sn()WB 214 Sn( Changes: Changes For Users from XPA 1.0 and 2.0)EA()EH(
-
-
-)0 2 146 H(Summary)WB 216 Sn()EH(
-)0 P(This document describes changes that will affect users who migrate
-from XPA 1.0 to XPA 2.0.
-
-
-)0 2 147 H(Description)WB 217 Sn()EH(
-)0 P(There have been a few changes that affect users who upgrade XPA
-from version 1.0 to version 2.0.  These changes are detailed below.
-)UL()0 P()-1 LI(XPA commands no longer have a resolver routine \201this is open to
-negotiations, but we decided the idea was dumb\202.  For the SAOtng
-program, this means that you must explicitly specify the access
-point, i.e.,:
-) 1 35 PR(  cat foo.fits | xpaset SAOtng fits)RP(
-
-)0 P(instead of:
-) 1 30 PR(  cat foo.fits | xpaset SAOtng)RP(
-)0 P()-1 LI(By default, xpaset, xpaget, etc. now wait for the server callback to
-complete; i.e., the old -W is implied \201and the switch is ignored\202.
-This allows support for better error handling.  If you want xpaset, etc.
-to return before the callback is complete, use -n switch:
-) 1 41 PR(  echo "file foo.fits" | xpaset -n SAOtng)RP(
-)0 P()-1 LI(The old -w switch in xpaset and xpaget is no longer necessary \201and is
-ignored\202, since you can have more than one process communicating with
-an xpa access point at one time.
-
-)0 P()-1 LI(The new -p switch on xpaset means you need not read from stdout:
-) 2 30 PR(              
-  xpaset -p SAOtng colormap I8)RP(
-)0 P(will send the paramlist to the SAOtng callback without reading from stdin.
-)LU(
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 148 H(Last)WB 218 Sn( updated: September 10, 2003)EH(
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (convert.html) D
-/Ti (Converting the XPA API to 2.0) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 45 Sn(
-
-
-)0 2 149 H(XPAConvert:)WB 220 Sn()WB 219 Sn( Converting the XPA API to 2.0)EA()EH(
-
-
-)0 2 150 H(Summary)WB 221 Sn()EH(
-)0 P(This document describes tips for converting from xpa 1.0 \201Xt-based
-xpa\202 to xpa 2.0 \201socket-based xpa\202.
-
-
-)0 2 151 H(Description)WB 222 Sn()EH(
-)0 P(The following are tips for converting from xpa 1.0 \201Xt-based xpa\202 to
-xpa 2.0 \201socket-based xpa\202. The changes are straight-forward and
-almost can be done automatically \201we used editor macros for most of
-the conversion\202.
-)UL()0 P()-1 LI(The existence of the cpp XPA_VERSION directive to distinguish between 1.0
-\201where it is not defined\202 and 2.0 \201where it is defined\202.
-
-)0 P()-1 LI(Remove the first widget argument from all send and receive server
-callbacks.  Also change first 2 arguments from XtPointer to void
-*. For example:
-) 16 74 PR(#ifdef XPA_VERSION
-static void XPAReceiveFile\201client_data, call_data, paramlist, buf, len\202
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     int len;
-#else
-static void XPAReceiveFile\201w, client_data, call_data, paramlist, buf, len\202
-     Widget w;
-     XtPointer client_data;
-     XtPointer call_data;
-     char *paramlist;
-     char *buf;
-     int len;
-#endif)RP(
-)0 P()-1 LI(Server callbacks should be declared as returning int instead
-of void. They now should return 0 for no errors, -1 for error.
-
-)0 P()-1 LI( The mode flags have changed when defining XPA server callbacks.
-The old )EM(S)ES( flag \201save buffer\202 is replaced by )EM(freebuf=false)ES(.
-The old )EM(E)ES( flag \201empty buffer is OK\202 is no longer used \201it
-was an artifact of the X implementation\202.
-
-)0 P()-1 LI(Change NewXPACommand\201\202 to XPAcmdNew\201\202, with the new calling sequence:
-) 1 52 PR(  xpa = NewXPACommand\201toplevel, NULL, prefix, NULL\202;)RP(
-is changed to:
-) 1 32 PR(  xpa = XPACmdNew\201xclass, name\202;)RP(
-)0 P()-1 LI(Change the AddXPACommand\201\202 subroutine name to XPACmdAdd \201with the same
-calling sequence\202:
-) 3 53 PR(  AddXPACommand\201xpa, "file",
-    "\200tdisplay a new file\200n\200t\200t  requires: filename",
-    NULL, NULL, NULL, XPAReceiveFile, text, NULL\202;)RP(
-is changed to:
-) 3 53 PR(  XPACmdAdd\201xpa, "file",
-    "\200tdisplay a new file\200n\200t\200t  requires: filename",
-    NULL, NULL, NULL, XPAReceiveFile, text, NULL\202;)RP(
-)0 P()-1 LI(The XPAXtAppInput\201\202 routine should be called just before XtAppMainLoop\201\202
-to add xpa fds to the Xt event loop:
-) 5 35 PR(  /* add the xpas to the Xt loop */
-  XPAXtAddInput\201app, NULL\202;
-
-  /* process events */
-  XtAppMainLoop\201app\202;)RP(
-)0 P()-1 LI(Change NewXPA\201\202 to XPANew\201\202 and call XPAXtAddInput\201\202 if the XtAppMainLoop
-routine already has been entered:
-) 4 71 PR(  xpa = NewXPA\201saotng->xim->toplevel, prefix, xparoot,
-               "FITS data or image filename\200n\200t\200t  options: file type",
-               XPASendData, new, NULL,
-               XPAReceiveData, new, "SE"\202;)RP(
-is changed to:
-) 6 74 PR(  sprintf\201tbuf, "%s.%s", prefix, xparoot\202;
-  xpa = XPANew\201"SAOTNG", tbuf,
-               "FITS data or image filename\200n\200t\200t  options: file type",
-               XPASendData, new, NULL,
-               XPAReceiveData, new, "SE"\202;
-  XPAXtAddInput\201XtWidgetToApplicationContext\201saotng->xim->toplevel\202, xpa\202;)RP(
-)0 P()-1 LI(Change XPAInternalReceiveCommand\201\202 to XPACmdInternalReceive\201\202
-remove first argument in the calling sequence\202:
-) 3 61 PR(  XPAInternalReceiveCommand\201im->saotng->xim->toplevel,
-                            im->saotng, im->saotng->commands,
-                            "zoom reset", NULL, 0\202;)RP(
-is changed to:
-) 2 57 PR(  XPACmdInternalReceive\201im->saotng, im->saotng->commands,
-                        "zoom reset", NULL, 0\202;)RP(
-)0 P()-1 LI(Change DestroyXPA to XPAFree:
-) 1 26 PR(  DestroyXPA\201im->dataxpa\202;)RP(
-is changed to:
-) 1 23 PR(  XPAFree\201im->dataxpa\202;)RP()LU(
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 152 H(Last)WB 223 Sn( updated: September 10, 2003)EH(
-
-)WB NL
-/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc
-DS
-/Ba f D /BO 0 D Bs
-/UR (name.html) D
-/Ti (What does XPA stand for?) D
-/Au () D
-/Df f D
-/ME [()] D
-
-0 BO R
-()1 Sl()WB 46 Sn(
-
-
-)0 2 153 H(XPAName:)WB 225 Sn()WB 224 Sn( What does XPA stand for?)EA()EH(
-
-
-)0 2 154 H(Summary)WB 226 Sn()EH(
-)0 P(What does XPA stand for? Who knows anymore!
-
-
-)0 2 155 H(Description)WB 227 Sn()EH(
-)0 P(What does XPA stand for? Dunno! The XPA messaging system originally
-was built on top of the X Window System and XPA was the mnemonic for
-)EM(X Public Access)ES(, to emphasize that we were providing public
-access to previously private data and algorithms in Xt programs.  Now
-that XPA no longer is tied to X, it can be argued that we ought to
-change the name \201how about )EM(SPAM: simple public access mechanism)ES(\202, but XPA is in wide-spread use in the astronomical community of
-its birth, and the name has taken on a life of its own. If anyone can
-think of what XPA now means, please let us know.
-
-)0 P(If you think this is bad, consider the MMT Telescope on Mount Hopkins,
-Arizona. When first installed twenty years ago, it featured an array
-of six 72-inch diameter mirrors. from which came its name: the
-)EM(Multiple Mirror Telescope)ES(.  In spring of 1999, these mirrors
-were replaced by a single 21 and 1/2 -foot diameter primary mirror,
-the largest single-piece glass reflector on the North American
-continent. And now MMT stands for ... MMT!
-
-
-
-
-
-)0 P()0 0 1 A(Go to XPA Help Index)0 0 TN TL()Ec /AF f D(
-
-)0 5 156 H(Last)WB 228 Sn( updated: September 10, 2003)EH(
-
-)WB NL
-/TE t D NP TU PM 0 eq and{/Pn () D showpage}if end restore
diff --git a/xpa/doc/xpamb.html b/xpa/doc/xpamb.html
deleted file mode 100644
index 79e46e9..0000000
--- a/xpa/doc/xpamb.html
+++ /dev/null
@@ -1,197 +0,0 @@
-<!-- =defdoc xpamb xpamb 1 -->
-<HTML>
-<HEAD>
-<TITLE>The XPA Message Bus (xpamb)</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpamb NAME -->
-<H2><A NAME="xpamb">xpamb: the XPA Message Bus</A></H2>
-
-<!-- =section xpamb SYNOPSIS -->
-<H2>Summary</H2>
-<P>
-The xpamb program can act as a "classical" message bus interface
-between clients and servers. A client can send a data request to
-the message bus, which then interfaces with multiple servers and
-returns the data back to the client.
-
-<!-- =section xpamb DESCRIPTION -->
-<H2>Description</H2>
-<P>
-A "classical" message bus (such as ToolTalk) consists of servers and
-clients, along with a mediating program that transfers data between
-different processes. XPA takes a slightly different approach in that
-communication between clients and servers is direct.  This generally
-is the correct technique when there is only one connection (or even a
-small number of connections), but can become inefficient for the
-serving program if a large amount of data is being transferred to many
-clients. For example, if a real-time data acquisition program is
-broadcasting a FITS image to several clients, it would need to
-transmit that image to each client individually.  This might interfere
-with its own processing cycles.  The preferable mechanism would be to
-pass the image off to an intermediate program that can then broadcast
-the data to the several clients.
-<P>
-The <B>xpamb</B> program can alleviate such problems by functioning
-as a message bus in cases where such an intermediary process is
-wanted.  It pre-defines a single access point named
-<B>XPAMB:xpamb</B> to which data can be sent for re-broadcast. You
-also can tell <B>xpamb</B> to save the data, and associate with that
-data a new access point, so that it can be retrieved later on.
-
-<P>
-All interaction with <B>xpamb</B> is performed through
-<B>xpaset</B> and <B>xpaget</B> (or the corresponding API
-routines, <B>XPASet()</B> and <B>XPAGet()</B>) to the
-<B>XPAMB:xpamb</B> access point. That is, <B>xpamb</B> is just
-another XPA-enabled program that responds to requests from
-clients. The paramlist is used to specify the targets to which
-the data will be for re-broadcast, as well as the re-broadcast paramlist:
-<PRE>
-  data | xpaset xpamb [switches] broadcast-target broadcast-paramlist
-</PRE>
-Optional switches are used to store data, and manipulate stored data,
-and are described below.
-
-<P>
-In its simplest form, you can, for example, send a FITS image to xpamb for
-broadcasting to all ds9 image simply by executing:
-<PRE>
-  cat foo.fits | xpaset xpamb "DS9:*" fits foo.fits
-</PRE>
-Since <B>DS9</B> is the class name for the ds9 image display
-program, this will result in the FITS image being re-sent to all fits
-access points for all active image display programs.
-
-<P>
-You can send stored data and new data to the same set of access points at
-the same time.  The stored data always is send first, followed by the new
-data:
-<PRE>
-  cat foo2.fits | xpaset xpamb -send foo "DS9:*" fits foo.fits
-</PRE>
-will first send the foo.fits file, and then the foo2.fits file to all
-access points of class <B>DS9</B>.  Notice that in this example,
-the foo2.fits file is not stored, but it could be stored by using the
-<B>-store [name]</B> switch on the command line.
-
-<P>
-The <B>xpaget</B> command can be used to retrieve a data from XPA
-access points or from a stored data buffer, or retrieve information
-about a stored data buffer.  If no arguments are given:
-<PRE>
-  xpaget xpamb
-</PRE>
-then information about all currently stored data buffers is returned. This
-information includes the data and time at which the data was stored, the
-size in bytes of the data, and the supplied info string.
-
-<P>
-If arguments are specified, they will be in the form:
-<PRE>
-  xpaget xpamb [-info] [-data] [name [paramlist]]
-</PRE>
-If the optional <B>-info</B> and/or <B>-data</B> switches are specified, then
-information and/or data will be returned for the named data buffer
-following the switches. You can use either or both of these switches
-in a single command. For example, if the -info switch is used:
-<PRE>
-  xpaget xpamb -info foo
-</PRE>
-then the info about that stored data buffer will be returned.
-If the -data is used with a specific name:
-<PRE>
-  xpaget xpamb -data foo
-</PRE>
-then the stored data itself will be returned. If both are used:
-<PRE>
-  xpaget xpamb -info -data foo
-</PRE>
-then the info will be returned, followed by the data. Note that it is an
-error to specify one of these switches without a data buffer name and that
-the paramlist will be ignored.
-
-<P>
-If neither the <B>-info</B> or <B>-data</B> switch is specified, then
-the name refers to an XPA access point (with an optional paramlist
-following).
-For example:
-<PRE>
-  xpaget xpamb ds9 file
-</PRE>
-is equivalent to:
-<PRE>
-  xpaget ds9 file
-</PRE>
-
-<!-- =section xpamb OPTIONS -->
-<H2>Options</H2>
-<P>
-For xpaset, several optional switches are used to save data and
-manipulate the stored data:
-<DL>
-
-<P>
-<DT><B>-data [name]</B>
-<DD> Add the supplied data buffer to a pool of stored data buffers,
-using the specified name as a unique identifier for later retrieval.
-An error occurs if the name already exists (use either <B>replace</B>
-or <B>del</B> to rectify this). The <B>-add</B> switch is supported
-for backwards compatibility with xpa 2.0.
-
-<P>
-<DT><B>-replace [name]</B>
-<DD> Replace previously existing stored data having the same unique name
-with new data. This essentially is a combination of the <B>del</B>
-and <B>data</B> commands.
-
-<P>
-<DT><B>-info ["'info string'"]</B>
-<DD> When adding a data buffer, you can specify an informational
-string to be stored with that data.  This string will be returned
-by xpaget:
-<PRE>
-  xpaget xpamb foo -info
-</PRE>
-(along with other information such as the date/time of storage and the size of
-the data buffer) if the -info switch is specified. If the info string contains
-spaces, you must enclose it in <B>two</B> sets of quotes:
-<PRE>
-  cat foo | xpaset xpamb -store foo -info "'this is info on foo'"
-</PRE>
-The first set of quotes is removed by the shell while the second is used to
-delineate the info string.
-
-<P>
-<DT><B>-send [name]</B>
-<DD> Broadcast the stored data buffer to the named template.
-
-<P>
-<DT><B>-del [name]</B>
-<DD> Delete the named data buffer and free all allocated space.
-</DL>
-
-<P>
-Switches can be used in any combination that makes sense. For example:
-<PRE>
-  cat foo.fits | xpaset xpamb -store foo -info "FITS" "DS9:*" fits foo.fits
-</PRE>
-will broadcast the foo.fits image to all access points of class
-<B>DS9</B>.  In addition, the foo.fits file will be stored under the
-name of <B>foo</B> for later manipulation such as:
-<PRE>
-  xpaset -p xpamb -send foo "DS9:*" fits foo.fits
-</PRE>
-will re-broadcast the foo.fits image to all access points of class "DS9".
-
-<!-- =section xpamb SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: September 10, 2003</H5>
-</BODY>
-</HTML>
diff --git a/xpa/doc/xpans.html b/xpa/doc/xpans.html
deleted file mode 100644
index a0aebb2..0000000
--- a/xpa/doc/xpans.html
+++ /dev/null
@@ -1,212 +0,0 @@
-<!-- =defdoc xpans xpans 1 -->
-<HTML>
-<HEAD>
-<TITLE>The XPA Name Server (xpans)</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpans NAME -->
-<H2><A NAME="xpans">xpans: the XPA Name Server</A></H2>
-
-<!-- =section xpans SYNOPSIS -->
-<H2>Summary</H2>
-<PRE>
-  xpans [-h] [-e] [-k sec] [-p port] [-l log] [-s security log] [-P n]
-</PRE>
-
-<!-- =section xpans OPTIONS -->
-<P>
-<PRE>
-  -h		print help message
-  -e		exit when there are no more XPA connections
-  -k		send keepalive messages every n sec
-  -l		log data base entries to specified file
-  -p		listen for connections on specified port
-  -s		log security info for each connection to specified file      
-  -P 		accept proxy requests (P=1) using separate thread (P=2)
-  --version     display version and exit
-</PRE>
-
-<!-- =section xpans DESCRIPTION -->
-<P>
-The xpans name server is an XPA-enabled program that is used to
-manage the names and ports of XPA access points. It is started
-automatically when an XPA access point is registered. You can access
-the name server using xpaget to get a list of registered access points.
-<P>
-The <EM>xpans</EM> name server provides a crucial link between XPA
-clients and servers.  When an XPA server defines an access point using
-XPANew(), XPACmdNew(), or XPAInfoNew(), the name of the access point
-is registered in the name service, along with connection information.
-The name server then matches class:name templates passed to it by XPA
-clients with these registered entries, so that the clients can
-communicate with the appropriate servers.
-
-<P>
-The socket connection between an XPA-enabled program and
-<EM>xpans</EM> is kept open until the former exits (or explicitly
-closes the connection). Apparently, some Internet equipment (e.g. DSL
-modems) can cause such a connection to time-out after a period of
-inactivity. To prevent this from happening, you can use the <EM>-k
-[sec]</EM> switch to send a short keep-alive message to each open
-connection after the specified time delay. (Note that this
-application level use of keep-alive is necessary only if you are
-serving XPA-enabled clients over the Internet and have to deal with
-long-term connections involving DSL or similar equipment.  XPA uses
-the ordinary socket-level keep-alive, which works for all other cases.)
-<B>NB (12/2/2009): Out-of-band (URG) TCP data, used by xpans
-keep-alive, is changed by some Cisco routers into in-band data.
-Encountering such a router will break the keep-alive function and may
-break your XPA server as well. Proceed with caution!</B>
-
-<P>
-The <EM>xpans</EM> program will be started automatically (assuming it
-can be found in the user's path) when the first XPA access point is
-registered.  It therefore need not be started explicitly.  However,
-when started automatically, the <EM>-e</EM> switch is used, so that
-the name server will exit when there are no more XPA access points
-registered. If you wish to keep the name server running continually,
-simply start it manually without the <EM>-e</EM> switch.
-
-<P>
-The name server will keep a log of registered access points if the
-<EM>-l [log]</EM> switch is used on the command line (this is the
-case for automatic start-up).  The log contains enough name and connection
-information to allow you to re-register all XPA access points in case
-the name server process is terminated prematurely. For example, after
-the ds9 access point is registered,the log will contain the entry:
-<PRE>
-  add 838e2f67:1863 ds9 ds9 gs eric
-</PRE>
-If <EM>xpans</EM> is terminated but ds9 still is running, you
-can re-register both access points for the ds9 process by running:
-<PRE>
-  xpaset -p 838e2f67:1863 -nsconnect
-</PRE>
-Notice that the ip:port specifier is used with <EM>xpaset</EM> to bypass
-the need for contacting the name server (which does not have the name
-registered yet!)
-
-<P>
-The name server will keep a log of security information if the <EM>-s
-[security log]</EM> switch is used on the command line. For each
-accepted connection, (including connections via the <EM>xpaget</EM>
-command), information will be logged about the host issuing the
-command and the parameters passed into the program. This is most
-useful when <EM>xpans</EM> is accepting connections from untrusted
-machines.
-
-<P>
-When an XPA access point is removed by a server using <EM>XPAFree()</EM>,
-the access information is removed from the name server.  If an
-XPA-enabled process is terminated, all names registered by that process
-will be removed automatically.  The log file is always updated to
-reflect the currently registered access points.
-
-<P>
-The name server itself has an XPA access point names <EM>xpans</EM>
-registered through which you can find out information about currently
-registered access points (assuming you have access to the name server;
-see <A HREF="./acl.html">XPA Access Control</A> for more information).
-For each registered access point, the following information is returned:
-<PRE>
-  class		# class of the access point
-  name		# name of the access point
-  access	# allowed access (g=xpaget,s=xpaset,i=xpainfo)
-  id		# socket access method (host:port for inet, file for local/unix)
-  user		# user name of access point owner
-</PRE>
-
-<P>
-For example, to display all currently registered access points, simply execute:
-<PRE>
-  xpaget xpans
-</PRE>
-Continuing the example of ds9 above, this will return:
-<PRE>
-  DS9 ds9 gs 838e2f67:1863 eric
-</PRE>
-If the same program has been started with different XPA access names,
-you can look up only names matching a specified template. For example,
-assume that ds9 has been started up using:
-<PRE>
-  ds9 &
-  ds9 -title ds9-1-eric &
-  ds9 -title ds9-2-eric &
-</PRE>
-To lookup all ds9 access points which end in ".eric" and which can
-be accessed using <EM>xpaset</EM>, use:
-<PRE>
-  xpaget xpans "DS9:*.eric" "s" "*"
-</PRE>
-This will return:
-<PRE>
-  DS9 ds9-2-eric gs 838e29d3:42102 eric
-  DS9 ds9-1-eric gs 838e29d3:42105 eric
-</PRE>
-The third argument "*" requests all access points from all users.
-You also can specify a specific user name and only access points
-registered by that user will be returned.
-
-<P>
-The name server uses the <EM>XPA_METHOD</EM> environment variable
-to determine whether it should listen for requests on INET or LOCAL
-sockets.  Since XPA access points also use this environment variable,
-the choice of socket method will be consistent.  Note that, when INET
-sockets are used, a local server can be accessed from remote machines
-if the <EM>XPA_NSINET</EM> environment variable is set to point to
-the local machine.  See
-<A HREF="./env.html">XPA Environment Variables</A>
-for more information.
-
-<P>
-An experimental feature of xpans is its ability to act as a proxy to
-XPA servers behind firewalls that want to communicate with external
-processes.  The basic idea is the following: an XPA server (call it
-"foo") on host1, possibly behind a firewall, makes a remote connection
-to a proxy-enabled xpans program on host2 (specifying host2's XPA method).
-For example:
-<PRE>
-  xpaset -p foo -remote 'host2:28571' + -proxy   # on host1
-</PRE> 
-When this is done, host2 can use xpaset, xpaget, and xpainfo calls to
-communicate with the XPA server foo. All command communication is
-performed via the xpans socket connection between foo on host1 and
-xpans on host2 (which was initiated by foo from inside the firewall).
-Data communication is similarly performed using a socket connection
-initiated on host1 (usually with a port value two greater than the
-port value of the main xpans socket connection). An xpaset or xpaget
-call on host2 contacts xpans, which performs an XPASet() or XPAGet()
-call to foo, passing commands and data back and forth between the two
-programs.
-
-<P>
-By default, proxy connections are not allowed by xpans. If the -P switch is
-specified with a value of 1, proxy connection are allowed, but all proxy
-communication is performed in the same thread as xpans processing. If
-a value of 2 is specified, the proxy processing is performed in a
-separate thread (assuming pthreads are supported on your system).
-Because xpa callback processing of any type can take a long time and
-therefore can interfere with normal xpans processing, threaded proxy
-connections (-P 2) are recommended.  When using proxy connections, it
-might also be useful to set the XPA_IOCALLSXPA environment variable, so
-that multiple proxy requests can be handled at the same time, instead of
-serially.
-
-<P>
-Note that this proxy interface to xpans is experimental. It is used
-to provide remote data analysis capabilities on the Chandra-Ed system
-using ds9.  (See http://chandra-ed.cfa.harvard.edu and
-http://hea-www.harvard.edu/saord/ds9 for more details). As always, please
-contact us if you have problems or questions.
-
-<!-- =section xpans SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: January 24, 2005</H5>
-</BODY>
-</HTML>
diff --git a/xpa/doc/xt.html b/xpa/doc/xt.html
deleted file mode 100644
index 2b68604..0000000
--- a/xpa/doc/xt.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!-- =defdoc xpaxt xpaxt n -->
-<HTML>
-<HEAD>
-<TITLE>XPA/Xt Interface</TITLE>
-</HEAD>
-<BODY>
-
-<!-- =section xpaxt NAME -->
-<H2><A NAME="xpatcl">XPAXt: the XPA Interface to Xt (X Windows)</A></H2>
-
-<!-- =section xpaxt SYNOPSIS -->
-<H2>Summary</H2>
-Describes how XPA access points can be added to X Toolkit (Xt) programs.
-
-<!-- =section xpaxt DESCRIPTION -->
-<H2>Description</H2>
-<P>
-XPA supports Xt programs: you can call XPANew(), XPACmdNew(), or
-XPAInfoNew() within any C routine to add XPA server callbacks to an Xt
-program.  Since an Xt program has its own event loop call (i.e.,
-XtAppMainLoop()), it therefore does not need or want to use the XPA
-even loop.  Thus, in order to add XPA access points to the standard Xt
-event loop, the following routine should be called before entering the
-loop:
-<PRE>
-  int XPAXtAddInput(XtAppContext app, XPA xpa)
-</PRE>
-<P>
-The XPAAddAddInput() routine will add XPA access points to the Xt event
-loop by making calls to the standard XtAppAddInput() routine. (If the
-XtAppContext argument is NULL, then the alternate XtAddInput() routine
-is used instead.)  If the xpa argument is NULL, then all active XPA
-access points are added to the loop.  If xpa is not NULL, then only
-the specified access point is added.  The latter type of call is used
-to add new access points from within a callback, after the program has
-entered the XtAppMainLoop() even loop.
-
-<!-- =section xpaxt SEE ALSO -->
-<!-- =text See xpa(n) for a list of XPA help pages -->
-<!-- =stop -->
-
-<P>
-<A HREF="./help.html">Go to XPA Help Index</A>
-
-<H5>Last updated: September 10, 2003</H5>
-</BODY>
-</HTML>
diff --git a/xpa/find.c b/xpa/find.c
deleted file mode 100644
index cf4d9ca..0000000
--- a/xpa/find.c
+++ /dev/null
@@ -1,456 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * Find.c -- find files via the path environment variable
- * (and related routines)
- *
- */
-#include <find.h>
-
-/*
- *
- * 	private routines 
- *
- */
-
-#define MAXBUFSIZE 8192
-
-#ifndef HAVE_UNISTD_H
-#define F_OK            0       /* does file exist */
-#define X_OK            1       /* is it executable by caller */
-#define W_OK            2       /* is it writable by caller */
-#define R_OK            4       /* is it readable by caller */
-#endif
-
-/* not part of unistd.h but we need to differentiate directories */
-#ifdef D_OK
-#undef D_OK
-#endif
-#define D_OK            256       /* is it a directory */
-
-#ifdef ANSI_FUNC
-static int 
-amparse (char *mode)
-#else
-static int amparse(mode)
-     char *mode;
-#endif
-{
-  int xmode = 0;
-
-  xmode |= ( strpbrk(mode, "r") != NULL ? R_OK 	: 0 );
-  xmode |= ( strpbrk(mode, "w") != NULL ? W_OK 	: 0 );
-  xmode |= ( strpbrk(mode, "x") != NULL ? X_OK	: 0 );
-  xmode |= ( strpbrk(mode, "f") != NULL ? F_OK 	: 0 );
-  xmode |= ( strpbrk(mode, "d") != NULL ? D_OK 	: 0 );
-
-  return xmode;
-}	
-
-#ifdef ANSI_FUNC
-static char *
-findpath (char *name, char *mode, char *path)
-#else
-static char *findpath(name, mode, path)
-     char *name;
-     char *mode;
-     char *path;
-#endif
-{
-  char	pathbuff[MAXBUFSIZE];
-  char	namebuff[MAXBUFSIZE];
-  char	tempbuff[MAXBUFSIZE];
-  char	backmode[MAXBUFSIZE];
-  char 	*here, *found;
-  int	 len;
-  int 	 mark = 0;
-  int	 skip = strpbrk(mode, ">") != NULL;
-  int	 pick = strpbrk(mode, "<") != NULL;
-
-  if ( skip && pick ) return NULL;
-
-  if ( (path==NULL) || ( name[0] == '.' && name[1] == '/' ) || name[0] == '/' )
-    return Access(name, mode);
-
-  strncpy(pathbuff, path, MAXBUFSIZE-1);
-  pathbuff[MAXBUFSIZE-1] = '\0';
-  path = pathbuff;
-
-  if ( (here = strpbrk(pathbuff, ":;")) ) {
-    mark = *here;
-    *here++ = '\0';
-  }
-  while ( path ) {
-    /* if there is an environment variable ... */
-    if ( strchr(path, '$') ) {
-      /* exand it */
-      ExpandEnv(path, tempbuff, MAXBUFSIZE);
-      /* make sure we could expand it (otherwise we get an infinite loop) */
-      if( !strchr(tempbuff, '$') ){
-	if ( (found = findpath(name, mode, tempbuff)) )
-	  return found;
-      }
-    } else {      
-      if ( !skip ) {      
-	if ( !strcmp(".", path) ) path[0] = '\0';
-
-	strncpy(namebuff, path, MAXBUFSIZE-1);
-	namebuff[MAXBUFSIZE-1] = '\0';
-	len = strlen(namebuff);
-	if ( namebuff[0] && namebuff[len-1] != '/' ){
-	  if( (len+1) <= (MAXBUFSIZE-1) ){
-	    strcat(namebuff, "/");
-	    len++;
-	  }
-	  /* filename is too large, so we can't find it */
-	  else
-	    return NULL;
-	}
-	if( len+strlen(name) <= MAXBUFSIZE-1 )
-	  strcat(namebuff, name);
-	/* filename is too large, so we can't find it */
-	else
-	  return NULL;
-
-	if ( (found = Access(namebuff, mode)) )
-	  return found;
-      }
-    }
-
-    if ( mark == ';' ) {
-      if ( skip ) {
-	skip = 0;
-	/* Knock down the skip mode to select all
-	 * directories in path after the first ";"
-	 */
-	strncpy(backmode, mode, MAXBUFSIZE-1);
-	backmode[MAXBUFSIZE-1] = '\0';
-	mode = backmode;
-      }
-      if ( pick ) return NULL;
-    }
-
-    path = here;
-    if ( here && (here = strpbrk(here, ":;")) ) {
-      mark = *here;
-      *here++ = '\0';
-    }
-  }
-
-  return NULL;
-}
-
-
-/*
- *
- * 	public routines 
- *
- */
-
-/*
- *
- * ResolvePath -- resolve the path to remove . and .. entries
- *
- */
-#ifdef ANSI_FUNC
-char *
-ResolvePath (char *ibuf, char *obuf, int maxlen)
-#else
-char *ResolvePath(ibuf, obuf, maxlen)
-     char *ibuf;
-     char *obuf;
-     int  maxlen;
-#endif
-{
-  char path[MAXBUFSIZE];
-  char *part[MAXBUFSIZE];
-  char *tbuf;
-  int i, j;
-  int len;
-  int npart=0;
-
-  /* if we have no path separators, we really don't have much to do! */
-  if( strchr(ibuf, '/') == NULL ){
-    strncpy(obuf, ibuf, maxlen-1);
-    obuf[maxlen-1] = '\0';
-    return(obuf);
-  }
-
-  /* if its just "/" or "/.", its easy */
-  if( !strcmp(ibuf, "/") || !strcmp(ibuf, "/.") ){
-    strncpy(obuf, "/", maxlen-1);
-    obuf[maxlen-1] = '\0';
-    return(obuf);
-  }
-
-  /* if we have a relative path to deal with, get current directory */
-  if( (*ibuf == '.') || ( (strchr(ibuf, '/') != NULL) && (*ibuf != '/') ) ){
-    getcwd(path, MAXBUFSIZE);
-  }
-  else{
-    *path = '\0';
-  }
-
-  /* construct the total string we have to deal with */
-  len = strlen(path) + strlen(ibuf) + 1;
-  tbuf = (char *)xmalloc(len+1);
-  if( *path ){
-    strcpy(tbuf, path);
-    strcat(tbuf, "/");
-    strcat(tbuf, ibuf);
-  }
-  else{
-    strcpy(tbuf, ibuf);
-  }
-  
-  /* construct the parts array from this string, removing / characters
-     and null-terminating each part */
-  for(i=0; i<len; i++){
-    if( tbuf[i] == '/' ){
-      tbuf[i] = '\0';
-      /* skip adjacent slashes */
-      if( tbuf[i+1] == '/' ) continue;
-      part[npart] = &tbuf[i+1];
-      npart++;
-    }
-  }
-
-  /* loop through the parts array and resolve the  . and .. entries */
-  for(i=0; i<npart; i++){
-    /* for ".", just remove it */
-    if( !strcmp(part[i], ".") ){
-      part[i] = NULL;
-    }
-    /* for "..", also remove the previous part -- if possible */
-    else if( !strcmp(part[i], "..") ){
-      part[i] = NULL;
-      for(j=i-1; j>=0; j--){
-	if( part[j] ){
-	  part[j] = NULL;
-	  break;
-	}
-      }
-    }
-  }
-
-  /* construct a new string from the remaining parts */
-  *obuf = '\0';
-  len = 0;
-  for(i=0; i<npart; i++){
-    if( part[i] != NULL ){
-      if( len+(int)strlen(part[i])+1 <= maxlen-1 ){
-	strcat(obuf, "/");
-	strcat(obuf, part[i]);
-	len += strlen(part[i])+1;
-      }
-      else{
-	break;
-      }
-    }
-  }
-
-  /* free up buffer space */
-  if( tbuf ) free(tbuf);
-
-  /* return the string */
-  return(obuf);
-}
-
-#ifdef ANSI_FUNC
-void
-ExpandEnv (char *name, char *envname, int maxlen)
-#else
-void ExpandEnv(name, envname, maxlen)
-     char *name;
-     char *envname;
-     int maxlen;
-#endif
-{
-  char brace[2];
-  char tbuf[MAXBUFSIZE];
-  char *fullname=NULL;
-  char *mip;
-  char *ip;
-  char *s;
-  int len;
-  int i=0, j=0;
-
-  /* allocate temp working buffer (so dest can be same as source) */
-  if( !(fullname=(char *)xcalloc(maxlen, sizeof(char))) ) return;
-
-  /* process each character */
-  for(ip=name; *ip; ip++){
-    /* if its not beginning of an env, just store and loop */
-    if( *ip != '$' ){
-      fullname[i++] = *ip;
-      fullname[i] = '\0';
-    }
-    else{
-      mip = ip;
-      /* skip past '$' */
-      ip++;
-      /* skip past brace, if necessary */
-      if( *ip == '{' ){
-	brace[0] = '{';
-	ip++;
-      }
-      else if( *ip == '(' ){
-	brace[0] = '(';
-	ip++;
-      }
-      else
-	brace[0] = '\0';
-      /* get variable up to next white space */
-      for(*tbuf='\0', j=0;
-	  (!isspace((int)*ip)) && (*ip != '"') && (*ip != '\'') && (*ip);
-	  ip++){
-	/* look for trailing brace, if necessary */
-	if( *brace && *ip == (*brace == '(' ? ')' : '}') ){
-	  ip++;
-	  break;
-	}
-	/* a "/" will end the environment variable as well */
-	if( *ip == '/' ){
-	  break;
-	}
-	tbuf[j++] = *ip;
-	tbuf[j] = '\0';
-      }
-      /* back up so we can process the white space in the outer loop */
-      ip--;
-      if( (s = (char *)getenv(tbuf)) != NULL ){
-	i += strlen(s);
-	if( i <= maxlen )
-	  strcat(fullname, s);
-      }
-      /* if we don't recognize this macro, put it back onto the string */
-      else{
-	len = ip - mip + 1;
-	i += len;
-	if( i <= maxlen )
-	  strncat(fullname, mip, len);
-      }
-    }
-  }
-
-  /* transfer to output buffer */
-  strncpy(envname, fullname, maxlen);
-
-  /* free up temp space */
-  if( fullname ) xfree(fullname);
-}
-
-#ifdef ANSI_FUNC
-char *
-Access (char *name, char *mode)
-#else
-char *Access (name, mode)
-     char *name;
-     char *mode;
-#endif
-{
-  struct stat info;
-  char fullname[MAXBUFSIZE];
-  char AccessName[MAXBUFSIZE];
-
-
-  ExpandEnv(name, fullname, MAXBUFSIZE);
-  if ( stat(fullname, &info) !=0 ) return NULL;
-
-#if HAVE_MINGW32==0 && HAVE_CYGWIN==0
-  if ( mode ) {
-    int m = amparse(mode);
-
-    /* distinguish between directories and files */
-    if (  (m & D_OK) && !(info.st_mode & S_IFDIR) ) return NULL;
-    if ( !(m & D_OK) &&  (info.st_mode & S_IFDIR) ) return NULL;
-
-    if ( getuid() == info.st_uid ) {
-	if ( m & R_OK && !(info.st_mode & S_IRUSR) ) return NULL;
-	if ( m & W_OK && !(info.st_mode & S_IWUSR) ) return NULL;
-	if ( m & X_OK && !(info.st_mode & S_IXUSR) ) return NULL;
-    } else
-      if ( getgid() == info.st_gid ) {
-	if ( m & R_OK && !(info.st_mode & S_IRGRP) ) return NULL;
-	if ( m & W_OK && !(info.st_mode & S_IWGRP) ) return NULL;
-	if ( m & X_OK && !(info.st_mode & S_IXGRP) ) return NULL;
-      } else {
-	if ( m & R_OK && !(info.st_mode & S_IROTH) ) return NULL;
-	if ( m & W_OK && !(info.st_mode & S_IWOTH) ) return NULL;
-	if ( m & X_OK && !(info.st_mode & S_IXOTH) ) return NULL;
-      }
-  }
-#endif
-
-  ResolvePath(fullname, AccessName, MAXBUFSIZE);
-  return(xstrdup(AccessName));
-}
-
-#ifdef ANSI_FUNC
-char *
-Find (char *name, char *mode, char *exten, char *path)
-#else
-char *Find (name, mode, exten, path)
-     char *name;
-     char *mode;
-     char *exten;
-     char *path;
-#endif
-{
-  char	extenbuff[MAXBUFSIZE];
-  char	namebuff[MAXBUFSIZE];
-  char 	*here, *found;
-  int    len;
-
-  /* sanity check */
-  if( !name || !*name )
-    return NULL;
-
-  /* if its a WWW file, we just say 'yes' */
-  if( !strncmp(name, "ftp://",  6) ||
-      !strncmp(name, "http://", 7) ){
-    return(xstrdup(name));
-  }
-
-  if ( exten == NULL )
-    return findpath(name, mode, path);
-  
-  strncpy(extenbuff, exten, MAXBUFSIZE-1);
-  extenbuff[MAXBUFSIZE-1] = '\0';
-  exten = extenbuff;
-
-  if ( (here = strpbrk(extenbuff, ":;")) ) *here++ = '\0';
-
-  while ( exten ) {
-    if ( exten[0] == '$' ) {
-      if ( (exten = (char *)getenv(&exten[1])) )
-	if ( (found = Find(name, mode, exten, path)) )
-	  return found;
-    } else {
-      char *e = strstr(name, exten);
-      
-      strncpy(namebuff, name, MAXBUFSIZE-1);
-      namebuff[MAXBUFSIZE-1] = '\0';
-      len = strlen(namebuff);
-      if ( (e==NULL) || ( e && *(e + len)) ){
-	if( len+strlen(exten) <= MAXBUFSIZE-1 )
-	  strcat(namebuff, exten);
-	/* filename is too large, so we can't find it */
-	else
-	  return NULL;
-      }
-
-      if ( (found = findpath(namebuff, mode, path)) )
-	return found;
-      
-    }
-    
-    exten = here;
-    if ( here && (here = strpbrk(here, ":;")) ) *here++ = '\0';
-  }
-  
-  return NULL;
-}
diff --git a/xpa/find.h b/xpa/find.h
deleted file mode 100644
index 96336a0..0000000
--- a/xpa/find.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * find.h -- declarations for find finding
- *
- */
-
-#ifndef	__find_h
-#define	__find_h
-
-#if HAVE_CONFIG_H
-#include <conf.h>
-#endif
-
-#include <stdio.h>
-#include <ctype.h>
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#if HAVE_STRING_H
-#include <string.h>
-#endif
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <xalloc.h>
-#include <prsetup.h>
-
-_PRbeg
-
-char *ResolvePath _PRx((char *ibuf, char *obuf, int maxlen));
-void ExpandEnv _PRx((char *name, char *fullname, int maxlen));
-char *Access _PRx((char *name, char *mode));
-char *Find _PRx((char *name, char *mode, char *extn, char *path));
-
-_PRend
-
-#endif
diff --git a/xpa/gtkloop.c b/xpa/gtkloop.c
deleted file mode 100644
index df5137e..0000000
--- a/xpa/gtkloop.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- *	Copyright (c) 2006 Smithsonian Astrophysical Observatory
- */
-
-#include <xpap.h>
-
-#ifdef HAVE_GTK
-
-#include <gtk/gtk.h>
-#include <gtk/gtkmain.h>
-
-/*----------------------------------------------------------------------------
- *
- * 			Private Routines and Data
- *
- *----------------------------------------------------------------------------
- */
-
-/* record struct for maintining gtk info in gtk select loop  */
-typedef struct xpagtkrec{
-  int fd;
-  void *client_data;
-  int id;
-} *XPAGtk, XPAGtkRec;
-
-/*----------------------------------------------------------------------------
- *
- * Routine:	XPAGtkHandler
- *
- * Purpose:	handle one request for an xpaset or xpaget
- *
- * Return:	none
- *
- *----------------------------------------------------------------------------
- */
-static gboolean XPAGtkHandler(GIOChannel *gio, GIOCondition condition, 
-   gpointer data)
-{
-  XPAGtk xptr = (XPAGtk)data;
-  if( (xptr == NULL) || (xptr->client_data == NULL) )
-    return TRUE;
-  XPAHandler((XPA)xptr->client_data, xptr->fd);
-   return TRUE; 
-}
-
-/*----------------------------------------------------------------------------
- *
- * Routine:	XPAGtkEnableOneInput
- *
- * Purpose:	Enable 1 XPA entry from the Xt event loop
- *
- * Results:	none
- *
- *----------------------------------------------------------------------------
- */
-static void XPAGtkEnableOneInput (void *client_data)
-{
-   XPAGtk xptr = (XPAGtk)client_data;
-   
-   if( xptr && !xptr->id ){
-        GIOChannel* ioc = g_io_channel_unix_new(xptr->fd);
-	xptr->id =  g_io_add_watch(ioc, (G_IO_IN | G_IO_HUP | G_IO_NVAL),
-		       XPAGtkHandler, xptr);
-   }
-}
-
-/*----------------------------------------------------------------------------
- *
- * Routine:	XPAGtkDisableOneInput
- *
- * Purpose:	Disable 1 XPA entry from the Xt event loop
- *
- * Results:	none
- *
- *----------------------------------------------------------------------------
- */
-static void XPAGtkDisableOneInput (void *client_data)
-{
-   XPAGtk xptr = (XPAGtk)client_data;
-
-   if(xptr && xptr->id){
-     g_source_remove(xptr->id); 
-     xptr->id = 0;
-   }
-}
-
-/*----------------------------------------------------------------------------
- *
- * Routine:	XPAGtkAddOneInput
- *
- * Purpose:	Add 1 XPA entry to the gtk event loop
- *
- * Results:	none
- *
- *----------------------------------------------------------------------------
- */
-static void* XPAGtkAddOneInput (void *client_data, int fd)
-{
-  XPAGtk xptr;
-  if( fd < 0 )
-    return(NULL);
-  xptr = (XPAGtk)calloc(1, sizeof(XPAGtkRec));
-  xptr->fd = fd;
-  xptr->client_data = client_data;
-  XPAGtkEnableOneInput(xptr);
-  return(xptr);
-}
-
-/*----------------------------------------------------------------------------
- *
- * Routine:	XPAGtkDelOneInput
- *
- * Purpose:	Delete 1 XPA entry from the gtk event loop (called by XPAFree)
- *
- * Results:	none
- *
- *----------------------------------------------------------------------------
- */
-
-static void XPAGtkDelOneInput (void *client_data)
-{
-  XPAGtk xptr = (XPAGtk)client_data;
-  if( xptr == NULL)
-    return;
-  XPAGtkDisableOneInput(xptr);
-  free(xptr);
-}
-
-/*----------------------------------------------------------------------------
- *
- * 			Public Routines and Data
- *
- *----------------------------------------------------------------------------
- */
-
-/*----------------------------------------------------------------------------
- *
- * Routine:	XPAGtkAddInput
- *
- * Purpose:	Add XPA entries to the Xt event loop
- *
- * Results:	number of xpa entried added
- *
- *----------------------------------------------------------------------------
- */
-int XPAGtkAddInput (XPA xpa)
-{
-  XPA cur;
-  int got=0;
-
-  /* if a specific xpa was specified, just add it */
-  if( xpa != NULL ){
-    /* remove old one */
-    if( xpa->seldel && xpa->selptr ){
-      (xpa->seldel)(xpa->selptr);
-    }
-    /* add new one */
-    xpa->seldel = XPAGtkDelOneInput;
-    xpa->seladd = XPAGtkAddOneInput;
-    xpa->selon =  XPAGtkEnableOneInput;
-    xpa->seloff = XPAGtkDisableOneInput;
-    xpa->selptr = XPAGtkAddOneInput((void *)xpa, xpa->fd);
-    got = 1;
-  }
-  /* otherwise set up all xpa's */
-  else{
-    for(cur=(XPA)XPAListHead(); cur!=NULL; cur=cur->next){
-      /* remove old one */
-      if( cur->seldel && cur->selptr ){
-	(cur->seldel)(cur->selptr);
-      }
-      /* add new one */
-      cur->seldel = XPAGtkDelOneInput;
-      cur->seladd = XPAGtkAddOneInput;
-      cur->selon =  XPAGtkEnableOneInput;
-      cur->seloff = XPAGtkDisableOneInput;
-      cur->selptr = XPAGtkAddOneInput((void *)cur, cur->fd);
-      got++;
-    }
-  }
-  return(got);
-}
-
-int xpa_gtk = 1;
-
-#else
-
-int xpa_gtk = 0;
-
-#endif
diff --git a/xpa/install-sh b/xpa/install-sh
deleted file mode 100755
index 36f96f3..0000000
--- a/xpa/install-sh
+++ /dev/null
@@ -1,276 +0,0 @@
-#!/bin/sh
-#
-# install - install a program, script, or datafile
-# This comes from X11R5 (mit/util/scripts/install.sh).
-#
-# Copyright 1991 by the Massachusetts Institute of Technology
-#
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation, and that the name of M.I.T. not be used in advertising or
-# publicity pertaining to distribution of the software without specific,
-# written prior permission.  M.I.T. makes no representations about the
-# suitability of this software for any purpose.  It is provided "as is"
-# without express or implied warranty.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.  It can only install one file at a time, a restriction
-# shared with many OS's install programs.
-
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
-
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
-
-transformbasename=""
-transform_arg=""
-instcmd="$mvprog"
-chmodcmd="$chmodprog 0755"
-chowncmd=""
-chgrpcmd=""
-stripcmd=""
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=""
-dst=""
-dir_arg=""
-
-while [ x"$1" != x ]; do
-    case $1 in
-	-c) instcmd=$cpprog
-	    shift
-	    continue;;
-
-	-d) dir_arg=true
-	    shift
-	    continue;;
-
-	-m) chmodcmd="$chmodprog $2"
-	    shift
-	    shift
-	    continue;;
-
-	-o) chowncmd="$chownprog $2"
-	    shift
-	    shift
-	    continue;;
-
-	-g) chgrpcmd="$chgrpprog $2"
-	    shift
-	    shift
-	    continue;;
-
-	-s) stripcmd=$stripprog
-	    shift
-	    continue;;
-
-	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
-	    shift
-	    continue;;
-
-	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
-	    shift
-	    continue;;
-
-	*)  if [ x"$src" = x ]
-	    then
-		src=$1
-	    else
-		# this colon is to work around a 386BSD /bin/sh bug
-		:
-		dst=$1
-	    fi
-	    shift
-	    continue;;
-    esac
-done
-
-if [ x"$src" = x ]
-then
-	echo "$0: no input file specified" >&2
-	exit 1
-else
-	:
-fi
-
-if [ x"$dir_arg" != x ]; then
-	dst=$src
-	src=""
-
-	if [ -d "$dst" ]; then
-		instcmd=:
-		chmodcmd=""
-	else
-		instcmd=$mkdirprog
-	fi
-else
-
-# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
-# might cause directories to be created, which would be especially bad
-# if $src (and thus $dsttmp) contains '*'.
-
-	if [ -f "$src" ] || [ -d "$src" ]
-	then
-		:
-	else
-		echo "$0: $src does not exist" >&2
-		exit 1
-	fi
-
-	if [ x"$dst" = x ]
-	then
-		echo "$0: no destination specified" >&2
-		exit 1
-	else
-		:
-	fi
-
-# If destination is a directory, append the input filename; if your system
-# does not like double slashes in filenames, you may need to add some logic
-
-	if [ -d "$dst" ]
-	then
-		dst=$dst/`basename "$src"`
-	else
-		:
-	fi
-fi
-
-## this sed command emulates the dirname command
-dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
-
-# Make sure that the destination directory exists.
-#  this part is taken from Noah Friedman's mkinstalldirs script
-
-# Skip lots of stat calls in the usual case.
-if [ ! -d "$dstdir" ]; then
-defaultIFS='
-	'
-IFS="${IFS-$defaultIFS}"
-
-oIFS=$IFS
-# Some sh's can't handle IFS=/ for some reason.
-IFS='%'
-set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
-IFS=$oIFS
-
-pathcomp=''
-
-while [ $# -ne 0 ] ; do
-	pathcomp=$pathcomp$1
-	shift
-
-	if [ ! -d "$pathcomp" ] ;
-        then
-		$mkdirprog "$pathcomp"
-	else
-		:
-	fi
-
-	pathcomp=$pathcomp/
-done
-fi
-
-if [ x"$dir_arg" != x ]
-then
-	$doit $instcmd "$dst" &&
-
-	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&
-	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&
-	if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&
-	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi
-else
-
-# If we're going to rename the final executable, determine the name now.
-
-	if [ x"$transformarg" = x ]
-	then
-		dstfile=`basename "$dst"`
-	else
-		dstfile=`basename "$dst" $transformbasename |
-			sed $transformarg`$transformbasename
-	fi
-
-# don't allow the sed command to completely eliminate the filename
-
-	if [ x"$dstfile" = x ]
-	then
-		dstfile=`basename "$dst"`
-	else
-		:
-	fi
-
-# Make a couple of temp file names in the proper directory.
-
-	dsttmp=$dstdir/#inst.$$#
-	rmtmp=$dstdir/#rm.$$#
-
-# Trap to clean up temp files at exit.
-
-	trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
-	trap '(exit $?); exit' 1 2 13 15
-
-# Move or copy the file name to the temp name
-
-	$doit $instcmd "$src" "$dsttmp" &&
-
-# and set any options; do chmod last to preserve setuid bits
-
-# If any of these fail, we abort the whole thing.  If we want to
-# ignore errors from any of these, just make sure not to ignore
-# errors from the above "$doit $instcmd $src $dsttmp" command.
-
-	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&
-	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&
-	if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&
-	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&
-
-# Now remove or move aside any old file at destination location.  We try this
-# two ways since rm can't unlink itself on some systems and the destination
-# file might be busy for other reasons.  In this case, the final cleanup
-# might fail but the new file should still install successfully.
-
-{
-	if [ -f "$dstdir/$dstfile" ]
-	then
-		$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||
-		$doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||
-		{
-		  echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
-		  (exit 1); exit
-		}
-	else
-		:
-	fi
-} &&
-
-# Now rename the file to the real destination.
-
-	$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
-
-fi &&
-
-# The final little trick to "correctly" pass the exit status to the exit trap.
-
-{
-	(exit 0); exit
-}
diff --git a/xpa/man/man1/xpaaccess.1 b/xpa/man/man1/xpaaccess.1
deleted file mode 100644
index a3aa7a6..0000000
--- a/xpa/man/man1/xpaaccess.1
+++ /dev/null
@@ -1,198 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpaaccess 1"
-.TH xpaaccess 1 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBxpaaccess: see if template matches registered \s-1XPA\s0 access points\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-xpaaccess [\-c] [\-h] [\-i nsinet] [\-m method] [\-n] [\-t sval,lval] [\-u users] \-v <template> [type]
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-.Vb 10
-\&  \-c            contact each access point individually
-\&  \-h            print help message
-\&  \-i            access XPA point on different machine (override XPA_NSINET)
-\&  \-m            override XPA_METHOD environment variable
-\&  \-n            return number of matches instead of "yes" or "no"
-\&  \-t [s,l]      set short and long timeouts (override XPA_[SHORT,LONG]_TIMEOUT)
-\&  \-u [users]    XPA points can be from specified users (override XPA_NSUSERS)
-\&  \-v            print info about each successful access point
-\&  \-V            print info or error about each access point
-\&  \-\-version     display version and exit
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-xpaaccess returns \*(L"yes\*(R" to stdout (with a return error code if 1) if there are
-existing \s-1XPA\s0 access points that match the 
-template
-(and optional access type: g,i,s). Otherwise, it returns \*(L"no\*(R" (with a
-return error code of 0).  If \-n is specified, the number of matches is
-returned instead (both to stdout and in the returned error code). If
-\&\-v is specified, each access point is displayed to stdout instead of
-the number of matches.
-.PP
-By default, xpaaccess simply contacts the xpans name server to find
-the list of registered access points that match the specified
-template. It also checks to make sure the specified types are
-supported by that access point. This is the fastest way to determine
-available access points. However, an access point might registered but
-not yet available, if, for example, the server program has not entered
-its event loop to process \s-1XPA\s0 requests. To find access points that are
-guaranteed to be available for processing, use the \-c (contact)
-switch.  With this switch, xpaaccess contacts each matching \s-1XPA\s0 server
-(rather than the name server) to make sure the registered access point
-really is ready for processing. In this mode, if an access point is
-registered but not available, xpaaccess will pause for a period of
-time equal to the \s-1XPA_LONG_TIMEOUT\s0, in order to give the server a
-chance to ready itself. By default, this timeout is 30 seconds. You
-can shorten the time of delay using the \-t \*(L"short,long\*(R" switch. For
-example, to shorten the delay time to 2 seconds, use:
-.PP
-.Vb 1
-\&  xpaaccess \-c \-t "2,2" ds9
-.Ve
-.PP
-The first argument is the short delay value, and is ignored in this
-operation. The second is the long delay timeout.
-.PP
-Note also that the default xpaaccess method (no \-c switch) does not
-check access control (acls) but rather only checks whether the access
-point is both registered with the xpans name server and provides the
-specified type of access. In other words, the default xpaaccess could
-return 'yes' when you might not actually have access. This mode also
-always returns 'yes' for the xpans name server itself, regardless of
-whether the name server is active. The \-c (contact) switch, which
-contacts the access point directly, can and does check the access
-control (only for servers using version 2.1 and above) and also
-returns the real status of xpans.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man1/xpachanges.1 b/xpa/man/man1/xpachanges.1
deleted file mode 100644
index f910bbe..0000000
--- a/xpa/man/man1/xpachanges.1
+++ /dev/null
@@ -1,180 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpachanges 1"
-.TH xpachanges 1 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fB\s-1XPA\s0 Changes: Changes For Users from \s-1XPA\s0 1.0 and 2.0\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-This document describes changes that will affect users who migrate
-from \s-1XPA\s0 1.0 to \s-1XPA\s0 2.0.
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-There have been a few changes that affect users who upgrade \s-1XPA\s0
-from version 1.0 to version 2.0.  These changes are detailed below.
-.IP "\(bu" 4
-\&\s-1XPA\s0 commands no longer have a resolver routine (this is open to
-negotiations, but we decided the idea was dumb).  For the SAOtng
-program, this means that you must explicitly specify the access
-point, i.e.,:
-.Sp
-.Vb 1
-\&  cat foo.fits | xpaset SAOtng fits
-.Ve
-.Sp
-instead of:
-.Sp
-.Vb 1
-\&  cat foo.fits | xpaset SAOtng
-.Ve
-.IP "\(bu" 4
-By default, xpaset, xpaget, etc. now wait for the server callback to
-complete; i.e., the old \-W is implied (and the switch is ignored).
-This allows support for better error handling.  If you want xpaset, etc.
-to return before the callback is complete, use \-n switch:
-.Sp
-.Vb 1
-\&  echo "file foo.fits" | xpaset \-n SAOtng
-.Ve
-.IP "\(bu" 4
-The old \-w switch in xpaset and xpaget is no longer necessary (and is
-ignored), since you can have more than one process communicating with
-an xpa access point at one time.
-.IP "\(bu" 4
-The new \-p switch on xpaset means you need not read from stdout:
-.Sp
-.Vb 1
-\&  xpaset \-p SAOtng colormap I8
-.Ve
-.Sp
-will send the paramlist to the SAOtng callback without reading from stdin.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man1/xpaget.1 b/xpa/man/man1/xpaget.1
deleted file mode 100644
index 12d94d9..0000000
--- a/xpa/man/man1/xpaget.1
+++ /dev/null
@@ -1,164 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpaget 1"
-.TH xpaget 1 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBxpaget: retrieve data from one or more \s-1XPA\s0 servers\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-xpaget [\-h] [\-i nsinet] [\-m method] [\-s] [\-t sval,lval] [\-u users] <template|host:port> [paramlist]
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-.Vb 8
-\&  \-h            print help message
-\&  \-i            access XPA point on different machine (override XPA_NSINET)
-\&  \-m            override XPA_METHOD environment variable
-\&  \-n            don\*(Aqt wait for the status message after server completes
-\&  \-s            enter server mode
-\&  \-t [s,l]      set short and long timeouts (override XPA_[SHORT,LONG]_TIMEOUT)
-\&  \-u [users]    XPA points can be from specified users (override XPA_NSUSERS)
-\&  \-\-version     display version and exit
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-Data will be retrieved from access points matching the 
-template
-or host:port.
-A set of qualifying parameters can be appended.
-.PP
-\&\fBExamples:\fR
-.PP
-.Vb 2
-\&  csh> xpaget ds9 images
-\&  csh> xpaget myhost.harvard.edu:12345
-.Ve
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man1/xpainfo.1 b/xpa/man/man1/xpainfo.1
deleted file mode 100644
index 2ad7f81..0000000
--- a/xpa/man/man1/xpainfo.1
+++ /dev/null
@@ -1,163 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpainfo 1"
-.TH xpainfo 1 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBxpainfo: send short message to one or more \s-1XPA\s0 servers\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-xpainfo [\-h] [\-i nsinet] [\-m method] [\-n] [\-s] [\-t sval,lval] [\-u users] <template|host:port> [paramlist]
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-.Vb 8
-\&  \-h            print help message
-\&  \-i            access XPA point on different machine (override XPA_NSINET)
-\&  \-m            override XPA_METHOD environment variable
-\&  \-n            don\*(Aqt wait for the status message after server completes
-\&  \-s            enter server mode
-\&  \-t [s,l]      set short and long timeouts (override XPA_[SHORT,LONG]_TIMEOUT)
-\&  \-u [users]    XPA points can be from specified users (override XPA_NSUSERS)
-\&  \-\-version     display version and exit
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-Info will be sent to access points matching the
-template
-or host:port.
-A set of qualifying parameters can be appended.
-.PP
-\&\fBExamples:\fR
-.PP
-.Vb 1
-\&  csh> xpainfo IMAGE ds9 image
-.Ve
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man1/xpamb.1 b/xpa/man/man1/xpamb.1
deleted file mode 100644
index 37f06f4..0000000
--- a/xpa/man/man1/xpamb.1
+++ /dev/null
@@ -1,325 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpamb 1"
-.TH xpamb 1 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBxpamb: the \s-1XPA\s0 Message Bus\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-The xpamb program can act as a \*(L"classical\*(R" message bus interface
-between clients and servers. A client can send a data request to
-the message bus, which then interfaces with multiple servers and
-returns the data back to the client.
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-For xpaset, several optional switches are used to save data and
-manipulate the stored data:
-.IP "\(bu" 4
-\&\fB\-data [name]\fR
-.Sp
-Add the supplied data buffer to a pool of stored data buffers,
-using the specified name as a unique identifier for later retrieval.
-An error occurs if the name already exists (use either \fBreplace\fR
-or \fBdel\fR to rectify this). The \fB\-add\fR switch is supported
-for backwards compatibility with xpa 2.0.
-.IP "\(bu" 4
-\&\fB\-replace [name]\fR
-.Sp
-Replace previously existing stored data having the same unique name
-with new data. This essentially is a combination of the \fBdel\fR
-and \fBdata\fR commands.
-.IP "\(bu" 4
-\&\fB\-info [\*(L"'info string'\*(R"]\fR
-.Sp
-When adding a data buffer, you can specify an informational
-string to be stored with that data.  This string will be returned
-by xpaget:
-.Sp
-.Vb 1
-\&  xpaget xpamb foo \-info
-.Ve
-.Sp
-(along with other information such as the date/time of storage and the size of
-the data buffer) if the \-info switch is specified. If the info string contains
-spaces, you must enclose it in \fBtwo\fR sets of quotes:
-.Sp
-.Vb 1
-\&  cat foo | xpaset xpamb \-store foo \-info "\*(Aqthis is info on foo\*(Aq"
-.Ve
-.Sp
-The first set of quotes is removed by the shell while the second is used to
-delineate the info string.
-.IP "\(bu" 4
-\&\fB\-send [name]\fR
-.Sp
-Broadcast the stored data buffer to the named template.
-.IP "\(bu" 4
-\&\fB\-del [name]\fR
-.Sp
-Delete the named data buffer and free all allocated space.
-.PP
-Switches can be used in any combination that makes sense. For example:
-.PP
-.Vb 1
-\&  cat foo.fits | xpaset xpamb \-store foo \-info "FITS" "DS9:*" fits foo.fits
-.Ve
-.PP
-will broadcast the foo.fits image to all access points of class
-\&\fB\s-1DS9\s0\fR.  In addition, the foo.fits file will be stored under the
-name of \fBfoo\fR for later manipulation such as:
-.PP
-.Vb 1
-\&  xpaset \-p xpamb \-send foo "DS9:*" fits foo.fits
-.Ve
-.PP
-will re-broadcast the foo.fits image to all access points of class \*(L"\s-1DS9\s0\*(R".
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-A \*(L"classical\*(R" message bus (such as ToolTalk) consists of servers and
-clients, along with a mediating program that transfers data between
-different processes. \s-1XPA\s0 takes a slightly different approach in that
-communication between clients and servers is direct.  This generally
-is the correct technique when there is only one connection (or even a
-small number of connections), but can become inefficient for the
-serving program if a large amount of data is being transferred to many
-clients. For example, if a real-time data acquisition program is
-broadcasting a \s-1FITS\s0 image to several clients, it would need to
-transmit that image to each client individually.  This might interfere
-with its own processing cycles.  The preferable mechanism would be to
-pass the image off to an intermediate program that can then broadcast
-the data to the several clients.
-.PP
-The \fBxpamb\fR program can alleviate such problems by functioning
-as a message bus in cases where such an intermediary process is
-wanted.  It pre-defines a single access point named
-\&\fBXPAMB:xpamb\fR to which data can be sent for re-broadcast. You
-also can tell \fBxpamb\fR to save the data, and associate with that
-data a new access point, so that it can be retrieved later on.
-.PP
-All interaction with \fBxpamb\fR is performed through
-\&\fBxpaset\fR and \fBxpaget\fR (or the corresponding \s-1API\s0
-routines, \fB\f(BIXPASet()\fB\fR and \fB\f(BIXPAGet()\fB\fR) to the
-\&\fBXPAMB:xpamb\fR access point. That is, \fBxpamb\fR is just
-another XPA-enabled program that responds to requests from
-clients. The paramlist is used to specify the targets to which
-the data will be for re-broadcast, as well as the re-broadcast paramlist:
-.PP
-.Vb 1
-\&  data | xpaset xpamb [switches] broadcast\-target broadcast\-paramlist
-.Ve
-.PP
-Optional switches are used to store data, and manipulate stored data,
-and are described below.
-.PP
-In its simplest form, you can, for example, send a \s-1FITS\s0 image to xpamb for
-broadcasting to all ds9 image simply by executing:
-.PP
-.Vb 1
-\&  cat foo.fits | xpaset xpamb "DS9:*" fits foo.fits
-.Ve
-.PP
-Since \fB\s-1DS9\s0\fR is the class name for the ds9 image display
-program, this will result in the \s-1FITS\s0 image being re-sent to all fits
-access points for all active image display programs.
-.PP
-You can send stored data and new data to the same set of access points at
-the same time.  The stored data always is send first, followed by the new
-data:
-.PP
-.Vb 1
-\&  cat foo2.fits | xpaset xpamb \-send foo "DS9:*" fits foo.fits
-.Ve
-.PP
-will first send the foo.fits file, and then the foo2.fits file to all
-access points of class \fB\s-1DS9\s0\fR.  Notice that in this example,
-the foo2.fits file is not stored, but it could be stored by using the
-\&\fB\-store [name]\fR switch on the command line.
-.PP
-The \fBxpaget\fR command can be used to retrieve a data from \s-1XPA\s0
-access points or from a stored data buffer, or retrieve information
-about a stored data buffer.  If no arguments are given:
-.PP
-.Vb 1
-\&  xpaget xpamb
-.Ve
-.PP
-then information about all currently stored data buffers is returned. This
-information includes the data and time at which the data was stored, the
-size in bytes of the data, and the supplied info string.
-.PP
-If arguments are specified, they will be in the form:
-.PP
-.Vb 1
-\&  xpaget xpamb [\-info] [\-data] [name [paramlist]]
-.Ve
-.PP
-If the optional \fB\-info\fR and/or \fB\-data\fR switches are specified, then
-information and/or data will be returned for the named data buffer
-following the switches. You can use either or both of these switches
-in a single command. For example, if the \-info switch is used:
-.PP
-.Vb 1
-\&  xpaget xpamb \-info foo
-.Ve
-.PP
-then the info about that stored data buffer will be returned.
-If the \-data is used with a specific name:
-.PP
-.Vb 1
-\&  xpaget xpamb \-data foo
-.Ve
-.PP
-then the stored data itself will be returned. If both are used:
-.PP
-.Vb 1
-\&  xpaget xpamb \-info \-data foo
-.Ve
-.PP
-then the info will be returned, followed by the data. Note that it is an
-error to specify one of these switches without a data buffer name and that
-the paramlist will be ignored.
-.PP
-If neither the \fB\-info\fR or \fB\-data\fR switch is specified, then
-the name refers to an \s-1XPA\s0 access point (with an optional paramlist
-following).
-For example:
-.PP
-.Vb 1
-\&  xpaget xpamb ds9 file
-.Ve
-.PP
-is equivalent to:
-.PP
-.Vb 1
-\&  xpaget ds9 file
-.Ve
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man1/xpans.1 b/xpa/man/man1/xpans.1
deleted file mode 100644
index 3573725..0000000
--- a/xpa/man/man1/xpans.1
+++ /dev/null
@@ -1,331 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpans 1"
-.TH xpans 1 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBxpans: the \s-1XPA\s0 Name Server\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  xpans [\-h] [\-e] [\-k sec] [\-p port] [\-l log] [\-s security log] [\-P n]
-.Ve
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-.Vb 8
-\&  \-h            print help message
-\&  \-e            exit when there are no more XPA connections
-\&  \-k            send keepalive messages every n sec
-\&  \-l            log data base entries to specified file
-\&  \-p            listen for connections on specified port
-\&  \-s            log security info for each connection to specified file      
-\&  \-P            accept proxy requests (P=1) using separate thread (P=2)
-\&  \-\-version     display version and exit
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-The xpans name server is an XPA-enabled program that is used to
-manage the names and ports of \s-1XPA\s0 access points. It is started
-automatically when an \s-1XPA\s0 access point is registered. You can access
-the name server using xpaget to get a list of registered access points.
-.PP
-The \fIxpans\fR name server provides a crucial link between \s-1XPA\s0
-clients and servers.  When an \s-1XPA\s0 server defines an access point using
-\&\fIXPANew()\fR, \fIXPACmdNew()\fR, or \fIXPAInfoNew()\fR, the name of the access point
-is registered in the name service, along with connection information.
-The name server then matches class:name templates passed to it by \s-1XPA\s0
-clients with these registered entries, so that the clients can
-communicate with the appropriate servers.
-.PP
-The socket connection between an XPA-enabled program and
-\&\fIxpans\fR is kept open until the former exits (or explicitly
-closes the connection). Apparently, some Internet equipment (e.g. \s-1DSL\s0
-modems) can cause such a connection to time-out after a period of
-inactivity. To prevent this from happening, you can use the \-k
-[sec] switch to send a short keep-alive message to each open
-connection after the specified time delay. (Note that this
-application level use of keep-alive is necessary only if you are
-serving XPA-enabled clients over the Internet and have to deal with
-long-term connections involving \s-1DSL\s0 or similar equipment.  \s-1XPA\s0 uses
-the ordinary socket-level keep-alive, which works for all other cases.)
-\&\s-1NB\s0 (12/2/2009): Out-of-band (\s-1URG\s0) \s-1TCP\s0 data, used by xpans
-keep-alive, is changed by some Cisco routers into in-band data.
-Encountering such a router will break the keep-alive function and may
-break your \s-1XPA\s0 server as well. Proceed with caution!
-.PP
-The \fIxpans\fR program will be started automatically (assuming it
-can be found in the user's path) when the first \s-1XPA\s0 access point is
-registered.  It therefore need not be started explicitly.  However,
-when started automatically, the \fI\-e\fR switch is used, so that
-the name server will exit when there are no more \s-1XPA\s0 access points
-registered. If you wish to keep the name server running continually,
-simply start it manually without the \fI\-e\fR switch.
-.PP
-The name server will keep a log of registered access points if the
-\&\fI\-l [log]\fR switch is used on the command line (this is the
-case for automatic start-up).  The log contains enough name and connection
-information to allow you to re-register all \s-1XPA\s0 access points in case
-the name server process is terminated prematurely. For example, after
-the ds9 access point is registered,the log will contain the entry:
-.PP
-.Vb 1
-\&  add 838e2f67:1863 ds9 ds9 gs eric
-.Ve
-.PP
-If \fIxpans\fR is terminated but ds9 still is running, you
-can re-register both access points for the ds9 process by running:
-.PP
-.Vb 1
-\&  xpaset \-p 838e2f67:1863 \-nsconnect
-.Ve
-.PP
-Notice that the ip:port specifier is used with \fIxpaset\fR to bypass
-the need for contacting the name server (which does not have the name
-registered yet!)
-.PP
-The name server will keep a log of security information if the \-s
-[security log] switch is used on the command line. For each
-accepted connection, (including connections via the \fIxpaget\fR
-command), information will be logged about the host issuing the
-command and the parameters passed into the program. This is most
-useful when \fIxpans\fR is accepting connections from untrusted
-machines.
-.PP
-When an \s-1XPA\s0 access point is removed by a server using \fI\fIXPAFree()\fI\fR,
-the access information is removed from the name server.  If an
-XPA-enabled process is terminated, all names registered by that process
-will be removed automatically.  The log file is always updated to
-reflect the currently registered access points.
-.PP
-The name server itself has an \s-1XPA\s0 access point names \fIxpans\fR
-registered through which you can find out information about currently
-registered access points (assuming you have access to the name server;
-see \s-1XPA\s0 Access Control for more information).
-For each registered access point, the following information is returned:
-.PP
-.Vb 5
-\&  class         # class of the access point
-\&  name          # name of the access point
-\&  access        # allowed access (g=xpaget,s=xpaset,i=xpainfo)
-\&  id            # socket access method (host:port for inet, file for local/unix)
-\&  user          # user name of access point owner
-.Ve
-.PP
-For example, to display all currently registered access points, simply execute:
-.PP
-.Vb 1
-\&  xpaget xpans
-.Ve
-.PP
-Continuing the example of ds9 above, this will return:
-.PP
-.Vb 1
-\&  DS9 ds9 gs 838e2f67:1863 eric
-.Ve
-.PP
-If the same program has been started with different \s-1XPA\s0 access names,
-you can look up only names matching a specified template. For example,
-assume that ds9 has been started up using:
-.PP
-.Vb 3
-\&  ds9 &
-\&  ds9 \-title ds9\-1\-eric &
-\&  ds9 \-title ds9\-2\-eric &
-.Ve
-.PP
-To lookup all ds9 access points which end in \*(L".eric\*(R" and which can
-be accessed using \fIxpaset\fR, use:
-.PP
-.Vb 1
-\&  xpaget xpans "DS9:*.eric" "s" "*"
-.Ve
-.PP
-This will return:
-.PP
-.Vb 2
-\&  DS9 ds9\-2\-eric gs 838e29d3:42102 eric
-\&  DS9 ds9\-1\-eric gs 838e29d3:42105 eric
-.Ve
-.PP
-The third argument \*(L"*\*(R" requests all access points from all users.
-You also can specify a specific user name and only access points
-registered by that user will be returned.
-.PP
-The name server uses the \fI\s-1XPA_METHOD\s0\fR environment variable
-to determine whether it should listen for requests on \s-1INET\s0 or \s-1LOCAL\s0
-sockets.  Since \s-1XPA\s0 access points also use this environment variable,
-the choice of socket method will be consistent.  Note that, when \s-1INET\s0
-sockets are used, a local server can be accessed from remote machines
-if the \fI\s-1XPA_NSINET\s0\fR environment variable is set to point to
-the local machine.  See
-\&\s-1XPA\s0 Environment Variables
-for more information.
-.PP
-An experimental feature of xpans is its ability to act as a proxy to
-\&\s-1XPA\s0 servers behind firewalls that want to communicate with external
-processes.  The basic idea is the following: an \s-1XPA\s0 server (call it
-\&\*(L"foo\*(R") on host1, possibly behind a firewall, makes a remote connection
-to a proxy-enabled xpans program on host2 (specifying host2's \s-1XPA\s0 method).
-For example:
-.PP
-.Vb 1
-\&  xpaset \-p foo \-remote \*(Aqhost2:28571\*(Aq + \-proxy   # on host1
-.Ve
-.PP
-When this is done, host2 can use xpaset, xpaget, and xpainfo calls to
-communicate with the \s-1XPA\s0 server foo. All command communication is
-performed via the xpans socket connection between foo on host1 and
-xpans on host2 (which was initiated by foo from inside the firewall).
-Data communication is similarly performed using a socket connection
-initiated on host1 (usually with a port value two greater than the
-port value of the main xpans socket connection). An xpaset or xpaget
-call on host2 contacts xpans, which performs an \fIXPASet()\fR or \fIXPAGet()\fR
-call to foo, passing commands and data back and forth between the two
-programs.
-.PP
-By default, proxy connections are not allowed by xpans. If the \-P switch is
-specified with a value of 1, proxy connection are allowed, but all proxy
-communication is performed in the same thread as xpans processing. If
-a value of 2 is specified, the proxy processing is performed in a
-separate thread (assuming pthreads are supported on your system).
-Because xpa callback processing of any type can take a long time and
-therefore can interfere with normal xpans processing, threaded proxy
-connections (\-P 2) are recommended.  When using proxy connections, it
-might also be useful to set the \s-1XPA_IOCALLSXPA\s0 environment variable, so
-that multiple proxy requests can be handled at the same time, instead of
-serially.
-.PP
-Note that this proxy interface to xpans is experimental. It is used
-to provide remote data analysis capabilities on the Chandra-Ed system
-using ds9.  (See http://chandra\-ed.cfa.harvard.edu and
-http://hea\-www.harvard.edu/saord/ds9 for more details). As always, please
-contact us if you have problems or questions.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man1/xpaset.1 b/xpa/man/man1/xpaset.1
deleted file mode 100644
index 943a708..0000000
--- a/xpa/man/man1/xpaset.1
+++ /dev/null
@@ -1,217 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpaset 1"
-.TH xpaset 1 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBxpaset: send data to one or more \s-1XPA\s0 servers\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-<data> | xpaset  [\-h] [\-i nsinet] [\-m method] [\-n] [\-p] [\-s] [\-t sval,lval] [\-u users] [\-v] <template|host:port> [paramlist]
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-.Vb 10
-\&  \-h            print help message
-\&  \-i            access XPA point on different machine (override XPA_NSINET)
-\&  \-m            override XPA_METHOD environment variable
-\&  \-n            don\*(Aqt wait for the status message after server completes
-\&  \-p            don\*(Aqt read (or send) buf data from stdin
-\&  \-s            enter server mode
-\&  \-t [s,l]      set short and long timeouts (override XPA_[SHORT,LONG]_TIMEOUT)
-\&  \-u [users]    XPA points can be from specified users (override XPA_NSUSERS)
-\&  \-v            verify message to stdout
-\&  \-\-version     display version and exit
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-Data read from stdin will be sent to access points matching the 
-template
-or host:port.
-A set of qualifying parameters can be appended.
-.PP
-Normally, xpaset reads data input from stdin until \s-1EOF\s0 and sends those
-data to the \s-1XPA\s0 target, along with parameters entered on the command
-line. For example to send a \s-1FITS\s0 file to the ds9 image display:
-.PP
-.Vb 1
-\&  cat foo.fits | xpaset ds9 fits
-.Ve
-.PP
-Sometimes, however, it is desirable to send only parameters to an \s-1XPA\s0
-access point, without sending data. For such cases, use the \-p switch to
-indicate that there is no data being send to stdin. For example, to
-change the colormap used by the ds9 image display program, use:
-.PP
-.Vb 1
-\&  csh> xpaset \-p ds9 cmap Heat
-.Ve
-.PP
-Of course, this also can be accomplished by sending \s-1EOF\s0 to stdin in
-any of the usual ways:
-.PP
-.Vb 4
-\&  csh> echo "" | xpaset ds9 cmap Heat
-\&  csh> xpaget ds9 cmap Heat < /dev/null
-\&  csh> xpaset ds9 cmap Heat
-\&  ^D                    # Ctl\-D signals EOF
-.Ve
-.PP
-The \-s switch puts xpaset into server mode, in which commands and data
-can be sent to access points without having to run xpaset multiple times.
-(Its not clear if this buys you much!) The syntax for sending commands
-in server mode is:
-.PP
-.Vb 8
-\&  csh> xpaset \-s
-\&  xpaset ds9 colormap I8
-\&  ^D
-\&  xpaset ds9 regions
-\&  circle 200 300 40
-\&  circle 300 400 50
-\&  ^D
-\&etc.
-.Ve
-.PP
-After the  required \*(L"xpaset\*(R" command is specified, optional \s-1ASCII\s0 data
-can be appended (as in the region example).  A single data/command set is
-delimited by ^D. Note that typing ^D when a command is expected terminates
-the program.
-.PP
-\&\s-1NB:\s0 server mode only works from the terminal and only \s-1ASCII\s0 data can be
-sent in this way.
-.PP
-\&\fBExamples:\fR
-.PP
-.Vb 2
-\&  csh> xpaset ds9 file < foo.fits
-\&  csh> echo "stop" | xpaset myhost:12345
-.Ve
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpaaccess.3 b/xpa/man/man3/xpaaccess.3
deleted file mode 100644
index a7e25e8..0000000
--- a/xpa/man/man3/xpaaccess.3
+++ /dev/null
@@ -1,233 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpaaccess 3"
-.TH xpaaccess 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-XPAAccess: return XPA access points matching
-template (XPA 2.1 and above)
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  int XPAAccess(XPA xpa,
-\&                char *template, char *paramlist, char *mode,
-\&                char **names, char **messages, int n);
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-The XPAAccess routine returns the public access points that match the
-specified second argument template and
-have the specified access type.
-.PP
-A
-template
-of the form \*(L"class1:name1\*(R" is sent to the
-\&\s-1XPA\s0 name server, which returns a list of at most n matching \s-1XPA\s0
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an \s-1XPA\s0 struct is passed to the call, then the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers (which will be closed
-when the call completes).
-.PP
-The \fIXPAAccess()\fR routine retrieves names from at most n \s-1XPA\s0 servers
-that match the specified template and that were checked for access
-using the specified mode.  The return string contains both the
-class:name and ip:port.  If a given server returned an error or the
-server callback sends a message back to the client, then the message
-will be stored in the associated element of the messages array.
-\&\s-1NB:\s0 if specified, the name and messages arrays must be of size n or greater.
-.PP
-The returned message string will be of the form:
-.PP
-.Vb 1
-\&  XPA$ERROR error\-message (class:name ip:port)
-.Ve
-.PP
-Note that names of matching registered access points are always
-returned but may not be valid; it is not sufficient to assume that the
-returned number of access points is the number of valid access points.
-Rather, it is essential to check the messages array for error
-messages.  Any string in the messages array is an error message and
-indicated that the associated access point is not available.
-.PP
-For example, assume that a server registers a number of access points
-but delays entering its event loop. If a call to \fIXPAAccess()\fR is made
-before the event loop is entered, the call will timeout (after waiting
-for the long timeout period) and return an error of the form:
-.PP
-.Vb 1
-\&  XPA$ERROR: timeout waiting for server authentication (XPA:xpa1)
-.Ve
-.PP
-The error means that the \s-1XPA\s0 access point has been registered but is
-not yet available (because events are not being processed). When the
-server finally enters its event loop, subsequent calls to \fIXPAAccess()\fR
-will return successfully.
-.PP
-\&\s-1NB:\s0 This routine only works with \s-1XPA\s0 servers built with \s-1XPA\s0 2.1.x and later.
-Servers with older versions of \s-1XPA\s0 will return the error message:
-.PP
-.Vb 1
-\&  XPA$ERROR invalid xpa command in initialization string
-.Ve
-.PP
-If you get this error message, then the old server actually is ready
-for access, since it got to the point of fielding the query! The
-xpaaccess program, for example, ignores this message in order to work
-properly with older servers.
-.PP
-The third argument for \fIXPAAccess()\fR is the type of access and can be
-any combination of:
-.PP
-.Vb 5
-\&  type          explanation
-\&  \-\-\-\-\-\-        \-\-\-\-\-\-\-\-\-\-\-
-\&  g             xpaget calls can be made on this access point
-\&  s             xpaset calls can be made on this access point
-\&  i             xpainfo calls can be made on this access point
-.Ve
-.PP
-The mode string argument is of the form: \*(L"key1=value1,key2=value2,...\*(R"
-The following keywords are recognized:
-.PP
-.Vb 3
-\&  key           value           default         explanation
-\&  \-\-\-\-\-\-        \-\-\-\-\-\-\-\-        \-\-\-\-\-\-\-\-        \-\-\-\-\-\-\-\-\-\-\-
-\&  ack           true/false      true            if false, don\*(Aqt wait for ack from server (after callback completes)
-.Ve
-.PP
-The ack keyword is not very useful, since the server completes the callback
-in order to return the data anyway.  It is here for completion (and perhaps
-for future usefulness).
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpaatexit.3 b/xpa/man/man3/xpaatexit.3
deleted file mode 100644
index 4ff2c7d..0000000
--- a/xpa/man/man3/xpaatexit.3
+++ /dev/null
@@ -1,149 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpaatexit 3"
-.TH xpaatexit 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAAtExit: install exit handler\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  void XPAAtExit(void);
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\fIXPAAtExit()\fR will install an exit handler using \fIatexit()\fR to run XPAFree on all
-\&\s-1XPA\s0 access points. This might be useful in cases where Unix sockets are being
-used: if an explicit call to \fIXPAFree()\fR is not made by the program, the Unix
-socket file will not be deleted immediately without an atexit handler. (\s-1NB:\s0 this
-call should not be made in a Tcl/Tk application. Accessing the Tcl native file
-system after Tcl has shut down all file systems causes the Tcl/Tl program to
-crash).
diff --git a/xpa/man/man3/xpacleanup.3 b/xpa/man/man3/xpacleanup.3
deleted file mode 100644
index 57ec12e..0000000
--- a/xpa/man/man3/xpacleanup.3
+++ /dev/null
@@ -1,151 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpacleanup 3"
-.TH xpacleanup 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPACleanup: release reserved \s-1XPA\s0 memory\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  void XPACleanup(void);
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-When \s-1XPA\s0 is initialized, it allocates a small amount of memory for the
-access control list, temp directory path, and reserved commands. This
-memory is found by valgrind to be \*(L"still reachable\*(R", meaning that \*(L"your
-program didn't free some memory it could have\*(R". Calling the
-\&\fIXPACleanup()\fR routine before exiting the program will free this memory
-and make valgrind happy.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpaclient.3 b/xpa/man/man3/xpaclient.3
deleted file mode 100644
index 804f57b..0000000
--- a/xpa/man/man3/xpaclient.3
+++ /dev/null
@@ -1,206 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpaclient 3"
-.TH xpaclient 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAClient: The \s-1XPA\s0 Client-side Programming Interface\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-A description of the \s-1XPA\s0 client-side programming interface.
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\fBIntroduction to \s-1XPA\s0 Client Programming\fR
-.PP
-Sending/receiving data to/from an \s-1XPA\s0 access point is easy: you
-generally only need to call the \fIXPAGet()\fR or \fIXPASet()\fR subroutines.
-.PP
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  int XPAGet(XPA xpa,
-\&      char *template, char *paramlist, char *mode,
-\&      char **bufs, size_t *lens, char **names, char **messages, int n);
-\&
-\&  int XPASet(XPA xpa,
-\&      char *template, char *paramlist, char *mode,
-\&      char *buf, size_t len, char **names, char **messages, int n);
-\&
-\&  int XPAInfo(XPA xpa,
-\&      char *template, char *paramlist, char *mode,
-\&      char **names, char **messages, int n);
-\&
-\&  int XPAAccess(XPA xpa,
-\&      char *template, char *paramlist, char *mode,
-\&      char **names, char **messages, int n);
-\&
-\&  int XPAGetFd(XPA xpa,
-\&      char *template, char *paramlist, char *mode,
-\&      int *fds, char **names, char **messages, int n);
-\&
-\&  int XPASetFd(XPA xpa,
-\&      char *template, char *paramlist, char *mode,
-\&      int fd, char **names, char **messages, int n);
-\&
-\&  XPA XPAOpen(char *mode);
-\&
-\&  void XPAClose(XPA xpa);
-\&
-\&  int XPANSLookup(XPA xpa,
-\&      char *template, char *type,
-\&      char ***classes, char ***names, char ***methods, char ***infos);
-.Ve
-.PP
-\&\fBIntroduction\fR
-.PP
-To use the \s-1XPA\s0 application programming interface, a software developer
-generally will include the xpa.h definitions file:
-.PP
-.Vb 1
-\&  #include <xpa.h>
-.Ve
-.PP
-in the software module that defines or accesses an \s-1XPA\s0 access point and
-then will link against the libxpa.a library:
-.PP
-.Vb 1
-\&  gcc \-o foo foo.c libxpa.a
-.Ve
-.PP
-\&\s-1XPA\s0 has been compiled using both C and \*(C+ compilers.
-.PP
-Client communication with \s-1XPA\s0 public access points generally is
-accomplished using \fIXPAGet()\fR or \fIXPASet()\fR within a program (or xpaget
-and xpaset at the command line).  Both routines require specification
-of the name of the access point.  If a template
-is used to specify the access point name (e.g., \*(L"ds9*\*(R"), then
-communication will take place with all servers matching that template.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpaclose.3 b/xpa/man/man3/xpaclose.3
deleted file mode 100644
index 15e5941..0000000
--- a/xpa/man/man3/xpaclose.3
+++ /dev/null
@@ -1,157 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpaclose 3"
-.TH xpaclose 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAClose: close a persistent \s-1XPA\s0 client handle\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  void XPAClose(XPA xpa);
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-XPAClose closes the persistent connections associated with this \s-1XPA\s0 struct
-and frees all allocated space. It also closes the open sockets connections
-to all \s-1XPA\s0 servers that were opened using this handle.
-.PP
-\&\fBExample:\fR
-.PP
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  XPA xpa;
-\&  XPAClose(xpa);
-.Ve
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpacmdadd.3 b/xpa/man/man3/xpacmdadd.3
deleted file mode 100644
index 9c4b7e5..0000000
--- a/xpa/man/man3/xpacmdadd.3
+++ /dev/null
@@ -1,174 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpacmdadd 3"
-.TH xpacmdadd 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPACmdAdd: add a command to an \s-1XPA\s0 command public access point\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  XPACmd XPACmdAdd(XPA xpa, char *name, char *help,
-\&                   int (*send_callback)(),
-\&                   void *send_data, char *send_mode,
-\&                   int (*rec_callback)(),
-\&                   void *rec_data,  char *rec_mode);
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-Add a command to an \s-1XPA\s0 command access point. The \s-1XPA\s0 argument specifies the
-\&\s-1XPA\s0 struct returned by a call to \fIXPANewCmd()\fR. The name argument is the
-name of the command. The other arguments function identically to the
-arguments in the \fIXPANew()\fR command, i.e., the send_callback and rec_callback
-routines have identical calling sequences to their \fIXPANew()\fR counterparts,
-with the exceptions noted below.
-.PP
-When help is requested for a command access point using:
-.PP
-.Vb 1
-\&  xpaget \-h class:name
-.Ve
-.PP
-all of the command help strings are listed.  To get help for a given
-command, use:
-.PP
-.Vb 1
-\&  xpaget \-h class:name cmd
-.Ve
-.PP
-Also, the acl keyword in the send_mode and receive_mode strings is
-global to the access point, not local to the command.  Thus, the value
-for the acl mode should be the same in all send_mode (or receive_mode)
-strings for each command in a command access point. (The acl for
-send_mode need not be the same as the acl for receive_mode, though).
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpacmddel.3 b/xpa/man/man3/xpacmddel.3
deleted file mode 100644
index 21bf0be..0000000
--- a/xpa/man/man3/xpacmddel.3
+++ /dev/null
@@ -1,147 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpacmddel 3"
-.TH xpacmddel 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPACmdDel: remove a command from an \s-1XPA\s0 command public access point\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  void XPACmdDel(XPA xpa, XPACmd cmd);
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-This routine removes a command from the list of available commands in
-a given \s-1XPA\s0.  That command will no longer be available for processing.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpacmdnew.3 b/xpa/man/man3/xpacmdnew.3
deleted file mode 100644
index 8a1cb94..0000000
--- a/xpa/man/man3/xpacmdnew.3
+++ /dev/null
@@ -1,196 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpacmdnew 3"
-.TH xpacmdnew 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPACmdNew: create a new \s-1XPA\s0 public access point for commands\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  XPA XPACmdNew(char *class, char *name);
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-Create a new \s-1XPA\s0 public access point for commands that will share a
-common identifier class:name. Enter this access point into the \s-1XPA\s0
-name server, so that it can be accessed by external processes.
-\&\fIXPACmdNew()\fR returns an \s-1XPA\s0 struct.
-.PP
-It often is more convenient to have one public access point that can
-manage a number of commands, rather than having individual access
-points for each command. For example, it is easier to command the
-ds9 image display using:
-.PP
-.Vb 3
-\&  echo "colormap I8"   | xpaset ds9
-\&  echo "scale log"     | xpaset ds9
-\&  echo "file foo.fits" | xpaset ds9
-.Ve
-.PP
-then to use:
-.PP
-.Vb 3
-\&  echo "I8"       | xpaset ds9_colormap
-\&  echo "log"      | xpaset ds9_scale
-\&  echo "foo.fits" | xpaset ds9_file
-.Ve
-.PP
-In the first case, the commands remain the same regardless of the
-target \s-1XPA\s0 name.  In the second case, the command names must change
-for each instance of ds9.  That is, if a second instance of ds9
-called \s-1DS9\s0 were running, it would be commanded either as:
-.PP
-.Vb 3
-\&  echo "colormap I8"   | xpaset DS9
-\&  echo "scale log"     | xpaset DS9
-\&  echo "file foo.fits" | xpaset DS9
-.Ve
-.PP
-or as:
-.PP
-.Vb 3
-\&  echo "I8"       | xpaset DS9_colormap
-\&  echo "log"      | xpaset DS9_scale
-\&  echo "foo.fits" | xpaset DS9_file
-.Ve
-.PP
-Thus, in cases where a program is going to manage many commands, it
-generally is easier to define them as commands associated with the
-\&\fIXPACmdNew()\fR routine, rather than as separate access points using
-\&\fIXPANew()\fR.
-.PP
-When \fIXPACmdNew()\fR is called, only the class:name identifier is
-specified.  Each sub-command is subsequently defined using the
-\&\fIXPACmdAdd()\fR routine.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpafree.3 b/xpa/man/man3/xpafree.3
deleted file mode 100644
index 53783eb..0000000
--- a/xpa/man/man3/xpafree.3
+++ /dev/null
@@ -1,153 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpafree 3"
-.TH xpafree 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAFree: remove an \s-1XPA\s0 public access point\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  int XPAFree(XPA xpa);
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-Remove the specified \s-1XPA\s0 public access point from the name server and
-free all associated storage.  Note that removal from the name server
-happens automatically when the process terminates, so this call is not
-generally needed.  It is used when public access points are being
-defined temporarily and then destroyed when no longer needed.  For
-example, ds9 temporarily creates a public access point when it
-loads a new image for display and destroys it when the image is
-unloaded.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpaget.3 b/xpa/man/man3/xpaget.3
deleted file mode 100644
index 4f03cf6..0000000
--- a/xpa/man/man3/xpaget.3
+++ /dev/null
@@ -1,244 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpaget 3"
-.TH xpaget 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAGet: retrieve data from one or more \s-1XPA\s0 servers\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  int XPAGet(XPA xpa,
-\&             char *template, char *paramlist, char *mode,
-\&             char **bufs, size_t *lens, char **names, char **messages,
-\&             int n);
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-Retrieve data from one or more \s-1XPA\s0 servers whose class:name identifier
-matches the specified template.
-.PP
-A 
-template
-of the form \*(L"class1:name1\*(R" is sent to the
-\&\s-1XPA\s0 name server, which returns a list of at most n matching \s-1XPA\s0
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an \s-1XPA\s0 struct is passed to the call, then the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers (which will be closed
-when the call completes).
-.PP
-The \fIXPAGet()\fR routine then retrieves data from at most n \s-1XPA\s0 servers,
-places these data into n allocated buffers and places the buffer
-pointers in the bufs array. The length of each buffer is stored in the
-lens array. A string containing the class:name and ip:port is stored
-in the name array.  If a given server returned an error or the server
-callback sends a message back to the client, then the message will be
-stored in the associated element of the messages array.  \s-1NB:\s0 if
-specified, the name and messages arrays must be of size n or greater.
-.PP
-The returned message string will be of the form:
-.PP
-.Vb 1
-\&  XPA$ERROR error\-message (class:name ip:port)
-.Ve
-.PP
-or
-.PP
-.Vb 1
-\&  XPA$MESSAGE message (class:name ip:port)
-.Ve
-.PP
-Note that when there is an error stored in an messages entry, the
-corresponding bufs and lens entry may or may not be \s-1NULL\s0 and 0
-(respectively), depending on the particularities of the server.
-.PP
-The return value will contain the actual number of servers that were
-processed.  This value thus will hold the number of valid entries in
-the bufs, lens, names, and messages arrays, and can be used to loop
-through these arrays.  In names and/or messages is \s-1NULL\s0, no information is
-passed back in that array.
-.PP
-The bufs, names, and messages arrays should be freed upon completion (if
-they are not \s-1NULL\s0);
-.PP
-The mode string is of the form: \*(L"key1=value1,key2=value2,...\*(R"
-The following keywords are recognized:
-.PP
-.Vb 4
-\&  key           value           default         explanation
-\&  \-\-\-\-\-\-        \-\-\-\-\-\-\-\-        \-\-\-\-\-\-\-\-        \-\-\-\-\-\-\-\-\-\-\-
-\&  ack           true/false      true            if false, don\*(Aqt wait for ack from server (after callback completes)
-\&  doxpa         true/false      true            client processes xpa requests
-.Ve
-.PP
-The ack keyword is not very useful, since the server completes the callback
-in order to return the data anyway.  It is here for completion (and perhaps
-for future usefulness).
-.PP
-Normally, an \s-1XPA\s0 client will process incoming \s-1XPA\s0 server requests
-while awaiting the completion of the client request.  Setting this
-variable to \*(L"false\*(R" will prevent \s-1XPA\s0 server requests from being
-processed by the client.
-.PP
-\&\fBExample:\fR
-.PP
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  #define NXPA 10
-\&  int  i, got;
-\&  size_t  lens[NXPA];
-\&  char *bufs[NXPA];
-\&  char *names[NXPA];
-\&  char *messages[NXPA];
-\&  got = XPAGet(NULL, "ds9", "file", NULL, bufs, lens, names, messages,
-\&  NXPA);
-\&  for(i=0; i<got; i++){
-\&    if( messages[i] == NULL ){
-\&      /* process buf contents */
-\&      ProcessImage(bufs[i], ...);
-\&      free(bufs[i]);
-\&    }
-\&    else{
-\&      /* error processing */
-\&      fprintf(stderr, "ERROR: %s (%s)\en", messages[i], names[i]);
-\&    }
-\&    if( names[i] )
-\&      free(names[i]);
-\&    if( messages[i] )
-\&      free(messages[i]);
-\&  }
-.Ve
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpagetfd.3 b/xpa/man/man3/xpagetfd.3
deleted file mode 100644
index 1899880..0000000
--- a/xpa/man/man3/xpagetfd.3
+++ /dev/null
@@ -1,235 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpagetfd 3"
-.TH xpagetfd 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAGetFd: retrieve data from one or more \s-1XPA\s0 servers and write to files\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  int XPAGetFd(XPA xpa,
-\&               char *template, char *paramlist, char *mode,
-\&               int *fds, char **names, char **messages, int n);
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-Retrieve data from one or more \s-1XPA\s0 servers whose class:name identifier
-matches the specified
-template
-and write it to files associated with
-one or more standard I/O fds (i.e, handles returned by \fIopen()\fR).
-.PP
-A 
-template
-of the form \*(L"class1:name1\*(R" is sent to the
-\&\s-1XPA\s0 name server, which returns a list of at most \s-1ABS\s0(n) matching \s-1XPA\s0
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an \s-1XPA\s0 struct is passed to the call, then the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers (which will be closed
-when the call completes).
-.PP
-The \fIXPAGetFd()\fR routine then retrieves data from the \s-1XPA\s0 servers,
-and write these data to the fds associated with one or more fds
-(i.e., results from open). Is n is positive, then there will be n fds
-and the data from each server will be sent to a separate fd. If n is
-negative, then there is only 1 fd and all data is sent to this single
-fd. (The latter is how xpaget is implemented.)
-.PP
-A string containing the class:name and ip:port is stored in the name
-array.  If a given server returned an error or the server callback
-sends a message back to the client, then the message will be stored in
-the associated element of the messages array.  \s-1NB:\s0 if specified, the
-name and messages arrays must be of size n or greater.
-.PP
-The returned message string will be of the form:
-.PP
-.Vb 1
-\&  XPA$ERROR   error\-message (class:name ip:port)
-.Ve
-.PP
-or
-.PP
-.Vb 1
-\&  XPA$MESSAGE message     (class:name ip:port)
-.Ve
-.PP
-Note that when there is an error stored in an messages entry, the
-corresponding bufs and lens entry may or may not be \s-1NULL\s0 and 0
-(respectively), depending on the particularities of the server.
-.PP
-The return value will contain the actual number of servers that were
-processed.  This value thus will hold the number of valid entries in
-the bufs, lens, names, and messages arrays, and can be used to loop
-through these arrays.  In names and/or messages is \s-1NULL\s0, no information is
-passed back in that array.
-.PP
-The mode string is of the form: \*(L"key1=value1,key2=value2,...\*(R"
-The following keywords are recognized:
-.PP
-.Vb 3
-\&  key           value           default         explanation
-\&  \-\-\-\-\-\-        \-\-\-\-\-\-\-\-        \-\-\-\-\-\-\-\-        \-\-\-\-\-\-\-\-\-\-\-
-\&  ack           true/false      true            if false, don\*(Aqt wait for ack from server (after callback completes)
-.Ve
-.PP
-The ack keyword is not very useful, since the server completes the callback
-in order to return the data anyway.  It is here for completion (and perhaps
-for future usefulness).
-.PP
-\&\fBExample:\fR
-.PP
-.Vb 10
-\&  #include <xpa.h>
-\&  #define NXPA 10
-\&  int  i, got;
-\&  int fds[NXPA];
-\&  char *names[NXPA];
-\&  char *messages[NXPA];
-\&  for(i=0; i<NXPA; i++)
-\&    fds[i] = open(...);
-\&  got = XPAGetFd(NULL, "ds9", "file", NULL, fds, names, messages, NXPA);
-\&  for(i=0; i<got; i++){
-\&    if( messages[i] != NULL ){
-\&      /* error processing */
-\&      fprintf(stderr, "ERROR: %s (%s)\en", messages[i], names[i]);
-\&    }
-\&    if( names[i] )
-\&      free(names[i]);
-\&    if( messages[i] )
-\&      free(messages[i]);
-\&  }
-.Ve
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpainfo.3 b/xpa/man/man3/xpainfo.3
deleted file mode 100644
index 4f51a05..0000000
--- a/xpa/man/man3/xpainfo.3
+++ /dev/null
@@ -1,213 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpainfo 3"
-.TH xpainfo 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAInfo: send short message to one or more \s-1XPA\s0 servers\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  int XPAInfo(XPA xpa,
-\&              char *template, char *paramlist, char *mode,
-\&              char **names, char **messages, int n);
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-Send a short paramlist message to one or more \s-1XPA\s0 servers whose
-class:name identifier matches the specified
-template.
-.PP
-A
-template
-of the form \*(L"class1:name1\*(R" is sent to the
-\&\s-1XPA\s0 name server, which returns a list of at most n matching \s-1XPA\s0
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an \s-1XPA\s0 struct is passed to the call, then the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers (which will be closed
-when the call completes).
-.PP
-The \fIXPAInfo()\fR routine does not send data from a buf to the \s-1XPA\s0
-servers. Only the paramlist is sent.  The semantics of the paramlist
-is not formalized, but at a minimum is should tell the server how to
-get more information.  For example, it might contain the class:name
-of the \s-1XPA\s0 access point from which the server (acting as a client)
-can obtain more info using XPAGet.
-.PP
-A string containing the class:name and ip:port of each server is
-returned in the name array.  If a given server returned an error or
-the server callback sends a message back to the client, then the
-message will be stored in the associated element of the messages
-array.  The returned message string will be of the form:
-.PP
-.Vb 1
-\&  XPA$ERROR   error\-message (class:name ip:port)
-.Ve
-.PP
-or
-.PP
-.Vb 1
-\&  XPA$MESSAGE message     (class:name ip:port)
-.Ve
-.PP
-The return value will contain the actual number of servers that were
-processed.  This value thus will hold the number of valid entries in
-the names and messages arrays, and can be used to loop through these
-arrays.  In names and/or messages is \s-1NULL\s0, no information is passed back
-in that array.
-.PP
-The following keywords are recognized:
-.PP
-.Vb 3
-\&  key           value           default         explanation
-\&  \-\-\-\-\-\-        \-\-\-\-\-\-\-\-        \-\-\-\-\-\-\-\-        \-\-\-\-\-\-\-\-\-\-\-
-\&  ack           true/false      true            if false, don\*(Aqt wait for ack from server
-.Ve
-.PP
-When ack is false, \fIXPAInfo()\fR will not wait for an error return from the \s-1XPA\s0
-server. This means, in effect, that XPAInfo will send its paramlist string
-to the \s-1XPA\s0 server and then exit: no information will be sent from the server
-to the client. This UDP-like behavior is essential to avoid race
-conditions in cases where \s-1XPA\s0 servers are sending info messages to
-other servers. If two servers try to send each other an info message
-at the same time and then wait for an ack, a race condition will result and
-one or both will time out.
-.PP
-\&\fBExample:\fR
-.PP
-.Vb 1
-\&  (void)XPAInfo(NULL, "IMAGE", "ds9 image", NULL, NULL, NULL, 0);
-.Ve
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpainfonew.3 b/xpa/man/man3/xpainfonew.3
deleted file mode 100644
index bab9739..0000000
--- a/xpa/man/man3/xpainfonew.3
+++ /dev/null
@@ -1,195 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpainfonew 3"
-.TH xpainfonew 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAInfoNew: define an \s-1XPA\s0 info public access point\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  XPA XPAInfoNew(char *class, char *name,
-\&                 int (*info_callback)(),
-\&                 void *info_data, char *info_mode);
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-[\s-1NB:\s0 this is an experimental interface, new to \s-1XPA\s0 2.0, whose value
-and best use is evolving.]
-.PP
-A program can register interest in receiving a short message about a
-particular topic from any other process that cares to send such a
-message.  Neither has to be an \s-1XPA\s0 server.  For example, if a user
-starts to work with a new image file called new.fits, she might
-wish to alert interested programs about this new file by sending a
-short message using xpainfo:
-.PP
-.Vb 1
-\&  xpainfo IMAGEFILE /data/new.fits
-.Ve
-.PP
-In this example, each process that has used the \fIXPAInfoNew()\fR call to
-register interest in messages associated with the identifier \s-1IMAGEFILE\s0
-will have its \fIinfo_callback()\fR executed with the following calling
-sequence:
-.PP
-.Vb 4
-\&  int info_cb(void *info_data, void *call_data, char *paramlist)
-\&  {
-\&    XPA xpa = (XPA)call_data;
-\&  }
-.Ve
-.PP
-The arguments passed to this routine are equivalent to those sent in
-the \fIsend_callback()\fR routine.  The main difference is that there is no
-buf sent to the info callback: this mechanism is meant for short
-announcement of messages of interest to many clients.
-.PP
-The mode string is of the form: \*(L"key1=value1,key2=value2,...\*(R"
-The following keywords are recognized:
-.PP
-.Vb 3
-\&  key           value           default         explanation
-\&  \-\-\-\-\-\-        \-\-\-\-\-\-\-\-        \-\-\-\-\-\-\-\-        \-\-\-\-\-\-\-\-\-\-\-
-\&  acl           true/false      true            enable access control
-.Ve
-.PP
-Because no buf is passed to this callback, the usual buf-related keywords
-are not applicable here.
-.PP
-The information sent in the parameter list is arbitrary.  However, we
-envision sending information such as file names or \s-1XPA\s0 access points
-from which to collect more data.  Note that the xpainfo program and
-the \fIXPAInfo()\fR routine that cause the info_callback to execute do not
-wait for the callback to complete before returning.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpamacros.3 b/xpa/man/man3/xpamacros.3
deleted file mode 100644
index c9a6ab5..0000000
--- a/xpa/man/man3/xpamacros.3
+++ /dev/null
@@ -1,180 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpamacros 3"
-.TH xpamacros 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fB\s-1XPA\s0 Server Callback Macros\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  xpa_class, xpa_name, xpa_method, xpa_cmdfd, xpa_datafd,
-\&  xpa_sendian, xpa_cendian
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-Server routines have  access to information about the \s-1XPA\s0 being called via
-the following macros (each of which takes the xpa handle as an argument):
-.PP
-.Vb 9
-\&  macro                 explanation
-\&  \-\-\-\-\-\-                \-\-\-\-\-\-\-\-\-\-\-
-\&  xpa_class             class of this xpa
-\&  xpa_name              name of this xpa
-\&  xpa_method            method string (inet or local connect info)
-\&  xpa_cmdfd             fd of command socket
-\&  xpa_datafd            fd of data socket
-\&  xpa_sendian           endian\-ness of server ("little" or "big")
-\&  xpa_cendian           endian\-ness of client ("little" or "big"
-.Ve
-.PP
-The argument to these macros is the call_data pointer that is passed
-to the server procedure.  This pointer should be type case to \s-1XPA\s0
-in the server routine:
-.PP
-.Vb 1
-\&  XPA xpa = (XPA)call_data;
-.Ve
-.PP
-The most important of these macros is \fIxpa_datafd()\fR.  A server routine
-that sets \*(L"fillbuf=false\*(R" in receive_mode or send_mode can use this
-macro to perform I/O directly to/from the client, rather than using
-buf.
-.PP
-The xpa_cendian and xpa_sendian macros can be used together to determine
-if the data transferred from the client is byte swapped with respect
-to the server. Values for these macros are: \*(L"little\*(R", \*(L"big\*(R", or \*(L"?\*(R".
-In order to do a proper conversion, you still need to know the format
-of the data (i.e., byte swapping is dependent on the size of the data
-element being converted).
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpamainloop.3 b/xpa/man/man3/xpamainloop.3
deleted file mode 100644
index ff01099..0000000
--- a/xpa/man/man3/xpamainloop.3
+++ /dev/null
@@ -1,214 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpamainloop 3"
-.TH xpamainloop 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAMainLoop: optional main loop for \s-1XPA\s0\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  void XPAMainLoop();
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-Once \s-1XPA\s0 access points have been defined, a program must enter an
-event loop to watch for requests from external programs. This can be
-done in a variety of ways, depending on whether the event loop is
-processing events other than \s-1XPA\s0 events.  In cases where there are no
-non-XPA events to be processed, the program can simply call the
-\&\fIXPAMainLoop()\fR event loop.  This loop is implemented essentially as
-follows (error checking is simplified in this example):
-.PP
-.Vb 8
-\&  FD_ZERO(&readfds);
-\&  while( XPAAddSelect(NULL, &readfds) ){
-\&    if( sgot = select(swidth, &readfds, NULL, NULL, NULL) >0 )
-\&      XPAProcessSelect(&readfds, 0);
-\&    else
-\&      break;
-\&    FD_ZERO(&readfds);
-\&  }
-.Ve
-.PP
-The \fIXPAAddSelect()\fR routine sets up the \fIselect()\fR readfds variable so
-that \fIselect()\fR will wait for I/O on all the active \s-1XPA\s0 channels.  It
-returns the number of XPAs that are active; the loop will end when
-there are no active XPAs. The standard \fIselect()\fR routine is called to
-wait for an external I/O request.  Since no timeout struct is passed
-in argument 5, the \fIselect()\fR call hangs until there is an external
-request.  When an external I/O request is made, the \fIXPAProcessSelect()\fR
-routine is executed to process the pending requests.  In this routine,
-the maxreq value determines how many requests will be processed: if
-maxreq <=0, then all currently pending requests will be processed.
-Otherwise, up to maxreq requests will be processed.  (The most usual
-values for maxreq is 0 to process all requests.)
-.PP
-If a program has its own Unix \fIselect()\fR loop, then \s-1XPA\s0 access points can
-be added to it by using a variation of the standard XPAMainLoop:
-.PP
-.Vb 7
-\&  XPAAddSelect(xpa, &readfds);
-\&  [app\-specific ...]
-\&  if( select(width, &readfds, ...) ){
-\&    XPAProcessSelect(&readfds, maxreq);
-\&    [app\-specific ...]
-\&    FD_ZERO(&readfds);
-\&  }
-.Ve
-.PP
-\&\fIXPAAddSelect()\fR is called before \fIselect()\fR to add the access points.
-If the first argument is \s-1NULL\s0, then all active \s-1XPA\s0 access points
-are added. Otherwise only the specified access point is added.
-After \fIselect()\fR is called, the \fIXPAProcessSelect()\fR routine can be called
-to process \s-1XPA\s0 requests.  Once again, the maxreq value determines how
-many requests will be processed: if maxreq <=0, then all currently
-pending requests will be processed.  Otherwise, up to maxreq requests
-will be processed.
-.PP
-\&\s-1XPA\s0 access points can be added to
-Xt event loops (using \fIXtAppMainLoop()\fR)
-and
-Tcl/Tk event loops (using vwait and the Tk loop).
-When using \s-1XPA\s0 with these event loops, you only need to call:
-.PP
-int XPAXtAddInput(XtAppContext app, \s-1XPA\s0 xpa)
-.PP
-or
-.PP
-.Vb 1
-\&  int XPATclAddInput(XPA xpa)
-.Ve
-.PP
-respectively before entering the loop.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpanew.3 b/xpa/man/man3/xpanew.3
deleted file mode 100644
index f4f72b6..0000000
--- a/xpa/man/man3/xpanew.3
+++ /dev/null
@@ -1,344 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpanew 3"
-.TH xpanew 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPANew: create a new \s-1XPA\s0 access point\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  XPA XPANew(char *class, char *name, char *help,
-\&             int (*send_callback)(),
-\&             void *send_data, char *send_mode,
-\&             int (*rec_callback)(),
-\&             void *rec_data,  char *rec_mode);
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-Create a new \s-1XPA\s0 public access point with the class:name
-identifier template
-and enter this access point into the \s-1XPA\s0 name server, so that it
-can be accessed by external processes. \fIXPANew()\fR returns an \s-1XPA\s0 struct.
-Note that the length of the class and name designations must be less
-than or equal to 1024 characters each.
-.PP
-The \s-1XPA\s0 name server daemon, xpans, will be started automatically if it
-is not running already (assuming it can be found in the path).  The
-program's ip address and listening port are specified by the
-environment variable \s-1XPA_NSINET\s0, which takes the form :.  If
-no such environment variable exists, then xpans is started on the
-current machine listening on port 14285.  It also uses 14286 as a
-known port for its public access point (so that routines do not have
-to go to the name server to find the name server ip and port!)
-As of \s-1XPA\s0 2.1.1, version information is exchanged between the xpans
-process and the new access point. If the access point uses an \s-1XPA\s0
-major/minor version newer than xpans, a warning is issued by both processes,
-since mixing of new servers and old xpa programs (xpaset, xpaget,
-xpans, etc.) is not likely to work. You can turn off the warning
-message by setting the \s-1XPA_VERSIONCHECK\s0 environment variable to \*(L"false\*(R".
-.PP
-The help string is meant to be returned by a request from xpaget:
-.PP
-.Vb 1
-\&  xpaget class:name \-help
-.Ve
-.PP
-A send_callback and/or a receive_callback can be specified; at
-least one of them must be specified.
-.PP
-A send_callback can be specified that will be executed in response to
-an external request from the xpaget program, the \fIXPAGet()\fR routine, or
-\&\fIXPAGetFd()\fR routine. This callback is used to send data to the
-requesting client.
-.PP
-The calling sequence for \fIsend_callback()\fR is:
-.PP
-.Vb 7
-\&  int send_callback(void *send_data, void *call_data,
-\&    char *paramlist, char **buf, size_t *len)
-\&  {
-\&    XPA xpa = (XPA)call_data;
-\&    ...
-\&    return(stat);
-\&  }
-.Ve
-.PP
-The send_mode string is of the form: \*(L"key1=value1,key2=value2,...\*(R"
-The following keywords are recognized:
-.PP
-.Vb 4
-\&  key           value           default         explanation
-\&  \-\-\-\-\-\-        \-\-\-\-\-\-\-\-        \-\-\-\-\-\-\-\-        \-\-\-\-\-\-\-\-\-\-\-
-\&  acl           true/false      true            enable access control
-\&  freebuf       true/false      true            free buf after callback completes
-.Ve
-.PP
-The call_data should be recast to the \s-1XPA\s0 struct as shown.  In
-addition, client-specific data can be passed to the callback in
-send_data.
-.PP
-The paramlist will be supplied by the client as qualifying parameters
-for the callback.  There are two ways in which the \fIsend_callback()\fR
-routine can send data back to the client:
-.PP
-1. The \fIsend_callback()\fR routine can fill in a buffer and pass back a
-pointer to this buffer. An integer len also is returned to specify the
-number of bytes of data in buf.  \s-1XPA\s0 will send this buffer to the
-client after the callback is complete.
-.PP
-2. The send_callback can send data directly to the client by writing
-to the fd pointed by the macro:
-.PP
-.Vb 1
-\&  xpa_datafd(xpa)
-.Ve
-.PP
-Note that this fd is of the kind returned by \fIsocket()\fR or \fIopen()\fR.
-.PP
-If a buf has been allocated by a standard malloc routine, filled, and
-returned to \s-1XPA\s0, then freebuf generally is set so that the buffer will
-be freed automatically when the callback is completed and data has
-been sent to the client.  If a static buf is returned, freebuf should
-be set to false to avoid a system error when freeing static storage.
-Note that default value for freebuf implies that the callback will
-allocate a buffer rather than use static storage.
-.PP
-On the other hand, if buf is dynamically allocated using a method
-other than a standard malloc/calloc/realloc routine (e.g. using Perl's
-memory allocation and garbage collection scheme), then it is necessary
-to tell \s-1XPA\s0 how to free the allocated buffer. To do this, use the
-\&\fIXPASetFree()\fR routine within your callback:
-.PP
-.Vb 1
-\&  void XPASetFree(XPA xpa, void (*myfree)(void *), void *myfree_ptr);
-.Ve
-.PP
-The first argument is the usual \s-1XPA\s0 handle. The second argument is the
-special routine to call to free your allocated memory. The third
-argument is an optional pointer.  If not \s-1NULL\s0, the specified free
-routine is called with that pointer as its sole argument. If \s-1NULL\s0, the
-free routine is called with the standard buf pointer as its sole
-argument. This is useful in cases where there is a mapping between the
-buffer pointer and the actual allocated memory location, and the
-special routine is expecting to be passed the former.
-.PP
-If, while the callback performs its processing, an error occurs that
-should be communicated to the client, then the routine XPAError should be
-called:
-.PP
-.Vb 1
-\&  XPAError(XPA xpa, char *s);
-.Ve
-.PP
-where s is an arbitrary error message.  The returned error message
-string will be of the form:
-.PP
-.Vb 1
-\&  XPA$ERROR   [error] (class:name ip:port)
-.Ve
-.PP
-If the callback wants to send a specific acknowledgment message back
-to the client, the routine XPAMessage can be called:
-.PP
-.Vb 1
-\&  XPAMessage(XPA xpa, char *s);
-.Ve
-.PP
-where s is an arbitrary error message.  The returned error message
-string will be of the form:
-.PP
-.Vb 1
-\&  XPA$MESSAGE [message] (class:name ip:port)
-.Ve
-.PP
-Otherwise, a standard acknowledgment is sent back to the client
-after the callback is completed.
-.PP
-The callback routine should return 0 if no error occurs, or \-1 to
-signal an error.
-.PP
-A receive_callback can be specified that will be executed in response
-to an external request from the xpaset program, or the XPASet (or
-\&\fIXPASetFd()\fR) routine. This callback is used to process data received
-from an external process.
-.PP
-The calling sequence for receive_callback is:
-.PP
-.Vb 7
-\&  int receive_callback(void *receive_data, void *call_data,
-\&    char *paramlist, char *buf, size_t len)
-\&  {
-\&    XPA xpa = (XPA)call_data;
-\&    ...
-\&    return(stat);
-\&  }
-.Ve
-.PP
-The mode string is of the form: \*(L"key1=value1,key2=value2,...\*(R"
-The following keywords are recognized:
-.PP
-.Vb 6
-\&  key           value           default         explanation
-\&  \-\-\-\-\-\-        \-\-\-\-\-\-\-\-        \-\-\-\-\-\-\-\-        \-\-\-\-\-\-\-\-\-\-\-
-\&  acl           true/false      true            enable access control
-\&  buf           true/false      true            server expects data bytes from client
-\&  fillbuf       true/false      true            read data into buf before executing callback
-\&  freebuf       true/false      true            free buf after callback completes
-.Ve
-.PP
-The call_data should be recast to the \s-1XPA\s0 struct as shown.  In
-addition, client-specific data can be passed to the callback in
-receive_data.
-.PP
-The paramlist will be supplied by the client. In addition, if the
-receive_mode keywords buf and fillbuf are true, then on entry into the
-\&\fIreceive_callback()\fR routine, buf will contain the data sent by the
-client. If buf is true but fillbuf is false, it becomes the callback's
-responsibility to retrieve the data from the client, using the data fd
-pointed to by the macro xpa_datafd(xpa).  If freebuf is true, then buf
-will be freed when the callback is complete.
-.PP
-If, while the callback is performing its processing, an error occurs
-that should be communicated to the client, then the routine XPAError
-can be called:
-.PP
-.Vb 1
-\&  XPAError(XPA xpa, char *s);
-.Ve
-.PP
-where s is an arbitrary error message.
-.PP
-The callback routine should return 0 if no error occurs, or \-1 to
-signal an error.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpanslookup.3 b/xpa/man/man3/xpanslookup.3
deleted file mode 100644
index 8725e3e..0000000
--- a/xpa/man/man3/xpanslookup.3
+++ /dev/null
@@ -1,232 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpanslookup 3"
-.TH xpanslookup 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPANSLookup: lookup registered \s-1XPA\s0 access points\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  int XPANSLookup(XPA xpa,
-\&                  char *template, char type,
-\&                  char ***classes, char ***names,
-\&                  char ***methods, char ***infos)
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\s-1XPA\s0 routines act on a class:name identifier in such a way
-that all access points that match the identifier are processed.  It is
-sometimes desirable to choose specific access points from the
-candidates that match the
-template.  In order to do this, the
-XPANSLookup routine can be called to return a list of matches, so that
-specific class:name instances can then be fed to \fIXPAGet()\fR, \fIXPASet()\fR, etc.
-.PP
-.Vb 4
-\& The first argument is an optional XPA struct. If non\-NULL, the
-\&existing name server connection associated with the specified xpa is
-\&used to query the xpans name server for matching templates. Otherwise,
-\&a new (temporary) connection is established with the name server.
-.Ve
-.PP
-The second argument to XPANSLookup is the class:name 
-template
-to match.
-.PP
-The third argument for \fIXPANSLookup()\fR is the type of access and can be
-any combination of:
-.PP
-.Vb 5
-\&  type          explanation
-\&  \-\-\-\-\-\-        \-\-\-\-\-\-\-\-\-\-\-
-\&  g             xpaget calls can be made on this access point
-\&  s             xpaset calls can be made on this access point
-\&  i             xpainfo calls can be made on this access point
-.Ve
-.PP
-The call typically specifies only one of these at a time.
-.PP
-The final arguments are pointers to arrays that will be filled
-in and returned by the name server. The name server will allocate and
-return arrays filled with the classes, names, and methods of all \s-1XPA\s0
-access points that match the template
-and have the specified type. Also returned are info strings, which
-generally are used internally by the client routines. These can be
-ignored (but the strings must be freed).  The function returns the
-number of matches. The returned value can be used to loop through the
-matches:
-.PP
-\&\fBExample:\fR
-.PP
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  char **classes;
-\&  char **names;
-\&  char **methods;
-\&  char **infos;
-\&  int i, n;
-\&  n = XPANSLookup(NULL, "foo*", "g", &classes, &names, &methods, &infos);
-\&  for(i=0; i<n; i++){
-\&    [more specific checks on possibilities ...]
-\&    [perhaps a call to XPAGet for those that pass, etc. ...]
-\&    /* don\*(Aqt forget to free alloc\*(Aqed strings when done */
-\&    free(classes[i]);
-\&    free(names[i]);
-\&    free(methods[i]);
-\&    free(infos[i]);
-\&  }
-\&  /* free up arrays alloc\*(Aqed by names server */
-\&  if( n > 0 ){
-\&    free(classes);
-\&    free(names);
-\&    free(methods);
-\&    free(infos);
-\&  }
-.Ve
-.PP
-The specified 
-template
-also can be a host:port specification, for example:
-.PP
-.Vb 1
-\&  myhost:12345
-.Ve
-.PP
-In this case, no connection is made to the name server. Instead, the
-call will return one entry such that the ip array contains the ip for
-the specified host and the port array contains the port.  The class
-and name entries are set to the character \*(L"?\*(R", since the class and
-name of the access point are not known.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpaopen.3 b/xpa/man/man3/xpaopen.3
deleted file mode 100644
index c62af06..0000000
--- a/xpa/man/man3/xpaopen.3
+++ /dev/null
@@ -1,172 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpaopen 3"
-.TH xpaopen 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAOpen: allocate a persistent client handle\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  XPA XPAOpen(char *mode);
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\fIXPAOpen()\fR allocates a persistent \s-1XPA\s0 struct that can be used with
-calls to \fIXPAGet()\fR, \fIXPASet()\fR, \fIXPAInfo()\fR, \fIXPAGetFd()\fR, and
-\&\fIXPASetFd()\fR. Persistence means that a connection to an \s-1XPA\s0 server is
-not closed when one of the above calls is completed but will be
-re-used on successive calls. Using \fIXPAOpen()\fR therefore saves the time
-it takes to connect to a server, which could be significant with slow
-connections or if there will be a large number of exchanges with a
-given access point.  The mode argument currently is ignored (\*(L"reserved
-for future use\*(R").
-.PP
-An \s-1XPA\s0 struct is returned if \fIXPAOpen()\fR was successful; otherwise \s-1NULL\s0
-is returned. This returned struct can be passed as the first argument
-to \fIXPAGet()\fR, etc.  Those calls will update the list of active \s-1XPA\s0
-connections.  Already connected servers (from a previous call) are
-left connected and new servers also will be connected.  Old servers
-(from a previous call) that are no longer needed are disconnected.
-The connected servers will remain connected when the next call to
-\&\fIXPAGet()\fR is made and connections are once again updated.
-.PP
-\&\fBExample:\fR
-.PP
-.Vb 1
-\& #include <xpa.h>
-\&
-\&  XPA xpa;
-\&  xpa = XPAOpen(NULL);
-.Ve
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpapoll.3 b/xpa/man/man3/xpapoll.3
deleted file mode 100644
index 61d3c28..0000000
--- a/xpa/man/man3/xpapoll.3
+++ /dev/null
@@ -1,163 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpapoll 3"
-.TH xpapoll 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAPoll: execute existing \s-1XPA\s0 requests\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  int XPAPoll(int msec, int maxreq);
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-It is sometimes desirable to implement a polling loop, i.e., where one
-checks for and processes \s-1XPA\s0 requests without blocking.  For this
-situation, use the \fIXPAPoll()\fR routine:
-.PP
-.Vb 1
-\&  XPAPoll(int msec, int maxreq);
-.Ve
-.PP
-The \fIXPAPoll()\fR routine will perform \fIXPAAddSelect()\fR and \fIselect()\fR, but with a
-timeout specified in millisecs by the msec argument. If one or more
-\&\s-1XPA\s0 requests are made before the timeout expires, the \fIXPAProcessSelect()\fR
-routine is called to process those requests. The maxreq value determines
-how many requests will be processed: if maxreq < 0, then no events are
-processed, but instead, the return value indicates the number of events
-that are pending.  If maxreq == 0, then all currently pending requests
-will be processed.  Otherwise, up to maxreq requests will be processed.
-(The most usual values for maxreq are 0 to process all requests and 1
-to process one request).
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xparace.3 b/xpa/man/man3/xparace.3
deleted file mode 100644
index 6100196..0000000
--- a/xpa/man/man3/xparace.3
+++ /dev/null
@@ -1,191 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xparace 3"
-.TH xparace 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fB\s-1XPA\s0 Race Conditions\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-Potential \s-1XPA\s0 race conditions and how to avoid them.
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-Currently, there is only one known circumstance in which \s-1XPA\s0 can get
-(temporarily) deadlocked in a race condition: if two or more \s-1XPA\s0
-servers send messages to one another using an \s-1XPA\s0 client routine such
-as \fIXPASet()\fR, they can deadlock while each waits for the other server
-to respond.  (This can happen if the servers call \fIXPAPoll()\fR with a
-time limit, and send messages in between the polling call.)  The
-reason this happens is that both client routines send a string to the
-other server to establish the handshake and then wait for the server
-response. Since each client is waiting for a response, neither is able
-to enter its event-handling loop and respond to the other's
-request. This deadlock will continue until one of the timeout periods
-expire, at which point an error condition will be triggered and the
-timed-out server will return to its event loop.
-.PP
-Starting with version 2.1.6, this rare race condition can be
-avoided by setting the \s-1XPA_IOCALLSXPA\s0 environment variable for servers
-that will make client calls. Setting this variable causes all \s-1XPA\s0
-socket \s-1IO\s0 calls to process outstanding \s-1XPA\s0 requests whenever the
-primary socket is not ready for \s-1IO\s0. This means that a server making a
-client call will (recursively) process incoming server requests while
-waiting for client completion. It also means that a server callback
-routine can handle incoming \s-1XPA\s0 messages if it makes its own \s-1XPA\s0 call.
-The semi-public routine oldvalue=XPAIOCallsXPA(newvalue) can be used
-to turn this behavior off and on temporarily. Passing a 0 will turn
-off \s-1IO\s0 processing, 1 will turn it back on. The old value is returned
-by the call.
-.PP
-By default, the \s-1XPA_IOCALLSXPA\s0 option is turned off, because we judge
-that the added code complication and overhead involved will not be
-justified by the amount of its use.  Moreover, processing \s-1XPA\s0 requests
-within socket \s-1IO\s0 can lead to non-intuitive results, since incoming
-server requests will not necessarily be processed to completion in the
-order in which they are received.
-.PP
-Aside from setting \s-1XPA_IOCALLSXPA\s0, the simplest way to avoid this race
-condition is to multi-process: when you want to send a client message,
-simply start a separate process to call the client routine, so that
-the server is not stopped. It probably is fastest and easiest to use
-\&\fIfork()\fR and then have the child call the client routine and exit. But
-you also can use either the \fIsystem()\fR or \fIpopen()\fR routine to start one
-of the command line programs and do the same thing. Alternatively, you
-can use \s-1XPA\s0's internal \fIlaunch()\fR routine instead of \fIsystem()\fR. Based on
-\&\fIfork()\fR and \fIexec()\fR, this routine is more secure than \fIsystem()\fR because
-it does not call /bin/sh.
-.PP
-Starting with version 2.1.5, you also can send an \fIXPAInfo()\fR message with
-the mode string \*(L"ack=false\*(R". This will cause the client to send a message
-to the server and then exit without waiting for any return message from
-the server. This UDP-like behavior will avoid the server deadlock when
-sending short XPAInfo messages.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpaserver.3 b/xpa/man/man3/xpaserver.3
deleted file mode 100644
index a0803aa..0000000
--- a/xpa/man/man3/xpaserver.3
+++ /dev/null
@@ -1,205 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpaserver 3"
-.TH xpaserver 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAServer: The \s-1XPA\s0 Server-side Programming Interface\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-A description of the \s-1XPA\s0 server-side programming interface.
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\fBIntroduction to \s-1XPA\s0 Server Programming\fR
-.PP
-Creating an \s-1XPA\s0 server is easy: you generally only need to call the
-\&\fIXPANew()\fR subroutine to define a named \s-1XPA\s0 access point and set up the
-send and receive callback routines.  You then enter an event loop such
-as \fIXPAMainLoop()\fR to field \s-1XPA\s0 requests.
-.PP
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  XPA XPANew(char *class, char *name, char *help,
-\&      int (*send_callback)(), void *send_data, char *send_mode,
-\&      int (*rec_callback)(),  void *rec_data,  char *rec_mode);
-\&
-\&  XPA XPACmdNew(char *class, char *name);
-\&
-\&  XPACmd XPACmdAdd(XPA xpa,
-\&         char *name, char *help,
-\&         int (*send_callback)(), void *send_data, char *send_mode,
-\&         int (*rec_callback)(),  void *rec_data,  char *rec_mode);
-\&
-\&  void XPACmdDel(XPA xpa, XPACmd cmd);
-\&
-\&  XPA XPAInfoNew(char *class, char *name,
-\&      int (*info_callback)(), void *info_data, char *info_mode);
-\&
-\&  int XPAFree(XPA xpa);
-\&
-\&  void XPAMainLoop(void);
-\&
-\&  int XPAPoll(int msec, int maxreq);
-\&
-\&  void XPAAtExit(void);
-\&
-\&  void XPACleanup(void);
-.Ve
-.PP
-\&\fBIntroduction\fR
-.PP
-To use the \s-1XPA\s0 application programming interface, a software developer
-generally will include the xpa.h definitions file:
-.PP
-.Vb 1
-\&  #include <xpa.h>
-.Ve
-.PP
-in the software module that defines or accesses an \s-1XPA\s0 access point, and
-then will link against the libxpa.a library:
-.PP
-.Vb 1
-\&  gcc \-o foo foo.c libxpa.a
-.Ve
-.PP
-\&\s-1XPA\s0 has been compiled using both C and \*(C+ compilers.
-.PP
-A server program generally defines an \s-1XPA\s0 access point by calling the
-\&\fIXPANew()\fR routine and specifies \*(L"send\*(R" and/or \*(L"receive\*(R" callback
-procedures to be executed by the program when an external process
-either sends data or commands to this access point or requests data or
-information from this access point. A program also can define several
-sub-commands for a single access point by calling \fIXPACmdNew()\fR and
-\&\fIXPACmdAdd()\fR instead.  Having defined one or more public access points
-in this way, an \s-1XPA\s0 server program enters its usual event loop (or
-uses the standard \s-1XPA\s0 event loop).
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpaset.3 b/xpa/man/man3/xpaset.3
deleted file mode 100644
index d9dd7c0..0000000
--- a/xpa/man/man3/xpaset.3
+++ /dev/null
@@ -1,236 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpaset 3"
-.TH xpaset 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPASet: send data to one or more \s-1XPA\s0 servers\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  int XPASet(XPA xpa,
-\&             char *template, char *paramlist, char *mode,
-\&             char *buf, size_t len, char **names, char **messages,
-\&             int n);
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-Send data to one or more \s-1XPA\s0 servers whose class:name identifier
-matches the specified template.
-.PP
-A 
-template
-of the form \*(L"class1:name1\*(R" is sent to the
-\&\s-1XPA\s0 name server, which returns a list of at most n matching \s-1XPA\s0
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an \s-1XPA\s0 struct is passed to the call, the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers (which will be closed
-when the call completes).
-.PP
-The \fIXPASet()\fR routine transfers data from buf to the \s-1XPA\s0 servers.
-The length of buf (in bytes) should be placed in the len variable.
-.PP
-A string containing the class:name and ip:port of each of these server
-is returned in the name array.  If a given server returned an error or
-the server callback sends a message back to the client, then the
-message will be stored in the associated element of the messages
-array. \s-1NB:\s0 if specified, the name and messages arrays must be of size
-n or greater.
-.PP
-The returned message string will be of the form:
-.PP
-.Vb 1
-\&  XPA$ERROR   [error] (class:name ip:port)
-.Ve
-.PP
-or
-.PP
-.Vb 1
-\&  XPA$MESSAGE [message] (class:name ip:port)
-.Ve
-.PP
-The return value will contain the actual number of servers that were
-processed.  This value thus will hold the number of valid entries in
-the names and messages arrays, and can be used to loop through these
-arrays.  In names and/or messages is \s-1NULL\s0, no information is passed back
-in that particular array.
-.PP
-The mode string is of the form: \*(L"key1=value1,key2=value2,...\*(R"
-The following keywords are recognized:
-.PP
-.Vb 5
-\&  key           value           default         explanation
-\&  \-\-\-\-\-\-        \-\-\-\-\-\-\-\-        \-\-\-\-\-\-\-\-        \-\-\-\-\-\-\-\-\-\-\-
-\&  ack           true/false      true            if false, don\*(Aqt wait for ack from server (after callback completes)
-\&  verify        true/false      false           send buf from XPASet[Fd] to stdout
-\&  doxpa         true/false      true            client processes xpa requests
-.Ve
-.PP
-The ack keyword is useful in cases where one does not want to wait for
-the server to complete, e.g. if a lot of processing needs to be done
-by the server on the passed data or when the success of the server
-operation is not relevant to the client.
-.PP
-Normally, an \s-1XPA\s0 client will process incoming \s-1XPA\s0 server requests
-while awaiting the completion of the client request.  Setting this
-variable to \*(L"false\*(R" will prevent \s-1XPA\s0 server requests from being
-processed by the client.
-.PP
-\&\fBExample:\fR
-.PP
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  #define NXPA 10
-\&  int  i, got;
-\&  size_t  len;
-\&  char *buf;
-\&  char *names[NXPA];
-\&  char *messages[NXPA];
-\&  ...
-\&  [fill buf with data and set len to the length, in bytes, of the data]
-\&  ...
-\&  /* send data to all access points */
-\&  got = XPASet(NULL, "ds9", "fits", NULL, buf, len, names, messages, NXPA);
-\&  /* error processing */
-\&  for(i=0; i<got; i++){
-\&    if( messages[i] ){
-\&      fprintf(stderr, "ERROR: %s (%s)\en", messages[i], names[i]);
-\&    }
-\&    if( names[i] )    free(names[i]);
-\&    if( messages[i] ) free(messages[i]);
-\&  }
-.Ve
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/man3/xpasetfd.3 b/xpa/man/man3/xpasetfd.3
deleted file mode 100644
index 5017a38..0000000
--- a/xpa/man/man3/xpasetfd.3
+++ /dev/null
@@ -1,214 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpasetfd 3"
-.TH xpasetfd 3 "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPASetFd: send data from stdin to one or more \s-1XPA\s0 servers\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  int XPASetFd(XPA xpa,
-\&               char *template, char *paramlist, char *mode,
-\&               int fd, char **names, char **messages, int n)
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-Read data from a standard I/O fd and send it to one or more \s-1XPA\s0
-servers whose class:name identifier matches the specified
-template.
-.PP
-A
-template
-of the form \*(L"class1:name1\*(R" is sent to the
-\&\s-1XPA\s0 name server, which returns a list of at most n matching \s-1XPA\s0
-servers.  A connection is established with each of these servers and
-the paramlist string is passed to the server as the data transfer
-request is initiated. If an \s-1XPA\s0 struct is passed to the call, then the
-persistent connections are updated as described above. Otherwise,
-temporary connections are made to the servers (which will be closed
-when the call completes).
-.PP
-The \fIXPASetFd()\fR routine then reads bytes from the specified fd
-until \s-1EOF\s0 and sends these bytes to the \s-1XPA\s0 servers.  
-The final parameter n specifies the maximum number of servers to contact.
-A string containing the class:name and ip:port of each server is returned in
-the name array.  If a given server returned an error, then the error
-message will be stored in the associated element of the messages array.
-\&\s-1NB:\s0 if specified, the name and messages arrays must be of size n or greater.
-.PP
-The return value will contain the actual number of servers that were
-processed.  This value thus will hold the number of valid entries in
-the names and messages arrays, and can be used to loop through these
-arrays.  In names and/or messages is \s-1NULL\s0, no information is passed back
-in that array.
-.PP
-The mode string is of the form: \*(L"key1=value1,key2=value2,...\*(R"
-The following keywords are recognized:
-.PP
-.Vb 4
-\&  key           value           default         explanation
-\&  \-\-\-\-\-\-        \-\-\-\-\-\-\-\-        \-\-\-\-\-\-\-\-        \-\-\-\-\-\-\-\-\-\-\-
-\&  ack           true/false      true            if false, don\*(Aqt wait for ack from server (after callback completes)
-\&  verify        true/false      false           send buf from XPASet[Fd] to stdout
-.Ve
-.PP
-The ack keyword is useful in cases where one does not want to wait for
-the server to complete, e.g. is a lot of processing needs to be done
-on the passed data or when the success of the server operation is not
-relevant to the client.
-.PP
-\&\fBExample:\fR
-.PP
-.Vb 1
-\&  #include <xpa.h>
-\&
-\&  #define NXPA 10
-\&  int  i, got;
-\&  int fd;
-\&  char *names[NXPA];
-\&  char *messages[NXPA];
-\&  fd = open(...);
-\&  got = XPASetFd(NULL, "ds9", "fits", NULL, fd, names, messages, NXPA);
-\&  for(i=0; i<got; i++){
-\&    if( messages[i] != NULL ){
-\&      /* error processing */
-\&      fprintf(stderr, "ERROR: %s (%s)\en", messages[i], names[i]);
-\&    }
-\&    if( names[i] )
-\&      free(names[i]);
-\&    if( messages[i] )
-\&      free(messages[i]);
-\&  }
-.Ve
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/mann/xpa.n b/xpa/man/mann/xpa.n
deleted file mode 100644
index 189a601..0000000
--- a/xpa/man/mann/xpa.n
+++ /dev/null
@@ -1,318 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpa n"
-.TH xpa n "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fB\s-1XPA:\s0 Public Access to Data and Algorithms\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-This document is the Table of Contents for \s-1XPA\s0.
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-The \s-1XPA\s0 messaging system provides seamless communication between many
-kinds of Unix programs, including X programs and Tcl/Tk programs.  It
-also provides an easy way for users to communicate with XPA-enabled
-programs by executing \s-1XPA\s0 client commands in the shell or by utilizing
-such commands in scripts.  Because \s-1XPA\s0 works both at the programming
-level and the shell level, it is a powerful tool for unifying any
-analysis environment: users and programmers have great flexibility in
-choosing the best level or levels at which to access \s-1XPA\s0 services, and
-client access can be extended or modified easily at any time.
-.PP
-A program becomes an XPA-enabled server by defining named points of
-public access through which data and commands can be exchanged with
-other client programs (and users).  Using standard \s-1TCP\s0 sockets as a
-transport mechanism, \s-1XPA\s0 supports both single-point and broadcast
-messaging to and from these servers.  It supports direct communication
-between clients and servers, or indirect communication via an
-intermediate message bus emulation program. Host-based access control
-is implemented, as is as the ability to communicate with \s-1XPA\s0 servers
-across a network.
-.PP
-\&\s-1XPA\s0 implements a layered interface that is designed to be useful both
-to software developers and to users.  The interface consists of a
-library of \s-1XPA\s0 client and server routines for use in C/\*(C+ programs and
-a suite of high-level user programs built on top of these libraries.
-Using the \s-1XPA\s0 library, access points can be added to Tcl/Tk programs,
-Xt programs, or to Unix programs that use the \s-1XPA\s0 event loop or any
-event loop based on \fIselect()\fR.  Client access subroutines can be added
-to any Tcl/Tk, Xt, or Unix program. Client access also is supported at
-the command line via a suite of high-level programs.
-.PP
-Choose from the following topics:
-.IP "\(bu" 4
-Introduction to \s-1XPA\s0
-[xpaintro(n)]
-.IP "\(bu" 4
-Access Point Names and Templates
-[xpatemplate(n)]
-.IP "\(bu" 4
-Getting Common Information About Access Points
-[xpacommon(n)]
-.IP "\(bu" 4
-Communication Methods
-[xpamethod(n)]
-.IP "\(bu" 4
-Communication Between Hosts
-[xpainet(n)]
-.IP "\(bu" 4
-Distinguishing Users
-[xpausers(n)]
-.IP "\(bu" 4
-\&\s-1XPA\s0 User Programs
-.RS 4
-.IP "\(bu" 4
-xpaget: get data and info
-[\fIxpaget\fR\|(1)]
-.IP "\(bu" 4
-xpaset: send data and info
-[\fIxpaset\fR\|(1)]
-.IP "\(bu" 4
-xpainfo: send info alert
-[\fIxpainfo\fR\|(1)]
-.IP "\(bu" 4
-xpaaccess: get access point info
-[\fIxpaaccess\fR\|(1)]
-.IP "\(bu" 4
-xpamb: message bus emulation
-[\fIxpamb\fR\|(1)]
-.IP "\(bu" 4
-xpans: the \s-1XPA\s0 name server
-[\fIxpans\fR\|(1)]
-.RE
-.RS 4
-.RE
-.IP "\(bu" 4
-\&\s-1XPA\s0 Server Routines
-.RS 4
-.IP "\(bu" 4
-XPANew: define a new access point
-[\fIxpanew\fR\|(3)]
-.IP "\(bu" 4
-XPACmdNew: define a new command access point
-[\fIxpacmdnew\fR\|(3)]
-.IP "\(bu" 4
-XPACmdAdd: add a command
-[\fIxpacmdadd\fR\|(3)]
-.IP "\(bu" 4
-XPACmdDel: delete a command
-[\fIxpacmddel\fR\|(3)]
-.IP "\(bu" 4
-XPAInfoNew: define an info access point
-[\fIxpainfonew\fR\|(3)]
-.IP "\(bu" 4
-XPAFree: free an access point
-[\fIxpafree\fR\|(3)]
-.IP "\(bu" 4
-XPAMainLoop: event loop for select server
-[\fIxpamainloop\fR\|(3)]
-.IP "\(bu" 4
-XPAPoll: poll for \s-1XPA\s0 events
-[\fIxpapoll\fR\|(3)]
-.IP "\(bu" 4
-XPACleanup: release reserved \s-1XPA\s0 memory
-[\fIxpacleanup\fR\|(3)]
-.IP "\(bu" 4
-\&\s-1XPA\s0 Server Macros: accessing structure internals
-[\fIxpamacros\fR\|(3)]
-.IP "\(bu" 4
-\&\s-1XPA\s0 Race Conditions: how to avoid them
-[\fIxparace\fR\|(3)]
-.IP "\(bu" 4
-\&\s-1XPA\s0 Out of Memory (\s-1OOM\s0) errors
-[\fIxpaoom\fR\|(3)]
-.RE
-.RS 4
-.RE
-.IP "\(bu" 4
-\&\s-1XPA\s0 Client Routines
-.RS 4
-.IP "\(bu" 4
-XPAOpen: open a persistent client connection
-[\fIxpaopen\fR\|(3)]
-.IP "\(bu" 4
-XPAClose: close persistent client connection
-[\fIxpaclose\fR\|(3)]
-.IP "\(bu" 4
-XPAGet: get data
-[\fIxpaget\fR\|(3)]
-.IP "\(bu" 4
-XPASet: send data or commands
-[\fIxpaset\fR\|(3)]
-.IP "\(bu" 4
-XPAInfo: send an info alert
-[\fIxpainfo\fR\|(3)]
-.IP "\(bu" 4
-XPAGetFd: get data and write to an fd
-[\fIxpagetfd\fR\|(3)]
-.IP "\(bu" 4
-XPASetFd: read data from and fd and send
-[\fIxpasetfd\fR\|(3)]
-.IP "\(bu" 4
-XPANSLookup: look up an access point
-[\fIxpanslookup\fR\|(3)]
-.IP "\(bu" 4
-XPAAccess: get access info
-[\fIxpaaccess\fR\|(3)]
-.IP "\(bu" 4
-The XPA/Xt Interface: Xt interface to \s-1XPA\s0
-[xpaxt(n)]
-.IP "\(bu" 4
-The XPA/Tcl Interface: Tcl interface to \s-1XPA\s0
-[xpatcl(n)]
-.RE
-.RS 4
-.RE
-.IP "\(bu" 4
-Tailoring the \s-1XPA\s0 Environment
-.RS 4
-.IP "\(bu" 4
-Environment Variables
-[xpaenv(n)]
-.IP "\(bu" 4
-Access Control
-[xpaacl(n)]
-.RE
-.RS 4
-.RE
-.IP "\(bu" 4
-Miscellaneous
-.RS 4
-.IP "\(bu" 4
-Where to Find Example/Test Code
-.IP "\(bu" 4
-User Changes Between \s-1XPA\s0 1.0 and 2.0
-.IP "\(bu" 4
-\&\s-1API\s0 Changes Between \s-1XPA\s0 1.0 and 2.0
-.IP "\(bu" 4
-What Does \s-1XPA\s0 Stand For, Anyway?
-.RE
-.RS 4
-.RE
diff --git a/xpa/man/mann/xpaacl.n b/xpa/man/mann/xpaacl.n
deleted file mode 100644
index d339c5d..0000000
--- a/xpa/man/mann/xpaacl.n
+++ /dev/null
@@ -1,251 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpaacl n"
-.TH xpaacl n "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAAcl: Access Control for \s-1XPA\s0 Messaging\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-\&\s-1XPA\s0 supports host-based access control for each \s-1XPA\s0 access point.  You
-can enable/disable access control using the \s-1XPA_ACL\s0 environment
-variable. You can specify access to specific \s-1XPA\s0 access points for
-specific machines using the \s-1XPA_DEFACL\s0 and \s-1XPA_ACLFILE\s0 environment
-variables. By default, an \s-1XPA\s0 access point is accessible only to
-processes running on the same machine (same as X Windows).
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-When \s-1INET\s0 sockets are in use (the default, as specified by the
-\&\fI\s-1XPA_METHOD\s0\fR environment variable), \s-1XPA\s0 supports a host-based
-access control mechanism for individual access points. This mean that
-access can be specified for get, set, or info operations for each
-access point on a machine by machine basis.  For \s-1LOCAL\s0 sockets, access
-is restricted (by definition) to the host machine.
-.PP
-\&\s-1XPA\s0 access control is enabled by default, but can be turned off by
-setting the \fI\s-1XPA_ACL\s0\fR environment variable to \fIfalse\fR.
-In this case, any process can access any \s-1XPA\s0 server.
-.PP
-Assuming that access control is turned on, the \s-1ACL\s0 for an individual
-\&\s-1XPA\s0 access point is set up when that access point is registered
-(although it can be changed later on; see below). This can be done in
-one of two ways:
-.PP
-Firstly, the \fI\s-1XPA_ACLFILE\s0\fR environment variable can defined to
-point to a file of access controls for individual access points. The format
-of this file is:
-.PP
-.Vb 1
-\& class:name ip acl
-.Ve
-.PP
-The first argument is a template that specifies the class:name of the
-access point covered by this \s-1ACL\s0. See
-\&\s-1XPA\s0 Access Points and Templates
-for more information about xpa templates.
-.PP
-The second argument is the \s-1IP\s0 address (in human-readable format) of
-the machine which is being given access.  This argument can be
-\&\fI*\fR to match all \s-1IP\s0 addresses.  It also can be \fI\f(CI$host\fI\fR
-to match the \s-1IP\s0 address of the current host.
-.PP
-The third argument is a string combination of \fIs\fR, \fIg\fR,
-or \fIi\fR to allow \fIxpaset\fR, \fIxpaget\fR, or
-\&\fIxpainfo\fR access respectively.  The \s-1ACL\s0 argument can be
-\&\fI+\fR to give \fIsgi\fR access or it can be \fI\-\fR to turn
-off all access.
-.PP
-For example,
-.PP
-.Vb 3
-\&  *:xpa1  somehost sg
-\&  *:xpa1  myhost +
-\&  * * g
-.Ve
-.PP
-will allow processes on the machine somehost to make xpaget and xpaset calls,
-allow processes on myhost to make any call, and allow all other hosts to
-make xpaget (but not xpaset) calls.
-.PP
-Secondly, if the \fI\s-1XPA_ACLFILE\s0\fR does not exist, then a single
-default value for all access points can be specified using the
-\&\fI\s-1XPA_DEFACL\s0\fR environment variable.  The default value for this
-variable is:
-.PP
-.Vb 1
-\&  #define XPA_DEFACL "*:* $host +"
-.Ve
-.PP
-meaning that all access points are fully accessible to all processes
-on the current host. Thus, in the absence of any \s-1ACL\s0 environment variables,
-processes on the current host have full access to all access points
-created on that host. This parallels the X11 xhost mechanism.
-.PP
-Access to an individual \s-1XPA\s0 access point can be changed using the \-acl
-parameter for that access point.  For example:
-.PP
-.Vb 1
-\&  xpaset \-p xpa1 \-acl "somehost \-"
-.Ve
-.PP
-will turn off all access control for somehost to the xpa1 access point, while:
-.PP
-.Vb 1
-\&  xpaset \-p XPA:xpa1 \-acl "beberly gs"
-.Ve
-.PP
-will give beberly xpaget and xpaset access to the access point whose
-class is \s-1XPA\s0 and whose name is xpa1.
-.PP
-Similarly, the current \s-1ACL\s0 for a given access point can be retrieved using:
-.PP
-.Vb 1
-\&  xpaget xpa1 \-acl
-.Ve
-.PP
-Of course, you must have xpaget access to this \s-1XPA\s0 access point to
-retrieve its \s-1ACL\s0.
-.PP
-Note that the \s-1XPA\s0 access points registered in the \fIxpans\fR
-program also behave according to the \s-1ACL\s0 rules.  That is, you cannot
-use xpaget to view the access points registered with xpans unless
-you have the proper \s-1ACL\s0.
-.PP
-Note also when a client request is made to an \s-1XPA\s0 server, the access
-control is checked when the initial connection is established.  This
-access in effect at this time remains in effect so long as the client
-connection is maintained, regardless of whether the access fro that
-\&\s-1XPA\s0 is changed later on.
-.PP
-We recognize that host-based access control is only relatively secure
-and will consider more stringent security (e.g., private key) in the
-future if the community requires such support.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/mann/xpacode.n b/xpa/man/mann/xpacode.n
deleted file mode 100644
index b13c7ae..0000000
--- a/xpa/man/mann/xpacode.n
+++ /dev/null
@@ -1,181 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpacode n"
-.TH xpacode n "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPACode: Where to Find Example/Test Code\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-The \s-1XPA\s0 source code directory contains two test programs,
-\&\fIstest.c\fR, and \fIctest.c\fR that can serve as
-examples for writing \s-1XPA\s0 servers and clients, respectively.
-They also can be used to test various features of \s-1XPA\s0.
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-To build the \s-1XPA\s0 test programs, execute:
-.PP
-.Vb 1
-\&   make All
-.Ve
-.PP
-in the \s-1XPA\s0 source directory to generate the \fIstest\fR and
-\&\fIctest\fR programs.  (\s-1NB:\s0 this should work on all platforms,
-although we have had problems with unresolved externals on one
-Sun/Solaris machine, for reasons still unknown.)
-.PP
-The stest program can be executed with no arguments to start
-an \s-1XPA\s0 server that contains the access points: xpa, xpa1,
-c_xpa (containing sub-commands cmd1 and cmd2), and i_xpa.
-You then can use xpaset and xpaget to interact with these access points:
-.PP
-.Vb 4
-\&  cat xpa.c | xpaset xpa      # send to xpa
-\&  cat xpa.c | xpaset "xpa*"   # send to xpa and xpa1
-\&  xpaget xpa                  # receive from xpa
-\&  xpaget xpa*                 # receive from xpa and xpa1
-.Ve
-.PP
-etc. You also can use ctest to do the same thing, or to iterate:
-.PP
-.Vb 4
-\&  ctest \-s \-l 100 xpa        # send to xpa 100 times
-\&  ctest \-s \-l 100 "xpa*"     # send to xpa and xpa1 100 times
-\&  ctest \-g \-l 100 xpa        # receive from xpa 100 times
-\&  ctest \-g \-l 100 "xpa*"     # receive from xpa and xpa1 100 times
-.Ve
-.PP
-More options are available: see the stest.c and ctest.c code itself, which
-were used extensively to debug \s-1XPA\s0.
-.PP
-The file test.tcl in the \s-1XPA\s0 source directory gives examples for using the 
-XPATclInterface.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/mann/xpacommon.n b/xpa/man/mann/xpacommon.n
deleted file mode 100644
index 1a456ed..0000000
--- a/xpa/man/mann/xpacommon.n
+++ /dev/null
@@ -1,302 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpacommon n"
-.TH xpacommon n "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPACommon: Getting Common Information About Access Points\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-There are various kinds of generic information you can retrieve about
-an \s-1XPA\s0 access point by using the xpaget command.
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-You can find out which \s-1XPA\s0 access points have been registered with
-the currently running 
-\&\s-1XPA\s0 name server
-by executing the
-xpaget
-command to retrieve info from the \s-1XPA\s0 name server:
-.PP
-.Vb 1
-\&  xpaget xpans
-.Ve
-.PP
-If, for example, the
-stest test server program
-is running, the following \s-1XPA\s0 access points will be returned (the specifics
-of the returned info will vary for different machines and users):
-.PP
-.Vb 4
-\&  XPA xpa gs 838e2f67:1262 eric
-\&  XPA xpa1 gs 838e2f67:1266 eric
-\&  XPA c_xpa gs 838e2f67:1267 eric
-\&  XPA i_xpa i 838e2f67:1268 eric
-.Ve
-.PP
-Note that access to this information is subject to the usual
-\&\s-1XPA\s0 Access Control restrictions.
-.PP
-Each \s-1XPA\s0 access point supports a number of reserved sub-commands that provide
-access to different kinds of information, e.g. the access control for
-that access point.  These sub-commands can be executed by using
-xpaset
-or
-xpaget
-at the command line, or
-\&\fIXPAGet()\fR
-or
-\&\fIXPASet()\fR
-in programs, e.g:
-.PP
-.Vb 3
-\&  xpaget ds9 \-acl
-\&  xpaget ds9 \-help
-\&  xpaget ds9 env FOO
-\&
-\&  xpaset \-p ds9 env FOO foofoo
-.Ve
-.PP
-With the exception of \fB\-help\fR and \fB\-version\fR, reserved
-sub-commands are available only on the machine on which the \s-1XPA\s0 server
-itself is running.
-.PP
-The following reserved sub-commands are defined for all access points:
-.IP "\(bu" 4
-\&\fB\-acl\fR get (set) the access control list [options: host type acl, for set]
-.Sp
-The 'xpaset' option allows you to add a new acl for a given host, or change
-the acl for an existing host. See
-\&\s-1XPA\s0 Access Control
-for more information.
-This access point is available only on the server machine.
-.IP "\(bu" 4
-\&\fB\-env\fR get (set) an environment variable [options: name (value, for set)]
-.Sp
-The 'xpaget' option will return the value of the named environment
-variable.  The 'xpaset' option will set the value of the names
-variable to the specified value.
-This access point is available only on the server machine.
-(Please be advised that we have had problems setting environment
-variables in static Tcl/Tk programs such as ds9 running under Linux.)
-.IP "\(bu" 4
-\&\fB\-clipboard\fR set(get) information on a named clipboard
-.Sp
-Clients can store \s-1ASCII\s0 state information on any number of named
-clipboards. Clipboards of the same name created by clients on
-different machines are kept separate.  The syntax for creating a
-clipboard is:
-.Sp
-.Vb 2
-\&  [data] | xpaset [server] \-clipboard add|append [clipboard_name]
-\&  xpaset \-p [server] \-clipboard delete [clipboard_name]
-.Ve
-.Sp
-Use \*(L"add\*(R" to create a new clipboard or replace the contents of an existing
-one. Use \*(L"append\*(R" to append to an existing clipboard.
-.Sp
-Information on a named clipboard is retrieved using:
-.Sp
-.Vb 1
-\&  xpaget [server] \-clipboard [clipboard_name]
-.Ve
-.IP "\(bu" 4
-\&\fB\-exec\fR set: execute commands from buffer [options: none]
-.Sp
-If \-exec is specified in the paramlist of an 'xpaset' call, then further
-sub-commands will be retrieved from the data buffer.
-.IP "\(bu" 4
-\&\fB\-help\fR get: return help string for this \s-1XPA\s0 or sub-command [options: name (for sub\-commands)]
-.Sp
-Each \s-1XPA\s0 access point and each \s-1XPA\s0 sub-command can have a help string
-associated with it that is specified when the access point is defined.
-The \-help option will return this help string.  For \s-1XPA\s0 access points
-that contain user-defined sub-commands, you can get the help string
-for a particular sub-command by specifying its name, or else get the
-help strings for all sub-commands if not name is specified.
-.IP "\(bu" 4
-\&\fB\-ltimeout\fR get (set) the long timeout value [options: seconds|reset]
-.Sp
-The 'xpaget' option will return the value of the long timeout (in seconds).
-The 'xpaset' option will set the value of the long timeout. If \*(L"reset\*(R" is
-specified, then the timeout value will be reset to the default value.
-.IP "\(bu" 4
-\&\fB\-nsconnect\fR set: re-establish name server connection to all \s-1XPA\s0's [options: none]
-.Sp
-If the 
-\&\s-1XPA\s0 Name Server (xpans)
-process has terminated unexpectedly and then re-started, this
-sub-command can be used to re-establish the connection.  You use it by
-sending the command to the [name:port] or [file] of the access point
-instead of to the \s-1XPA\s0 name (since the latter requires the xpans
-connection!):
-.Sp
-.Vb 1
-\&  xpaset \-p 838e2f67:1268 \-nsconnect
-.Ve
-.Sp
-See xpans for more information.
-.IP "\(bu" 4
-\&\fB\-nsdisconnect\fR set: break name server connection to all \s-1XPA\s0's [options: none]
-.Sp
-This sub-command will terminate the connection to the
-\&\s-1XPA\s0 Name Server (xpans), thereby making
-all access points inaccessible except through their underlying [name:port]
-or [file] identifiers.  I forget why we added it, it seems pretty useless.
-.IP "\(bu" 4
-\&\fB\-stimeout\fR get (set) the short timeout value [options: seconds|reset]
-.Sp
-The 'xpaget' option will return the value of the short timeout (in seconds).
-The 'xpaset' option will set the value of the short timeout. If \*(L"reset\*(R" is
-specified, then the timeout value will be reset to the default value.
-.IP "\(bu" 4
-\&\fB\-remote\fR set: register xpa with remote server [options: host[:port] [acl]] [\-proxy]
-.Sp
-This sub-command will register the \s-1XPA\s0 access point with the \s-1XPA\s0 name
-server (xpans) on the specified host (which must already be running).
-The specified host also is given access control to the access point,
-using the specified acl or the default acl of \*(L"+\*(R" (meaning the remote
-host can xpaset, xpaget, xpainfo or xpaaccess). If the acl is
-specified as \*(L"\-\*(R", then the access point is unregistered. 
-See Communication Between Machines
-for more information on how this sub-command is used.
-.IP "\(bu" 4
-\&\fB\-version\fR get: return \s-1XPA\s0 version string [options: none]
-.Sp
-The version refers to the version of \s-1XPA\s0 used to define this access point
-(currently something like 2.0).
-.PP
-You can add your own reserved commands to all \s-1XPA\s0 access points by using the
-\&\fIXPACmdAdd()\fR
-routine, passing the \s-1XPA\s0 handle returned by \fI\s-1XPA\s0 XPAGetReserved(void)\fR
-as the first argument. Note again that these will only be available on the
-machine where the \s-1XPA\s0 service is running.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/mann/xpaconvert.n b/xpa/man/mann/xpaconvert.n
deleted file mode 100644
index 035ef0b..0000000
--- a/xpa/man/mann/xpaconvert.n
+++ /dev/null
@@ -1,267 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpaconvert n"
-.TH xpaconvert n "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAConvert: Converting the \s-1XPA\s0 \s-1API\s0 to 2.0\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-This document describes tips for converting from xpa 1.0 (Xt-based
-xpa) to xpa 2.0 (socket-based xpa).
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-The following are tips for converting from xpa 1.0 (Xt-based xpa) to
-xpa 2.0 (socket-based xpa). The changes are straight-forward and
-almost can be done automatically (we used editor macros for most of
-the conversion).
-.IP "\(bu" 4
-The existence of the cpp \s-1XPA_VERSION\s0 directive to distinguish between 1.0
-(where it is not defined) and 2.0 (where it is defined).
-.IP "\(bu" 4
-Remove the first widget argument from all send and receive server
-callbacks.  Also change first 2 arguments from XtPointer to void
-*. For example:
-.Sp
-#ifdef \s-1XPA_VERSION\s0
-static void XPAReceiveFile(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     int len;
-#else
-static void XPAReceiveFile(w, client_data, call_data, paramlist, buf, len)
-     Widget w;
-     XtPointer client_data;
-     XtPointer call_data;
-     char *paramlist;
-     char *buf;
-     int len;
-#endif
-.IP "\(bu" 4
-Server callbacks should be declared as returning int instead
-of void. They now should return 0 for no errors, \-1 for error.
-.IP "\(bu" 4
-The mode flags have changed when defining \s-1XPA\s0 server callbacks.
-The old \fIS\fR flag (save buffer) is replaced by \fIfreebuf=false\fR.
-The old \fIE\fR flag (empty buffer is \s-1OK\s0) is no longer used (it
-was an artifact of the X implementation).
-.IP "\(bu" 4
-Change \fINewXPACommand()\fR to \fIXPAcmdNew()\fR, with the new calling sequence:
-.Sp
-.Vb 1
-\&  xpa = NewXPACommand(toplevel, NULL, prefix, NULL);
-.Ve
-.Sp
-is changed to:
-.Sp
-.Vb 1
-\&  xpa = XPACmdNew(xclass, name);
-.Ve
-.IP "\(bu" 4
-Change the \fIAddXPACommand()\fR subroutine name to XPACmdAdd (with the same
-calling sequence):
-.Sp
-.Vb 3
-\&  AddXPACommand(xpa, "file",
-\&    "\etdisplay a new file\en\et\et  requires: filename",
-\&    NULL, NULL, NULL, XPAReceiveFile, text, NULL);
-.Ve
-.Sp
-is changed to:
-.Sp
-.Vb 3
-\&  XPACmdAdd(xpa, "file",
-\&    "\etdisplay a new file\en\et\et  requires: filename",
-\&    NULL, NULL, NULL, XPAReceiveFile, text, NULL);
-.Ve
-.IP "\(bu" 4
-The \fIXPAXtAppInput()\fR routine should be called just before \fIXtAppMainLoop()\fR
-to add xpa fds to the Xt event loop:
-.Sp
-.Vb 2
-\&  /* add the xpas to the Xt loop */
-\&  XPAXtAddInput(app, NULL);
-\&
-\&  /* process events */
-\&  XtAppMainLoop(app);
-.Ve
-.IP "\(bu" 4
-Change \fINewXPA()\fR to \fIXPANew()\fR and call \fIXPAXtAddInput()\fR if the XtAppMainLoop
-routine already has been entered:
-.Sp
-.Vb 4
-\&  xpa = NewXPA(saotng\->xim\->toplevel, prefix, xparoot,
-\&               "FITS data or image filename\en\et\et  options: file type",
-\&               XPASendData, new, NULL,
-\&               XPAReceiveData, new, "SE");
-.Ve
-.Sp
-is changed to:
-.Sp
-.Vb 6
-\&  sprintf(tbuf, "%s.%s", prefix, xparoot);
-\&  xpa = XPANew("SAOTNG", tbuf,
-\&               "FITS data or image filename\en\et\et  options: file type",
-\&               XPASendData, new, NULL,
-\&               XPAReceiveData, new, "SE");
-\&  XPAXtAddInput(XtWidgetToApplicationContext(saotng\->xim\->toplevel), xpa);
-.Ve
-.IP "\(bu" 4
-Change \fIXPAInternalReceiveCommand()\fR to \fIXPACmdInternalReceive()\fR
-remove first argument in the calling sequence):
-.Sp
-.Vb 3
-\&  XPAInternalReceiveCommand(im\->saotng\->xim\->toplevel,
-\&                            im\->saotng, im\->saotng\->commands,
-\&                            "zoom reset", NULL, 0);
-.Ve
-.Sp
-is changed to:
-.Sp
-.Vb 2
-\&  XPACmdInternalReceive(im\->saotng, im\->saotng\->commands,
-\&                        "zoom reset", NULL, 0);
-.Ve
-.IP "\(bu" 4
-Change DestroyXPA to XPAFree:
-.Sp
-.Vb 1
-\&  DestroyXPA(im\->dataxpa);
-.Ve
-.Sp
-is changed to:
-.Sp
-.Vb 1
-\&  XPAFree(im\->dataxpa);
-.Ve
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/mann/xpaenv.n b/xpa/man/mann/xpaenv.n
deleted file mode 100644
index ead081c..0000000
--- a/xpa/man/mann/xpaenv.n
+++ /dev/null
@@ -1,482 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpaenv n"
-.TH xpaenv n "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAEnv: Environment Variables for \s-1XPA\s0 Messaging\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-Describes the environment variables which can be used to tailor the overall
-\&\s-1XPA\s0 environment.
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-The following environment variables are supported by \s-1XPA:\s0
-.IP "\(bu" 4
-\&\fB\s-1XPA_ACL\s0\fR
-.Sp
-If \fI\s-1XPA_ACL\s0\fR is \fItrue\fR, then 
-host-based \s-1XPA\s0 Access Control
-is turned on and only specified machines can access specified access
-points.  If \fIfalse\fR, then access control is turned off and any
-machine can access point. The default is turn turn access control on.
-.IP "\(bu" 4
-\&\fB\s-1XPA_ACLFILE\s0\fR
-.Sp
-If
-\&\s-1XPA\s0 Access Control
-is turned on, this variable specifies the name of the file containing
-access control information for all access points started by this user.
-The default file name is: \fI\f(CI$HOME\fI/acls.xpa\fR.
-.IP "\(bu" 4
-\&\fB\s-1XPA_CONNECT_TIMEOUT\s0\fR
-.Sp
-When an \s-1XPA\s0 server first starts up, it immediately tries to
-connect to the \s-1XPA\s0 name server program (xpans) on the host specified by
-the \fI\s-1XPA_NSINET\s0\fR variable. (If this connection fails on the
-local host, and if xpans can be found in the path, then the name
-server is started automatically.)  Unfortunately, a mis-configured
-network can cause this connect attempt to hang for many seconds while
-the \fIconnect()\fR system call times out. Therefore, an alarm is started
-to interrupt the \fIconnect()\fR call and prevent a long hang.  The initial
-value of the alarm timeout is 10 seconds, but can be changed by setting
-this environment variable. If you want to disable the alarm and allow
-the initial \fIconnect()\fR to time out, set the value of this variable to
-0. Normally, users would not change this variable at all.
-.IP "\(bu" 4
-\&\fB\s-1XPA_CLIENT_DOXPA\s0\fR
-.Sp
-Normally, an \s-1XPA\s0 client (xpaget, xpaset, etc.) will process incoming
-\&\s-1XPA\s0 server requests while awaiting the completion of the client request.
-Setting this variable to \*(L"false\*(R" will prevent \s-1XPA\s0 server requests from
-being processed by the client.
-.IP "\(bu" 4
-\&\fB\s-1XPA_DEFACL\s0\fR
-.Sp
-If
-\&\s-1XPA\s0 Access Control
-is turned on, this variable specifies the default access control
-condition for all access points, if the \fI\s-1XPA_ACLFILE\s0\fR file does
-not exist.  The default acl is: \fI\f(CI$host:\fI* \f(CI$host\fI +\fR, meaning that
-all processes on the host machine have full access to all access points.
-.IP "\(bu" 4
-\&\fB\s-1XPA_HOST\s0\fR
-.Sp
-For the \s-1INET\s0 socket method, \s-1XPA\s0 utilizes the canonical hostname (as
-returned by the \fIgethostname()\fR routine) to construct the \s-1IP\s0 part of the
-method id. Under some circumstances, this might not be a correct choice
-of name and \s-1IP\s0. For example, if an \s-1XPA\s0 server is started on a machine
-running \s-1VPN\s0, you might want to use the \s-1VPN\s0 name and \s-1IP\s0 instead of the
-canonical host name, so that other machines in the \s-1VPN\s0 network can
-access the server. In this case, you can set the \s-1XPA_HOST\s0 to be
-the \s-1VPN\s0 name (if resolvable) or, more easily, the \s-1VPN\s0 \s-1IP\s0.
-.IP "\(bu" 4
-\&\fB\s-1XPA_IOCALLSXPA\s0\fR
-.Sp
-Setting this variable causes all \s-1XPA\s0 socket \s-1IO\s0 calls to process
-outstanding \s-1XPA\s0 requests whenever the primary socket is not ready for
-\&\s-1IO\s0. This means that a server making a client call will (recursively)
-process incoming server requests while waiting for client completion.
-This inter-IO \s-1XPA\s0 processing avoids a rare
-\&\s-1XPA\s0 Race Condition: two or more
-\&\s-1XPA\s0 servers sending messages to one another using an \s-1XPA\s0 client
-routine such as \fIXPASet()\fR can deadlock while each waits for the other
-server to respond. This can happen, for example, if the servers call
-\&\fIXPAPoll()\fR with a time limit, and send messages in between the polling call.
-.Sp
-By default, this option is turned off, because we judge that the added
-code complication and overhead involved will not be justified by the
-amount of its use.  Moreover, processing \s-1XPA\s0 requests within socket \s-1IO\s0
-can lead to non-intuitive results, since incoming server requests will
-not necessarily be processed to completion in the order in which they
-are received.
-.IP "\(bu" 4
-\&\fB\s-1XPA_LOGNAME\s0\fR
-.Sp
-\&\s-1XPA\s0 preferentially uses the de facto standard environment variable
-\&\s-1LOGNAME\s0 to determine the username when registering an access point in
-the name server. If this environment variable has been used for
-something other than the actual user name (such as a log file name),
-unexpected results can ensue. In such cases, use the \s-1XPA_LOGNAME\s0
-variable to set the user name. (If neither exists, then getpwuid(\fIgeteuid()\fR)
-is used as a last resort).
-.IP "\(bu" 4
-\&\fB\s-1XPA_LONG_TIMEOUT\s0\fR
-.Sp
-\&\s-1XPA\s0 is designed to allow data to be sent from one process to
-another over a long period of time (i.e., a program that generates
-image data sends that data to an image display, but slowly) but it
-also seeks to prevent hangs. This is done by supporting 2 timeout
-periods: a \fIshort\fR timeout for protocol communication
-and a \fIlong\fR for data communication.
-.Sp
-The \fI\s-1XPA_LONG_TIMEOUT\s0\fR variable controls the \fIlong\fR
-timeout and is used to prevent hangs in cases where communication
-between the client and server that is \fInot\fR controlled by the
-\&\s-1XPA\s0 interface itself. Transfer of data between client and server, or a
-client's wait for a status message after completion of the server
-callback, are two examples of this sort of communication. By default,
-the \fIlong\fR timeout is set to 180 seconds.
-Setting the value to \-1 will disable \fIlong\fR timeouts and allow
-an infinite amount of time.
-.IP "\(bu" 4
-\&\fB\s-1XPA_MAXHOSTS\s0\fR
-.Sp
-The maximum number of access points that the programs 
-\&\fIxpaset\fR, \fIxpaget\fR, and \fIxpainfo\fR will
-communicate with at one time. The default is 64, meaning, for
-example, that the \fIxpaset\fR program will not send a message
-to more than 100 access points at one time and \fIxpaget\fR will
-not retrieve from more than 100 access points at one time.
-.IP "\(bu" 4
-\&\fB\s-1XPA_METHOD\s0\fR
-.Sp
-Determines the socket connection method used by this session of \s-1XPA\s0.
-The choices are: \fIinet\fR (to use \s-1INET\s0 or Internet-based
-sockets), \fIlocalhost\fR (to use the machines localhost inet
-socket), or \fIlocal (unix)\fR (to use \s-1UNIX\s0 sockets). The default
-is \fI\s-1INET\s0\fR.  Using the \fIinet\fR method will allow access
-from other machines (subject to access controls) but using
-\&\fIlocalhost\fR or \fIlocal\fR will not. Localhost is most useful
-for private access and when the machine in question is not connected
-to the Internet. The unix method also can be used for private access
-and non-Internet connections (Unix platforms only).
-.Sp
-Once defined, the first registration of an \s-1XPA\s0 access point will
-ensure that an instance of the
-\&\s-1XPA\s0 Name Server (xpans)
-is running that handles that connection method. All new access points
-will use the new connection method but existing access points will use
-the original method.
-.IP "\(bu" 4
-\&\fB\s-1XPA_NSINET\s0\fR
-.Sp
-For the \fIinet\fR method of socket connection, this variable
-specifies the host and port on which the 
-\&\s-1XPA\s0 Name Server (xpans)
-is listens for new access points. The default is \fI\f(CI$host:\fI$port\fR,
-meaning that the default \s-1XPA\s0 port (14285) on the current machine
-(as returned by \fIgethostname()\fR) is used. If several machines were all
-accessing the same \s-1XPA\s0 access points, you would use this variable to
-specify that they all use the same name server to find out about these
-access points.  For example, a value of \fImyhost:$port\fR would
-mean that the xpans name server is running on myhost and uses the
-default port 12345.  All machines would then get the \s-1XPA\s0 access points
-registered with that name server, subject to access controls.
-.Sp
-The port used by xpans to register its \s-1XPA\s0 access point normally is
-taken to be one greater than the port on which it receives new access
-points from \s-1XPA\s0 servers. You can specify a specific access point port
-using the syntax machine:port1,port2, i.e., the access point port is
-specified after the comma.  For example, \f(CW$host:12345\fR,23456 will listen
-for new access ports on 12345 and will accept \s-1XPA\s0 commands on 23456.
-.IP "\(bu" 4
-\&\fB\s-1XPA_NSREGISTER\s0\fR
-.Sp
-This boolean variable specifies whether a server registers its \s-1XPA\s0
-access point with the specified xpans name server. The default is
-\&\fItrue\fR.  If set to \fIfalse\fR, the access point still is
-set up but it is not registered with xpans and therefore cannot be
-accessed by name. (It can be accessed by method, if the latter is
-known.) Note that an access point can be registered later on (using
-\&\-remote or \-proxy, for example). This variable mainly is useful in
-cases where the Internet configuration is broken (so that registration
-causes a \s-1DNS\s0 hang) but you still wish to and can use the server with a
-remote xpans (e.g., ds9's Virtual Observatory capability).
-.IP "\(bu" 4
-\&\fB\s-1XPA_NSUNIX\s0\fR
-.Sp
-For the \fIlocal\fR method of socket connection, this variable
-specifies the name of the Unix file that will be used to access the
-\&\s-1XPA\s0 Name Server (xpans). The default is
-\&\fIxpans_unix\fR. This variable is not usually needed. Note that
-is the \fIlocal\fR socket method is used, then remote machines will
-not be able to access the xpans name server or the registered \s-1XPA\s0 access
-points.
-.IP "\(bu" 4
-\&\fB\s-1XPA_NSUSERS\s0\fR
-.Sp
-This variable specifies whether other users' access points will be
-returned by the
-\&\s-1XPA\s0 Name Server (xpans) for use by
-\&\fIxpaget\fR, \fIxpaset\fR, etc.
-Generally speaking, it is sufficient to run one xpans name server per
-machine and register the access points for all users with that xpans.
-This means, for example, that if you request information from
-ds9 by running:
-.Sp
-.Vb 1
-\&  xpaget ds9 colormap
-.Ve
-.Sp
-you might get information from your own ds9 as well as
-from another user running ds9 on the same machine.  The
-\&\fI\s-1XPA_NSUSERS\s0\fR variable controls whether you want such access 
-to the access points of other users.
-By default, only your own access points are returned, so
-that, in the example above, you would only get the colormap information
-from the ds9 you registered. If, however, you had set the value of the
-\&\fI\s-1XPA_NSUSERS\s0\fR variable to \fIeric,fred\fR, then you would be
-able to communicate with both eric and fred's access points. Note that
-this variable can be overridden using the \fI\-u\fR switch on the
-\&\fIxpaget\fR, \fIxpaset\fR, and \fIxpainfo\fR programs.
-.IP "\(bu" 4
-\&\fB\s-1XPA_PORT\s0\fR
-.Sp
-A semi-colon delimited list of user specified ports to use for specific
-\&\s-1XPA\s0 access points. The format is each specification is:
-.Sp
-class:template port1[ port2]
-.Sp
-where \fBport1\fR is the main (command) port for the access point and
-\&\fBport2\fR is the (secondary) data port. If port2 is not specified,
-it defaults to a value of 0 (meaning the system assigns the port).
-.Sp
-Specification of specific ports is useful, for example, when a machine
-outside a firewall needs to communicate with a machine inside a
-firewall. In such a case, the firewall should be configured to allow
-socket connections to both the command and data port from the outside
-machine, and the inside \s-1XPA\s0 program should be started up with the
-outside machine in its \s-1ACL\s0 list. Then, when the inside program is
-started with specified ports, outside \s-1XPA\s0 programs can use
-\&\*(L"machine:port\*(R" to contact the inside access points, instead of the
-access point names. That is, the machine outside the firewall does not
-need access to the \s-1XPA\s0 name server:
-.Sp
-export XPA_PORT=\*(L"DS9:ds9 12345 12346\*(R"   # on machine \*(L"inside\*(R"
-cat foo.fits | xpaset inside:12345 fits # on machine \*(L"outside\*(R"
-.Sp
-Note that 2 ports are required for full \s-1XPA\s0 communication and
-therefore 2 ports should be specified to go through a firewall.  The
-second port assignment is not important if you simply are assigning
-the command port in order to communicate commands with a known
-port (e.g., to bypass the xpans name server). If only one (command)
-port is specified, the system will negotiate a random data port and
-everything will work properly.
-.Sp
-This support is somewhat experimental. If you run into problems, please
-let us know.
-.IP "\(bu" 4
-\&\fB\s-1XPA_PORTFILE\s0\fR
-.Sp
-A list of user-specified port to use for specific xpa access points.
-The format of the file is:
-.Sp
-class:template port1 [port2]
-.Sp
-where \fBport1\fR is the main port for the access point and
-\&\fBport2\fR is the data port. If port2 is not specified, it defaults
-to a value of 0 (meaning the system assigns the port).  See
-\&\fB\s-1XPA_PORT\s0\fR above for an explanation of user-specified ports.
-.IP "\(bu" 4
-\&\fB\s-1XPA_SHORT_TIMEOUT\s0\fR
-.Sp
-\&\s-1XPA\s0 is designed to allow data to be sent from one process to
-another over a long period of time (i.e., a program that generates
-image data sends that data to an image display, but slowly) but it
-also seeks to prevent hangs. This is done by supporting 2 timeout
-periods: a \fIshort\fR timeout for protocol communication
-and a \fIlong\fR for data communication.
-.Sp
-The \fI\s-1XPA_SHORT_TIMEOUT\s0\fR variable
-controls the \fIshort\fR timeout and is used to prevent hangs
-in cases where the \s-1XPA\s0 protocol requires internal communication between
-the client and server that is controlled by the \s-1XPA\s0 interface
-itself. Authentication is an example of this sort of communication,
-as is the establishment of a data channel between the two processes.
-The default value for the \fIshort\fR is 30 seconds (which is
-a pretty long time, actually). Setting the value to \-1 will disable
-\&\fIshort\fR timeouts and allow an infinite amount of time.
-.IP "\(bu" 4
-\&\fB\s-1XPA_SIGUSR1\s0\fR
-.Sp
-If the value of this variable is \fItrue\fR, then \s-1XPA\s0 will
-catch \s-1SIGUSR1\s0 signals when performing an I/O operation in order to
-curtail that operation. This facility allows users to send a \s-1SIGUSR1\s0
-signal to an \s-1XPA\s0 server if a client is hanging up the server by
-sending or receiving data too slowly (timeouts also can be used \*(-- see
-above). When enabled in this way, the \s-1SIGUSR1\s0 signal is ignored at all other
-times, so that its safe to send the signal at any time.  If the
-variable is set to \fIfalse\fR, then \s-1SIGUSR1\s0 is not used at
-all. Turning off \s-1SIGUSR1\s0 would be desired in cases there the program
-uses \s-1SIGUSR1\s0 for some other reason and does not want \s-1XPA\s0 interfering.
-The default is to use the signal.
-.IP "\(bu" 4
-\&\fB\s-1XPA_TIMESTAMP_ERRORS\s0\fR
-.Sp
-If \fI\s-1XPA_TIMESTAMP_ERRORS\s0\fR is \fItrue\fR, then error
-messages will include a date/time string.  This can be useful when
-\&\s-1XPA\s0 errors are being saved in an error log (e.g. Web/CGI use). The
-default is false.
-.IP "\(bu" 4
-\&\fB\s-1XPA_TMPDIR\s0\fR
-.Sp
-This variable specifies the directory into which \s-1XPA\s0 logs, Unix
-socket files (when \fI\s-1XPA_METHOD\s0\fR is \fIlocal\fR), etc. are
-stored. The default is \fI/tmp/.xpa\fR.
-.IP "\(bu" 4
-\&\fB\s-1XPA_VERBOSITY\s0\fR
-.Sp
-Specify the verbosity level of error messages. If the value is
-set to \fI0\fR, \fIfalse\fR, or \fIoff\fR, then no error
-messages are printed to stderr.  If the value is \fI1\fR, then
-important \s-1XPA\s0 error messages will be output.  If the value is
-set to \fI2\fR, \s-1XPA\s0 warnings about out-of-sync messages will also
-be output.  These latter almost always can be ignored.
-.IP "\(bu" 4
-\&\fB\s-1XPA_VERSIONCHECK\s0\fR
-.Sp
-Specify whether a new access point should check its major and minor \s-1XPA\s0
-version number against the version used by the xpans name server at
-registration time. The default is \fItrue\fR. When checking is
-performed, a warning is issued if the server major version is found to
-be greater than the xpans version. Note that the check is performed
-both by the \s-1XPA\s0 server and by the xpans process and warnings will be
-issued by each.  Also, instead of the values of \fItrue\fR or
-\&\fIfalse\fR, you can give this variable an integer value n. In this
-case, each version checking process (i.e., the XPA-enabled server or
-xpans) will print out a maximum of n warning messages (after which
-version warnings are silently swallowed).
-.Sp
-In general, it is a bad idea to run an XPA-enabled server program
-using a version of \s-1XPA\s0 newer than the basic xpaset, xpaget, xpaaccess,
-xpans programs. This sort of mismatch usually will not work due to
-protocol changes.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
-.SH "POD ERRORS"
-.IX Header "POD ERRORS"
-Hey! \fBThe above document had some coding errors, which are explained below:\fR
-.IP "Around line 458:" 4
-.IX Item "Around line 458:"
-\&'=item' outside of any '=over'
-.IP "Around line 509:" 4
-.IX Item "Around line 509:"
-You forgot a '=back' before '=head1'
diff --git a/xpa/man/mann/xpainet.n b/xpa/man/mann/xpainet.n
deleted file mode 100644
index 4847654..0000000
--- a/xpa/man/mann/xpainet.n
+++ /dev/null
@@ -1,396 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpainet n"
-.TH xpainet n "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAInet: \s-1XPA\s0 Communication Between Hosts\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-\&\s-1XPA\s0 uses standard inet sockets to support communication between two or
-more host computers.
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-When the Communication Method is set to
-\&\fBinet\fR (as it is by default), \s-1XPA\s0 can be used to communicate
-between different computers on the Internet.  \s-1INET\s0 sockets utilize the
-\&\s-1IP\s0 address of the given machine and a (usually random) port number to
-communicate between processes on the same machine or between different
-machines on the Internet.  These standard Internet sockets are also
-used by programs such as Netscape, ftp. etc.
-.PP
-\&\s-1XPA\s0 supports a host-based Access Control mechanism
-to prevent unauthorized access of \s-1XPA\s0 access points by other computers
-on the Net.  By default, only the machine on which the \s-1XPA\s0 server is
-running can access \s-1XPA\s0 services. Therefore, setting up communication
-between a local \s-1XPA\s0 server machine and a remote client machine
-requires a two-part registration process:
-.IP "\(bu" 4
-the \s-1XPA\s0 service on the local machine must be made known to the 
-remote machine
-.IP "\(bu" 4
-the remote machine must be given permission to access the local
-\&\s-1XPA\s0 service
-.PP
-Three methods by which this remote registration can be accomplished
-are described below.
-.PP
-\&\fBManual Registration\fR
-.PP
-The first method is the most basic and does not require the remote
-client to have xpans running.  To use it, the local server simply
-gives a remote client machine access to one or more \s-1XPA\s0 access points
-using xpaset and the \fB\-acl\fR sub-command. For example,
-consider the \s-1XPA\s0 test program \*(L"stest\*(R" running on a local machine.  By
-default the access control for the access point named \*(L"xpa\*(R" is
-restricted to that machine:
-.PP
-.Vb 3
-\&  [sh]$ xpaget xpa \-acl
-\&  *:* 123.456.78.910 gisa
-\&  *:* localhost gisa
-.Ve
-.PP
-Using xpaset and the \fB\-acl\fR sub-command, a remote client
-machine can be given permission to perform xpaget, xpaset, xpaaccess,
-or xpainfo operations.  For example, to allow the xpaget operation, the
-following command can be issued on the local machine:
-.PP
-.Vb 1
-\&  [sh]$ xpaset \-p xpa \-acl "remote_machine g"
-.Ve
-.PP
-This results in the following access permissions on the local machine:
-.PP
-.Vb 4
-\&  [sh]$ xpaget xpa \-acl
-\&  XPA:xpa 234.567.89.012 g
-\&  *:* 123.456.78.910 gisa
-\&  *:* localhost gisa
-.Ve
-.PP
-The remote client can now use the local server's xpans name server to
-establish communication with the local \s-1XPA\s0 service. This can be done
-on a call-by-call basis using the \fB\-i\fR switch on xpaset, xpaget, etc:
-.PP
-.Vb 6
-\&  [sh]$ xpaget \-i "local_machine:12345" xpa
-\&  class: XPA
-\&  name: xpa
-\&  method: 88877766:2778
-\&  sendian: little
-\&  cendian: big
-.Ve
-.PP
-Alternatively, the \s-1XPA_NSINET\s0 variable on the remote machine can be
-set to point directly to xpans on the local machine, removing
-the need to override this value each time an \s-1XPA\s0 program is run:
-.PP
-.Vb 7
-\&  [csh]$ setenv XPA_NSINET \*(Aqkarapet:$port\*(Aq
-\&  [csh]$ xpaget xpa
-\&  class: XPA
-\&  name: xpa
-\&  method: 88877766:2778
-\&  sendian: little
-\&  cendian: big
-.Ve
-.PP
-Here, '$port' means to use the default \s-1XPA\s0 name service port (14285).
-not a port environment variable.
-.PP
-Access permission for remote client machines can be stored in a file
-on the local machine pointed to by the \fB\s-1XPA_ACLFILE\s0\fR environment
-variable or using the \fB\s-1XPA_DEFACL\s0\fR environment variable. See <A
-HREF=\*(L"./acl.html\*(R">\s-1XPA\s0 Access Control for more information.
-.PP
-\&\fBRemote Registration\fR
-.PP
-If xpans is running on the remote client machine, then a local xpaset
-command can be used with the \fB\-remote\fR sub-command to
-register the local \s-1XPA\s0 service in the remote name service, while at
-the same time giving the remote machine permission to access the local
-service.  For example, assume again that \*(L"stest\*(R" is running on the
-local machine and that xpans is also running on the remote machine.
-To register access of this local xpa on the remote machine, use 
-the xpaset and the \fB\-remote\fR sub-command:
-.PP
-.Vb 1
-\&  [sh]$ ./xpaset \-p xpa \-remote \*(Aqremote_machine:$port\*(Aq +
-.Ve
-.PP
-To register the local xpa access point on the remote machine with xpaget
-access only, execute:
-.PP
-.Vb 1
-\&  [sh]$ ./xpaset \-p xpa \-remote \*(Aqremote_machine:$port\*(Aq g
-.Ve
-.PP
-Once the remote registration command is executed, the remote client
-machine will have an entry such as the following in its own xpans name
-service:
-.PP
-.Vb 2
-\&  [csh]$ xpaget xpans
-\&  XPA xpa gs 88877766:2839 eric
-.Ve
-.PP
-The xpa access point can now be utilized on the remote machine without
-further setup:
-.PP
-.Vb 6
-\&  [csh]$ xpaget xpa
-\&  class: XPA
-\&  name: xpa
-\&  method: 838e2f68:2839
-\&  sendian: little
-\&  cendian: big
-.Ve
-.PP
-To unregister remote access from the local machine, use the same
-command but with a '\-' argument:
-.PP
-.Vb 1
-\&  [sh]$ xpaset \-p xpa \-remote \*(Aqremote_machine:$port\*(Aq \-
-.Ve
-.PP
-The benefit of using remote registration is that communication with
-remote access points can be mixed with that of other access points
-on the remote machine.  Using Access Point
-Names and Templates, one \s-1XPA\s0 command can be used to send or
-receive messages to the remote and local services.
-.PP
-\&\fB\s-1XPANS\s0 Proxy Registration\fR
-.PP
-The two methods described above are useful when the local and remote
-machines are able to communicate freely to one another. This would be
-the case on most Local Area Networks (LANs) where all machines are
-behind the same firewall and there is no port blocking between
-machines on the same \s-1LAN\s0.  The situation is more complicated when the
-\&\s-1XPA\s0 server is behind a firewall, where outgoing connections are
-allowed, but incoming port blocking is implemented to prevent machines
-outside the firewall from connecting to machines inside the
-firewall. Such incoming port blocking will prevent xpaset and xpaget
-from connecting to an \s-1XPA\s0 server inside a firewall.
-.PP
-To allow locally fire-walled \s-1XPA\s0 services to register with remote
-machines, we have implemented a proxy service within the xpans name
-server. To register remote proxy service, xpaset and the
-\&\fB\-remote\fR sub-command is again used, but with an additional
-\&\fB\-proxy\fR argument added to the end of the command:
-.PP
-.Vb 1
-\&  [sh]$ ./xpaset \-p xpa \-remote \*(Aqremote_machine:$port\*(Aq g \-proxy
-.Ve
-.PP
-Once a remote proxy registration command is executed, the remote
-machine will have an entry such as the following in its own xpans name
-service:
-.PP
-.Vb 2
-\&  [csh]$ xpaget xpans
-\&  XPA xpa gs @88877766:2839 eric
-.Ve
-.PP
-The '@' sign in the name service entry indicates that xpans proxy
-processing is being used for this access point. Other than that, from
-the user's point of view, there is no difference in how this \s-1XPA\s0
-access point is contacted using \s-1XPA\s0 programs (xpaset, xpaget, etc.) or
-libraries:
-.PP
-.Vb 6
-\&  [csh]$ xpaget xpa
-\&  class: XPA
-\&  name: xpa
-\&  method: 88877766:3053
-\&  sendian: little
-\&  cendian: big
-.Ve
-.PP
-Of course, the underlying processing of the \s-1XPA\s0 requests is very much
-different when xpans proxy is involved. Instead of an \s-1XPA\s0 program such
-contacting the \s-1XPA\s0 service directly, it contacts the local xpans.
-Acting as a proxy server, xpans communicates with the \s-1XPA\s0 service
-using the command channel established at registration time. Commands
-(including establishing a new data channel) are sent between xpans and
-the \s-1XPA\s0 service to set up a new message transfer, and then data is fed
-to/from the xpa request, through xpans, from/to the \s-1XPA\s0 service. In
-this way, it can be arranged so that connections between the
-fire-walled \s-1XPA\s0 service and the remote client are always initiated by
-the \s-1XPA\s0 service itself. Thus, incoming connections that would be
-blocked by the firewall are avoided. Note that there is a performance
-penalty for using the xpans/proxy service.  Aside from extra overhead
-to set up proxy communication, all data must be sent through the
-intermediate proxy process.
-.PP
-The xpans proxy scheme requires that the remote client allow the local
-\&\s-1XPA\s0 server machine to connect to the remote xpans/proxy server. If the
-remote client machine also is behind a port-blocking firewall, such
-connections will be disallowed. In this case, the only solution is to
-open up some ports on the remote client machine to allow incoming
-connections to xpans/proxy. Two ports must be opened (for command and
-data channel connections). By default, these two ports are 14285 and
-14287. The port numbers can be changed using the \fB\s-1XPA_NSINET\s0\fR
-environment variable. This variable takes the form:
-.PP
-.Vb 1
-\&  setenv XPA_NSINET machine:port1[,port2[,port3]]
-.Ve
-.PP
-where port1 is the main connecting port, port2 is the \s-1XPA\s0 access port,
-and port3 is the secondary data connecting port. The second and third
-ports are optional and default to port1+1 and port1+2, respectively.
-It is port1 and port3 that must be left open for incoming connections.
-.PP
-For example, to change the port assignments so that xpans listens
-for registration commands on port 12345 and data commands on port 28573:
-.PP
-.Vb 1
-\&  setenv XPA_NSINET myhost:12345
-.Ve
-.PP
-Alternatively, all three ports can be assigned explicitly:
-.PP
-.Vb 1
-\&  setenv XPA_NSINET remote:12345,3000,12346
-.Ve
-.PP
-In this case 12345 and 12346 should be open for incoming connections.
-The \s-1XPA\s0 access port (which need not be open to the outside
-world) is set to 3000.
-.PP
-Finally, note that we currently have no mechanism to cope with
-Internet proxy servers (such as \s-1SOCKS\s0 servers). If an \s-1XPA\s0 service is
-running on a machine that cannot connect directly to outside machines,
-but goes through a proxy server instead, there currently is no way to
-register that \s-1XPA\s0 service with a remote machine.  We hope to implement
-support for \s-1SOCKS\s0 proxy in a future release.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/mann/xpaintro.n b/xpa/man/mann/xpaintro.n
deleted file mode 100644
index 2978e6b..0000000
--- a/xpa/man/mann/xpaintro.n
+++ /dev/null
@@ -1,250 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpaintro n"
-.TH xpaintro n "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAIntro: Introduction to the \s-1XPA\s0 Messaging System\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-A brief introduction to the \s-1XPA\s0 messaging system, which provides
-seamless communication between all kinds of Unix event-driven
-programs, including X programs, Tcl/Tk programs, and Perl programs.
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-The \s-1XPA\s0 messaging system provides seamless communication between all
-kinds of Unix programs, including X programs, Tcl/Tk programs, and
-Perl programs.  It also provides an easy way for users to communicate
-with these XPA-enabled programs by executing \s-1XPA\s0 client commands in
-the shell or by utilizing such commands in scripts.  Because \s-1XPA\s0 works
-both at the programming level and the shell level, it is a powerful
-tool for unifying any analysis environment: users and programmers have
-great flexibility in choosing the best level or levels at which to
-access \s-1XPA\s0 services, and client access can be extended or modified
-easily at any time.
-.PP
-A program becomes an XPA-enabled server by defining named points of
-public access through which data and commands can be exchanged with
-other client programs (and users).  Using standard \s-1TCP\s0 sockets as
-a transport mechanism, \s-1XPA\s0 supports both single-point and broadcast
-messaging to and from these servers.  It supports direct communication
-between clients and servers, or indirect communication via an
-intermediate message bus emulation program. Host-based access control
-is implemented, as is as the ability to communicate with \s-1XPA\s0 servers
-across a network.
-.PP
-\&\s-1XPA\s0 implements a layered interface that is designed to be useful both
-to software developers and to users.  The interface consists of a
-library of \s-1XPA\s0 client and server routines for use in programs and a
-suite of high-level user programs built on top of these libraries.
-Using the \s-1XPA\s0 library, access points can be added to
-Tcl/Tk
-programs, 
-Xt
-programs, or to Unix programs that use the \s-1XPA\s0 event loop or any
-event loop based on \fIselect()\fR.  Client access subroutines can be added
-to any Tcl/Tk or Unix program. Client access also is supported at the
-command line via a suite of high-level programs.
-.PP
-The major components of the \s-1XPA\s0 layered interface are:
-.IP "\(bu" 4
-A set of \s-1XPA\s0 server routines, centered on 
-\&\fIXPANew()\fR,
-which are used by \s-1XPA\s0 server programs to tag public access points with
-string identifiers and to register send and receive callbacks for
-these access points.
-.IP "\(bu" 4
-A set of \s-1XPA\s0 client routines, centered on the 
-\&\fIXPASet()\fR
-and
-\&\fIXPAGet()\fR,
-which are used by external client applications to exchange data and
-commands with an \s-1XPA\s0 server.
-.IP "\(bu" 4
-High-level programs, centered on
-xpaset
-and
-xpaget,
-which allow data
-and information to be exchanged with \s-1XPA\s0 server programs from the
-command line and from scripts.  These programs have the command syntax:
-.Sp
-.Vb 2
-\&  [data] | xpaset  [qualifiers ...]
-\&           xpaget  [qualifiers ...]
-.Ve
-.IP "\(bu" 4
-An \s-1XPA\s0 name server program, 
-xpans,
-through which \s-1XPA\s0 access point names are
-registered by servers and distributed to clients.
-.PP
-Defining an \s-1XPA\s0 access point is easy: a server application calls
-\&\fIXPANew()\fR,
-\&\fIXPACmdNew()\fR,
-or the experimental
-\&\fIXPAInfoNew()\fR
-routine to
-create a named public access point.  An \s-1XPA\s0 service can specify \*(L"send\*(R"
-and \*(L"receive\*(R" callback procedures (or an \*(L"info\*(R" procedure in the case
-of \fIXPAInfoNew()\fR) to be executed by the program when an external
-process either sends data or commands to this access point or requests
-data or information from this access point.  Either of the callbacks
-can be omitted, so that a particular access point can be specified as
-read-only, read-write, or write-only.  Application-specific client
-data can be associated with these callbacks.  Having defined one or
-more public access points in this way, an \s-1XPA\s0 server program enters
-its usual event loop (or uses the standard \s-1XPA\s0 event loop).
-.PP
-Clients communicate with these \s-1XPA\s0 public access points
-using programs such as
-xpaget,
-xpaset, and
-xpainfo
-(at the command line),
-or routines such as
-\&\fIXPAGet()\fR,
-\&\fIXPASet()\fR,
-and
-\&\fIXPAInfo()\fR
-within a program.  Both methods require specification of the name of
-the access point.  The xpaget program returns data or other
-information from an \s-1XPA\s0 server to its standard output, while the
-xpaset program sends data or commands from its standard input to an
-\&\s-1XPA\s0 application. The corresponding \s-1API\s0 routines set/get data to/from
-memory, returning error messages and other info as needed.  If a
-template
-is used to specify the access point name (e.g., \*(L"ds9*\*(R"), then
-communication will take place with all servers matching that template.
-.PP
-Please note that \s-1XPA\s0 currently is not thread-safe. All \s-1XPA\s0 calls must be
-in the same thread.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/mann/xpamethod.n b/xpa/man/mann/xpamethod.n
deleted file mode 100644
index faecd86..0000000
--- a/xpa/man/mann/xpamethod.n
+++ /dev/null
@@ -1,200 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpamethod n"
-.TH xpamethod n "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAMethod: \s-1XPA\s0 Communication Methods\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-\&\s-1XPA\s0 supports both inet and unix (local) socket communication.
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\s-1XPA\s0 uses sockets for communication between processes. It supports
-three methods of socket communication: inet, localhost, and unix. In
-general, the same method should be employed for all \s-1XPA\s0 processes in a
-session and the global environment variable \s-1XPA_METHOD\s0 should be used
-to set up the desired method. By default, the preferred method is
-\&\*(L"inet\*(R", which is appropriate for most users. You can set up a
-different method by typing something like:
-.PP
-.Vb 3
-\&  setenv XPA_METHOD local              # unix csh
-\&  XPA_METHOD=local; export XPA_METHOD  # unix sh, bash, windows/cygwin
-\&  set XPA_METHOD=localhost             # dos/windows
-.Ve
-.PP
-The options for \s-1XPA_METHOD\s0 are: \fBinet\fR, \fBunix\fR (or
-\&\fBlocal\fR), and \fBlocalhost\fR. On Unix machines, this
-environment setup command can be placed in your shell init file
-(.cshrc, .profile, .bashrc, etc.) On Windows platforms, it can be
-placed in your \s-1AUTOEXEC\s0.BAT file (I think!).
-.PP
-By default, \fBinet\fR sockets are used by \s-1XPA\s0. These are the standard
-Internet sockets that are used by programs such as Netscape,
-ftp. etc. Inet sockets utilize the \s-1IP\s0 address of the given machine and
-a (usually random) port number to communicate between processes on the
-same machine or between different machines on the Internet. (Note that
-\&\s-1XPA\s0 has an Access Control mechanism to
-prevent unauthorized access of \s-1XPA\s0 access points by other computers on
-the Net). For users connected to the Internet, this usually is the
-appropriate communication method. For more information about setting
-up \s-1XPA\s0 communication between machines, see
-Communication Between Machines.
-.PP
-In you are using \s-1XPA\s0 on a machine without an Internet connection, then
-inet sockets are not appropriate. In fact, an \s-1XPA\s0 process often will
-hang for many seconds while waiting for a response from the Domain
-Name Service (\s-1DNS\s0) when using inet sockets. Instead of inet sockets,
-users on Unix platforms can also use \fBunix\fR sockets (also known
-as local sockets). These sockets are based on the local file system
-and do not make use of the \s-1DNS\s0. They generally are considered to be
-faster than inet sockets, but they are not implemented under
-Windows. Use local sockets as a first resort if you are on a Unix
-machine that is not connected to the Internet.
-.PP
-Users not connected to the Internet also can use \fBlocalhost\fR
-sockets. These are also inet-type sockets but the \s-1IP\s0 address used for
-the local machine is the \fBlocalhost\fR address, 0x7F000001, instead
-of the real \s-1IP\s0 of the machine. Depending on how sockets are set up for
-a given platform, communication with the \s-1DNS\s0 usually is not required in
-this case (though of course, \s-1XPA\s0 cannot interact with other machines).
-The localhost method will generally work on both Unix and Windows
-platforms, but whether the \s-1DNS\s0 is required or not is subject to
-individual configurations.
-.PP
-A final warning/reminder: if your XPA-enabled server hangs at startup
-time and your \s-1XPA_METHOD\s0 is \fBinet\fR, the problem probably is
-related to an incorrect Internet configuration. This can be confirmed
-by using the \fBunix\fR method or (usually) the \fBlocalhost\fR
-method. You can use these alternate methods if other hosts do not need
-access to the \s-1XPA\s0 server.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/mann/xpaname.n b/xpa/man/mann/xpaname.n
deleted file mode 100644
index cdb6839..0000000
--- a/xpa/man/mann/xpaname.n
+++ /dev/null
@@ -1,158 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpaname n"
-.TH xpaname n "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAName: What does \s-1XPA\s0 stand for?\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-What does \s-1XPA\s0 stand for? Who knows anymore!
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-What does \s-1XPA\s0 stand for? Dunno! The \s-1XPA\s0 messaging system originally
-was built on top of the X Window System and \s-1XPA\s0 was the mnemonic for
-\&\fIX Public Access\fR, to emphasize that we were providing public
-access to previously private data and algorithms in Xt programs.  Now
-that \s-1XPA\s0 no longer is tied to X, it can be argued that we ought to
-change the name (how about \s-1SPAM:\s0 simple public access mechanism
-), but \s-1XPA\s0 is in wide-spread use in the astronomical community of
-its birth, and the name has taken on a life of its own. If anyone can
-think of what \s-1XPA\s0 now means, please let us know.
-.PP
-If you think this is bad, consider the \s-1MMT\s0 Telescope on Mount Hopkins,
-Arizona. When first installed twenty years ago, it featured an array
-of six 72\-inch diameter mirrors. from which came its name: the
-\&\fIMultiple Mirror Telescope\fR.  In spring of 1999, these mirrors
-were replaced by a single 21 and 1/2 \-foot diameter primary mirror,
-the largest single-piece glass reflector on the North American
-continent. And now \s-1MMT\s0 stands for ... \s-1MMT\s0!
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/mann/xpaoom.n b/xpa/man/mann/xpaoom.n
deleted file mode 100644
index 9dfdc3f..0000000
--- a/xpa/man/mann/xpaoom.n
+++ /dev/null
@@ -1,166 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpaoom n"
-.TH xpaoom n "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXpaoom: What happens when \s-1XPA\s0 runs out of memory?\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-When \s-1XPA\s0 can't allocate memory, it exits. You can arrange to have it call
-\&\fIlongjmp()\fR instead.
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-When an \s-1XPA\s0 server or client cannot allocate memory, it will attempt to
-output an error message and then exit. If this is not satisfactory (e.g.,
-perhaps your program is interactive and can recover from \s-1OOM\s0 errors), you
-can tell \s-1XPA\s0 to call \fIlongjmp()\fR to go to a recovery branch. To pass the 
-requisite jmp_buf variable to \s-1XPA\s0, make the following call:
-.PP
-.Vb 1
-\&  XPASaveJmp(void *env);
-.Ve
-.PP
-The value of env is the address of a jmp_buf variable that was previously 
-passed to \fIsetjmp()\fR. For example:
-.PP
-.Vb 9
-\&  jmp_buf env;
-\&  ...
-\&  if( setjmp(jmp_buf) != 0 ){
-\&    /* out of memory \-\- take corrective action, if possible */
-\&  } else {
-\&    /* save env for XPA */
-\&    XPASaveJmp((void *)&jmp_buf);
-\&  }
-\&  // enter main loop ...
-.Ve
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/mann/xpatcl.n b/xpa/man/mann/xpatcl.n
deleted file mode 100644
index 9156d5e..0000000
--- a/xpa/man/mann/xpatcl.n
+++ /dev/null
@@ -1,362 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpatcl n"
-.TH xpatcl n "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPATcl: the \s-1XPA\s0 Interface to the Tcl/Tk Environment\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-Tcl/Tk programs can act as \s-1XPA\s0 clients and/or servers using the Tcl
-interface to \s-1XPA\s0 that is contained in the libtclxpa.so shared object.
-.PP
-\&\fBServer Routines\fR
-.PP
-.Vb 11
-\&  set xpa [xpanew class name help sproc sdata smode rproc rdata rmode]
-\&  xpafree xpa
-\&  set xpa [xpanew class name help iproc idata imode]
-\&  set xpa [xpacmdnew class name]
-\&  xpacmdadd xpa name help sproc sdata smode rproc rdata rmode
-\&  xpacmddel xpa cmd
-\&  set val [xparec xpa option]
-\&    options: name, class, method, cmdfd, datafd, cmdchan, datachan
-\&  xpasetbuf xpa buf len
-\&  xpaerror xpa message
-\&  xpamessage xpa message
-.Ve
-.PP
-\&\fBClient Routines\fR
-.PP
-.Vb 11
-\&  set xpa [xpaopen mode]
-\&  xpaclose xpa
-\&  set got [xpaget xpa template paramlist mode bufs lens names errs n]
-\&  set got [xpaget xpa template paramlist mode chans names errs n]
-\&  set got [xpaset xpa template paramlist mode buf len names errs n]
-\&  set got [xpasetfd xpa template paramlist mode chan names errs n]
-\&  set got [xpainfo xpa template paramlist mode names errs n]
-\&  # NB: 2.1 calling sequence change
-\&  # set got [xpaaccess template type] (2.0.5)
-\&  set got [xpaaccess xpa template paramlist mode names errs n]
-\&  set got [xpanslookup template type classes names methods]
-.Ve
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-You can call \fIXPANew()\fR, \fIXPACmdNew()\fR, or \fIXPAInfoNew()\fR within a C
-routine to add C\-based \s-1XPA\s0 server callbacks to a TCL/Tk program that
-uses a Tcl/Tk event loop (either \fIvwait()\fR or the Tk event loop);
-Such a program does not need or want to use the \s-1XPA\s0 event loop.
-Therefore, in order to add \s-1XPA\s0 access points to the Tcl/Tk loop, the
-following routine should be called beforehand:
-.PP
-.Vb 1
-\&  int XPATclAddInput(XPA xpa);
-.Ve
-.PP
-Normally, the xpa argument is \s-1NULL\s0, meaning that all current \s-1XPA\s0
-access points are registered with the event loop.  However, if a
-single \s-1XPA\s0 access point is to be added (i.e., after the event loop is
-started) then the handle of that \s-1XPA\s0 access point can be passed to
-this routine.
-.PP
-The significance of the \s-1XPA/TCL\s0 interface goes beyond the support for
-using \s-1XPA\s0 inside C code. The interface allows you to write \s-1XPA\s0
-servers and to make calls to the \s-1XPA\s0 client interface within the Tcl
-environment using the Tcl language directly. The XPA/Tcl
-interface can be loaded using the following package command:
-.PP
-.Vb 1
-\&  package require tclxpa 2.0
-.Ve
-.PP
-Alternatively, you can load the shared object (called libtclxpa.so ) directly:
-.PP
-.Vb 1
-\&  load .../libtclxpa.so tclxpa
-.Ve
-.PP
-Once the tclxpa package is loaded, you can use Tcl versions of \s-1XPA\s0
-routines to define \s-1XPA\s0 servers or make client \s-1XPA\s0 calls.  The
-interface for these routines is designed to match the Unix \s-1XPA\s0
-interface as nearly as possible.  Please refer to
-\&\s-1XPA\s0 Servers
-and
-\&\s-1XPA\s0 Clients
-for general information about these routines.
-.PP
-The file test.tcl in the \s-1XPA\s0 source directory gives examples for using the 
-XPA/Tcl interface.
-.PP
-The following notes describe the minor differences between the interfaces.
-.PP
-\&\fBXPANew\fR
-.PP
-.Vb 1
-\&  set xpa [xpanew class name help sproc sdata smode rproc rdata rmode]
-.Ve
-.PP
-rproc and sproc routines are routines.  The calling sequence of the
-rproc routine is identical to its C counterpart:
-.PP
-.Vb 1
-\&  proc rec_cb { xpa client_data paramlist buf len } { ... }
-.Ve
-.PP
-The sproc routine, however is slightly different from its C counterpart
-because of the difficulty of passing data back from the callback to C:
-.PP
-.Vb 1
-\&  proc sendcb { xpa client_data paramlist } { ... }
-.Ve
-.PP
-Note that the C\-based server's char **buf and int *len arguments are
-missing from the Tcl callback. This is because we did not know how to
-fill buf with data and pass it back to the C routines for communication
-with the client.  Instead, the Tcl server callback uses the following
-routine to set buf and len:
-.PP
-.Vb 1
-\&  xpasetbuf xpa buf len
-.Ve
-.PP
-where:
-.PP
-.Vb 5
-\&  arg           explanation
-\&  \-\-\-\-\-\-        \-\-\-\-\-\-\-\-\-\-\-
-\&  xpa           the first argument of the server callback
-\&  buf           the data to be returned to the client
-\&  len           data length in bytes, (if absent, use length of the buf object)
-.Ve
-.PP
-When this routine is called, a copy of buf is saved for transmission to
-the client.
-.PP
-The fact that buf is duplicated means that \s-1TCL\s0 server writers might wish to
-perform the I/O directly within the callback, rather than have \s-1XPA\s0 do it
-automatically at the end of the routine.  To do this, set:
-.PP
-.Vb 1
-\&  fillbuf=false
-.Ve
-.PP
-in the xpanew smode and then perform I/O through the Tcl channel
-obtained from:
-.PP
-.Vb 1
-\&  set dchan [xparec $xpa datachan]
-.Ve
-.PP
-where:
-.PP
-.Vb 5
-\&  arg           explanation
-\&  \-\-\-\-\-\-        \-\-\-\-\-\-\-\-\-\-\-
-\&  xpa           the first argument of the server callback
-\&  datachan      literal string "datachan" that returns the data channel
-\&  len           data length in bytes, (if absent, use length of the buf object)
-.Ve
-.PP
-\&\s-1NB:\s0 datachan and cmdchan are not available under Windows. It is
-necessary to use the \*(L"raw\*(R" equivalents: datafd and cmdfd.
-.PP
-The same considerations apply to the rproc for receive servers: a copy
-of the incoming data is generated to pass to the receive callback. This
-copy again can be avoided by using \*(L"fillbuf=false\*(R" in the rmode and then
-reading the incoming data from datachan.
-.PP
-The send and receive callback routines can use the xpaerror and xpamessage
-routines to send errors and messages back to the client.  If you also
-want tcl itself to field an error condition, use the standard return call:
-.PP
-.Vb 1
-\&  return ?\-code c? ?\-errorinfo i? ?\-errorcode ec? string
-.Ve
-.PP
-See the Tcl man page for more info.
-.PP
-\&\fBXPARec\fR
-.PP
-The Tcl xparec procedure supplies server routines with access to information 
-that is available via macros in the C interface:
-.PP
-.Vb 1
-\&  set val [xparec xpa <option>]
-.Ve
-.PP
-where option is: name, class, method, cmdfd, datafd, cmdchan,
-datachan.  Note that two additional identifiers, cmdchan and datachan,
-have been added to to provide Tcl channels corresponding to datafd and
-cmdfd.  (These latter might still be retrieved in Tcl and passed back
-to a C routines.)  An additional option called \*(L"version\*(R" can be used to
-determine the \s-1XPA\s0 version used to build the Tcl interface. Note that
-the standard options require a valid \s-1XPA\s0 handle, but \*(L"version\*(R" does
-not (since it simply reports the value of the \s-1XPA_VERSION\s0 definition
-in the \s-1XPA\s0 source include file).
-.PP
-\&\s-1NB:\s0 datachan and cmdchan are not available under Windows. It is
-necessary to use the \*(L"raw\*(R" equivalents: datafd and cmdfd.
-.PP
-.Vb 12
-\&  macro         explanation
-\&  \-\-\-\-\-\-        \-\-\-\-\-\-\-\-\-\-\-
-\&  class         class of this xpa
-\&  name          name of this xpa
-\&  method        method string (inet or local connect info)
-\&  cmdchan       Tcl channel of command socket
-\&  datachan      Tcl channel of data socket
-\&  cmdfd         fd of command socket
-\&  datafd        fd of data socket
-\&  sendian       endian\-ness of server ("little" or "big")
-\&  cendian       endian\-ness of client ("little" or "big"
-\&  version       XPA version used to build this code
-.Ve
-.PP
-Under Windows, the Tcl event handler cannot automatically sense when an
-\&\s-1XPA\s0 socket is ready for \s-1IO\s0 (i.e. \fITcl_CreateFileHandler()\fR is not available
-under Windows). The Windows Tcl event handler therefore must be awakened
-occasionally for check for \s-1XPA\s0 events. This is done using the standard
-\&\fITcl_SetMaxBlockTime()\fR call. The time parameter is defined in tclloop.c
-and is currently set to 1000 microseconds (1/1000 of a second).
-.PP
-The version option can be used to differentiate between source code versions.
-It was created to support legacy Tcl code that needs to maintain the 2.0.5
-calling sequence for xpaaccess. You can use a version test such as:
-.PP
-.Vb 5
-\&  if [catch { xparec "" version } version] {
-\&    puts "pre\-2.1.0e"
-\&  } else {
-\&    puts [split $version .]
-\&  }
-.Ve
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/mann/xpatemplate.n b/xpa/man/mann/xpatemplate.n
deleted file mode 100644
index f8fc55a..0000000
--- a/xpa/man/mann/xpatemplate.n
+++ /dev/null
@@ -1,232 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpatemplate n"
-.TH xpatemplate n "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPATemplate: Access Point Names and Templates\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-\&\s-1XPA\s0 access points are composed of two parts: a general class and a
-specific name.  Both parts accept template characters so that you
-can send/retrieve data to/from multiple servers at one time.
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-When \s-1XPA\s0 servers call
-\&\fIXPANew()\fR,
-or
-\&\fIXPACmdNew()\fR
-to define \s-1XPA\s0 access points, they specify a string identifier composed of a
-class and a name. When clients communicate with \s-1XPA\s0 access points,
-they specify which access points to communicate with using
-an identifier of the form:
-.PP
-.Vb 1
-\&  class:name
-.Ve
-.PP
-All registered \s-1XPA\s0 access points that match the specified identifier
-will be available for communication (subject to access control rules,
-etc.)
-.PP
-As of \s-1XPA\s0 2.1.5, the length of both the class and name designations are
-limited to 1024 characters.
-.PP
-The \s-1XPA\s0 class:name identifier actually is a template: it accepts wild
-cards in its syntax, so a single specifier can match more than one \s-1XPA\s0
-access point.  (Note that the class is optional and defaults to \*(L"*\*(R".)
-The allowed syntax for clients to specify the class:name template is
-of the form shown below. (Note that \*(L"*\*(R" is used to denote a generic
-wild card, but other wild cards characters are supported, as described
-below).
-.PP
-.Vb 7
-\&  template      explanation
-\&  \-\-\-\-\-\-\-\-      \-\-\-\-\-\-\-\-\-\-\-
-\&  class:name    exact match of class and name
-\&  name          match any class with this name
-\&  *:name        match any class with this name
-\&  class:*       match any name of this class
-\&  *:*           match any access point
-.Ve
-.PP
-In general, the following wild-cards can be applied to class and name:
-.PP
-.Vb 5
-\&  wildcard      explanation
-\&  \-\-\-\-\-\-\-\-      \-\-\-\-\-\-\-\-\-\-\-
-\&  ?             match any character, but there must be one
-\&  *             match anything, or nothing
-\&  [...]         match an inclusive set
-.Ve
-.PP
-Although the class:name template normally is used to refer to \s-1XPA\s0
-access points, these also can be specified using their individual
-socket identifiers.  For inet sockets, the socket identifier is
-\&\fBip:port\fR, where ip can be the DNS-registered name,
-the \s-1ASCII\s0 \s-1IP\s0 number (e.g. 123.45.67.890) or the hex \s-1IP\s0 number
-(e.g. 838f3a60). For unix sockets, the identifier is the socket file
-name.  These socket identifiers are displayed as the fourth argument
-in the xpans display of registered access points.  For example,
-consider the ds9 program started using inet sockets. The xpans name
-server will register something like this:
-.PP
-.Vb 2
-\&  csh> xpaget xpans
-\&  DS9 ds9 gs saord.harvard.edu:3236 eric
-.Ve
-.PP
-You can access ds9 using ip:3236 in any of the three forms:
-.PP
-.Vb 2
-\&  csh> xpaget saord:3236 file
-\&  /home/eric/data/snr.ev
-\&
-\&  csh> xpaget 123.45.67.890:3236 file
-\&  /home/eric/data/snr.ev
-\&
-\&  csh> xpaget 838f3a60:3236 file
-\&  /home/eric/data/snr.ev
-.Ve
-.PP
-In the case of unix  sockets, the socket identifier is a file:
-.PP
-.Vb 2
-\&  csh> xpaget xpans
-\&  DS9 ds9 gs /tmp/.xpa/DS9_ds9.2631 eric
-\&
-\&  csh> xpaget /tmp/.xpa/DS9_ds9.2631 file
-\&  /home/eric/data/snr.ev
-.Ve
-.PP
-This feature can be useful in distinguishing between multiple
-instances of a program that all have the same class:name designation.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/mann/xpausers.n b/xpa/man/mann/xpausers.n
deleted file mode 100644
index 2823e3d..0000000
--- a/xpa/man/mann/xpausers.n
+++ /dev/null
@@ -1,186 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpausers n"
-.TH xpausers n "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAUsers: Distinguishing Users\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-\&\s-1XPA\s0 normally distinguishes between users on a given host, but it is possible
-to send data to access points belonging to other users.
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-A single \s-1XPA\s0 name service typically serves all users on a given
-machine.  Two users can register the same \s-1XPA\s0 access points on the
-same machine without conflict, because the user's username is
-registered with each access point and, by default, programs such as
-xpaget and xpaset only process access points of the appropriate user.
-For example:
-.PP
-.Vb 4
-\&  XPA xpa1 gs 838e2f67:1262 eric
-\&  XPA xpa2 gs 838e2f67:1266 eric
-\&  XPA xpa1 gs 838e2f67:2523 john
-\&  XPA xpa2 gs 838e2f67:2527 john
-.Ve
-.PP
-Here the users \*(L"eric\*(R" and \*(L"john\*(R" both have registered the access
-points xpa1 and xpa2. When either \*(L"john\*(R" or \*(L"eric\*(R" retrieves
-information from xpa1, they will process only the access point
-registered in their user name.
-.PP
-If you want to access another user's \s-1XPA\s0 access points on a single
-machine, use the \-u [user] option on xpaset, xpaget, etc. For example,
-if eric executes:
-.PP
-.Vb 1
-\&  xpaget \-u john xpa1
-.Ve
-.PP
-he will access John's xpa1 access point.Use \*(L"*\*(R" to access all users
-on a given machine:
-.PP
-.Vb 1
-\&  xpaget \-u "*" xpa1
-.Ve
-.PP
-Note that the \s-1XPA\s0 Environment Variable
-\&\s-1XPA_NSUSERS\s0 can be used to specify the default list of users to
-process:
-.PP
-.Vb 1
-\&  setenv XPA_NSUSERS "eric,john"
-.Ve
-.PP
-will cause access points from both \*(L"eric\*(R" and \*(L"john\*(R" to be processed
-by default.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/man/mann/xpaxt.n b/xpa/man/mann/xpaxt.n
deleted file mode 100644
index 8885dd4..0000000
--- a/xpa/man/mann/xpaxt.n
+++ /dev/null
@@ -1,161 +0,0 @@
-.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.13)
-.\"
-.\" Standard preamble:
-.\" ========================================================================
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-.fi
-..
-.\" Set up some character translations and predefined strings.  \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
-.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
-.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
-.\" nothing in troff, for use with C<>.
-.tr \(*W-
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.ie n \{\
-.    ds -- \(*W-
-.    ds PI pi
-.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
-.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
-.    ds L" ""
-.    ds R" ""
-.    ds C` ""
-.    ds C' ""
-'br\}
-.el\{\
-.    ds -- \|\(em\|
-.    ds PI \(*p
-.    ds L" ``
-.    ds R" ''
-'br\}
-.\"
-.\" Escape single quotes in literal strings from groff's Unicode transform.
-.ie \n(.g .ds Aq \(aq
-.el       .ds Aq '
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr for
-.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
-.\" entries marked with X<> in POD.  Of course, you'll have to process the
-.\" output yourself in some meaningful fashion.
-.ie \nF \{\
-.    de IX
-.    tm Index:\\$1\t\\n%\t"\\$2"
-..
-.    nr % 0
-.    rr F
-.\}
-.el \{\
-.    de IX
-..
-.\}
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
-.    \" fudge factors for nroff and troff
-.if n \{\
-.    ds #H 0
-.    ds #V .8m
-.    ds #F .3m
-.    ds #[ \f1
-.    ds #] \fP
-.\}
-.if t \{\
-.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
-.    ds #V .6m
-.    ds #F 0
-.    ds #[ \&
-.    ds #] \&
-.\}
-.    \" simple accents for nroff and troff
-.if n \{\
-.    ds ' \&
-.    ds ` \&
-.    ds ^ \&
-.    ds , \&
-.    ds ~ ~
-.    ds /
-.\}
-.if t \{\
-.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
-.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
-.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
-.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
-.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
-.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-.    \" troff and (daisy-wheel) nroff accents
-.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
-.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
-.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
-.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
-.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
-.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
-.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
-.ds ae a\h'-(\w'a'u*4/10)'e
-.ds Ae A\h'-(\w'A'u*4/10)'E
-.    \" corrections for vroff
-.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
-.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
-.    \" for low resolution devices (crt and lpr)
-.if \n(.H>23 .if \n(.V>19 \
-\{\
-.    ds : e
-.    ds 8 ss
-.    ds o a
-.    ds d- d\h'-1'\(ga
-.    ds D- D\h'-1'\(hy
-.    ds th \o'bp'
-.    ds Th \o'LP'
-.    ds ae ae
-.    ds Ae AE
-.\}
-.rm #[ #] #H #V #F C
-.\" ========================================================================
-.\"
-.IX Title "xpaxt n"
-.TH xpaxt n "July 23, 2013" "version 2.1.15" "SAORD Documentation"
-.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
-.\" way too many mistakes in technical documents.
-.if n .ad l
-.nh
-.SH "NAME"
-\&\fBXPAXt: the \s-1XPA\s0 Interface to Xt (X Windows)\fR
-.SH "SYNOPSIS"
-.IX Header "SYNOPSIS"
-Describes how \s-1XPA\s0 access points can be added to X Toolkit (Xt) programs.
-.SH "DESCRIPTION"
-.IX Header "DESCRIPTION"
-\&\s-1XPA\s0 supports Xt programs: you can call \fIXPANew()\fR, \fIXPACmdNew()\fR, or
-\&\fIXPAInfoNew()\fR within any C routine to add \s-1XPA\s0 server callbacks to an Xt
-program.  Since an Xt program has its own event loop call (i.e.,
-\&\fIXtAppMainLoop()\fR), it therefore does not need or want to use the \s-1XPA\s0
-even loop.  Thus, in order to add \s-1XPA\s0 access points to the standard Xt
-event loop, the following routine should be called before entering the
-loop:
-.PP
-.Vb 1
-\&  int XPAXtAddInput(XtAppContext app, XPA xpa)
-.Ve
-.PP
-The \fIXPAAddAddInput()\fR routine will add \s-1XPA\s0 access points to the Xt event
-loop by making calls to the standard \fIXtAppAddInput()\fR routine. (If the
-XtAppContext argument is \s-1NULL\s0, then the alternate \fIXtAddInput()\fR routine
-is used instead.)  If the xpa argument is \s-1NULL\s0, then all active \s-1XPA\s0
-access points are added to the loop.  If xpa is not \s-1NULL\s0, then only
-the specified access point is added.  The latter type of call is used
-to add new access points from within a callback, after the program has
-entered the \fIXtAppMainLoop()\fR even loop.
-.SH "SEE ALSO"
-.IX Header "SEE ALSO"
-See xpa(n) for a list of \s-1XPA\s0 help pages
diff --git a/xpa/mklib b/xpa/mklib
deleted file mode 100755
index c900b3e..0000000
--- a/xpa/mklib
+++ /dev/null
@@ -1,880 +0,0 @@
-#!/bin/sh
-
-# Make a shared library.
-# This script should be useful for projects other than Mesa.
-# Improvements/fixes are welcome.
-
-
-# Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
-#
-# Permission is hereby granted, free of charge, to any person obtaining a
-# copy of this software and associated documentation files (the "Software"),
-# to deal in the Software without restriction, including without limitation
-# the rights to use, copy, modify, merge, publish, distribute, sublicense,
-# and/or sell copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-# BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-#
-# Option defaults
-#
-LIBNAME=""
-MAJOR=1
-MINOR=0
-PATCH=""
-DEPS=""
-LINK=""
-LDFLAGS=""
-CPLUSPLUS=0
-STATIC=0
-DLOPEN=0
-INSTALLDIR="."
-ARCH="auto"
-ARCHOPT=""
-NOPREFIX=0
-EXPORTS=""
-
-
-#
-# Parse arguments
-#
-while true
-do
-    case $1 in
-	'-h' | '--help')
-	    echo 'Usage: mklib [options] objects'
-	    echo 'Create a shared library from object files.'
-	    echo '  -o LIBRARY    specifies the name of the resulting library, without'
-	    echo '                the leading "lib" or any suffix.'
-	    echo '                (eg: "-o GL" might result in "libGL.so" being made)'
-	    echo '  -major N      specifies major version number (default is 1)'
-	    echo '  -minor N      specifies minor version number (default is 0)'
-	    echo '  -patch N      specifies patch version number (default is 0)'
-	    echo '  -lLIBRARY     specifies a dependency on LIBRARY'
-	    echo '  -LDIR         search in DIR for library dependencies'
-	    echo '  -linker L     explicity specify the linker program to use (eg: gcc, g++)'
-	    echo '                Not observed on all systems at this time.'
-	    echo '  -ldflags OPT  specify any additional linker flags in OPT'
-	    echo '  -cplusplus    link with C++ runtime'
-	    echo '  -static       make a static library (default is dynamic/shared)'
-	    echo '  -dlopen       make a shared library suitable for dynamic loading'
-	    echo '  -install DIR  put resulting library file(s) in DIR'
-	    echo '  -arch ARCH    override using `uname` to determine host system'
-	    echo '  -archopt OPT  specify an extra achitecture-specific option OPT'
-	    echo '  -altopts OPTS alternate options to override all others'
-	    echo "  -noprefix     don't prefix library name with 'lib' nor add any suffix"
-	    echo '  -exports FILE only export the symbols listed in FILE'
-	    echo '  -h, --help    display this information and exit'
-	    exit 1
-	    ;;
-	'-o')
-	    shift 1;
-	    LIBNAME=$1
-	    ;;
-	'-major')
-	    shift 1;
-	    MAJOR=$1
-	    ;;
-	'-minor')
-	    shift 1;
-	    MINOR=$1
-	    ;;
-	'-patch')
-	    shift 1;
-	    PATCH=$1
-	    ;;
-	'-linker')
-	    shift 1;
-	    LINK=$1
-	    ;;
-	'-ldflags')
-	    shift 1;
-	    LDFLAGS=$1
-	    ;;
-	-l*)
-	    DEPS="$DEPS $1"
-	    ;;
-	-L*)
-	    DEPS="$DEPS $1"
-	    ;;
-	-pthread)
-	    # this is a special case (see bugzilla 10876)
-	    DEPS="$DEPS $1"
-	    ;;
-	-Wl*)
-	    # Another special case for DragonFly
-	    DEPS="$DEPS $1"
-	    ;;
-	-Wl*)
-	    DEPS="$DEPS $1"
-	    ;;
-	'-pthread')
-	    DEPS="$DEPS -pthread"
-	    ;;
-	'-cplusplus')
-	    CPLUSPLUS=1
-	    ;;
-	'-static')
-	    STATIC=1
-	    ;;
-	'-dlopen')
-	    DLOPEN=1
-	    ;;
-	'-install')
-	    shift 1;
-	    INSTALLDIR=$1
-	    ;;
-	'-arch')
-	    shift 1;
-	    ARCH=$1
-	    ;;
-	'-archopt')
-	    shift 1;
-	    ARCHOPT=$1
-	    ;;
-	'-altopts')
-            shift 1;
-            ALTOPTS=$1
-            ;;
-	'-noprefix')
-	    NOPREFIX=1
-	    ;;
-	'-exports')
-	    shift 1;
-	    EXPORTS=$1
-	    ;;
-	-*)
-	    echo "mklib: Unknown option: " $1 ;
-	    exit 1
-	    ;;
-	*)
-	    # This should be the first object file, stop parsing
-	    break
-    esac
-    shift 1
-done
-OBJECTS=$@
-
-
-if [ ${ARCH} = "auto" ] ; then
-    ARCH=`uname`
-fi
-
-
-#
-# Error checking
-#
-if [ "x${LIBNAME}" = "x" ] ; then
-    echo "mklib: Error: no library name specified"
-    exit 1
-fi
-if [ "x${OBJECTS}" = "x" ] ; then
-    echo "mklib: Error: no object files specified"
-    exit 1
-fi
-
-
-#
-# Debugging info
-#
-if [  ]  ; then
-    echo "-----------------"
-    echo ARCH is $ARCH
-    echo LIBNAME is $LIBNAME
-    echo MAJOR is $MAJOR
-    echo MINOR is $MINOR
-    echo PATCH is $PATCH
-    echo DEPS are $DEPS
-    echo "EXPORTS in" $EXPORTS
-    echo "-----------------"
-fi
-
-
-#
-# OK, make the library now
-#
-case $ARCH in
-
-    'Linux' | 'OpenBSD' | 'DragonFly' | 'GNU' | GNU/*)
-	# we assume gcc
-
-	if [ "x$LINK" = "x" ] ; then
-	    # -linker was not specified so set default link command now
-            if [ $CPLUSPLUS = 1 ] ; then
-                LINK=g++
-            else
-                LINK=gcc
-            fi
-	fi
-
-	if [ $NOPREFIX = 1 ] ; then
-	    # No "lib" or ".so" part
-	    echo "mklib: Making" $ARCH "shared library: " ${LIBNAME}
-	    case $ARCH in 'Linux' | 'GNU' | GNU/*)
-		OPTS="-Xlinker -Bsymbolic -shared"
-	    ;;
-	    *)
-		OPTS="-shared"
-	    ;;
-	    esac
-
-	    # Check if objects are 32-bit and we're running in 64-bit
-	    # environment.  If so, pass -m32 flag to linker.
-	    set ${OBJECTS}
-	    ABI32=`file $1 | grep 32-bit`
-	    if [ "${ABI32}" -a `uname -m` = "x86_64" ] ; then
-		OPTS="-m32 ${OPTS}"
-	    fi
-
-            if [ "${ALTOPTS}" ] ; then
-                OPTS=${ALTOPTS}
-            fi
-
-            rm -f ${LIBNAME}
-            # make lib
-            ${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
-            # finish up
-            FINAL_LIBS="${LIBNAME}"
-        elif [ $STATIC = 1 ] ; then
-            LIBNAME="lib${LIBNAME}.a"     # prefix with "lib", suffix with ".a"
-            echo "mklib: Making" $ARCH "static library: " ${LIBNAME}
-            LINK="ar"
-            OPTS="-ru"
-            if [ "${ALTOPTS}" ] ; then
-                OPTS=${ALTOPTS}
-            fi
-            rm -f ${LIBNAME}
-            # make lib
-            ${LINK} ${OPTS} ${LIBNAME} ${OBJECTS}
-            ranlib ${LIBNAME}
-            # finish up
-            FINAL_LIBS=${LIBNAME}
-        else
-	    LIBNAME="lib${LIBNAME}"     # prefix with "lib"
-	    case $ARCH in 'Linux' | 'GNU' | GNU/*)
-		OPTS="-Xlinker -Bsymbolic -shared -Wl,-soname,${LIBNAME}.so.${MAJOR}"
-	    ;;
-	    *)
-		OPTS="-shared -Wl,-soname,${LIBNAME}.so.${MAJOR}"
-	    ;;
-	    esac
-	    if [ $EXPORTS ] ; then
-		#OPTS="${OPTS} -Xlinker --retain-symbols-file ${EXPORTS}"
-		# Make the 'exptmp' file for --version-script option
-		echo "{" > exptmp
-		echo "global:" >> exptmp
-		sed 's/$/;/' ${EXPORTS} >> exptmp
-		echo "local:" >> exptmp
-		echo "*;" >> exptmp
-		echo "};" >> exptmp
-		OPTS="${OPTS} -Xlinker --version-script=exptmp"
-		# exptmp is removed below
-	    fi
-
-	    # Check if objects are 32-bit and we're running in 64-bit
-	    # environment.  If so, pass -m32 flag to linker.
-	    set ${OBJECTS}
-	    ABI32=`file $1 | grep 32-bit`
-	    if [ "${ABI32}" -a `uname -m` = "x86_64" ] ; then
-		OPTS="-m32 ${OPTS}"
-	    fi
-            if [ "${ALTOPTS}" ] ; then
-                OPTS=${ALTOPTS}
-            fi
-
-	    if [ x${PATCH} = "x" ] ; then
-		VERSION="${MAJOR}.${MINOR}"
-	    else
-		VERSION="${MAJOR}.${MINOR}.${PATCH}"
-	    fi
-
-            echo "mklib: Making" $ARCH "shared library: " ${LIBNAME}.so.${VERSION}
-
-            # rm any old libs
-            rm -f ${LIBNAME}.so.${VERSION}
-            rm -f ${LIBNAME}.so.${MAJOR}
-            rm -f ${LIBNAME}.so
-
-            # make lib
-            ${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME}.so.${VERSION} ${OBJECTS} ${DEPS}
-            # make usual symlinks
-            ln -s ${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR}
-            ln -s ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so
-            # finish up
-            FINAL_LIBS="${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so"
-#	    rm -f exptmp
-        fi
-	;;
-
-    'SunOS')
-        if [ $STATIC = 1 ] ; then
-	    LIBNAME="lib${LIBNAME}.a"
-	    echo "mklib: Making SunOS static library: " ${LIBNAME}
-	    rm -f ${LIBNAME}
-	    ar -ruv ${LIBNAME} ${OBJECTS}
-	    FINAL_LIBS=${LIBNAME}
-	else
-	    if [ $NOPREFIX = 0 ] ; then
-		LIBNAME="lib${LIBNAME}.so"
-	    fi
-	    echo "mklib: Making SunOS shared library: " ${LIBNAME}
-
-	    if [ "x$LINK" = "x" ] ; then
-		# -linker was not specified, choose default linker now
-		if [ $CPLUSPLUS = 1 ] ; then
-		    # determine linker and options for C++ code
-		    if [ `which c++` ] ; then
-			# use Sun c++
-			LINK="c++"
-		    elif [ `type g++` ] ; then
-			# use g++
-			LINK="g++"
-		    else
-			echo "mklib: warning: can't find C++ comiler, trying CC."
-			LINK="CC"
-		    fi
-		else
-		    # use native Sun linker for C code
-		    LINK="ld"
-		fi
-	    fi
-
-	    # linker options
-	    if [ ${LINK} = "ld" -o ${LINK} = "cc" -o ${LINK} = "CC" ] ; then
-		# SunOS tools, -G to make shared libs
-		OPTS="-G"
-	    else
-		# gcc linker
-		# Check if objects are 32-bit and we're running in 64-bit
-		# environment.  If so, pass -m32 flag to linker.
-		set ${OBJECTS}
-		ABI32=`file $1 | grep 32-bit`
-		if [ "${ABI32}" ] ; then
-		    OPTS="-m32 -shared -Wl,-Bdynamic"
-		else
-		    OPTS="-m64 -shared -Wl,-Bdynamic"
-		fi
-	    fi
-
-	    # Check if objects are SPARC v9
-	    # file says: ELF 64-bit MSB relocatable SPARCV9 Version 1
-	    set ${OBJECTS}
-	    SPARCV9=`file $1 | grep SPARCV9`
-	    if [ "${SPARCV9}" ] ; then
-		OPTS="${OPTS} -xarch=v9"
-	    fi
-            if [ "${ALTOPTS}" ] ; then
-                OPTS=${ALTOPTS}
-            fi
-	    # for debug:
-	    #echo "mklib: linker is" ${LINK} ${OPTS}
-	    if [ $NOPREFIX = 1 ] ; then
-		rm -f ${LIBNAME}
-		${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
-	    else
-		rm -f ${LIBNAME}.${MAJOR} ${LIBNAME}
-		${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME}.${MAJOR} ${OBJECTS} ${DEPS}
-		ln -s ${LIBNAME}.${MAJOR} ${LIBNAME}
-	    fi
-	    FINAL_LIBS="${LIBNAME}.${MAJOR} ${LIBNAME}"
-	fi
-	;;
-
-    'FreeBSD')
-	# we assume gcc
-
-	if [ "x$LINK" = "x" ] ; then
-	    # -linker was not specified so set default link command now
-            if [ $CPLUSPLUS = 1 ] ; then
-                LINK=g++
-            else
-                LINK=gcc
-            fi
-	fi
-
-	if [ $NOPREFIX = 1 ] ; then
-	    # No "lib" or ".so" part
-	    echo "mklib: Making FreeBSD shared library: " ${LIBNAME}
-	    OPTS="-shared"
-            if [ "${ALTOPTS}" ] ; then
-                OPTS=${ALTOPTS}
-            fi
-	    rm -f ${LIBNAME}
-	    ${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
-	    FINAL_LIBS=${LIBNAME}
-        elif [ $STATIC = 1 ] ; then
-	    STLIB="lib${LIBNAME}.a"
-	    echo "mklib: Making FreeBSD static library: " ${STLIB}
-	    rm -f ${STLIB}
-	    ar cq ${STLIB} ${OBJECTS}
-	    ranlib ${STLIB}
-	    FINAL_LIBS=${STLIB}
-	else
-	    SHLIB="lib${LIBNAME}.so.${MAJOR}"
-	    OPTS="-shared -Wl,-soname,${SHLIB}"
-            if [ "${ALTOPTS}" ] ; then
-                OPTS=${ALTOPTS}
-            fi
-	    echo "mklib: Making FreeBSD shared library: " ${SHLIB}
-	    rm -f ${SHLIB}
-	    ${LINK} ${OPTS} ${LDFLAGS} -o ${SHLIB} ${OBJECTS} ${DEPS}
-	    ln -sf ${SHLIB} "lib${LIBNAME}.so"
-	    FINAL_LIBS="${SHLIB} lib${LIBNAME}.so"
-	fi
-	;;
-
-    'NetBSD')
-        if [ $STATIC = 1 ] ; then
-	    LIBNAME="lib${LIBNAME}_pic.a"
-	    echo "mklib: Making NetBSD PIC static library: " ${LIBNAME}
-	    rm -f ${LIBNAME}
-	    ar cq ${LIBNAME} ${OBJECTS}
-	    ranlib ${LIBNAME}
-	    FINAL_LIBS=${LIBNAME}
-	else
-	    LIBNAME="lib${LIBNAME}.so.${MAJOR}.${MINOR}"
-	    echo "mklib: Making NetBSD PIC shared library: " ${LIBNAME}
-	    rm -f ${LIBNAME}
-	    ld -x -Bshareable -Bforcearchive -o ${LIBNAME} ${OBJECTS}
-	    FINAL_LIBS=${LIBNAME}
-	fi
-	;;
-
-    'IRIX' | 'IRIX64')
-        if [ $STATIC = 1 ] ; then
-	    LIBNAME="lib${LIBNAME}.a"
-	    rm -f ${LIBNAME}
-	    ar rc ${LIBNAME} ${OBJECTS}
-	    FINAL_LIBS=${LIBNAME}
-	else
-	    LIBNAME="lib${LIBNAME}.so"  # prefix with "lib", suffix with ".so"
-
-	    # examine first object to determine ABI
-    	    set ${OBJECTS}
-	    ABI_O32=`file $1 | grep 'ELF 32-bit'`
-	    ABI_N32=`file $1 | grep 'ELF N32'`
-	    ABI_N64=`file $1 | grep 'ELF 64-bit'`
-	    if [ "${ABI_O32}" ] ; then
-		OPTS="-32 -shared -all"
-		ABI="o32-bit"
-	    elif [ "${ABI_N32}" ] ; then
-		OPTS="-n32 -shared -all"
-		ABI="n32-bit"
-	    elif [ "${ABI_N64}" ] ; then
-		OPTS="-64 -shared -all"
-		ABI="64-bit"
-	    else
-		echo "Error: Unexpected IRIX ABI!"
-		exit 1
-	    fi
-
-            if [ "${ALTOPTS}" ] ; then
-                OPTS=${ALTOPTS}
-            fi
-
-	    if [ $CPLUSPLUS = 1 ] ; then
-		LINK="CC"
-	    else
-		LINK="ld"
-	    fi
-
-	    echo "mklib: Making IRIX " ${ABI} " shared library: " ${LIBNAME}
-	    ${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
-	    FINAL_LIBS=${LIBNAME}
-	fi
-	;;
-
-    'linux-cygwin')
-	LIBNAME="lib${LIBNAME}.a"
-	echo "mklib: Making linux-cygwin library: " ${LIBNAME}
-	rm -f ${LIBNAME}
-	gnuwin32ar ruv ${LIBNAME} ${OBJECTS}
-	FINAL_LIBS=${LIBNAME}
-	;;
-
-    'HP-UX')
-        if [ $STATIC = 1 ] ; then
-	    LIBNAME="lib${LIBNAME}.a"
-	    echo "mklib: Making HP-UX static library: " ${LIBNAME}
-	    rm -f ${LIBNAME}
-	    ar -ruv ${LIBNAME} ${OBJECTS}
-	    FINAL_LIBS=${LIBNAME}
-	else
-            # HP uses a .2 for their current GL/GLU libraries
-	    if [ ${LIBNAME} = "GL" -o ${LIBNAME} = "GLU" ] ; then
-	       MAJOR=2
-	    fi
-	    RUNLIB="lib${LIBNAME}.${MAJOR}"
-	    DEVLIB="lib${LIBNAME}.sl"
-	    echo "mklib: Making HP-UX shared library: " ${RUNLIB} ${DEVLIB}
-	    ld -b -o ${RUNLIB} +b ${RUNLIB} ${OBJECTS} ${DEPS}
-	    ln -s ${RUNLIB} ${DEVLIB}
-	    FINAL_LIBS="${RUNLIB} ${DEVLIB}"
-	fi
-	;;
-
-    'AIX' )
-	# examine first object to determine ABI
-    	set ${OBJECTS}
-	ABI_64=`file $1 | grep '64-bit'`
-	if [ "${ABI_64}" ] ; then
-	    X64="-X64"
-	    Q64="-q64"
-	    OFILE=shr_64.o
-	else
-	    OFILE=shr.o  #Want to be consistent with the IBM libGL.a
-	fi
-
-	if [ $STATIC = 1 ] ; then
-	    LIBNAME="lib${LIBNAME}.a"
-	    echo "mklib: Making AIX static library: " ${LIBNAME}
-	    ar -ruv ${X64} ${LIBNAME} ${OBJECTS}
-	    FINAL_LIBS=${LIBNAME}
-	else
-	    EXPFILE="lib${LIBNAME}.exp"
-	    LIBNAME="lib${LIBNAME}.a"  # shared objects are still stored in the .a libraries
-	    OPTS="-bE:${EXPFILE} -bM:SRE -bnoentry ${Q64}"
-	    rm -f ${EXPFILE} ${OFILE}
-	    NM="/bin/nm -eC ${X64}"
-	    echo "#! /usr/lib/${LIBNAME}" > ${EXPFILE}
-	    ${NM} ${OBJECTS} | awk '{
-	    if ((($2 == "T") || ($2 == "D") || ($2 == "B")) \
-	    && ( substr($1,1,1) != ".")) {
-		    if (substr ($1, 1, 7) != "__sinit" &&
-			    substr ($1, 1, 7) != "__sterm") {
-			    if (substr ($1, 1, 5) == "__tf1")
-				print (substr ($1, 7))
-			    else if (substr ($1, 1, 5) == "__tf9")
-				print (substr ($1, 15))
-			    else
-				print $1
-			}
-		}
-	    }' | sort -u >> ${EXPFILE}
-
-            if [ "${ALTOPTS}" ] ; then
-                OPTS=${ALTOPTS}
-            fi
-
-            # On AIX a shared library is linked differently when
-            # you want to dlopen the file
-	    if [ $DLOPEN = "1" ] ; then
-		cc -G ${OPTS} ${LDFLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
-	    else
-		cc ${OPTS} ${LDFLAGS} -o ${OFILE} ${OBJECTS} ${DEPS}
-		ar ${X64} -r ${LIBNAME} ${OFILE}
-	    fi
-
-            FINAL_LIBS="${LIBNAME}"
-        fi
-        ;;
-
-    'OpenSTEP')
-	LIBNAME="lib${LIBNAME}.a"
-	echo "mklib: Making OpenSTEP static library: " ${LIBNAME}
-	libtool -static -o ${LIBNAME} - ${OBJECTS}
-	FINAL_LIBS=${LIBNAME}
-	;;
-
-    'OSF1')
-        if [ $STATIC = 1 ] ; then
-	    LIBNAME="lib${LIBNAME}.a"
-	    echo "mklib: Making OSF/1 static library: " ${LIBNAME}
-	    rm -f ${LIBNAME}
-	    ar -ruv ${LIBNAME} ${OBJECTS}
-	    FINAL_LIBS=${LIBNAME}
-	else
-	    VERSION="${MAJOR}.${MINOR}"
-	    LIBNAME="lib${LIBNAME}.so"
-	    echo "mklib: Making OSF/1 shared library: " ${LIBNAME}
-	    if [ "x$LINK" = "x" ] ; then
-		if [ $CPLUSPLUS = 1 ] ; then
-		    LINK=cxx
-		else
-		    LINK=cc
-		fi
-	    fi
-	    rm -f ${LIBNAME}.${VERSION}
-	    ${LINK} -o ${LIBNAME}.${VERSION} -shared -set_version ${VERSION} -soname ${LIBNAME}.${VERSION} -expect_unresolved \* -all ${OBJECTS} ${DEPS}
-	    ln -sf ${LIBNAME}.${VERSION} ${LIBNAME}
-	    FINAL_LIBS="${LIBNAME} ${LIBNAME}.${VERSION}"
-	fi
-	;;
-
-    'Darwin')
-        if [ $STATIC = 1 ] ; then
-            LIBNAME="lib${LIBNAME}.a"
-            echo "mklib: Making Darwin static library: " ${LIBNAME}
-            LINK="ar"
-            OPTS="-ruvs"
-            if [ "${ALTOPTS}" ] ; then
-                OPTS=${ALTOPTS}
-            fi
-            ${LINK} ${OPTS} ${LIBNAME} ${OBJECTS}
-            FINAL_LIBS=${LIBNAME}
-        else
-            # On Darwin a .bundle is used for a library that you want to dlopen
-            if [ $DLOPEN = "1" ] ; then
-                LIBSUFFIX="bundle"
-                OPTS="${ARCHOPT} -bundle -multiply_defined suppress"
-            else
-		LIBSUFFIX="dylib"
-                OPTS="${ARCHOPT} -dynamiclib -multiply_defined suppress -current_version ${MAJOR}.${MINOR}.0 -compatibility_version ${MAJOR}.${MINOR}.0 -install_name lib${LIBNAME}.${MAJOR}.${LIBSUFFIX}"
-            fi
-
-            if [ ${EXPORTS} ] ; then
-                OPTS="${OPTS} -exported_symbols_list ${EXPORTS}"
-            fi 
-
-            LINKNAME="lib${LIBNAME}.${MAJOR}.${LIBSUFFIX}"
-            LINKNAME2="lib${LIBNAME}.${LIBSUFFIX}"
-            LIBNAME="lib${LIBNAME}.${MAJOR}.${MINOR}.${LIBSUFFIX}"
-
-	    # examine first object to determine ABI
-    	    set ${OBJECTS}
-            ABI_PPC=`file $1 | grep ' ppc'`
-            ABI_I386=`file $1 | grep ' i386'`
-            ABI_PPC64=`file $1 | grep ' ppc64'`
-            ABI_X86_64=`file $1 | grep ' x86_64'`
-            if [ "${ABI_PPC}" ] ; then
-                OPTS="${OPTS} -arch ppc"
-            fi
-            if [ "${ABI_I386}" ] ; then
-                OPTS="${OPTS} -arch i386"
-            fi
-            if [ "${ABI_PPC64}" ] ; then
-                OPTS="${OPTS} -arch ppc64"
-            fi
-            if [ "${ABI_X86_64}" ] ; then
-                OPTS="${OPTS} -arch x86_64"
-            fi
-
-            if [ "${ALTOPTS}" ] ; then
-                OPTS=${ALTOPTS}
-            fi
-
-	    # XXX can we always add -isysroot /Developer/SDKs/MacOSX10.4u.sdk
-	    # to OPTS here?
-
-	    # determine linker
-	    if [ $CPLUSPLUS = 1 ] ; then
-		LINK="g++"
-	    else
-		LINK="cc"
-	    fi
-
-            echo "mklib: Making Darwin shared library: " ${LIBNAME}
-
-            ${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME} ${OBJECTS} ${DEPS}
-            ln -s ${LIBNAME} ${LINKNAME}
-            ln -s ${LIBNAME} ${LINKNAME2}
-            FINAL_LIBS="${LIBNAME} ${LINKNAME} ${LINKNAME2}"
-        fi
-        ;;
-
-    'LynxOS')
-	LIBNAME="lib${LIBNAME}.a"
-	echo "mklib: Making LynxOS static library: " ${LIBNAME}
-	rm -f ${LIBNAME}
-	ar ru ${LIBNAME} ${OBJECTS}
-	FINAL_LIBS=${LIBNAME}
-	;;
-
-    'BeOS')
-        if [ $STATIC = 1 ] ; then
-            LIBNAME="lib${LIBNAME}.a"
-            echo "mklib: Making BeOS static library: " ${LIBNAME}
-            ar -cru "${LIBNAME}" ${OBJECTS}
-        else
-	    LIBNAME="lib${LIBNAME}.so"
-	    echo "mklib: Making BeOS shared library: " ${LIBNAME}
-	    gcc -nostart -Xlinker "-soname=${LIBNAME}" -L/Be/develop/lib/x86 -lbe ${DEPS} ${OBJECTS} -o "${LIBNAME}"
-	    mimeset -f "${LIBNAME}"
-	    # XXX remove the Mesa3D stuff here since mklib isn't mesa-specific.
-	    setversion "${LIBNAME}" -app ${MAJOR} ${MINOR} ${PATCH} -short "Powered by Mesa3D!" -long "Powered by Mesa3D!"
-	fi
-	FINAL_LIBS=${LIBNAME}
-	;;
-
-    'QNX')
-	LIBNAME="lib${LIBNAME}.a"
-	echo "mklib: Making QNX library: " ${LIBNAME}
-	wlib ${LIBNAME} ${OBJECTS}
-	FINAL_LIBS=${LIBNAME}
-	;;
-
-    'MorphOS')
-	LIBNAME="lib${LIBNAME}.a"
-	echo "mklib: Making MorphOS library: " ${LIBNAME}
-	ppc-morphos-ar rc ${LIBNAME} ${OBJECTS}
-	FINAL_LIBS="${LIBNAME}"
-	;;
-
-    'icc' | 'icc-istatic')
-	# Intel C compiler
-	# This should get merged into the Linux code, above, since this isn't
-	# really a different architecture.
-	LIBNAME="lib${LIBNAME}"     # prefix with "lib"
-
-        if [ $STATIC = 1 ] ; then
-            echo "mklib: Making Intel ICC static library: " ${LIBNAME}.a
-            LINK="ar"
-            OPTS="-ruv"
-            if [ "${ALTOPTS}" ] ; then
-                OPTS=${ALTOPTS}
-            fi
-            # make lib
-            ${LINK} ${OPTS} ${LIBNAME}.a ${OBJECTS}
-            # finish up
-            FINAL_LIBS="${LIBNAME}.a"
-        else
-            if [ $ARCH = icc-istatic ] ; then
-                 OPTS="-shared -i-static -cxxlib-icc"
-            else
-                 OPTS="-shared"
-            fi
-            if [ "${ALTOPTS}" ] ; then
-                OPTS=${ALTOPTS}
-            fi
-            VERSION="${MAJOR}.${MINOR}.${PATCH}"
-            echo "mklib: Making Intel ICC shared library: " ${LIBNAME}.so.${VERSION}
-
-            if [ $CPLUSPLUS = 1 ] ; then
-                LINK="icpc"
-            else
-                LINK="icc"
-            fi
-            # rm any old libs
-            rm -f ${LIBNAME}.so.${VERSION}
-            rm -f ${LIBNAME}.so.${MAJOR}
-            rm -f ${LIBNAME}.so
-            # make lib
-            ${LINK} ${OPTS} ${LDFLAGS} -o ${LIBNAME}.so.${VERSION} ${OBJECTS} ${DEPS}
-            # make usual symlinks
-            ln -s ${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR}
-            ln -s ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so
-            # finish up
-            FINAL_LIBS="${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so"
-        fi
-	;;
-
-    'aix-gcc')
-	# AIX with gcc
-        if [ $STATIC = 1 ] ; then
-	    LIBNAME="lib${LIBNAME}.a"
-	    echo "mklib: Making AIX GCC static library: " ${LIBNAME}
-	    rm -f ${LIBNAME}
-	    ar ru ${LIBNAME} ${OBJECTS}
-	    FINAL_LIBS=${LIBNAME}
-	else
-	    LIBNAME="lib${LIBNAME}.so"  # prefix with "lib", suffix with ".so"
-	    echo "mklib: Making AIX GCC shared library: " ${LIBNAME}
-	    # remove old lib
-	    rm -f ${LIBNAME}
-	    # make the lib
-	    gcc -shared -Wl,-G ${OBJECTS} ${DEPS} -o ${LIBNAME}
-	    # NOTE: the application linking with this library must specify
-	    # the -Wl,-brtl flags to gcc
-	    FINAL_LIBS=${LIBNAME}
-	fi
-	;;
-
-    'ultrix')
-	# XXX untested
-        if [ $STATIC = 0 ] ; then
-	    echo "mklib: Warning shared libs not supported on Ultrix"
-	fi
-	LIBNAME="lib${LIBNAME}.a"
-	echo "mklib: Making static library for Ultrix: " ${LIBNAME}
-	rm -f ${LIBNAME}
-	ar ru ${LIBNAME} ${OBJECTS}
-	FINAL_LIBS="${LIBNAME}"
-	;;
-
-     CYGWIN*)
-	# GCC-based environment
-	CYGNAME="cyg${LIBNAME}"     # prefix with "cyg"
-	LIBNAME="lib${LIBNAME}"     # prefix with "lib"
-
-        if [ $STATIC = 1 ] ; then
-            echo "mklib: Making" $ARCH "static library: " ${LIBNAME}.a
-            LINK="ar"
-            OPTS="-ru"
-            if [ "${ALTOPTS}" ] ; then
-                OPTS=${ALTOPTS}
-            fi
-            # make lib
-            ${LINK} ${OPTS} ${LIBNAME}.a ${OBJECTS}
-	    ranlib ${LIBNAME}.a
-            # finish up
-            FINAL_LIBS=${LIBNAME}.a
-        else
-	    OPTS="-shared -Wl,-export-all -Wl,--out-implib=${LIBNAME}-${MAJOR}.dll.a"
-            if [ "${ALTOPTS}" ] ; then
-                OPTS=${ALTOPTS}
-            fi
-            echo "mklib: Making" $ARCH "shared library: " ${LIBNAME}-${MAJOR}.dll
-
-            if [ $CPLUSPLUS = 1 ] ; then
-                LINK="g++"
-            else
-                LINK="gcc"
-            fi
-
-            # rm any old libs
-            rm -f ${LIBNAME}-${MAJOR}.dll
-            rm -f ${LIBNAME}.dll.a
-            rm -f ${LIBNAME}.a
-
-            # make lib
-            ${LINK} ${OPTS} ${LDFLAGS} -o ${CYGNAME}-${MAJOR}.dll ${OBJECTS} ${DEPS}
-            # make usual symlinks
-            ln -s ${LIBNAME}-${MAJOR}.dll.a ${LIBNAME}.dll.a
-            # finish up
-            FINAL_LIBS="${LIBNAME}-${MAJOR}.dll.a ${LIBNAME}.dll.a"
-	    # special case for installing in bin
-            FINAL_BINS="${CYGNAME}-${MAJOR}.dll"
-        fi
-	;;
-
-    'example')
-	# If you're adding support for a new architecture, you can
-	# start with this:
-        if [ $STATIC = 1 ] ; then
-	    LIBNAME="lib${LIBNAME}.a"
-	    echo "mklib: Making static library for example arch: " ${LIBNAME}
-	    rm -f ${LIBNAME}
-	    ar rv ${LIBNAME} ${OBJECTS}
-	    FINAL_LIBS="${LIBNAME}"
-	else
-	    LIBNAME="lib${LIBNAME}.so"  # prefix with "lib", suffix with ".so"
-	    echo "mklib: Making shared library for example arch: " ${LIBNAME}
-	    ld -o ${LIBNAME} ${OBJECTS} ${DEPS}
-	    FINAL_LIBS="${LIBNAME}"
-	fi
-	;;
-
-    *)
-	echo "mklib: ERROR: Don't know how to make a static/shared library for" ${ARCH}
-	echo "mklib: Please add necessary commands to mklib script."
-	;;
-esac
-
-
-#
-# Put library files into installation directory if specified.
-#
-if [ ${INSTALLDIR} != "." ] ; then
-    echo "mklib: Installing" ${FINAL_LIBS} "in" ${INSTALLDIR}
-    mv ${FINAL_LIBS} ${INSTALLDIR}/
-fi
diff --git a/xpa/notes/osx.note b/xpa/notes/osx.note
deleted file mode 100644
index 6ba68a7..0000000
--- a/xpa/notes/osx.note
+++ /dev/null
@@ -1,38 +0,0 @@
-Mac OS X Leopard v10.5 (MB427Z/A)
-
-The process has forked and you cannot use this CoreFoundation
-
-http://developer.apple.com/releasenotes/CoreFoundation/CoreFoundation.html
-
-CoreFoundation and fork() Due to the behavior of fork(),
-CoreFoundation cannot be used on the child-side of fork(). If you
-fork(), you must follow that with an exec*() call of some sort, and
-you should not use CoreFoundation APIs within the child, before the
-exec*(). The applies to all higher-level APIs which use
-CoreFoundation, and since you cannot know what those higher-level APIs
-are doing, and whether they are using CoreFoundation APIs, you should
-not use any higher-level APIs either. This includes use of the
-daemon() function.
-
-Additionally, per POSIX, only async-cancel-safe functions are safe to
-use on the child side of fork(), so even use of lower-level
-libSystem/BSD/UNIX APIs should be kept to a minimum, and ideally to
-only async-cancel-safe functions.
-
-This has always been true, and there have been notes made of this on
-various Cocoa developer mailling lists in the past. But CoreFoundation
-is taking some stronger measures now to "enforce" this limitation, so
-we thought it would be worthwhile to add a release note to call this
-out as well. A message is written to stderr when something uses API
-which is definitely known not to be safe in CoreFoundation after
-fork(). If file descriptor 2 has been closed, however, you will get no
-message or notice, which is too bad. We tried to make processes
-terminate in a very recognizable way, and did for a while and that was
-very handy, but backwards binary compatibility prevented us from doing
-so.
-
---------------
-
-This is the function you set a debug breakpoint on if you try to fork() in Leopard then call a CoreFoundation method:
-
-void __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__(void);
diff --git a/xpa/notes/winport.note b/xpa/notes/winport.note
deleted file mode 100644
index fb7b46d..0000000
--- a/xpa/notes/winport.note
+++ /dev/null
@@ -1,81 +0,0 @@
-Documentation:
-
-The URL:
-
-    http://msdn.microsoft.com/library 
-
-has a good Unix Application Migration Guide as well as Win32 API. 
-
-				MINGW32
-Problems:
-
-client.c:
-
-The select() function does not work on stdio files, so xpaset cannot add
-stdio to select(). This means that "cat foo.fits | xpaset ds9" is not
-implemented. This is a client side problem and would not affect ds9 running
-as an xpa server.
-
-xpaio.c and others:
-
-Win32 does not support most Unix signal handling, and in particular, the
-SIGALRM signal. This means that XPA will hang indefinitely on a system
-call, i.e., there is no timeout support corresponding to XPA_LONG_TIMEOUT
-and XPA_SHORT_TIMEOUT. This affects both clients and servers.
-
-timedconn.c:
-
-Again, lack of support for SIGALRM means alrmconnect() is not implemented.
-For some reason, noblkconect() also did not work properly, so I had to
-use theregular connect() in client.c and hang until further notice. This
-is a client side problem and would not affect ds9 as an xpa server.
-
-launch.c:
-
-Without fork(), its not obvious how to make the code wait for the
-child to start. In the end, I used simply called win32 spawnvp(), put
-a short sleep into the parent, and hoped for the best.
-
-find.c:
-
-Couldn't find the access mode bits (S_IRUSR, S_IWUSR, S_IXUSR) in win32,
-so access checking in find() is not supported.
-
-Code Changes:
-
-xpa.c, client.c (sockets)
-
-Ironically, wsock64 has an FD_SETSIZE of 64 and I had to redefine this to
-8192 to make XPA sockets work.
-
-For wsock32 sockets, we must initialize wsock32 using:
-
-     WSADATA wsaData;
-     ...
-     if( WSAStartup(MAKEWORD(2,0), &wsaData) ) != 0 ) {handle error};
-
-and clean up at the time of exit:
-
-    WSACleanup();
-
-The close(sock) call is replaced by closesocket(sock).
-
-The call:
-
-    fcntl(sock, F_SETFD, FD_CLOEXEC);
-
-is not needed or implemented (since sockets do not survive across exec) and
-must be commented out.
-
-Calls to:
-
-    flags = fcntl(client->datafd, F_GETFL);
-    fcntl(client->datafd, F_SETFL, flags|NONBIO);
-
-get changed to:
-
-    int flags=1;
-    ioctlsocket(socket, FIONBIO, (u_long FAR *)&flags);
-
-
-
diff --git a/xpa/pkgIndex.tcl b/xpa/pkgIndex.tcl
deleted file mode 100644
index 75d2435..0000000
--- a/xpa/pkgIndex.tcl
+++ /dev/null
@@ -1,11 +0,0 @@
-# Tcl package index file, version 1.1
-# This file is generated by the "pkg_mkIndex -direct" command
-# and sourced either when an application starts up or
-# by a "package unknown" script.  It invokes the
-# "package ifneeded" command to set up package-related
-# information so that packages will be loaded automatically
-# in response to "package require" commands.  When this
-# script is sourced, the variable $dir must contain the
-# full path name of this file's directory.
-
-package ifneeded tclxpa 2.1 [list load [file join $dir libtclxpa.so]]
diff --git a/xpa/port.c b/xpa/port.c
deleted file mode 100644
index f3751ac..0000000
--- a/xpa/port.c
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * port.c -- xpa port management
- *
- */
-
-#include <xpap.h>
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- *			Private Routines
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/* this is the head of the global list -- too lazy to do anything more */
-static PORT porthead=NULL;
-
-#ifdef ANSI_FUNC
-static PORT 
-XPAPortLookup (char *xclass, char *name)
-#else
-static PORT XPAPortLookup(xclass, name)
-     char *xclass;
-     char *name;
-#endif
-{
-  PORT cur;
-  /*  look for exact match */
-  for(cur=porthead; cur!=NULL; cur=cur->next){
-    if( !strcmp(xclass, cur->xclass) 		&&
-	!strcmp(name, cur->name)   		){
-      return(cur);
-    }
-  }
-  /* otherwise look for a template match */
-  for(cur=porthead; cur!=NULL; cur=cur->next){
-    if( tmatch(xclass, cur->xclass)		&&
-	tmatch(name, cur->name) 		){
-      return(cur);
-    }
-  }
-  return(NULL);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAPortParse
- *
- * Purpose:	parse port list into components
- *
- * Returns:	0 on success, -1 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPAPortParse (char *lbuf, char *xclass, char *name, int *port, int len)
-#else
-static int XPAPortParse(lbuf, xclass, name, port, len)
-     char *lbuf;
-     char *xclass;
-     char *name;
-     int *port;
-     int len;
-#endif
-{
-  char tbuf[SZ_LINE];
-  int lp=0;
-
-  /* init port values */
-  *port = 0;
-
-  /* class:name is required */
-  if( word(lbuf, tbuf, &lp) ){
-    XPAParseName(tbuf, xclass, name, len);
-  }
-  else{
-    return(-1);
-  }
-
-  /* port is required but can be "*" for default port */
-  if( word(lbuf, tbuf, &lp) ){
-    if( !strcmp(tbuf, "*") )
-      *port = XPA_DEFPORT;
-    else
-      *port = atoi(tbuf);
-  }
-  else{
-    return(-1);
-  }
-
-  /* made it */
-  return(0);
-}
-
-/*----------------------------------------------------------------------------
- *
- *
- *			Public Routines
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAPortAdd
- *
- * Purpose:	add one port entry to the xpa port list
- *
- * Returns: 	0 on success, -1 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAPortAdd (char *lbuf)
-#else
-int XPAPortAdd(lbuf)
-     char *lbuf;
-#endif
-{
-  PORT xnew;
-  PORT cur;
-  char xclass[SZ_LINE];
-  char name[SZ_LINE];
-  int port;
-
-  /* allocate port struct */
-  if( (xnew = (PORT)xcalloc(1, sizeof(struct portrec))) == NULL )
-    goto error;
-
-  /* parse info from line buffer */
-  if( XPAPortParse(lbuf, xclass, name, &port, SZ_LINE) < 0 )
-    goto error;
-
-  /* fill in the blanks */
-  xnew->xclass = xstrdup(xclass);
-  xnew->name = xstrdup(name);
-  xnew->port = port;
-
-  /* add this port to end of list of port's */
-  if( porthead == NULL ){
-    porthead = xnew;
-  }
-  else{
-    for(cur=porthead; cur->next!=NULL; cur=cur->next)
-      ;
-    cur->next = xnew;
-  }
-  return(0);
-
-error:
-  if( xnew )
-    xfree(xnew);
-  return(-1);
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * Routine: 	XPAPortDel
- *
- * Purpose: 	free up alloc'ed memory in the port record structure
- *
- * Results:	0 on success, -1 for failure
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAPortDel (PORT port)
-#else
-int XPAPortDel(port)
-     PORT port;
-#endif
-{
-  PORT cur;
-
-  if( port == NULL )
-    return(-1);
-
-  /* remove from list of port's */
-  if( porthead ){
-    if( porthead == port ){
-      porthead = porthead->next;
-    }
-    else{
-      for(cur=porthead; cur!=NULL; cur=cur->next){
-	if( cur->next == port ){
-	  cur->next = (cur->next)->next;
-	  break;
-	}
-      }
-    }
-  }
-
-  /* free up string space */
-  if( port->xclass ) xfree(port->xclass);
-  if( port->name )   xfree(port->name);
-
-  /* free up record struct */
-  xfree((char *)port);
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAPortFree
- *
- * Purpose:	
- *
- * Results:	1 on success, 0 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void 
-XPAPortFree (void)
-#else
-void XPAPortFree()
-#endif
-{
-  PORT cur;
-  PORT saveport;
-
-  for(cur=porthead; cur!=NULL; ){
-    saveport = cur->next;
-    XPAPortDel(cur);
-    cur = saveport;
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAPortNew
- *
- * Purpose:	read or re-read the port list
- *
- * Results:	number of lines in list (including default)
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAPortNew (char *aname, int flag)
-#else
-int XPAPortNew(aname, flag)
-     char *aname;
-     int flag;
-#endif
-{
-  int got=0;
-  char lbuf[SZ_LINE];
-  char *s;
-  char *portname=NULL;
-  char *portpath=NULL;
-  char *portstr=NULL;
-  char *portcopy=NULL;
-  FILE *fp;
-
-  /* if there is an old list, free it */
-  if( flag == 0 )
-    XPAPortFree();
-
-  /* get port file name */
-  if( aname && *aname )
-    portname = aname;
-  else if( (portname=(char *)getenv("XPA_PORTFILE")) == NULL )
-    portname = XPA_PORTFILE;
-
-  /* get the default port */
-  portstr=(char *)getenv("XPA_PORT");
-
-  /* add the port assignments from environment first */
-  if( portstr && *portstr ){
-    portcopy=(char *)xstrdup(portstr);
-    for(s=(char *)strtok(portcopy,";"); s!=NULL; s=(char *)strtok(NULL,";")){
-      if( XPAPortAdd(s) == 0 )
-	got++;
-    }
-    if( portcopy) xfree(portcopy);
-  }
-
-  /* add the port assignments from file next */
-  if( (portpath=(char *)Access(portname, "r")) != NULL ){
-    if( (fp=fopen(portpath, "r")) != NULL ){
-      while( fgets(lbuf, SZ_LINE, fp) ){
-	if( *lbuf == '#' ){
-	  continue;
-	}
-	if( XPAPortAdd(lbuf) == 0 )
-	  got++;
-      }
-      fclose(fp);
-    }
-    xfree(portpath);
-  }
-
-  /* return the news */
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAPort
- *
- * Purpose:	check for pre-defined port for a given class, name and
- *		1 for com port, 2 for data port
- *
- * Results:	assigned port or 0
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAPort (XPA xpa)
-#else
-int XPAPort(xpa)
-     XPA xpa;
-#endif
-{
-  int p=0;
-  PORT cur;
-  
-  if( xpa == NULL )
-    return 0;
-  if( (cur = XPAPortLookup(xpa->xclass, xpa->name)) ){
-    p = cur->port;
-  }
-  return p;
-}
diff --git a/xpa/prsetup.h b/xpa/prsetup.h
deleted file mode 100644
index e629156..0000000
--- a/xpa/prsetup.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-/* prsetup.h -- define variables for ANSI prototyping */
-
-#ifndef _prsetup
-#define _prsetup
-
-#ifdef NO_ANSI_FUNC
-#define _PRbeg
-#define _PRend
-#define _PRx(s) ()
-#ifdef ANSI_FUNC
-#undef ANSI_FUNC
-#endif
-#else
-#if defined(__cplusplus) || defined(c_plusplus)
-#define _PRbeg extern "C" {   /* do not leave open across includes */
-#define _PRend }
-#define _PRx(s) s
-#define ANSI_FUNC 1
-#else
-#if defined(__STDC__)
-#define _PRbeg
-#define _PRend
-#define _PRx(s) s
-#define ANSI_FUNC 1
-#else
-#define _PRbeg
-#define _PRend
-#define _PRx(s) ()
-#ifdef ANSI_FUNC
-#undef ANSI_FUNC
-#endif
-#endif
-#endif
-#endif
-
-/* the ever-present */
-#ifndef SZ_LINE
-#define SZ_LINE 4096
-#endif
-
-#ifndef MIN
-#define MIN(a,b) (((a)<(b))?(a):(b))
-#endif
-
-#ifndef MAX
-#define MAX(a,b) (((a)>(b))?(a):(b))
-#endif
-
-#ifndef ABS
-#define ABS(x)		((x)<0?(-(x)):(x))
-#endif
-
-#endif
-
diff --git a/xpa/python/PythonXPA/README b/xpa/python/PythonXPA/README
deleted file mode 100644
index 9c803db..0000000
--- a/xpa/python/PythonXPA/README
+++ /dev/null
@@ -1,25 +0,0 @@
-Hi Eric,
-
-it's me again. Hope everything is ok with you.
-
-I started working with python and because python 2.5 comes with ctypes
-included I started to wrap some XPA functionality. In the web I only
-found PyXPA 0.2 which is very alpha. And with ctypes, we don't need any
-c-code linked in, python package is enough.
-
-Although I have wrapped only the functionality I need for now, I think
-it is already usable. And, of course, when you or anyone is interested
-in it, I can easily add more functionality.
-
-There is no installation needed. Just adjust the path to your libxpa.so
-in XPAClient.py and XPAServer.py and optionally adjust NXPA in
-XCPAClient.py.
-
-Then you can start stest and run test_XPAC.py or run test_XPAS.py and
-issue some xpainfo/get/set commands.
-
-
-
-Regards,
-Bernhard
-
diff --git a/xpa/python/PythonXPA/client/XPAClient.py b/xpa/python/PythonXPA/client/XPAClient.py
deleted file mode 100644
index 29e39eb..0000000
--- a/xpa/python/PythonXPA/client/XPAClient.py
+++ /dev/null
@@ -1,98 +0,0 @@
-
-import sys
-from ctypes import *
-
-libxpa=cdll.LoadLibrary("../../libxpa.so.1.0")
-libc=cdll.LoadLibrary(None);
-
-
-#xpa_t = c_void_p 
-#xpa = xpa_t(None)
-
-c_byte_p = POINTER(c_byte)
-
-
-
-##############
-
-NXPA = 10
-
-##############
-
-
-def free_bufs(p_arr, len):
-    for i in range(len):
-        if p_arr[i]:
-            print "freeing [", i, "] ", p_arr[i][0], p_arr[i][1]
-            libc.free(p_arr[i])
-
-
-
-
-
-## XPA XPAOpen(char *mode);
-
-XPAOpen = libxpa.XPAOpen
-libxpa.XPAOpen.restype = c_void_p
-libxpa.XPAOpen.argtypes = [c_char_p]
-
-## void XPAClose(XPA xpa);
-XPAClose = libxpa.XPAClose
-libxpa.XPAClose.argtypes = [c_void_p]
-
-
-## int XPAGet(XPA xpa, char *template, char *paramlist, char *mode,
-##         char **bufs, int *lens, char **names, char **messages, int n);
-
-XPAGet = libxpa.XPAGet
-libxpa.XPAGet.restype = c_int
-libxpa.XPAGet.argtypes = [c_void_p, c_char_p, c_char_p, c_char_p, \
-                     c_byte_p*NXPA, c_int*NXPA, c_byte_p*NXPA, c_byte_p*NXPA, \
-                     c_int]
-
-
-## when you want to send something like "hello\0x00 you" use this
-
-## int XPASet(XPA xpa,
-##             char *template, char *paramlist, char *mode,
-##             char *buf, int len, char **names, char **messages,
-##             int n);
-
-#libxpa.XPASet.restype = c_int
-#libxpa.XPASet.argtypes = [c_void_p, c_char_p, c_char_p, c_char_p, \
-#                     c_byte_p, c_int, c_char_p*NXPA, c_char_p*NXPA, \
-#                     c_int]
-
-## when you know, you will send strings only, use this one to avoid conversions
-
-XPASet = libxpa.XPASet
-libxpa.XPASet.restype = c_int
-libxpa.XPASet.argtypes = [c_void_p, c_char_p, c_char_p, c_char_p, \
-                     c_char_p, c_int, c_byte_p*NXPA, c_byte_p*NXPA, \
-                     c_int]
-
-## int XPAInfo(XPA xpa,
-##              char *template, char *paramlist, char *mode,
-##              char **names, char **messages, int n);
-
-XPAInfo = libxpa.XPAInfo
-libxpa.XPAInfo.restype = c_int
-libxpa.XPAInfo.argtypes = [c_void_p, c_char_p, c_char_p, c_char_p, \
-                     c_byte_p*NXPA, c_byte_p*NXPA, \
-                     c_int]
-
-## int XPAAccess(XPA xpa,
-##              char *template, char *paramlist, char *mode,
-##              char **names, char **messages, int n);
-
-XPAAccess = libxpa.XPAAccess
-libxpa.XPAAccess.restype = c_int
-libxpa.XPAAccess.argtypes = [c_void_p, c_char_p, c_char_p, c_char_p, \
-                     c_byte_p*NXPA, c_byte_p*NXPA, \
-                     c_int]
-
-#del libxpa
-
-
-
-
diff --git a/xpa/python/PythonXPA/client/test_XPAC.py b/xpa/python/PythonXPA/client/test_XPAC.py
deleted file mode 100755
index 7111a98..0000000
--- a/xpa/python/PythonXPA/client/test_XPAC.py
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/usr/bin/python
-
-################################
-####### testing:               #
-####### please start "stest"   #
-################################
-
-from XPAClient import *
-
-import time
-
-xpa = None
-print xpa
-xpa = XPAOpen("ack=false")
-############################
-print xpa
-
-buff_t = c_byte_p*NXPA
-
-buffs = buff_t()
-names = buff_t()
-messages = buff_t()
-
-
-
-int_t = c_int*NXPA
-lens = int_t()
-
-ok = True
-while ok:
-   #ok = False
-   print "--- XPAGet Test 1"
-   n = XPAGet(xpa, "XPA:xpa*", "help", "ack=false", buffs, lens, names, \
-                   messages, NXPA)
-   #########################################################################
-   print n
-   print buffs[0][0:lens[0]], "\n", buffs[1][0:lens[1]]
-   print string_at(names[0]), string_at(names[1])
-
-   for j in range(n):
-      ascii_text = string_at(buffs[j], lens[j])
-      #ascii_text = ''.join(chr(buffs[j][i]) for i in range(0, lens[j]))
-      print "---", j, "---\n>>>\n" + ascii_text + "\n<<<"
-
-   free_bufs(buffs, NXPA)
-   free_bufs(names, NXPA)
-   free_bufs(messages, NXPA)
-
-
-   print "--- XPASet Test 1"
-   txt = "Hey, you!"
-   n = XPASet(xpa, "XPA:xpa", "", "", txt, len(txt), names, messages, NXPA)
-   #########################################################################
-   print string_at(names[0])
-   free_bufs(names, NXPA)
-   free_bufs(messages, NXPA)
-   
-   #sys.exit(0)
-   
-   print "--- XPAGet Test 2"
-   n = XPAGet(xpa, "XPA:xpa[12]", "error", "", buffs, lens, names, \
-                   messages, NXPA)
-   #########################################################################
-   print n
-   print ":::: "
-   if names[0]:
-      print "\t names[0]: ", string_at(names[0])
-   if names[1]:
-      print "\t names[1]: ", string_at(names[1])
-
-   free_bufs(buffs, NXPA)
-   free_bufs(names, NXPA)
-   free_bufs(messages, NXPA)
-
-   print "--- XPAInfo Test 1"
-   n = XPAInfo(xpa, "XPA:i_xpa", "hey there", "", names, messages, NXPA)
-   #########################################################################
-   print n
-   if names:
-      free_bufs(names, NXPA)
-   if messages:
-      free_bufs(messages, NXPA)
-
-   n = XPAAccess(xpa, "XPA:*", "", "", names, messages, NXPA)
-   #########################################################################
-   print n
-   for j in range(n):
-      print "access ---", j, "---  >>>" + string_at(names[j]) + "<<<"
-   
-   if names:
-      free_bufs(names, NXPA)
-   if messages:
-      free_bufs(messages, NXPA)
-
-
-
-   #time.sleep(0.010)
-
-
-
-XPAClose(xpa)
-###############
-xpa = None
-
diff --git a/xpa/python/PythonXPA/server/XPAServer.py b/xpa/python/PythonXPA/server/XPAServer.py
deleted file mode 100644
index 4c46ed3..0000000
--- a/xpa/python/PythonXPA/server/XPAServer.py
+++ /dev/null
@@ -1,125 +0,0 @@
-
-from ctypes import *
-
-x=cdll.LoadLibrary("../libxpa.so.1.0")
-
-
-c_byte_p = POINTER(c_byte)
-
-
-## int XPAPoll(int msec, int maxreq);
-
-XPAPoll = x.XPAPoll
-x.XPAPoll.restype = c_int
-x.XPAPoll.argtypes = [c_int, c_int]
-
-
-
-
-## typedef struct xparec{
-##  /* xpa version */
-##  char *version;
-##  /* status of this xpa */
-##  int status;
-##  /* "g", "s", "i" are server types; "c" for client */
-##  char *type;
-##  /*
-##   * THE SERVER SIDE
-##   */
-##  struct xparec *next;
-##  char *xclass;
-##  char *name;
-##  char *help;
-
-##
-##   /* and so on */
-##
-## } *XPA;
-
-# ctypes wrapper
-class xparec(Structure):
-   _fields_ = [ ("version", c_char_p), \
-              ("status", c_int), \
-              ("type", c_char_p), \
-              ("next", c_void_p), \
-              ("xclass", c_char_p), \
-              ("name", c_char_p), \
-              ("help", c_char_p) \
-              ]
-
-XPA = POINTER(xparec)
-
-
-
-
-
-## int XPAFree(XPA xpa);
-
-XPAFree = x.XPAFree
-x.XPAFree.restype = c_void_p
-x.XPAFree.argtypes = [XPA]
-
-
-
-## info callback:
-## int info_cb(void *info_data, void *call_data, char *paramlist)
-
-
-
-INFOCBFUNC = CFUNCTYPE(c_int, c_char_p, XPA,  c_char_p)
-
-### implement like this:
-#def py_infocb_func(a, b, c):
-#    print "py_cmp_func", a, b
-#    return 0
-#
-#infocb_func = INFOCBFUNC(py_infocb_func)
-
-
-
-## XPA XPAInfoNew(char *class, char *name,
-##                 int (*info_callback)(),
-##                 void *info_data, char *info_mode);
-
-XPAInfoNew = x.XPAInfoNew
-x.XPAInfoNew.restype = XPA
-x.XPAInfoNew.argtypes = [c_char_p, c_char_p, INFOCBFUNC, c_char_p, c_char_p]
-
-
-
-
-
-## int send_callback(void *send_data, void *call_data,
-##     char *paramlist, char **buf, int *len)
-
-SENDCBFUNC = CFUNCTYPE(c_int, c_char_p, XPA,  c_char_p, POINTER(c_byte_p), POINTER(c_int))
-
-### implement like this:
-#def py_sendcb_func(a, data, call_data, param, buf, len):
-#   print "inside send_callback"
-#   return 0
-#
-#sendcb_func = SENDCBFUNC(py_sendcb_func)
-
-
-##  int receive_callback(void *receive_data, void *call_data,
-##    char *paramlist, char *buf, int len)
-
-RCVCBFUNC = CFUNCTYPE(c_int, c_char_p, XPA,  c_char_p, c_byte_p, c_int)
-
-
-
-##  XPA XPANew(char *class, char *name, char *help,
-##             int (*send_callback)(),
-##             void *send_data, char *send_mode,
-##             int (*rec_callback)(),
-##             void *rec_data,  char *rec_mode);
-
-XPANew = x.XPANew
-x.XPANew.restype = XPA
-x.XPANew.argtypes = [c_char_p, c_char_p, c_char_p, \
-                     SENDCBFUNC, \
-                     c_char_p, c_char_p, \
-                     RCVCBFUNC, \
-                     c_char_p, c_char_p \
-                     ]
diff --git a/xpa/python/PythonXPA/server/test_XPAS.py b/xpa/python/PythonXPA/server/test_XPAS.py
deleted file mode 100755
index fe4f1a2..0000000
--- a/xpa/python/PythonXPA/server/test_XPAS.py
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/usr/bin/python
-
-################################
-####### testing:               #
-################################
-
-from XPAServer import *
-
-import time
-
-print "Poll"
-n = x.XPAPoll(10000, 0)
-print "got %d" % n
-
-EXIT_FLAG = False
-
-
-##############################
-#    setting up Info Point   #
-##############################
-
-def py_infocb_func(a, b, c):
-    global EXIT_FLAG
-    print ">>> INFO:"
-    print "params:", c
-    print "info:", a
-    print "XPA.name", b[0].name
-    print "<<<" 
-    if (c[0:4] == "exit"):
-        print "setting EXIT_FLAG" 
-        EXIT_FLAG = True
-    return 0
-
-infocb_func = INFOCBFUNC(py_infocb_func)
-
-xpa = XPAInfoNew("XPA", "i_test", infocb_func, "my info", "")
-
-##############################
-
-
-
-
-#######################################
-#    setting up  AccessPoint Get/Set  #
-#######################################
-
-def py_sendcb_func(data, call_data, param, buf, len):
-   print "inside send_callback"
-   print "param:", param
-   print "buf:", string_at(buf)
-   buf[0] = cast("this is test only\n", c_byte_p)
-   len[0] = 19
-   return 0
-
-sendcb_func = SENDCBFUNC(py_sendcb_func)
-
-
-def py_rcvcb_func(data, call_data, param, buf, len):
-   print "inside rcv_callback"
-   print "param:", param
-   print "got %d bytes" % len
-   print "buf:", string_at(buf)
-   return 0
-
-rcvcb_func = RCVCBFUNC(py_rcvcb_func)
-
-
-xpa2 = XPANew("XPA", "myxpa", "this is great help", 
-              sendcb_func,
-              "SEND_DATA", "freebuf=false",
-              rcvcb_func,
-              "", "")
-
-
-
-
-
-##############################
-print "Entering loop"
-
-while EXIT_FLAG == False:
-    n = XPAPoll(1000, 1)
-    print "got:", n
-
-print "loop finished"
-##############################
-
-
-print "calling XPAFree"
-XPAFree(xpa)
-XPAFree(xpa2)
diff --git a/xpa/remote.c b/xpa/remote.c
deleted file mode 100644
index 1b1689c..0000000
--- a/xpa/remote.c
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * remote.c -- xpa access control list management
- *
- */
-
-#include <xpap.h>
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- *			Private Routines
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- *		Semi-Public Routines (used by command.c)
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAReceiveRemote
- *
- * Purpose:	establish remote connection with specified acls
- *
- * Returns:	xpa callback error codes
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAReceiveRemote (void *client_data, void *call_data, char *paramlist,
-	       char *buf, size_t len)
-#else
-int XPAReceiveRemote(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     size_t len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  XPA cxpa;
-  char *mode=NULL;
-  char host[SZ_LINE];
-  char acl[SZ_LINE];
-  char which[SZ_LINE];
-  char tbuf[SZ_LINE];
-  int lp=0;
-
-  /* make sure we are using inet sockets */
-  if( XPAMtype() != XPA_INET ){
-    snprintf(tbuf, SZ_LINE, "remote requires that XPA_METHOD be 'inet'\n");
-    XPAError(xpa, tbuf);
-    return(-1);
-  }
-
-  /* see if we are connecting to a particular host */
-  if( paramlist && *paramlist ){
-    cxpa = xpa;
-    /* arg1: host */
-    if( !word(paramlist, host, &lp) ){
-      goto error;
-    }
-    /* arg2: acl (optional) or -proxy */
-    if( !word(paramlist, acl, &lp) ){
-      strcpy(acl, "+");
-    }
-    /* arg3: -proxy to set up proxy processing
-       or    acl (if other word was -proxy) */
-    else{
-      if( !strcmp(acl, "-proxy") ){
-	mode="proxy=true";
-	if( !word(paramlist, acl, &lp) ){
-	  strcpy(acl, "+");
-	}
-      }
-      else if( word(paramlist, which, &lp) ){
-	if( !strcmp(which, "-proxy") ){
-	  mode="proxy=true";
-	}
-	else{
-	  goto error;
-	}
-      }
-    }
-    /* make the call */
-    if( XPARemote(cxpa, host, acl, mode) >= 0 ){
-      return(0);
-    }
-    else{
-      snprintf(tbuf, SZ_LINE, "remote xpans %s failed to process %s\n",
-	       host, xpa->name);
-      XPAError(xpa, tbuf);
-      return(-1);
-    }
-  }
-  else{
-    goto error;
-  }
-
-error:
-  XPAError(xpa, "syntax error: -remote hostname:port [acl] [-proxy]\n");
-  return(-1);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASendRemote
- *
- * Purpose:	return the list of remotes for this access point
- *
- * Returns:	0 for success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPASendRemote (void *client_data, void *call_data, char *paramlist,
-	    char **buf, size_t *len)
-#else
-int XPASendRemote(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char **buf;
-     size_t *len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  NS ns;
-  int got = 0;
-  char tbuf[SZ_LINE];
-
-  /* list out the remotes */
-  for(ns=xpa->nshead; ns!=NULL; ns=ns->next){
-    /* skip default ns */
-    if( ns->host == NULL ) continue;
-    snprintf(tbuf, SZ_LINE, "%s %x:%d\n", ns->host, ns->ip, ns->port);
-    send(xpa_datafd(xpa), tbuf, strlen(tbuf), 0);
-    got++;
-  }
-  if( got == 0 ){
-    send(xpa_datafd(xpa), "\n", 1, 0);
-  }
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPARemote
- *
- * Purpose:	register the specified XPA (or all XPAs) with the named remote
- *		name server using the specified acl
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int
-XPARemote (XPA xpa, char *host, char *acl, char *mode)
-#else
-int XPARemote(xpa, host, acl, mode)
-     XPA xpa;
-     char *host;
-     char *acl;
-     char *mode;
-#endif
-{
-  int got=0;
-  char remote[SZ_LINE];
-  char mach[SZ_LINE];
-  char lbuf[SZ_LINE];
-  char *ind;
-  XPA cur;
-
-  /* might have to add the "port" to the host to get remote */
-  strncpy(remote, host, SZ_LINE-1);
-  remote[SZ_LINE-1] = '\0';
-  if( (ind=strchr(remote, ':')) == NULL ){
-    strcat(remote, ":$port");
-  }
-
-  /* if no acl is specified, make it '+' */
-  if( (acl == NULL) || (*acl == '\0') ){
-    acl = "+";
-  }
-
-  /* get machine name by removing port suffix */
-  strcpy(mach, remote);
-  if( (ind=strchr(mach, ':')) != NULL ){
-    *ind = '\0';
-  }
-  else{
-    return(-1);
-  }
-
-  /* either process the specified xpa, or do all of them */
-  if( xpa ){
-    cur = xpa;
-    /* acl="-" => delete, else add */
-    if( strcmp(acl, "-") ){
-      got=XPANSAdd(cur, remote, mode);
-    }
-    else{
-      got=XPANSDel(cur, remote, mode);
-    }
-    switch(got){
-    /* error condition */
-    case -1:
-      return(-1);
-    /* OK */
-    case 0:
-      snprintf(lbuf, SZ_LINE, "%s:%s %s %s",
-	       cur->xclass, cur->name, mach, acl);
-      XPAAclEdit(lbuf);
-      break;
-    /* entry already exists (OK) */
-    case 1:
-      break;
-    }
-  }
-  else{
-    for(cur=XPAListHead(); cur!=NULL; cur=cur->next){
-      /* acl="-" => delete, else add */
-      if( strcmp(acl, "-") ){
-	got=XPANSAdd(cur, remote, mode);
-      }
-      else{
-	got=XPANSDel(cur, remote, mode);
-      }
-      switch(got){
-      /* error condition */
-      case -1:
-	return(-1);
-      /* OK */
-      case 0:
-	snprintf(lbuf, SZ_LINE, "%s:%s %s %s",
-		 cur->xclass, cur->name, mach, acl);
-	XPAAclEdit(lbuf);
-	break;
-      /* entry already exists (OK) */
-      case 1:
-	break;
-      }
-    }
-  }
-
-  /* return OK  */
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- *			Public Routines
- *
- *
- *----------------------------------------------------------------------------
- */
-
diff --git a/xpa/rtest.c b/xpa/rtest.c
deleted file mode 100644
index 94387a7..0000000
--- a/xpa/rtest.c
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- *	Copyright (c) 2004 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * rtest -- server test for xpa
- *
- */
-#include <xpap.h>
-
-#define MAX_XPAS 10
-
-extern char *optarg;
-extern int optind;
-
-#define BUFSIZE 1000000
-
-char xbuf[BUFSIZE+1];
-size_t xlen;
-int quiet=0;
-
-#ifdef ANSI_FUNC
-int send_cb (void *client_data, void *call_data, char *paramlist, 
-	     char **buf, size_t *len)
-#else
-int send_cb(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char **buf;
-     size_t *len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-
-  if( !xpa ) return(-1);
-  *len = xlen;
-  *buf = (char *)xmalloc(*len);
-  memcpy(*buf, xbuf, *len);
-  if( !quiet ) fprintf(stderr, "sent (%s): %lu\n", 
-		       paramlist, (unsigned long)xlen);
-  return(0);
-}
-
-#ifdef ANSI_FUNC
-int receive_cb (void *client_data, void *call_data, char *paramlist,
-		char *buf, size_t len)
-#else
-int receive_cb(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     size_t len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-
-  if( !xpa ) return(-1);
-  if( !quiet ) fprintf(stderr, "recd (%s): %s\n", paramlist, buf);
-  return(0);
-}
-
-#ifdef ANSI_FUNC
-int 
-main (int argc, char **argv)
-#else
-main(argc, argv)
-     int argc;
-     char **argv;
-#endif
-{
-  int c;
-  int i, j;
-  int got;
-  int delay=-1;
-  int total=0;
-  int dobig=0;
-  int dofd=0;
-  int doexit=0;
-  int poll=1;
-  int msec=100;
-  size_t lens[MAX_XPAS];
-  char *bufs[MAX_XPAS];
-  char *names[MAX_XPAS];
-  char *errs[MAX_XPAS];
-  char *xmode="";
-  char xname[SZ_LINE];
-  char xclass[SZ_LINE];
-  char paramlist[SZ_LINE];
-  
-  int xfds[1];
-  XPA xpa;
-
-  /* we use the xpa timestamp routine */
-  putenv("XPA_TIMESTAMP_ERRORS=true");
-
-  /* process switch arguments */
-  while ((c = getopt(argc, argv, "bd:fm:pqv")) != -1){
-    switch(c){
-    case 'b':
-      dobig = 1;
-      break;
-    case 'd':
-      delay = atoi(optarg);
-      break;
-    case 'f':
-      dofd = 1;
-      break;
-    case 'm':
-      msec = atoi(optarg);
-      break;
-    case 'p':
-      poll = 0;
-      break;
-    case 'q':
-      quiet = 1;
-      break;
-    case 'v':
-      break;
-    default:
-      break;
-    }
-  }
-  /* make sure we have the xpa argument */
-  if( optind >= argc ){
-    fprintf(stderr, "usage: %s [xpa] [target1 target2 ...]\n", argv[0]);
-    exit(1);
-  }
-  strcpy(xname, argv[optind++]);
-  strcpy(xclass, xname);
-  cluc(xclass);
-
-  if( (xpa = XPANew(xclass, xname, "help is on the way", 
-		    send_cb, (void *)xname, xmode, 
-		    receive_cb, (void *)xname, xmode)) ){
-    fprintf(stdout, "%s using method: %s\n", xpa_name(xpa), xpa_method(xpa));
-  }
-  else{
-    fprintf(stderr, "ERROR: could not init xpa\n");
-    exit(1);
-  }
-
-  if( dobig ){
-    for(i=0; i<BUFSIZE; i++){
-      xbuf[i] = 'a' + (i%26);
-    }
-  }
-  else{
-    snprintf(xbuf, SZ_LINE,
-	     "%s:%s %s (%s);",
-	     xpa_class(xpa), xpa_name(xpa), xpa_method(xpa), xpa_sendian(xpa));
-  }
-  xlen = strlen(xbuf);
-  xfds[0] = fileno(stderr);
-
-  fprintf(stdout, "\nEntering select loop ...\n");
-  while( 1 ){
-    if( poll ){
-      fprintf(stderr, "*");
-      XPAPoll(msec, 1);
-    }
-    else{
-      fprintf(stderr, ".");
-    }
-    for(doexit=0, j=optind; j<argc; j++){
-      snprintf(paramlist, SZ_LINE, "#%d", total++);
-      if( total && ((total % 1000) == 0) ) fprintf(stderr, "%d", total);
-      if( dofd ){
-	got = XPAGetFd(NULL, argv[j], paramlist, NULL, xfds, names, errs,
-		       -MAX_XPAS);
-	for(i=0; i<got; i++){
-	  if( errs[i] ){
-	    fprintf(stderr, "ERROR in %s:\n%s", names[i], errs[i]);
-	    fprintf(stderr, "Exiting after error\n");
-	    doexit = 1;
-	  }
-	}
-      }
-      else{
-	got = XPAGet(NULL, argv[j], paramlist, NULL, bufs, lens, names, errs,
-		     MAX_XPAS);
-	for(i=0; i<got; i++){
-	  if( errs[i] ){
-	    fprintf(stderr, "ERROR in %s:\n%s", names[i], errs[i]);
-	    fprintf(stderr, "Exiting after error\n");
-	    doexit = 1;
-	  }
-	  else{
-	    if( !quiet ) fprintf(stderr, "%s", bufs[i]);
-	    if( bufs[i] ) xfree(bufs[i]);
-	  }
-	}
-      }
-      for(i=0; i<got; i++){
-	if( names[i] ) xfree(names[i]);
-	if( errs[i] ) xfree(errs[i]);
-      }
-      if( doexit ) exit(1);
-      XPASet(NULL, argv[j], paramlist, NULL, xbuf, xlen, names, errs,
-	     MAX_XPAS);
-      for(i=0; i<got; i++){
-	if( errs[i] ){
-	  fprintf(stderr, "ERROR in %s:\n%s", names[i], errs[i]);
-	  fprintf(stderr, "Exiting after error\n");
-	  doexit = 1;
-	}
-      }
-      for(i=0; i<got; i++){
-	if( names[i] ) xfree(names[i]);
-	if( errs[i] ) xfree(errs[i]);
-      }
-      if( doexit ) goto done;
-      if( delay > 0 ) XPASleep(delay);
-    }
-  }
-
-done:
-  XPAFree(xpa);
-  exit(0);
-}
diff --git a/xpa/saoconfig b/xpa/saoconfig
deleted file mode 100755
index 4046822..0000000
--- a/xpa/saoconfig
+++ /dev/null
@@ -1,180 +0,0 @@
-#!/bin/sh
-set -x
-rm -rf ./config.cache
-
-if [ x"$1" = x ]; then
-  name=`uname -n`
-else
-  if [ x"$1" = x"--" ]; then
-    name=`uname -n`
-  else
-    name="$1"
-  fi
-  shift
-fi
-
-if [ x"$CFLAGS" = x ]; then
-  CFLAGS="-g"
-  export CFLAGS
-fi
-if [ x"$LDFLAGS" = x ]; then
-  LDFLAGS="-g"
-  export LDFLAGS
-fi
-
-GCCFLAGS="-Wall -Wno-implicit-int"
-CF="--config-cache"
-BIT64="-m64 -mcpu=v9"
-LARGEFILE="-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64"
-
-# handle saord builds specially
-if [ x$name = xsaord ]; then
-  SAORDPREFIX=/soft/saord
-  platform=`uname`
-  case $platform in
-  SunOS)
-    SAORDPREFIX=/soft/saord
-  ;;
-  esac
-fi
-
-echo "configure for: " $name
-
-case $name in
-  cc)
-  ./configure	$CF					\
-		CC=cc CFLAGS="$CFLAGS" $*
-  ;;
-
-  gcc)
-  ./configure	$CF					\
-		CC=gcc CFLAGS="$CFLAGS $GCCFLAGS" $*
-  ;;
-
-# Solaris 64bit and largefile suport
-  large)
-  ./configure	$CF 						    \
-	 	--x-includes=/usr/openwin/include		    \
-		--x-libraries=/usr/openwin/lib/sparcv9 		    \
-		--without-tcl 					    \
-		CC=gcc CFLAGS="$CFLAGS $GCCFLAGS $BIT64 $LARGEFILE" \
-      		LDFLAGS="-g $BIT64 -L/usr/lib/sparcv9" $*
-  ;;
-
-  opt)
-  ./configure	$CF					\
-		CC=gcc CFLAGS="$CFLAGS $GCCFLAGS -O2" $*
-  ;;
-
-  g++)
-  ./configure	$CF					\
-		CC=g++ CFLAGS="$CFLAGS $GCCFLAGS" $*
-  ;;
-
-  noansi)
-  ./configure	$CF					\
-		CC=gcc CFLAGS="$CFLAGS $GCCFLAGS -DNO_ANSI_FUNC" $*
-  ;;
-
-  dl)
-  ./configure	$CF					\
-		--enable-dl=yes CC=gcc CFLAGS="$CFLAGS $GCCFLAGS" $*
-  ;;
-
-  shared)
-  ./configure 	$CF					\
-      		--enable-shared=yes			\
-  		CC=gcc CFLAGS="$CFLAGS $GCCFLAGS"	\
-		$*
-  ;;
-
-  threads)
-  ./configure 	$CF					\
-		--enable-threaded-xpans			\
-		 CC=cc CFLAGS="$CFLAGS" $*
-  ;;
-
-  saord*)
-  ./configure 	$CF					\
-		--prefix=$SAORDPREFIX			\
-      		CC=gcc CFLAGS="$CFLAGS -O2"		\
- 		$*
-  ;;
-
-  bokhara*)
-  ./configure 	$CF					\
-		--prefix=${HOME}			\
-		CC=gcc CFLAGS="$CFLAGS $GCCFLAGS"  $*
-  ;;
-
-  ds9*)
-  ./configure 	$CF					\
-		--prefix=${HOME}			\
-      		--enable-shared=yes			\
-		--with-tcl=/proj/rd/eric/saods9/lib	\
-      		CC=gcc CFLAGS="$CFLAGS $GCCFLAGS"  $*
-  ;;
-
-  cfa208*)
-  ./configure 	$CF					\
-		--prefix=${HOME}			\
-		CC=gcc CFLAGS="$CFLAGS"  $*
-  ;;
-
-  akela*|karapet*)
-  ./configure 	$CF					\
-		--prefix=${HOME}			\
-      		--enable-shared=yes			\
-		CC=gcc CFLAGS="$CFLAGS $GCCFLAGS" $*
-  ;;
-
-  ds9*)
-  ./configure 	$CF					\
-		--prefix=${HOME}/eric			\
-      		--enable-shared=yes			\
-		CC=gcc CFLAGS="$CFLAGS $GCCFLAGS" $*
-  ;;
-
-  baba*)
-  ./configure 	$CF					\
-		--prefix=${HOME}			\
-		CC=gcc CFLAGS="$CFLAGS"  $*
-  ;;
-
-  apple*|APPLE*)
-  ./configure 	$CF					\
-		--prefix=${HOME}			\
-		CC=icc CFLAGS="$CFLAGS"  $*
-  ;;
-
-  mred)
-  ./configure 	$CF					\
-		--prefix=${HOME}/pub/usr/local		\
-		--enable-threaded-xpans			\
-		--without-tcl				\
-		 CC=cc CFLAGS="$CFLAGS" $*
-  ;;
-
-  mocha*|Mocha*|luwak*|*Luwak*|decaf*|Decaf*|barista*|Barista*|knomad*|Knomad*)
-  ./configure	$CF 							\
-		--prefix=/usr/local					\
-		CC=gcc CFLAGS="$CFLAGS $GCCFLAGS $LARGEFILE -O2"	\
-      		$*
-  ;;
-
-  voyager*|VOYAGER*)
-  ./configure 	$CF					\
-  		--enable-posix_spawn --prefix=${HOME}   \
-		CC=gcc CFLAGS="$CFLAGS $GCCFLAGS" $*
-  ;;
-
-
-  kitchensink)
-  ./configure --enable-shared=link --enable-threaded-xpans --with-threads $*
-  ;;
-
-  *)
-  ./configure 	$CF $*
-  ;;
-
-esac
diff --git a/xpa/stest.c b/xpa/stest.c
deleted file mode 100644
index afceb89..0000000
--- a/xpa/stest.c
+++ /dev/null
@@ -1,729 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * stest -- server test for xpa
- *
- */
-#include <xpap.h>
-
-#ifndef BUILD_WITH_XT
-#if HAVE_XT
-#undef HAVE_XT
-#endif
-#endif
-
-#if HAVE_XT
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-#endif
-
-#define MAX_FPS 10
-
-extern char *optarg;
-extern int optind;
-
-XPA xpa1, xpa1a, xpa2, xpa3;
-int  quiet=0;
-int  dowait=0;
-int  dofill=0;
-int  dosave=1;
-int  doone=0;
-int  domyfree=0;
-int  doatexit=0;
-int n=0;
-int please_exit=0;
-size_t  save_bytes=-1;
-char *save_buf=NULL;
-
-char *mode="";
-char name[SZ_LINE];
-char xclass[SZ_LINE];
-
-#ifdef ANSI_FUNC
-void myfree(void *buf)
-#else
-void myfree(buf)
-     void *buf;
-#endif
-{
-  fprintf(stderr, "myfree calling xfree(%p)\n", buf);
-  xfree(buf);
-}
-
-#ifdef ANSI_FUNC
-int 
-send_cb (void *client_data, void *call_data, char *paramlist,
-	 char **buf, size_t *len)
-#else
-int send_cb(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char **buf;
-     size_t *len;
-#endif
-{
-  char *s = (char *)client_data;
-  XPA xpa = (XPA)call_data;
-  char tbuf[SZ_LINE];
-  char xtemplate[SZ_LINE];
-  char *names[MAX_FPS];
-  char *bufs[MAX_FPS];
-  char *errs[MAX_FPS];
-  size_t lens[MAX_FPS];
-  int sendbuf=0;
-  int got;
-  int i;
-  int ip;
-
-  /* set the free routine */
-  if( domyfree ) XPASetFree(xpa, myfree, NULL);
-
-  /* introduce ourselves */
-  if( !quiet ){
-    fprintf(stdout, "SEND_CB #%d: %s:%s %s (%s)\n",
-	    n++, xpa_class(xpa), xpa_name(xpa), xpa_method(xpa), s);
-  }
-
-  /* process special paramlist tokens */
-  if( paramlist && *paramlist ){
-    ip = 0;
-    word(paramlist, xtemplate, &ip);
-    if( !quiet )
-      fprintf(stdout, "\tparamlist: %s\n", paramlist);
-    if( !strncmp(paramlist, "buf", 3) ){
-      sendbuf=1;
-    }
-    else if( !strcmp(paramlist, "free") ){
-      if( !quiet )
-	fprintf(stdout, "Freeing xpa struct\n");
-      XPAFree(xpa);
-      return(0);
-    }
-    else if( !strcmp(paramlist, "exit") ){
-      if( !quiet )
-	fprintf(stdout, "Exiting\n");
-      if( doatexit){
-	please_exit = 1;
-      } else {
-	XPAFree(xpa1);
-	if( !doone ){
-	  XPAFree(xpa1a);
-	  XPAFree(xpa2);
-	  XPAFree(xpa3);
-	}
-      }
-    }
-    else if( !strcmp(paramlist, "Exit") ){
-      if( !quiet )
-	fprintf(stdout, "Exiting immediately\n");
-      exit(0);
-    }
-    else if( !strncmp(paramlist, "error", 5) ){
-      if( !quiet )
-	fprintf(stdout, "\treturning error: %s\n", &paramlist[6]);
-      *len = 0;
-      *buf = NULL;
-      if( strlen(paramlist) > 6 )
-	XPAError(xpa, &paramlist[6]);
-      else
-	XPAError(xpa, "intentional error from client");
-      return(-1);
-    }
-    else if( !strcmp(paramlist, "wait") || !strcmp(paramlist, "version") ){
-      fprintf(stdout, "Press <CR> to continue ...");
-      fgets(tbuf, SZ_LINE, stdin);
-    }
-    else if( !strcmp(paramlist, "poll") ){
-repoll:
-      fprintf(stdout, "Press 'q' to quit ...");
-      got = XPAPoll (10000, 1);
-      fprintf(stdout, " XPAPoll returns %d ...", got);
-      fgets(tbuf, SZ_LINE, stdin);
-      if( *tbuf != 'q' )
-	goto repoll;
-    }
-    else if( !strncmp(paramlist, "fork ", 5) ){
-#if HAVE_MINGW32==0
-      if( strlen(paramlist) > 5 ){
-	fprintf(stdout, "fork command: %s\n", &paramlist[5]);
-	/* child forks a command and exits */
-	if(!(fork())){
-	  system(&paramlist[5]);
-	  /* should call _exit but this tests avoidance of atexit routine */
-	  exit(0);
-	}
-      }
-#else
-      fprintf(stderr, "ERROR: fork() not available in mingw\n");
-      exit(1);
-#endif
-    }
-    else if( !strcmp(xtemplate, "xpaget") ){
-      word(paramlist, xtemplate, &ip);
-      got = XPAGet(xpa, xtemplate, &(paramlist[ip]), NULL,
-		   bufs, lens, names, errs, MAX_FPS);
-      if( !quiet )
-	fprintf(stdout, "XPAGet (%s) returned %d buffer(s)\n", xtemplate, got);
-      for(i=0; i<got; i++){
-	if( !quiet )
-	  fprintf(stdout, "\t%d: %s\n", i, names[i]);
-	if( errs[i] == NULL ){
-	  if( !quiet && (lens[i] > 0) ){
-	    fprintf(stdout, "contents (%lu bytes):\n", (unsigned long)lens[i]);
-	    fwrite(bufs[i], sizeof(char), lens[i], stdout);
-	  }
-	  if( !quiet )
-	    fprintf(stdout, "\n");
-	}
-	else{
-	  write(fileno(stdout), errs[i], strlen(errs[i]));
-	}
-	if( bufs[i] )
-	  xfree(bufs[i]);
-	if( names[i] )
-	  xfree(names[i]);
-	if( errs[i] )
-	  xfree(errs[i]);
-      }
-    }
-  }
-  else if( dowait ){
-    fprintf(stdout, "Press <CR> to continue ...");
-    fgets(tbuf, SZ_LINE, stdin);
-  }
-
-  /* return information about this xpa */
-  if( !sendbuf ){
-    snprintf(tbuf, SZ_LINE,
-	  "class: %s\nname: %s\nmethod: %s\nsendian: %s\ncendian: %s\n",
-	  xpa_class(xpa), xpa_name(xpa), xpa_method(xpa),
-	  xpa_sendian(xpa), xpa_cendian(xpa));
-  
-    if( (xpa->send_mode & XPA_MODE_FILLBUF) ){
-      send(xpa_datafd(xpa), tbuf, strlen(tbuf), 0);
-      *len = 0;
-      *buf = NULL;
-      if( !quiet)
-	fprintf(stdout, "\tcallback writes %d bytes to client\n",
-		(int)strlen(tbuf));
-    }
-    /* return the buffer and let xpa transmit it */
-    else{
-      *len = strlen(tbuf);
-      *buf = (char *)xmalloc(*len);
-      memcpy(*buf, tbuf, *len);
-      if( !quiet)
-	fprintf(stdout, "\tcallback returns %d bytes to xpa handler\n",
-		(int)strlen(tbuf));
-    }
-  }
-  /* return the last buffer we were sent */
-  else{
-    if( (xpa->send_mode & XPA_MODE_FILLBUF) ){
-      send(xpa_datafd(xpa), save_buf, save_bytes, 0);
-      *len = 0;
-      *buf = NULL;
-      if( !quiet)
-	fprintf(stdout, "\tcallback writes %lu bytes to client\n", 
-		(unsigned long)save_bytes);
-    }
-    /* return the buffer and let xpa transmit it */
-    else{
-      *len = save_bytes;
-      *buf = (char *)xmalloc(*len);
-      memcpy(*buf, save_buf, *len);
-      if( !quiet)
-	fprintf(stdout, "\tcallback returns %lu bytes to xpa handler\n",
-		(unsigned long)save_bytes);
-    }
-  }
-  if( !quiet ){
-    fprintf(stdout, "SEND_CB complete\n");
-  }
-  else{
-    fprintf(stdout, ".");
-  }
-  fflush(stdout);
-  fflush(stderr);
-  return(0);
-}
-
-#ifdef ANSI_FUNC
-int 
-receive_cb (void *client_data, void *call_data, char *paramlist,
-	    char *buf, size_t len)
-#else
-int receive_cb(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     size_t len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  char *s = (char *)client_data;
-  char tbuf[SZ_LINE];
-  char cbuf[SZ_LINE];
-  char *errs[1];
-  int i;
-  int ip;
-  int got;
-  int xwait;
-
-  /* set the free routine */
-  if( domyfree ) XPASetFree(xpa, myfree, NULL);
-
-  if( !quiet ){
-    fprintf(stdout, "RECEIVE_CB #%d: %s:%s %s (%s)\n",
-	    n++, xpa_class(xpa), xpa_name(xpa), xpa_method(xpa), s);
-  }
-  /* process param list */
-  if( paramlist && *paramlist ){
-    if( !quiet )
-      fprintf(stdout, "\tparamlist: %s\n", paramlist);
-    if( !strcmp(paramlist, "free") ){
-      if( !quiet )
-	fprintf(stdout, "Freeing xpa struct\n");
-      XPAFree(xpa);
-      return(0);
-    }
-    else if( !strcmp(paramlist, "exit") ){
-      if( !quiet )
-	fprintf(stdout, "Exiting\n");
-      if( doatexit){
-	please_exit = 1;
-      } else {
-	XPAFree(xpa1);
-	if( !doone ){
-	  XPAFree(xpa1a);
-	  XPAFree(xpa2);
-	  XPAFree(xpa3);
-	}
-      }
-    }
-    else if( !strcmp(paramlist, "Exit") ){
-      if( !quiet )
-	fprintf(stdout, "Exiting immediately\n");
-      exit(0);
-    }
-    else if( !strncmp(paramlist, "error", 5) ){
-      if( !quiet )
-	fprintf(stdout, "Processing error: %s\n", &paramlist[6]);
-      if( strlen(paramlist) > 6 )
-	XPAError(xpa, &paramlist[6]);
-      else
-	XPAError(xpa, "intentional error from client");
-      return(-1);
-    }
-    else if( !strcmp(paramlist, "wait") ){
-      fprintf(stdout, "Press <CR> to continue ...");
-      fgets(tbuf, SZ_LINE, stdin);
-    }
-    else if( !strcmp(paramlist, "poll") ){
-repoll:
-      fprintf(stdout, "Press 'q' to quit ...");
-      got = XPAPoll (10000, 1);
-      fprintf(stdout, " ... XPAPoll returns %d ...", got);
-      fgets(tbuf, SZ_LINE, stdin);
-      if( *tbuf != 'q' )
-	goto repoll;
-    }
-    else if( !strncmp(paramlist, "fork ", 5) ){
-#if HAVE_MINGW32==0
-      if( strlen(paramlist) > 5 ){
-	fprintf(stdout, "fork command: %s\n", &paramlist[5]);
-	/* child forks a command and exits */
-	if(!(fork())){
-	  system(&paramlist[5]);
-	  /* should call _exit but this tests avoidance of atexit routine */
-	  exit(0);
-	}
-      }
-#else
-      fprintf(stderr, "ERROR: fork() not available in mingw\n");
-      exit(1);
-#endif
-    }
-    else if( !strncmp(paramlist, "xpaset", 6) ){
-      ip = 0;
-      word(paramlist, tbuf, &ip);
-      if( word(paramlist, tbuf, &ip) ){
-	if( !quiet )
-	  fprintf(stdout, "calling XPASet(%s, \"%s\")\n",
-		  tbuf, &(paramlist[ip]));
-	got = XPASet(NULL, tbuf, &(paramlist[ip]), mode,
-		     paramlist, strlen(paramlist), NULL, errs, 1);
-	if( got == 0 ){
-	  if( !quiet )
-	    fprintf(stdout, "no XPA access points matched template %s\n",
-		    tbuf);
-	}
-	else if( errs[0] != NULL ){
-	  if( !quiet )
-	    fprintf(stdout, "Error on xpaset to %s: %s\n", tbuf, errs[0]);
-	  xfree(errs[0]);
-	}
-	else{
-	  if( !quiet )
-	    fprintf(stdout, "XPASet to %s successful\n", tbuf);
-	}
-      }
-      return(0);
-    }
-  }
-  else if( dowait ){
-    fprintf(stdout, "Press <CR> to continue ...");
-    fgets(tbuf, SZ_LINE, stdin);
-  }
-
-  /* reset save buffer */
-  if( save_buf != NULL ){
-    xfree(save_buf);
-    save_buf = NULL;
-  }
-  save_bytes = 0;
-  xwait = dowait;
-  if( !(xpa->receive_mode & XPA_MODE_FILLBUF) && dofill ){
-    while( (got=recv(xpa_datafd(xpa), tbuf, SZ_LINE, 0)) >0 ){
-      if( xwait >0 ){
-	fprintf(stdout, "got %d bytes ... press <CR> to continue ...", got);
-	fgets(cbuf, SZ_LINE, stdin);
-	xwait--;
-      }
-      i = save_bytes;
-      save_bytes += got;
-      if( dosave ){
-	if( save_buf == NULL )
-	  save_buf = (char *)xmalloc(save_bytes);
-	else
-	  save_buf = (char *)xrealloc(save_buf, save_bytes);
-	memcpy(&save_buf[i], tbuf, got);
-      }
-    }
-    if( !quiet )
-      fprintf(stdout, "\tcallback read %lu bytes\n", 
-	      (unsigned long)save_bytes);
-  }
-  else{
-    if( !quiet ){
-      fprintf(stdout, "\tenter callback with buf: %lu bytes\n", 
-	      (unsigned long)len);
-    }
-    save_bytes = len;
-    save_buf = (char *)xmalloc(len);
-    memcpy(save_buf, buf, len);
-  }
-  if( !quiet ){
-    fprintf(stdout, "RECEIVE_CB complete\n");
-  }
-  else{
-    fprintf(stdout, ".");
-  }
-  fflush(stdout);
-  fflush(stderr);
-  return(0);
-}
-
-#ifdef ANSI_FUNC
-int 
-info_cb (void *client_data, void *call_data, char *paramlist)
-#else
-int info_cb(client_data, call_data, paramlist)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  char *s = (char *)client_data;
-  char xtemplate[SZ_LINE];
-  char *names[MAX_FPS];
-  char *bufs[MAX_FPS];
-  char *errs[MAX_FPS];
-  size_t lens[MAX_FPS];
-  int i;
-  int ip;
-  int got;
-
-  if( !quiet ){
-    fprintf(stdout, "INFO_CB #%d: %s:%s (%s)\n",
-	    n++, xpa_class(xpa), xpa_name(xpa), s);
-  }
-
-  if( paramlist && *paramlist ){
-    if( !quiet )
-      fprintf(stdout, "\tparamlist: %s\n", paramlist);
-    ip = 0;
-    word(paramlist, xtemplate, &ip);
-    if( !strcmp(xtemplate, "xpaget") ){
-      word(paramlist, xtemplate, &ip);
-      got = XPAGet(xpa, xtemplate, &(paramlist[ip]), NULL,
-		   bufs, lens, names, errs, MAX_FPS);
-      if( !quiet )
-	fprintf(stdout, "XPAGet (%s) returned %d buffer(s)\n", xtemplate, got);
-      for(i=0; i<got; i++){
-	if( !quiet )
-	  fprintf(stdout, "\t%d: %s\n", i, names[i]);
-	if( errs[i] == NULL ){
-	  if( !quiet && (lens[i] > 0) ){
-	    fprintf(stdout, "contents (%lu bytes):\n", 
-		    (unsigned long)lens[i]);
-	    fwrite(bufs[i], sizeof(char), lens[i], stdout);
-	  }
-	  if( !quiet )
-	    fprintf(stdout, "\n");
-	}
-	else{
-	  write(fileno(stdout), errs[i], strlen(errs[i]));
-	}
-	if( bufs[i] )
-	  xfree(bufs[i]);
-	if( names[i] )
-	  xfree(names[i]);
-	if( errs[i] )
-	  xfree(errs[i]);
-      }
-    }
-  }
-  if( !quiet ){
-    fprintf(stdout, "INFO_CB complete\n");
-  }
-  else{
-    fprintf(stdout, ".");
-  }
-  fflush(stdout);
-  fflush(stderr);
-  return(0);
-}
-
-#ifdef ANSI_FUNC
-int 
-main (int argc, char **argv)
-#else
-main(argc, argv)
-     int argc;
-     char **argv;
-#endif
-{
-#if HAVE_XT
-  Widget top;
-  XtAppContext appcontext;
-#endif
-  char *proxy=NULL;
-  char tbuf[SZ_LINE];
-  char tbuf2[SZ_LINE];
-  char cmd[SZ_LINE];
-  int c;
-  int got=0;
-  int x=0;
-  int delay=0;
-
-#if HAVE_MINGW32==0
-  setvbuf(stdout, NULL, _IONBF, 0);
-  setvbuf(stderr, NULL, _IONBF, 0);
-#endif
-
-  *cmd = '\0';
-  /* process switch arguments */
-  while ((c = getopt(argc, argv, "1ad:f:mqrRp:suwxX")) != -1){
-    switch(c){
-    case '1':
-      doone = 1;
-      break;
-    case 'a':
-      mode = "ack=false";
-      break;
-    case 'd':
-      delay = atoi(optarg);
-      break;
-    case 'f':
-      snprintf(cmd, SZ_LINE, "%s %s &\n", argv[0], optarg);
-      break;
-    case 'm':
-      domyfree = 1;
-      break;
-    case 'q':
-      quiet = 1;
-      break;
-    case 'p':
-      proxy = optarg;
-      break;
-    case 'r':
-      mode = "fillbuf=false";
-      break;
-    case 'R':
-      mode = "fillbuf=false";
-      dofill = 1;
-      dosave = 0;
-      break;
-    case 's':
-      x = 0;
-      break;
-    case 'u':
-      mode = "buf=false";
-      break;
-    case 'w':
-      dowait++;
-      break;
-    case 'x':
-      doatexit=1;
-      break;
-    case 'X':
-      x = 1;
-      break;
-    }
-  }
-
-  if( optind >= argc ){
-    strcpy(name, "xpa");
-  }
-  else{
-    strcpy(name, argv[optind]);
-  }
-  strcpy(xclass, name);
-  cluc(xclass);
-
-  if( doatexit ){
-#if HAVE_ATEXIT
-    XPAAtExit();
-#else
-    fprintf(stderr, "ERROR: atexit not available\n");
-    exit(1);
-#endif
-  }
-
-  if( x ){
-#if HAVE_XT
-    top = XtAppInitialize(&appcontext, "Server", NULL, 0,
-			  &argc, argv, NULL, NULL, 0);
-    XtVaSetValues(top, XtNwidth, (XtArgVal)10, XtNheight, (XtArgVal)10,
-		  XtNmappedWhenManaged, (XtArgVal)False, NULL);
-#else
-    fprintf(stderr, "Xt is not available ...\n");
-    got = 1;
-    goto done;
-#endif
-  }
-
-  strcpy(tbuf, name);
-  snprintf(tbuf2, SZ_LINE, "help for %s", tbuf);
-  xpa1 = XPANew(xclass, tbuf, tbuf2,
-		send_cb, (void *)"send1", mode, 
-		receive_cb, (void *)"receive1", mode);
-  if( xpa1 == NULL ){
-    fprintf(stderr, "ERROR: could not init xpa1\n");
-  }
-  else{
-    fprintf(stdout, "%s using method: %s\n", xpa_name(xpa1), xpa_method(xpa1));
-  }
-
-  if( !doone ){
-    snprintf(tbuf, SZ_LINE, "%s1", name);
-    snprintf(tbuf2, SZ_LINE, "help for %s", tbuf);
-    xpa1a = XPANew(xclass, tbuf, tbuf2,
-		   send_cb, (void *)"send1a", mode, 
-		   receive_cb, (void *)"receive1a", mode);
-    if( xpa1a == NULL ){
-      fprintf(stderr, "ERROR: could not init xpa1a\n");
-    }
-    else{
-      fprintf(stdout, "%s using method: %s\n", 
-	      xpa_name(xpa1a), xpa_method(xpa1a));
-    }
-    
-    snprintf(tbuf, SZ_LINE, "c_%s", name);
-    xpa2 = XPACmdNew(xclass, tbuf);
-    if( xpa2 == NULL ){
-      fprintf(stderr, "ERROR: could not init xpa2\n");
-    }
-    else{
-      XPACmdAdd(xpa2, "cmd2", "and help for cmd2",
-		send_cb, (void *)"cmd2", mode, 
-		receive_cb, (void *)"cmd2", mode);
-      XPACmdAdd(xpa2, "cmd1 xx yy", "help for cmd1 xx yy",
-		send_cb, (void *)"cmd1 xx yy", mode, 
-		receive_cb, (void *)"cmd1 xx yy", mode);
-      XPACmdAdd(xpa2, "cmd1 xx", "help for cmd1 xx",
-		send_cb, (void *)"cmd1 xx", mode, 
-		receive_cb, (void *)"cmd1 xx", mode);
-      XPACmdAdd(xpa2, "cmd1", NULL,
-		send_cb, (void *)"cmd1", mode, 
-		receive_cb, (void *)"cmd1", mode);
-      fprintf(stdout, "%s using method: %s\n", 
-	      xpa_name(xpa2), xpa_method(xpa2));
-    }
-    
-    snprintf(tbuf, SZ_LINE, "i_%s", name);
-    xpa3 = XPAInfoNew(xclass, tbuf, info_cb, (void *)"info1", mode);
-    if( xpa3 == NULL ){
-      fprintf(stderr, "ERROR: could not init xpa3\n");
-    }
-    else{
-      fprintf(stdout, "%s using method: %s\n", xpa_name(xpa3), xpa_method(xpa3));
-    }
-  }
-    
-  if( *cmd != '\0' ){
-    fprintf(stdout, "starting bkgd process: %s", cmd);
-    system(cmd);
-  }
-
-  /* delay if necessary */
-  if( delay ){
-    fprintf(stdout, "starting delay of %d seconds ...", delay);
-    XPASleep(delay*1000);
-    fprintf(stdout, " done\n");
-  }
-  fflush(stdout);
-  fflush(stderr);
-
-  /* connect to proxy, if necessary */
-  if( proxy ){
-    if( XPARemote(xpa1, proxy, "+", "proxy=true") < 0 ){
-      fprintf(stderr, "ERROR: could not connect to proxy: %s\n", proxy);
-    }
-  }
-
-  if( x ){
-#if HAVE_XT
-    fprintf(stdout, "\nEntering Xt loop ...\n");
-    XPAXtAddInput(appcontext, NULL);
-    XtRealizeWidget(top);
-    XtAppMainLoop(appcontext);
-#else
-    fprintf(stderr, "Xt is not available ...\n");
-    got = 1;
-    goto done;
-#endif
-  }
-  else{
-    fprintf(stdout, "\nEntering select loop ...\n");
-    if( !doatexit ){
-      XPAMainLoop();
-    } else {
-      while( !please_exit )
-	if( !XPAPoll(-1, 100) ) please_exit=1;
-    }
-    goto done;
-  }
-
-done:
-  if( !doatexit ){
-    XPAFree(xpa1);
-    if( !doone ){
-      XPAFree(xpa1a);
-      XPAFree(xpa2);
-      XPAFree(xpa3);
-    }
-  }
-
-  /* make valgrind happy */
-  XPACleanup();
-  if( save_buf ) xfree(save_buf);
-  exit(got);
-}
diff --git a/xpa/tcl.c b/xpa/tcl.c
deleted file mode 100644
index 1dbdad4..0000000
--- a/xpa/tcl.c
+++ /dev/null
@@ -1,2773 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-#include <xpap.h>
-
-#if HAVE_TCL
-
-#include <tcl.h>
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- * 			Private Routines and Data
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/* with Tcl 8.4, some function prototypes have added CONST qualifiers,
-   which we try to deal with in a backward-compatible way */
-#define XCONST84
-#if TCL_MAJOR_VERSION >= 8
-#if TCL_MINOR_VERSION >= 4
-#undef XCONST84
-#define XCONST84 CONST
-#endif
-#endif
-
-#ifdef NULLSTRING
-#undef NULLSTRING
-#endif
-#define NULLSTRING ""
-
-#define TCL_NULLSTR(s) (!s || !*s || !strcmp(s, "{}"))
-
-#define TY_CLIENT 1
-#define TY_SERVER 2
-
-#ifndef MAX_XPAS
-#define MAX_XPAS 10000
-#endif
-
-/*
- *
- * record struct for client_data for XPATcl[Send,Receive,Info] routines
- *
- */
-typedef struct xpatclclientdatarec{
-  Tcl_Interp *interp;
-  char *callback;
-  char *client_data;
-} *XPATclClientData, XPATclClientDataRec;
-
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	Tcl_GetXPAFromObj
- *
- * Purpose:	convert string to XPA handle
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-Tcl_GetXPAFromObj(Tcl_Interp *interp, Tcl_Obj *obj, int flag, XPA *xpa)
-#else
-static int Tcl_GetXPAFromObj(interp, obj, flag, xpa)
-     Tcl_Interp *interp;
-     Tcl_Obj *obj;
-     int flag;
-     XPA *xpa;
-#endif
-{
-  char *s;
-  void *lval;
-  Tcl_Obj *resultPtr;
-
-  /* get result pointer */
-  resultPtr = Tcl_GetObjResult(interp);
-
-  if( (s = Tcl_GetStringFromObj(obj, NULL)) == NULL ){
-    return(TCL_ERROR);
-  }
-  if( strncmp(s, "xpa_", 4) || (sscanf(&(s[4]), "%p", &lval) != 1) ){
-    Tcl_SetStringObj(resultPtr, "XPA$ERROR: invalid xpa handle", -1);
-    return(TCL_ERROR);
-  }
-  *xpa = (XPA)lval;
-  /* make sure its a valid xpa */
-  switch(flag){
-  case TY_CLIENT:
-    if( !XPAClientValid(*xpa) ){
-      Tcl_SetStringObj(resultPtr, "XPA$ERROR: invalid xpa client handle", -1);
-      return(TCL_ERROR);
-    }
-    break;
-  case TY_SERVER:
-    if( !XPAValid(*xpa) ){
-      Tcl_SetStringObj(resultPtr, "XPA$ERROR: invalid xpa server handle", -1);
-      return(TCL_ERROR);
-    }
-    break;
-  }
-  return(TCL_OK);
-}
-
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPATclHandler
- *
- * Purpose:	common handler for access points written in tcl
- * 		execute the tcl receive command with xpa arguments
- *		used instead of Tcl_Eval so we can avoid interpreting either
- *		paramlist or buf
- *
- *
- * Returns:	0 on success, -1 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPATclHandler (void *client_data, void *call_data, char *paramlist,
-	       char *buf, int len, int nargs)
-#else
-static int XPATclHandler(client_data, call_data, paramlist, buf, len, nargs)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     int len;
-     int nargs;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  XPATclClientData xptr = (XPATclClientData)client_data;
-  Tcl_CmdInfo info;		/* Info about command procedures */
-  Tcl_Obj *objv[10];		/* Object vector for arguments */
-  Tcl_Obj *resultPtr;		/* The result object */
-  int result;			/* TCL_OK or TCL_ERROR */
-  int object;
-  char tbuf[SZ_LINE];
-  XCONST84 char *argv[10];
-  char *s=NULL;
-  char *t=NULL;
-  char *cmd;
-
-  /* make sure we have a callback */
-  if( !xptr || !xptr->callback ){
-    XPAError(xpa, "Invalid tcl command for xpa callback");
-    return(-1);
-  }
-  /* set command name */
-  cmd = xptr->callback;
-
-  /* Map from the command name to a C procedure */
-  if( !Tcl_GetCommandInfo(xptr->interp, cmd, &info) ){
-    XPAError(xpa, "Unknown tcl command for xpa callback");
-    return(-1);
-  }
-
-  /* string-ize some values */
-  snprintf(tbuf, SZ_LINE, "xpa_%p", xpa);
-  s = xstrdup(tbuf);
-  if( nargs > 4 ){
-    snprintf(tbuf, SZ_LINE, "%d", len);
-    t = xstrdup(tbuf);
-  }
-
-  /* package up argument values */
-  object = info.isNativeObjectProc;
-  if (object) {
-    /* The object interface is preferred for this command */
-    objv[0] = Tcl_NewStringObj(cmd, strlen(cmd));
-    objv[1] = Tcl_NewStringObj(s, strlen(s));
-    if( (xptr->client_data == NULL) || (*xptr->client_data == '\0') )
-      objv[2] = Tcl_NewStringObj(NULLSTRING, strlen(NULLSTRING));
-    else
-      objv[2] = Tcl_NewStringObj(xptr->client_data, strlen(xptr->client_data));
-    if( (paramlist == NULL) || (*paramlist == '\0') )
-      objv[3] = Tcl_NewStringObj(NULLSTRING, strlen(NULLSTRING));
-    else
-      objv[3] = Tcl_NewStringObj(paramlist, strlen(paramlist));
-    if( nargs > 4 ){
-      if( (buf == NULL) || (*buf == '\0') || (len == 0) )
-	objv[4] = Tcl_NewStringObj(NULLSTRING, strlen(NULLSTRING));
-      else
-	objv[4] = Tcl_NewStringObj(buf, len);
-      objv[5] = Tcl_NewStringObj(t, strlen(t));
-    }
-  } else {
-    argv[0] = cmd;
-    argv[1] = s;
-    argv[2] = xptr->client_data;
-    argv[3] = paramlist;
-    if( nargs > 4 ){
-      argv[4] = buf;
-      argv[5] = t;
-    }
-  }
-
-  /* reset before we make C call */
-  Tcl_ResetResult(xptr->interp);
-
-  /*
-   * Invoke the C procedure.
-   */
-  if (object) {
-    result = (*info.objProc)(info.objClientData, xptr->interp, nargs, objv);
-    /* Get the string value from the result object */
-    resultPtr = Tcl_GetObjResult(xptr->interp);
-    Tcl_SetResult(xptr->interp, Tcl_GetStringFromObj(resultPtr, NULL),
-		  TCL_VOLATILE);
-  } else {
-    result = (*info.proc)(info.clientData, xptr->interp, nargs, argv);
-  }
-
-  /* clean up */
-  if( s ) xfree(s);
-  if( t ) xfree(t);
-
-  /* translate Tcl status into XPA status */
-  if( result == TCL_OK ){
-    return(0);
-  }
-  else{
-    s = (char *)Tcl_GetStringResult(xptr->interp);
-    if( !strncmp(s, "XPA$ERROR: ", 11) )
-      s += 11;
-    XPAError(xpa, s);
-    return(-1);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPATclReceive
- *
- * Purpose:	receive handler for access points written in tcl
- * 		execute the tcl receive command with xpa arguments
- *		used instead of Tcl_Eval so we can avoid interpreting either
- *		paramlist or buf
- *
- *
- * Returns:	0 on success, -1 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPATclReceive (void *client_data, void *call_data, char *paramlist,
-	       char *buf, size_t len)
-#else
-static int XPATclReceive(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     size_t len;
-#endif
-{
-  return(XPATclHandler(client_data, call_data, paramlist, buf, len, 6));
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPATclSend
- *
- * Purpose:	send handler for access points written in tcl
- *
- * Returns:	0 on success, -1 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPATclSend (void *client_data, void *call_data, char *paramlist,
-	    char **buf, size_t *len)
-#else
-static int XPATclSend(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char **buf;
-     size_t *len;
-#endif
-{
-  return(XPATclHandler(client_data, call_data, paramlist, NULL, 0, 4));
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPATclInfo
- *
- * Purpose:	info handler for access points written in tcl
- *
- * Returns:	0 on success, -1 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPATclInfo (void *client_data, void *call_data, char *paramlist)
-#else
-static int XPATclInfo(client_data, call_data, paramlist)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-#endif
-{
-  return(XPATclHandler(client_data, call_data, paramlist, NULL, 0, 4));
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPANew_Tcl
- *
- * Purpose:	Tcl binding to XPANew procedure
- *
- * Tcl call:
- *
- *     xpanew class name help sproc sdata smode rproc rdata rmode
- *
- * use the empty string to specify NULL arguments
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPANew_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPANew_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  char *xclass;
-  char *name;
-  char *help;
-  char *send_cb;
-  char *sdata;
-  char *smode;
-  char *rec_cb;
-  char *rdata;
-  char *rmode;
-  char tbuf[SZ_LINE];
-  XPA xpa;
-  SendCb sproc;
-  ReceiveCb rproc;
-  XPATclClientData sptr;
-  XPATclClientData rptr;
-  Tcl_Obj *resultPtr;
-
-  /* make sure argument count is correct */
-  if( objc != 10 ){
-    Tcl_WrongNumArgs(interp, 1, objv, 
-     "class name help sproc sdata smode rproc rdata rmode");
-    return(TCL_ERROR);
-  }
-
-  /* get arguments as strings */
-  xclass = Tcl_GetStringFromObj(objv[1], NULL);
-  name = Tcl_GetStringFromObj(objv[2], NULL);
-  help = Tcl_GetStringFromObj(objv[3], NULL);
-  send_cb = Tcl_GetStringFromObj(objv[4], NULL);
-  sdata = Tcl_GetStringFromObj(objv[5], NULL);
-  smode = Tcl_GetStringFromObj(objv[6], NULL);
-  rec_cb = Tcl_GetStringFromObj(objv[7], NULL);
-  rdata = Tcl_GetStringFromObj(objv[8], NULL);
-  rmode = Tcl_GetStringFromObj(objv[9], NULL);
-
-  /* this will hold the result */
-  resultPtr = Tcl_GetObjResult(interp);
-
-  /* set up callback procedures */
-  if( ((send_cb == NULL) || (*send_cb == '\0') ) ){
-    sproc = NULL;
-    sptr = NULL;
-  }
-  else{
-    sproc = XPATclSend;
-    sptr = (XPATclClientData)xcalloc(1, sizeof(XPATclClientDataRec));
-    sptr->interp = interp;
-    sptr->callback = xstrdup(send_cb);
-    sptr->client_data = xstrdup(sdata);
-  }
-  if( ((rec_cb == NULL) || (*rec_cb == '\0') ) ){
-    rproc = NULL;
-    rptr = NULL;
-  }
-  else{
-    rproc = XPATclReceive;
-    rptr = (XPATclClientData)xcalloc(1, sizeof(XPATclClientDataRec));
-    rptr->interp = interp;
-    rptr->callback = xstrdup(rec_cb);
-    rptr->client_data = xstrdup(rdata);
-  }
-
-  /* make sure we have either a send or receive callback */
-  if( !sproc && !rproc ){
-    Tcl_SetStringObj(resultPtr, 
-       "XPA$ERROR: xpanew requires send_cb or rec_cb (or both)", -1);
-    return(TCL_ERROR);
-  }
-
-  /* set up the tcl handler for the xpa access point */
-  xpa = XPANew(xclass, name, help, sproc, sptr, smode, rproc, rptr, rmode);
-  if( xpa == NULL ){
-    Tcl_SetStringObj(resultPtr,
-		     "XPA$ERROR: could not create XPA access point", -1);
-    return(TCL_ERROR);
-  }
-  else{
-    /* add this xpa to the Tcl event loop */
-    XPATclAddInput(xpa);
-    /* return xpa address to tcl in a string */
-    snprintf(tbuf, SZ_LINE, "xpa_%p", xpa);
-    Tcl_SetStringObj(resultPtr, tbuf, -1);
-    return(TCL_OK);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAFree_Tcl
- *
- * Purpose:	Tcl binding to XPAFree procedure
- *
- * Tcl call:
- *
- *     xpafree xpa
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPAFree_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPAFree_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  XPA xpa;
-  XPATclClientData ptr;
-
-  /* make sure argument count is correct */
-  if( objc != 2 ){
-    Tcl_WrongNumArgs(interp, 1, objv, "xpa");
-    return(TCL_ERROR);
-  }
-
-  /* get xpa, which is always arg 1 */
-  if( Tcl_GetXPAFromObj(interp, objv[1], TY_SERVER, &xpa) != TCL_OK){
-    return(TCL_ERROR);
-  }
-
-  /* reset error/result condition */
-  Tcl_ResetResult(interp);
-
-  /* free the associated tcl record, stored in the client data */
-  if( xpa->send_data ){
-    ptr = (XPATclClientData)xpa->send_data;
-    if( ptr->callback )    xfree( ptr->callback);
-    if( ptr->client_data ) xfree( ptr->client_data);
-    xfree(xpa->send_data);
-  }
-  if( xpa->receive_data ){
-    ptr = (XPATclClientData)xpa->receive_data;
-    if( ptr->callback )    xfree( ptr->callback);
-    if( ptr->client_data ) xfree( ptr->client_data);
-    xfree(xpa->receive_data);
-  }
-  if( xpa->info_data ){ 
-    ptr = (XPATclClientData)xpa->info_data;
-    if( ptr->callback )    xfree( ptr->callback);
-    if( ptr->client_data ) xfree( ptr->client_data);
-    xfree(xpa->info_data);
-  }
-
-  /* call the XPAFree routine */
-  XPAFree(xpa);
-  return(TCL_OK);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAInfoNew_Tcl
- *
- * Purpose:	Tcl binding to XPAInfoNew procedure
- *
- * Tcl call:
- *
- *     xpanew class name help iproc idata imode
- *
- * use the empty string to specify NULL arguments
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPAInfoNew_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPAInfoNew_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  char *xclass;
-  char *name;
-  char *info_cb;
-  char *idata;
-  char *imode;
-  char tbuf[SZ_LINE];
-  XPA xpa;
-  InfoCb iproc;
-  XPATclClientData iptr;
-  Tcl_Obj *resultPtr;
-
-  /* make sure argument count is correct */
-  if( objc != 6 ){
-    Tcl_WrongNumArgs(interp, 1, objv, 
-     "class name iproc idata imode");
-    return(TCL_ERROR);
-  }
-
-  /* get arguments as strings */
-  xclass = Tcl_GetStringFromObj(objv[1], NULL);
-  name = Tcl_GetStringFromObj(objv[2], NULL);
-  info_cb = Tcl_GetStringFromObj(objv[3], NULL);
-  idata = Tcl_GetStringFromObj(objv[4], NULL);
-  imode = Tcl_GetStringFromObj(objv[5], NULL);
-
-  /* this will hold the result */
-  resultPtr = Tcl_GetObjResult(interp);
-
-  /* set up callback procedures */
-  if( info_cb == NULL ){
-    Tcl_SetStringObj(resultPtr, 
-       "XPA$ERROR: xpainfonew requires info_cb", -1);
-    return(TCL_ERROR);
-  }
-  else{
-    iproc = XPATclInfo;
-    iptr = (XPATclClientData)xcalloc(1, sizeof(XPATclClientDataRec));
-    iptr->interp = interp;
-    iptr->callback = xstrdup(info_cb);
-    iptr->client_data = xstrdup(idata);
-  }
-
-  /* set up the tcl handler for the xpa access point */
-  xpa = XPAInfoNew(xclass, name, iproc, iptr, imode);
-  if( xpa == NULL ){
-    Tcl_SetStringObj(resultPtr,
-		     "XPA$ERROR: could not create XPA info access point", -1);
-    return(TCL_ERROR);
-  }
-  else{
-    /* add this xpa to the Tcl event loop */
-    XPATclAddInput(xpa);
-    /* return xpa address to tcl in a string */
-    snprintf(tbuf, SZ_LINE, "xpa_%p", xpa);
-    Tcl_SetStringObj(resultPtr, tbuf, -1);
-    return(TCL_OK);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPACmdNew_Tcl
- *
- * Purpose:	Tcl binding to XPACmdNew procedure
- *
- * Tcl call:
- *
- *     xpacmdnew class name
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPACmdNew_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPACmdNew_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  char *xclass;
-  char *name;
-  char tbuf[SZ_LINE];
-  XPA xpa;
-  Tcl_Obj *resultPtr;
-
-  /* make sure argument count is correct */
-  if( objc != 3 ){
-    Tcl_WrongNumArgs(interp, 1, objv, "class name");
-    return(TCL_ERROR);
-  }
-
-  /* get arguments as strings */
-  xclass = Tcl_GetStringFromObj(objv[1], NULL);
-  name = Tcl_GetStringFromObj(objv[2], NULL);
-
-  /* this will hold the result */
-  resultPtr = Tcl_GetObjResult(interp);
-
-  /* set up the tcl handler for the xpa access point */
-  if( (xpa = XPACmdNew(xclass, name)) == NULL ){
-    Tcl_SetStringObj(resultPtr, 
-       "XPA$ERROR: could not create XPA command access point", -1);
-    return(TCL_ERROR);
-  }
-  else{
-    /* add this xpa to the Tcl event loop */
-    XPATclAddInput(xpa);
-    /* return xpa address to tcl in a string */
-    snprintf(tbuf, SZ_LINE, "xpa_%p", xpa);
-    Tcl_SetStringObj(resultPtr, tbuf, -1);
-    return(TCL_OK);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPACmdAdd_Tcl
- *
- * Purpose:	Tcl binding to XPACmdAdd procedure
- *
- * Tcl call:
- *
- *     xpacmdadd xpa name help sproc sdata smode rproc rdata rmode
- *
- * use the empty string to specify NULL arguments
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPACmdAdd_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPACmdAdd_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  char *name;
-  char *help;
-  char *send_cb;
-  char *sdata;
-  char *smode;
-  char *rec_cb;
-  char *rdata;
-  char *rmode;
-  char tbuf[SZ_LINE];
-  XPA xpa;
-  XPACmd xpacmd;
-  SendCb sproc;
-  ReceiveCb rproc;
-  XPATclClientData sptr;
-  XPATclClientData rptr;
-  Tcl_Obj *resultPtr;
-
-  /* make sure argument count is correct */
-  if( objc != 10 ){
-    Tcl_WrongNumArgs(interp, 1, objv, 
-     "class name help sproc sdata smode rproc rdata rmode");
-    return(TCL_ERROR);
-  }
-
-  /* get xpa, which is always arg 1 */
-  if( Tcl_GetXPAFromObj(interp, objv[1],  TY_SERVER, &xpa) != TCL_OK){
-    return(TCL_ERROR);
-  }
-
-  name = Tcl_GetStringFromObj(objv[2], NULL);
-  help = Tcl_GetStringFromObj(objv[3], NULL);
-  send_cb = Tcl_GetStringFromObj(objv[4], NULL);
-  sdata = Tcl_GetStringFromObj(objv[5], NULL);
-  smode = Tcl_GetStringFromObj(objv[6], NULL);
-  rec_cb = Tcl_GetStringFromObj(objv[7], NULL);
-  rdata = Tcl_GetStringFromObj(objv[8], NULL);
-  rmode = Tcl_GetStringFromObj(objv[9], NULL);
-
-  /* this will hold the result */
-  resultPtr = Tcl_GetObjResult(interp);
-
-  /* set up callback procedures */
-  if( ((send_cb == NULL) || (*send_cb == '\0') ) ){
-    sproc = NULL;
-    sptr = NULL;
-  }
-  else{
-    sproc = XPATclSend;
-    sptr = (XPATclClientData)xcalloc(1, sizeof(XPATclClientDataRec));
-    sptr->interp = interp;
-    sptr->callback = xstrdup(send_cb);
-    sptr->client_data = xstrdup(sdata);
-  }
-  if( ((rec_cb == NULL) || (*rec_cb == '\0') ) ){
-    rproc = NULL;
-    rptr = NULL;
-  }
-  else{
-    rproc = XPATclReceive;
-    rptr = (XPATclClientData)xcalloc(1, sizeof(XPATclClientDataRec));
-    rptr->interp = interp;
-    rptr->callback = xstrdup(rec_cb);
-    rptr->client_data = xstrdup(rdata);
-  }
-
-  /* make sure we have either a send or receive callback */
-  if( !sproc && !rproc ){
-    Tcl_SetStringObj(resultPtr, 
-       "XPA$ERROR: xpacmdadd requires send_cb or rec_cb (or both)", -1);
-    return(TCL_ERROR);
-  }
-
-  /* set up the tcl handler for the xpa access point */
-  xpacmd = XPACmdAdd(xpa, name, help, sproc, sptr, smode, rproc, rptr, rmode);
-  if( xpacmd == NULL ){
-    Tcl_SetStringObj(resultPtr, "XPA$ERROR: could not create XPA command", -1);
-    return(TCL_ERROR);
-  }
-  else{
-    /* return xpa address to tcl in a string */
-    snprintf(tbuf, SZ_LINE, "xpacmd_%p", xpacmd);
-    Tcl_SetStringObj(resultPtr, tbuf, -1);
-    return(TCL_OK);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPACmdDel_Tcl
- *
- * Purpose:	Tcl binding to XPACmdDel procedure
- *
- * Tcl call:
- *
- *     xpacmddel xpa cmd
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPACmdDel_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPACmdDel_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  void *lval;
-  char *s;
-  XPA xpa;
-  XPACmd cmd;
-  Tcl_Obj *resultPtr;
-
-  /* make sure argument count is correct */
-  if( objc != 3 ){
-    Tcl_WrongNumArgs(interp, 1, objv, "xpa cmd");
-    return(TCL_ERROR);
-  }
-
-  /* get result pointer */
-  resultPtr = Tcl_GetObjResult(interp);
-
-  /* get xpa, which is always arg 1 */
-  if( Tcl_GetXPAFromObj(interp, objv[1], TY_SERVER, &xpa) != TCL_OK){
-    return(TCL_ERROR);
-  }
-
-  /* get xpacmd, which is always arg 2 */
-  if( (s = Tcl_GetStringFromObj(objv[2], NULL)) == NULL ){
-    return(TCL_ERROR);
-  }
-  if( strncmp(s, "xpacmd_", 7) || (sscanf(&(s[7]), "%p", &lval) != 1) ){
-    Tcl_SetStringObj(resultPtr, "XPA$ERROR: invalid xpacmd handle", -1);
-    return(TCL_ERROR);
-  }
-  cmd = (XPACmd)lval;
-
-  /* reset error/result condition */
-  Tcl_ResetResult(interp);
-
-  /* call the XPACmdDel routine */
-  if( XPACmdDel(xpa, cmd) == 0 ){
-    /* free the associated tcl record, stored in the client data */
-    if( cmd->send_data )    xfree(cmd->send_data);
-    if( cmd->receive_data ) xfree(cmd->receive_data);
-    return(TCL_OK);
-  }
-  else{
-    resultPtr = Tcl_GetObjResult(interp);
-    Tcl_SetStringObj(resultPtr, "XPA$ERROR: could not delete xpa cmd", -1);
-    return(TCL_ERROR);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPARec_Tcl
- *
- * Purpose:	Tcl binding to retrieve info from the xpa struct
- *
- * Tcl call:
- *
- *     set val [xparec xpa <option>]
- *
- *     where option can be one of the following:
- *
- *			name
- *			class
- *			method
- *			cmdfd
- *			datafd
-#ifndef HAVE_CYGWIN
- *			cmdchan
- *			datachan
-#endif
- *			sendian
- *			cendian
- *			version
- *		
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPARec_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPARec_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-#ifndef HAVE_CYGWIN
-  Tcl_Channel chan;
-#endif
-  static XCONST84 char *subCmds[] = {
-    "cendian",
-    "class",
-#ifndef HAVE_CYGWIN
-    "cmdchan",
-#endif
-    "cmdfd",
-#ifndef HAVE_CYGWIN
-    "datachan",
-#endif
-    "datafd",
-    "method",
-    "name",
-    "sendian",
-    "version",
-    (char *) NULL};
-  enum ISubCmdIdx {
-    ICendianIdx,
-    IClassIdx,
-#ifndef HAVE_CYGWIN
-    ICmdChanIdx,
-#endif
-    ICmdFdIdx,
-#ifndef HAVE_CYGWIN
-    IDataChanIdx,
-#endif
-    IDataFdIdx,
-    IMethodIdx,
-    INameIdx,
-    ISendianIdx,
-    IVersionIdx
-  } index;
-  XPA xpa;
-  int result;
-  char tbuf[SZ_LINE];
-
-  /* we always have 3 args: xparec $xpa [option] */
-  if (objc != 3) {
-    Tcl_WrongNumArgs(interp, 1, objv, "xpa option");
-    return TCL_ERROR;
-  }
-
-  /* get sub-command index */
-  if( (result = Tcl_GetIndexFromObj(interp, objv[2], subCmds, "option", 0,
-				    (int *)&index)) != TCL_OK ){
-    return result;
-  }
-
-  /* get xpa, which is always arg 1 */
-  if( (result=Tcl_GetXPAFromObj(interp, objv[1], TY_SERVER, &xpa)) != TCL_OK){
-    /* valid xpa is required, except for version */
-    if( index != IVersionIdx )
-      return(TCL_ERROR);
-  }
-
-  /* process sub-command */
-  switch (index) {
-  case ICendianIdx:
-    Tcl_SetResult(interp, (char *)xpa_cendian(xpa), TCL_VOLATILE);
-    result = TCL_OK;
-    break;
-  case IClassIdx:
-    Tcl_SetResult(interp, xpa_class(xpa), TCL_VOLATILE);
-    result = TCL_OK;
-    break;
-#ifndef HAVE_CYGWIN
-  case ICmdChanIdx:
-    snprintf(tbuf, SZ_LINE, "sock%d", xpa_cmdfd(xpa));
-    /* make sure we have a valid OS socket fd */
-    if( xpa_cmdfd(xpa) < 0 ){
-      Tcl_SetResult(interp, "none", TCL_STATIC);
-      result = TCL_OK;
-    }
-    /* see if this socket already is defined as a tcl variable */
-    else if( Tcl_GetChannel(interp, tbuf, NULL) != NULL ){
-      Tcl_SetResult(interp, tbuf, TCL_VOLATILE);
-      result = TCL_OK;
-    }
-    /* create new tcl variable for this socket */
-    else{
-      /* create a tcl channel corresponding to the xpa socket */
-      if( !(chan = Tcl_MakeTcpClientChannel((ClientData)(uintptr_t)xpa_cmdfd(xpa))) ){
-	Tcl_SetResult(interp, "XPA$ERROR: could not map XPA cmdfd to tcl",
-		      TCL_STATIC);
-	result = TCL_ERROR;
-      }
-      else{
-	/* hold a reference to this channel outside tcl */
-	Tcl_RegisterChannel(NULL, chan);
-	/* register this channel with tcl */
-	Tcl_RegisterChannel(interp, chan);
-	/* make this Tcl channel unbuffered, so user does not have to flush */
-	Tcl_SetChannelOption(interp, chan, "-buffering", "none");
-	/* return name so that it can be used by tcl */
-	Tcl_SetResult(interp, (char *)Tcl_GetChannelName(chan), TCL_VOLATILE);
-	result = TCL_OK;
-      }
-    }
-    break;
-#endif
-  case ICmdFdIdx:
-    if( xpa_cmdfd(xpa) < 0 )
-      strcpy(tbuf, "none");
-    else
-      snprintf(tbuf, SZ_LINE, "%d", xpa_cmdfd(xpa));
-    Tcl_SetResult(interp, tbuf, TCL_VOLATILE);
-    result = TCL_OK;
-    break;
-#ifndef HAVE_CYGWIN
-  case IDataChanIdx:
-    snprintf(tbuf, SZ_LINE, "sock%d", xpa_datafd(xpa));
-    /* make sure we have a valid OS socket fd */
-    if( xpa_datafd(xpa) < 0 ){
-      Tcl_SetResult(interp, "none", TCL_STATIC);
-      result = TCL_OK;
-    }
-    /* see if this socket already is defined as a tcl variable */
-    else if( Tcl_GetChannel(interp, tbuf, NULL) != NULL ){
-      Tcl_SetResult(interp, tbuf, TCL_VOLATILE);
-      result = TCL_OK;
-    }
-    /* create new tcl variable for this socket */
-    else{
-      if( !(chan = Tcl_MakeTcpClientChannel((ClientData)(uintptr_t)xpa_datafd(xpa))) ){
-	Tcl_SetResult(interp, "XPA$ERROR: could not map XPA datafd to tcl",
-		      TCL_STATIC);
-	result = TCL_ERROR;
-      }
-      else{
-	/* hold a reference to this channel outside tcl */
-	Tcl_RegisterChannel(NULL, chan);
-	/* register this channel with tcl */
-	Tcl_RegisterChannel(interp, chan);
-	/* make this Tcl channel unbuffered, so user does not have to flush */
-	Tcl_SetChannelOption(interp, chan, "-buffering", "none");
-	/* return name so that it can be used by tcl */
-	Tcl_SetResult(interp, (char *)Tcl_GetChannelName(chan), TCL_VOLATILE);
-	result = TCL_OK;
-      }
-    }
-    break;
-#endif
-  case IDataFdIdx:
-    if( xpa_datafd(xpa) < 0 )
-      strcpy(tbuf, "none");
-    else
-      snprintf(tbuf, SZ_LINE, "%d", xpa_datafd(xpa));
-    Tcl_SetResult(interp, tbuf, TCL_VOLATILE);
-    result = TCL_OK;
-    break;
-  case IMethodIdx:
-    Tcl_SetResult(interp, xpa_method(xpa), TCL_VOLATILE);
-    result = TCL_OK;
-    break;
-  case INameIdx:
-    Tcl_SetResult(interp, xpa_name(xpa), TCL_VOLATILE);
-    result = TCL_OK;
-    break;
-  case ISendianIdx:
-    Tcl_SetResult(interp, xpa_sendian(xpa), TCL_VOLATILE);
-    result = TCL_OK;
-    break;
-  case IVersionIdx:
-    snprintf(tbuf, SZ_LINE, "%s", XPA_VERSION);
-    Tcl_SetResult(interp, tbuf, TCL_VOLATILE);
-    result = TCL_OK;
-    break;
-  }
-  return result;
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASetBuf_Tcl
- *
- * Purpose:	Tcl binding to XPASetBuf procedure
- *
- * Tcl call:
- *
- *     xpasetbuf xpa buf len
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPASetBuf_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPASetBuf_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  int error;
-  int len;
-  char *buf;
-  XPA xpa;
-
-  /* make sure argument count is correct */
-  if( objc < 3 ){
-    Tcl_WrongNumArgs(interp, 1, objv, "xpa buf len");
-    return(TCL_ERROR);
-  }
-
-  /* get xpa, which is always arg 1 */
-  if( Tcl_GetXPAFromObj(interp, objv[1], TY_SERVER, &xpa) != TCL_OK){
-    return(TCL_ERROR);
-  }
-
-  /* get buf */
-  buf = Tcl_GetStringFromObj(objv[2], &len);
-  /* get len if specified */
-  if( objc >= 4 ){
-    if( (error = Tcl_GetIntFromObj(interp, objv[3], &len)) != TCL_OK )
-      return(error);
-  }
-  /* copy buffer to the xpa struct */
-  XPASetBuf(xpa, buf, len, 1);
-  /* return status */
-  return(TCL_OK);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAOpen_Tcl
- *
- * Purpose:	Tcl binding to XPAOpen procedure
- *
- * Tcl call:
- *
- *     xpaopen mode
- *
- * mode currently is NULL
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPAOpen_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPAOpen_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  char *mode;
-  char tbuf[SZ_LINE];
-  XPA xpa;
-  Tcl_Obj *resultPtr;
-
-  /* make sure argument count is correct */
-  if( objc != 2 ){
-    Tcl_WrongNumArgs(interp, 1, objv, "mode");
-    return(TCL_ERROR);
-  }
-
-  /* get arguments as strings */
-  mode = Tcl_GetStringFromObj(objv[1], NULL);
-
-  /* this will hold the result */
-  resultPtr = Tcl_GetObjResult(interp);
-
-  /* set up the tcl handler for the xpa access point */
-  xpa = XPAOpen(mode);
-  if( xpa == NULL ){
-    Tcl_SetStringObj(resultPtr,
-		     "XPA$ERROR: could not open XPA", -1);
-    return(TCL_ERROR);
-  }
-  else{
-    /* return xpa address to tcl in a string */
-    snprintf(tbuf, SZ_LINE, "xpa_%p", xpa);
-    Tcl_SetStringObj(resultPtr, tbuf, -1);
-    return(TCL_OK);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAClose_Tcl
- *
- * Purpose:	Tcl binding to XPAClose procedure
- *
- * Tcl call:
- *
- *     xpaclose xpa
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPAClose_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPAClose_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  XPA xpa;
-
-  /* make sure argument count is correct */
-  if( objc != 2 ){
-    Tcl_WrongNumArgs(interp, 1, objv, "xpa");
-    return(TCL_ERROR);
-  }
-
-  /* get xpa, which is always arg 1 */
-  if( Tcl_GetXPAFromObj(interp, objv[1], TY_CLIENT, &xpa) != TCL_OK){
-    return(TCL_ERROR);
-  }
-
-  /* reset error/result condition */
-  Tcl_ResetResult(interp);
-
-  /* call the XPAClose routine */
-  XPAClose(xpa);
-  return(TCL_OK);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAGet_Tcl
- *
- * Purpose:	Tcl binding to XPAGet procedure
- *
- * Tcl call:
- *
- *     set got [xpaget xpa template paramlist mode bufs lens names errs n]
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPAGet_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPAGet_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  XPA xpa;
-  int got;
-  int n;
-  int i;
-  size_t *clens=NULL;
-  char *xpastr;
-  char *tmpl;
-  char *paramlist;
-  char *mode;
-  /* char *bufs; */
-  /* char *lens; */
-  char *names;
-  char *errs;
-  char **cbufs=NULL;
-  char **cnames=NULL;
-  char **cerrs=NULL;
-  Tcl_Obj *resultPtr;
-  Tcl_Obj *nullPtr;
-  Tcl_Obj *bufsPtr;
-  Tcl_Obj *lensPtr;
-  Tcl_Obj *namesPtr;
-  Tcl_Obj *errsPtr;
-  Tcl_Obj **bufsObjv;
-  Tcl_Obj **lensObjv;
-  Tcl_Obj **namesObjv=NULL;
-  Tcl_Obj **errsObjv=NULL;
-
-  /* make sure argument count is correct */
-  if( objc != 10 ){
-    Tcl_WrongNumArgs(interp, 1, objv,
-		     "xpa template paramlist mode bufs lens names errs n");
-    return(TCL_ERROR);
-  }
-
-  /* get result pointer */
-  resultPtr = Tcl_GetObjResult(interp);
-
-  /* get xpa struct pointer, which might be NULL */
-  xpastr = Tcl_GetStringFromObj(objv[1], NULL);
-  if( TCL_NULLSTR(xpastr) )
-    xpa = NULL;
-  else{
-    /* get xpa, which is always arg 1 */
-    if( Tcl_GetXPAFromObj(interp, objv[1], TY_CLIENT, &xpa) != TCL_OK){
-      Tcl_SetStringObj(resultPtr, "XPA$ERROR: invalid xpa client handle", -1);
-      return(TCL_ERROR);
-    }
-  }
-
-  /* get other args */
-  tmpl = Tcl_GetStringFromObj(objv[2], NULL);
-  paramlist = Tcl_GetStringFromObj(objv[3], NULL);
-  mode = Tcl_GetStringFromObj(objv[4], NULL);
-  /* bufs = Tcl_GetStringFromObj(objv[5], NULL); */
-  /* lens = Tcl_GetStringFromObj(objv[6], NULL); */
-  names = Tcl_GetStringFromObj(objv[7], NULL);
-  errs = Tcl_GetStringFromObj(objv[8], NULL);
-  if( (Tcl_GetIntFromObj(interp, objv[9], &n) != TCL_OK) || (n < 1) ){
-    n = 1;
-  }
-
-  /* allocate return buffers */
-  cbufs  = (char **)xcalloc(n, sizeof(char *));
-  bufsObjv = (Tcl_Obj **)xcalloc(n, sizeof(Tcl_Obj *));
-  clens  =   (size_t *)xcalloc(n, sizeof(size_t));
-  lensObjv = (Tcl_Obj **)xcalloc(n, sizeof(Tcl_Obj *));
-  if( !TCL_NULLSTR(names) ){
-    cnames = (char **)xcalloc(n, sizeof(char *));
-    namesObjv = (Tcl_Obj **)xcalloc(n, sizeof(Tcl_Obj *));
-  }
-  if( !TCL_NULLSTR(errs) ){
-    cerrs  = (char **)xcalloc(n, sizeof(char *));
-    errsObjv = (Tcl_Obj **)xcalloc(n, sizeof(Tcl_Obj *));
-  }
-
-  /* reset before we make C call */
-  Tcl_ResetResult(interp);
-
-  /* make the XPA C call */
-  got = XPAGet(xpa, tmpl, paramlist, mode, cbufs, clens, cnames, cerrs, n);
-
-  /* if we got anything, fill in the blanks */
-  if( got > 0 ){
-    /* generate a Tcl object for each return argument */
-    for(i=0; i<got; i++){
-      bufsObjv[i] = Tcl_NewObj();
-      Tcl_SetStringObj(bufsObjv[i], cbufs[i], clens[i]);
-      
-      lensObjv[i] = Tcl_NewObj();
-      Tcl_SetIntObj(lensObjv[i], clens[i]);
-      
-      if( cnames ){
-	namesObjv[i] = Tcl_NewObj();
-	Tcl_SetStringObj(namesObjv[i], cnames[i],
-			 cnames[i] ? strlen(cnames[i]) : 0);
-      }
-      
-      if( cerrs ){
-	errsObjv[i] = Tcl_NewObj();
-	Tcl_SetStringObj(errsObjv[i], cerrs[i], 
-			 cerrs[i] ? strlen(cerrs[i]) : 0);
-      }
-    }
-    /* make lists from the return arguments and set the return variables */
-    bufsPtr = Tcl_NewObj();
-    Tcl_SetListObj(bufsPtr, got, bufsObjv);
-    Tcl_ObjSetVar2(interp, objv[5], NULL, bufsPtr, TCL_PARSE_PART1);
-    
-    lensPtr = Tcl_NewObj();
-    Tcl_SetListObj(lensPtr, got, lensObjv);
-    Tcl_ObjSetVar2(interp, objv[6], NULL, lensPtr, TCL_PARSE_PART1);
-    
-    if( cnames ){
-      namesPtr = Tcl_NewObj();
-      Tcl_SetListObj(namesPtr, got, namesObjv);
-      Tcl_ObjSetVar2(interp, objv[7], NULL, namesPtr, TCL_PARSE_PART1);
-    }
-    
-    if( cerrs ){
-      errsPtr = Tcl_NewObj();
-      Tcl_SetListObj(errsPtr, got, errsObjv);
-      Tcl_ObjSetVar2(interp, objv[8], NULL, errsPtr, TCL_PARSE_PART1);
-    }
-  }
-  else{
-    nullPtr = Tcl_NewObj();
-    Tcl_SetStringObj(nullPtr, "", -1);
-    Tcl_ObjSetVar2(interp, objv[5], NULL, nullPtr, TCL_PARSE_PART1);
-    Tcl_ObjSetVar2(interp, objv[6], NULL, nullPtr, TCL_PARSE_PART1);
-    if( cnames )
-      Tcl_ObjSetVar2(interp, objv[7], NULL, nullPtr, TCL_PARSE_PART1);
-    if( cerrs )
-      Tcl_ObjSetVar2(interp, objv[8], NULL, nullPtr, TCL_PARSE_PART1);
-  }
-
-  /* free up space */
-  for(i=0; i<got; i++){
-    if( cbufs[i]  ) xfree((char *)cbufs[i]);
-    if( cnames[i] ) xfree((char *)cnames[i]);
-    if( cerrs[i]  ) xfree((char *)cerrs[i]);
-  }
-  if( cbufs  )    xfree((char *)cbufs);
-  if( clens  )    xfree((char *)clens);
-  if( cnames )    xfree((char *)cnames);
-  if( cerrs  )    xfree((char *)cerrs);
-  if( bufsObjv )  xfree((char *)bufsObjv);
-  if( lensObjv )  xfree((char *)lensObjv);
-  if( namesObjv ) xfree((char *)namesObjv);
-  if( errsObjv  ) xfree((char *)errsObjv);
-
-  /* return the number of accesses as the tcl function result */
-  resultPtr = Tcl_GetObjResult(interp);
-  Tcl_SetIntObj(resultPtr, got);
-
-  /* return status */
-  return(TCL_OK);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAGetFd_Tcl
- *
- * Purpose:	Tcl binding to XPAGetFd procedure
- *
- * Tcl call:
- *
- *     set got [xpaget xpa template paramlist mode chans names errs n]
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPAGetFd_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPAGetFd_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  XPA xpa;
-  int got;
-  int n;
-  int i;
-  int flag;
-  int *cfds;
-  char *xpastr;
-  char *tmpl;
-  char *paramlist;
-  char *mode;
-  char *names;
-  char *errs;
-  char **cnames=NULL;
-  char **cerrs=NULL;
-  Tcl_Obj *resultPtr;
-  Tcl_Obj *nullPtr;
-  Tcl_Obj *fdPtr;
-  Tcl_Obj *namesPtr;
-  Tcl_Obj *errsPtr;
-  Tcl_Obj **namesObjv=NULL;
-  Tcl_Obj **errsObjv=NULL;
-  Tcl_Channel chan;
-
-  /* make sure argument count is correct */
-  if( objc != 9 ){
-    Tcl_WrongNumArgs(interp, 1, objv,
-		     "xpa template paramlist mode chans names errs n");
-    return(TCL_ERROR);
-  }
-
-  /* get result pointer */
-  resultPtr = Tcl_GetObjResult(interp);
-
-  /* get xpa struct pointer, which might be NULL */
-  xpastr = Tcl_GetStringFromObj(objv[1], NULL);
-  if( TCL_NULLSTR(xpastr) )
-    xpa = NULL;
-  else{
-    /* get xpa, which is always arg 1 */
-    if( Tcl_GetXPAFromObj(interp, objv[1], TY_CLIENT, &xpa) != TCL_OK ){
-      Tcl_SetStringObj(resultPtr, "XPA$ERROR: invalid xpa client handle", -1);
-      return(TCL_ERROR);
-    }
-  }
-
-  /* get other args */
-  tmpl = Tcl_GetStringFromObj(objv[2], NULL);
-  paramlist = Tcl_GetStringFromObj(objv[3], NULL);
-  mode = Tcl_GetStringFromObj(objv[4], NULL);
-  names = Tcl_GetStringFromObj(objv[6], NULL);
-  errs = Tcl_GetStringFromObj(objv[7], NULL);
-  if( (Tcl_GetIntFromObj(interp, objv[8], &n) != TCL_OK) || (n < 1) ){
-    n = 1;
-  }
-
-  /* get file descriptors */
-  if( n < 0 ){
-    cfds  = (int *)xcalloc(1, sizeof(int));
-    if( Tcl_ListObjIndex(interp, objv[5], 0, &fdPtr) != TCL_OK ){
-      Tcl_SetStringObj(resultPtr, 
-	       "XPA$ERROR: invalid channel list passed to xpagetfd", -1);
-      return(TCL_ERROR);
-    }
-    else{
-      chan = Tcl_GetChannel(interp, Tcl_GetStringFromObj(fdPtr, NULL),
-			    &flag);
-      if( chan == NULL ){
-	Tcl_SetStringObj(resultPtr, 
-		 "XPA$ERROR: invalid channel passed to xpagetfd", -1);
-	return(TCL_ERROR);
-      }
-      if( !(flag&TCL_WRITABLE) ){
-	Tcl_SetStringObj(resultPtr, 
-		 "XPA$ERROR: non-writable channel passed to xpagetfd", -1);
-	return(TCL_ERROR);
-      }
-      Tcl_GetChannelHandle(chan, TCL_WRITABLE, (ClientData *)&(cfds[0]));
-    }
-  }
-  else{
-    cfds  = (int *)xcalloc(n, sizeof(int));
-    for(i=0; i<n; i++){
-      if( Tcl_ListObjIndex(interp, objv[5], i, &fdPtr) != TCL_OK ){
-	Tcl_SetStringObj(resultPtr, 
-		 "XPA$ERROR: invalid channel list passed to xpagetfd", -1);
-	return(TCL_ERROR);
-      }
-      else{
-	chan = Tcl_GetChannel(interp, Tcl_GetStringFromObj(fdPtr, NULL),
-			      &flag);
-	if( chan == NULL ){
-	  Tcl_SetStringObj(resultPtr, 
-		 "XPA$ERROR: invalid channel passed to xpagetfd", -1);
-	  return(TCL_ERROR);
-	}
-	if( !(flag&TCL_WRITABLE) ){
-	  Tcl_SetStringObj(resultPtr, 
-		 "XPA$ERROR: non-writable channel passed to xpagetfd", -1);
-	  return(TCL_ERROR);
-	}
-	Tcl_GetChannelHandle(chan, TCL_WRITABLE, (ClientData *)&(cfds[i]));
-      }
-    }
-  }
-
-  /* allocate return buffers */
-  if( !TCL_NULLSTR(names) ){
-    cnames = (char **)xcalloc(n, sizeof(char *));
-    namesObjv = (Tcl_Obj **)xcalloc(n, sizeof(Tcl_Obj *));
-  }
-  if( !TCL_NULLSTR(errs) ){
-    cerrs  = (char **)xcalloc(n, sizeof(char *));
-    errsObjv = (Tcl_Obj **)xcalloc(n, sizeof(Tcl_Obj *));
-  }
-
-  /* reset before we make C call */
-  Tcl_ResetResult(interp);
-
-  /* make the XPA C call */
-  got = XPAGetFd(xpa, tmpl, paramlist, mode, cfds, cnames, cerrs, n);
-
-  /* if we got anything, fill in the blanks */
-  if( got > 0 ){
-    /* generate a Tcl object for each return argument */
-    for(i=0; i<got; i++){
-      if( cnames ){
-	namesObjv[i] = Tcl_NewObj();
-	Tcl_SetStringObj(namesObjv[i], cnames[i],
-			 cnames[i] ? strlen(cnames[i]) : 0);
-      }
-
-      if( cerrs ){
-	errsObjv[i] = Tcl_NewObj();
-	Tcl_SetStringObj(errsObjv[i], cerrs[i], 
-			 cerrs[i] ? strlen(cerrs[i]) : 0);
-      }
-    }
-    /* make lists from the return arguments and set the return variables */
-    if( cnames ){
-      namesPtr = Tcl_NewObj();
-      Tcl_SetListObj(namesPtr, got, namesObjv);
-      Tcl_ObjSetVar2(interp, objv[6], NULL, namesPtr, TCL_PARSE_PART1);
-    }
-    if( cerrs ){
-      errsPtr = Tcl_NewObj();
-      Tcl_SetListObj(errsPtr, got, errsObjv);
-      Tcl_ObjSetVar2(interp, objv[7], NULL, errsPtr, TCL_PARSE_PART1);
-    }
-  }
-  else{
-    nullPtr = Tcl_NewObj();
-    Tcl_SetStringObj(nullPtr, "", -1);
-    if( cnames )
-      Tcl_ObjSetVar2(interp, objv[6], NULL, nullPtr, TCL_PARSE_PART1);
-    if( cerrs )
-      Tcl_ObjSetVar2(interp, objv[7], NULL, nullPtr, TCL_PARSE_PART1);
-  }
-
-  /* free up space */
-  for(i=0; i<got; i++){
-    if( cnames[i] ) xfree((char *)cnames[i]);
-    if( cerrs[i]  ) xfree((char *)cerrs[i]);
-  }
-  if( cfds   )    xfree((char *)cfds);
-  if( cnames )    xfree((char *)cnames);
-  if( cerrs  )    xfree((char *)cerrs);
-  if( namesObjv ) xfree((char *)namesObjv);
-  if( errsObjv  ) xfree((char *)errsObjv);
-
-  /* return the number of accesses as the tcl function result */
-  Tcl_SetIntObj(resultPtr, got);
-
-  /* return status */
-  return(TCL_OK);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASet_Tcl
- *
- * Purpose:	Tcl binding to XPASet procedure
- *
- * Tcl call:
- *
- *     set got [xpaset xpa template paramlist mode buf len names errs n]
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPASet_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPASet_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  XPA xpa;
-  int got;
-  int n;
-  int i;
-  int blen;
-  int len;
-  char *xpastr;
-  char *tmpl;
-  char *paramlist;
-  char *mode;
-  char *buf;
-  char *names;
-  char *errs;
-  char **cnames=NULL;
-  char **cerrs=NULL;
-  Tcl_Obj *resultPtr;
-  Tcl_Obj *nullPtr;
-  Tcl_Obj *namesPtr;
-  Tcl_Obj *errsPtr;
-  Tcl_Obj **namesObjv=NULL;
-  Tcl_Obj **errsObjv=NULL;
-
-  /* make sure argument count is correct */
-  if( objc != 10 ){
-    Tcl_WrongNumArgs(interp, 1, objv,
-		     "xpa template paramlist mode buf len names errs n");
-    return(TCL_ERROR);
-  }
-
-  /* get result pointer */
-  resultPtr = Tcl_GetObjResult(interp);
-
-  /* get xpa struct pointer, which might be NULL */
-  xpastr = Tcl_GetStringFromObj(objv[1], NULL);
-  if( TCL_NULLSTR(xpastr) )
-    xpa = NULL;
-  else{
-    /* get xpa, which is always arg 1 */
-    if( Tcl_GetXPAFromObj(interp, objv[1], TY_CLIENT, &xpa) != TCL_OK ){
-      Tcl_SetStringObj(resultPtr, "XPA$ERROR: invalid xpa client handle", -1);
-      return(TCL_ERROR);
-    }
-  }
-
-  /* get other args */
-  tmpl = Tcl_GetStringFromObj(objv[2], NULL);
-  paramlist = Tcl_GetStringFromObj(objv[3], NULL);
-  mode = Tcl_GetStringFromObj(objv[4], NULL);
-  buf = Tcl_GetStringFromObj(objv[5], &blen);
-  if( (Tcl_GetIntFromObj(interp, objv[6], &len) != TCL_OK) || (len < 0) ){
-    len = blen;
-  }
-  names = Tcl_GetStringFromObj(objv[7], NULL);
-  errs = Tcl_GetStringFromObj(objv[8], NULL);
-  if( (Tcl_GetIntFromObj(interp, objv[9], &n) != TCL_OK) || (n < 1) ){
-    n = 1;
-  }
-
-  /* allocate return buffers */
-  if( !TCL_NULLSTR(names) ){
-    cnames = (char **)xcalloc(n, sizeof(char *));
-    namesObjv = (Tcl_Obj **)xcalloc(n, sizeof(Tcl_Obj *));
-  }
-  if( !TCL_NULLSTR(errs) ){
-    cerrs  = (char **)xcalloc(n, sizeof(char *));
-    errsObjv = (Tcl_Obj **)xcalloc(n, sizeof(Tcl_Obj *));
-  }
-
-  /* reset before we make C call */
-  Tcl_ResetResult(interp);
-
-  /* make the XPA C call */
-  got = XPASet(xpa, tmpl, paramlist, mode, buf, len, cnames, cerrs, n);
-
-  /* if we got anything, fill in the blanks */
-  if( got > 0 ){
-    /* generate a Tcl object for each return argument */
-    for(i=0; i<got; i++){
-      if( cnames ){
-	namesObjv[i] = Tcl_NewObj();
-	Tcl_SetStringObj(namesObjv[i], cnames[i],
-			 cnames[i] ? strlen(cnames[i]) : 0);
-      }
-      if( cerrs ){
-	errsObjv[i] = Tcl_NewObj();
-	Tcl_SetStringObj(errsObjv[i], cerrs[i], 
-			 cerrs[i] ? strlen(cerrs[i]) : 0);
-      }
-    }
-    /* make lists from the return arguments and set the return variables */
-    if( cnames ){
-      namesPtr = Tcl_NewObj();
-      Tcl_SetListObj(namesPtr, got, namesObjv);
-      Tcl_ObjSetVar2(interp, objv[7], NULL, namesPtr, TCL_PARSE_PART1);
-    }
-    if( cerrs ){
-      errsPtr = Tcl_NewObj();
-      Tcl_SetListObj(errsPtr, got, errsObjv);
-      Tcl_ObjSetVar2(interp, objv[8], NULL, errsPtr, TCL_PARSE_PART1);
-    }
-  }
-  else{
-    nullPtr = Tcl_NewObj();
-    Tcl_SetStringObj(nullPtr, "", -1);
-    if( cnames )
-      Tcl_ObjSetVar2(interp, objv[7], NULL, nullPtr, TCL_PARSE_PART1);
-    if( cerrs )
-      Tcl_ObjSetVar2(interp, objv[8], NULL, nullPtr, TCL_PARSE_PART1);
-  }
-
-  /* free up space */
-  for(i=0; i<got; i++){
-    if( cnames[i] ) xfree((char *)cnames[i]);
-    if( cerrs[i]  ) xfree((char *)cerrs[i]);
-  }
-  if( cnames )    xfree((char *)cnames);
-  if( cerrs  )    xfree((char *)cerrs);
-  if( namesObjv ) xfree((char *)namesObjv);
-  if( errsObjv  ) xfree((char *)errsObjv);
-
-  /* return the number of accesses as the tcl function result */
-  Tcl_SetIntObj(resultPtr, got);
-
-  /* return status */
-  return(TCL_OK);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASetFd_Tcl
- *
- * Purpose:	Tcl binding to XPASetFd procedure
- *
- * Tcl call:
- *
- *     set got [xpasetfd xpa template paramlist mode chan names errs n]
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPASetFd_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPASetFd_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  XPA xpa;
-  int got;
-  int n;
-  int i;
-  int flag;
-  int fd;
-  char *xpastr;
-  char *tmpl;
-  char *paramlist;
-  char *mode;
-  char *names;
-  char *errs;
-  char **cnames=NULL;
-  char **cerrs=NULL;
-  Tcl_Obj *resultPtr;
-  Tcl_Obj *nullPtr;
-  Tcl_Obj *namesPtr;
-  Tcl_Obj *errsPtr;
-  Tcl_Obj **namesObjv=NULL;
-  Tcl_Obj **errsObjv=NULL;
-  Tcl_Channel chan;
-
-  /* make sure argument count is correct */
-  if( objc != 9 ){
-    Tcl_WrongNumArgs(interp, 1, objv,
-		     "xpa template paramlist mode chan names errs n");
-    return(TCL_ERROR);
-  }
-
-  /* get result pointer */
-  resultPtr = Tcl_GetObjResult(interp);
-
-  /* get xpa struct pointer, which might be NULL */
-  xpastr = Tcl_GetStringFromObj(objv[1], NULL);
-  if( TCL_NULLSTR(xpastr) )
-    xpa = NULL;
-  else{
-    /* get xpa, which is always arg 1 */
-    if( Tcl_GetXPAFromObj(interp, objv[1], TY_CLIENT, &xpa) != TCL_OK){
-      Tcl_SetStringObj(resultPtr, "XPA$ERROR: invalid xpa client handle", -1);
-      return(TCL_ERROR);
-    }
-  }
-
-  /* get other args */
-  tmpl = Tcl_GetStringFromObj(objv[2], NULL);
-  paramlist = Tcl_GetStringFromObj(objv[3], NULL);
-  mode = Tcl_GetStringFromObj(objv[4], NULL);
-  names = Tcl_GetStringFromObj(objv[6], NULL);
-  errs = Tcl_GetStringFromObj(objv[7], NULL);
-  if( (Tcl_GetIntFromObj(interp, objv[8], &n) != TCL_OK) || (n < 1) ){
-    n = 1;
-  }
-
-  /* allocate return buffers */
-  if( !TCL_NULLSTR(names) ){
-    cnames = (char **)xcalloc(n, sizeof(char *));
-    namesObjv = (Tcl_Obj **)xcalloc(n, sizeof(Tcl_Obj *));
-  }
-  if( !TCL_NULLSTR(errs) ){
-    cerrs  = (char **)xcalloc(n, sizeof(char *));
-    errsObjv = (Tcl_Obj **)xcalloc(n, sizeof(Tcl_Obj *));
-  }
-
-  /* get file descriptor */
-  chan = Tcl_GetChannel(interp, Tcl_GetStringFromObj(objv[5], NULL), &flag);
-  if( chan == NULL ){
-    Tcl_SetStringObj(resultPtr, 
-       "XPA$ERROR: invalid channel passed to xpasetfd", -1);
-    return(TCL_ERROR);
-  }
-  if( !(flag&TCL_READABLE) ){
-    Tcl_SetStringObj(resultPtr, 
-       "XPA$ERROR: non-readable channel passed to xpasetfd", -1);
-    return(TCL_ERROR);
-  }
-  Tcl_GetChannelHandle(chan, TCL_READABLE, (ClientData *)&fd);
-
-  /* reset before we make C call */
-  Tcl_ResetResult(interp);
-
-  /* make the XPA C call */
-  got = XPASetFd(xpa, tmpl, paramlist, mode, fd, cnames, cerrs, n);
-
-  /* if we got anything, fill in the blanks */
-  if( got > 0 ){
-    /* generate a Tcl object for each return argument */
-    for(i=0; i<got; i++){
-      if( cnames ){
-	namesObjv[i] = Tcl_NewObj();
-	Tcl_SetStringObj(namesObjv[i], cnames[i],
-			 cnames[i] ? strlen(cnames[i]) : 0);
-      }
-      if( cerrs ){
-	errsObjv[i] = Tcl_NewObj();
-	Tcl_SetStringObj(errsObjv[i], cerrs[i], 
-			 cerrs[i] ? strlen(cerrs[i]) : 0);
-      }
-    }
-    /* make lists from the return arguments and set the return variables */
-    if( cnames ){
-      namesPtr = Tcl_NewObj();
-      Tcl_SetListObj(namesPtr, got, namesObjv);
-      Tcl_ObjSetVar2(interp, objv[6], NULL, namesPtr, TCL_PARSE_PART1);
-    }
-    if( cerrs ){
-      errsPtr = Tcl_NewObj();
-      Tcl_SetListObj(errsPtr, got, errsObjv);
-      Tcl_ObjSetVar2(interp, objv[7], NULL, errsPtr, TCL_PARSE_PART1);
-    }
-  }
-  else{
-    nullPtr = Tcl_NewObj();
-    Tcl_SetStringObj(nullPtr, "", -1);
-    if( cnames )
-      Tcl_ObjSetVar2(interp, objv[6], NULL, nullPtr, TCL_PARSE_PART1);
-    if( cerrs )
-      Tcl_ObjSetVar2(interp, objv[7], NULL, nullPtr, TCL_PARSE_PART1);
-  }
-
-  /* free up space */
-  for(i=0; i<got; i++){
-    if( cnames[i] ) xfree((char *)cnames[i]);
-    if( cerrs[i]  ) xfree((char *)cerrs[i]);
-  }
-  if( cnames )    xfree((char *)cnames);
-  if( cerrs  )    xfree((char *)cerrs);
-  if( namesObjv ) xfree((char *)namesObjv);
-  if( errsObjv  ) xfree((char *)errsObjv);
-
-  /* return the number of accesses as the tcl function result */
-  Tcl_SetIntObj(resultPtr, got);
-
-  /* return status */
-  return(TCL_OK);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAInfo_Tcl
- *
- * Purpose:	Tcl binding to XPAInfo procedure
- *
- * Tcl call:
- *
- *     set got [xpainfo xpa template paramlist mode names errs n]
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPAInfo_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPAInfo_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  XPA xpa;
-  int got;
-  int n;
-  int i;
-  char *xpastr;
-  char *tmpl;
-  char *paramlist;
-  char *mode;
-  char *names;
-  char *errs;
-  char **cnames=NULL;
-  char **cerrs=NULL;
-  Tcl_Obj *resultPtr;
-  Tcl_Obj *nullPtr;
-  Tcl_Obj *namesPtr;
-  Tcl_Obj *errsPtr;
-  Tcl_Obj **namesObjv=NULL;
-  Tcl_Obj **errsObjv=NULL;
-
-  /* make sure argument count is correct */
-  if( objc != 8 ){
-    Tcl_WrongNumArgs(interp, 1, objv,
-		     "xpa template paramlist mode names errs n");
-    return(TCL_ERROR);
-  }
-
-  /* get result pointer */
-  resultPtr = Tcl_GetObjResult(interp);
-
-  /* get xpa struct pointer, which might be NULL */
-  xpastr = Tcl_GetStringFromObj(objv[1], NULL);
-  if( TCL_NULLSTR(xpastr) )
-    xpa = NULL;
-  else{
-    /* get xpa, which is always arg 1 */
-    if( Tcl_GetXPAFromObj(interp, objv[1], TY_CLIENT, &xpa) != TCL_OK){
-      Tcl_SetStringObj(resultPtr, "XPA$ERROR: invalid xpa client handle", -1);
-      return(TCL_ERROR);
-    }
-  }
-
-  /* get other args */
-  tmpl = Tcl_GetStringFromObj(objv[2], NULL);
-  paramlist = Tcl_GetStringFromObj(objv[3], NULL);
-  mode = Tcl_GetStringFromObj(objv[4], NULL);
-  names = Tcl_GetStringFromObj(objv[5], NULL);
-  errs = Tcl_GetStringFromObj(objv[6], NULL);
-  if( (Tcl_GetIntFromObj(interp, objv[7], &n) != TCL_OK) || (n < 1) ){
-    n = 1;
-  }
-
-  /* allocate return buffers */
-  if( !TCL_NULLSTR(names) ){
-    cnames = (char **)xcalloc(n, sizeof(char *));
-    namesObjv = (Tcl_Obj **)xcalloc(n, sizeof(Tcl_Obj *));
-  }
-  if( !TCL_NULLSTR(errs) ){
-    cerrs  = (char **)xcalloc(n, sizeof(char *));
-    errsObjv = (Tcl_Obj **)xcalloc(n, sizeof(Tcl_Obj *));
-  }
-
-  /* reset before we make C call */
-  Tcl_ResetResult(interp);
-
-  /* make the XPA C call */
-  got = XPAInfo(xpa, tmpl, paramlist, mode, cnames, cerrs, n);
-
-  /* if we got anything, fill in the blanks */
-  if( got > 0 ){
-    /* generate a Tcl object for each return argument */
-    for(i=0; i<got; i++){
-      if( cnames ){
-	namesObjv[i] = Tcl_NewObj();
-	Tcl_SetStringObj(namesObjv[i], cnames[i],
-			 cnames[i] ? strlen(cnames[i]) : 0);
-      }
-      if( cerrs ){
-	errsObjv[i] = Tcl_NewObj();
-	Tcl_SetStringObj(errsObjv[i], cerrs[i], 
-			 cerrs[i] ? strlen(cerrs[i]) : 0);
-      }
-    }
-    /* make lists from the return arguments and set the return variables */
-    if( cnames ){
-      namesPtr = Tcl_NewObj();
-      Tcl_SetListObj(namesPtr, got, namesObjv);
-      Tcl_ObjSetVar2(interp, objv[5], NULL, namesPtr, TCL_PARSE_PART1);
-    }
-
-    if( cerrs ){
-      errsPtr = Tcl_NewObj();
-      Tcl_SetListObj(errsPtr, got, errsObjv);
-      Tcl_ObjSetVar2(interp, objv[6], NULL, errsPtr, TCL_PARSE_PART1);
-    }
-  }
-  else{
-    nullPtr = Tcl_NewObj();
-    Tcl_SetStringObj(nullPtr, "", -1);
-    if( cnames )
-      Tcl_ObjSetVar2(interp, objv[5], NULL, nullPtr, TCL_PARSE_PART1);
-    if( cerrs )
-      Tcl_ObjSetVar2(interp, objv[6], NULL, nullPtr, TCL_PARSE_PART1);
-  }
-
-  /* free up space */
-  for(i=0; i<got; i++){
-    if( cnames[i] ) xfree((char *)cnames[i]);
-    if( cerrs[i]  ) xfree((char *)cerrs[i]);
-  }
-  if( cnames )    xfree((char *)cnames);
-  if( cerrs  )    xfree((char *)cerrs);
-  if( namesObjv ) xfree((char *)namesObjv);
-  if( errsObjv  ) xfree((char *)errsObjv);
-
-  /* return the number of accesses as the tcl function result */
-  Tcl_SetIntObj(resultPtr, got);
-
-  /* return status */
-  return(TCL_OK);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAAccess_Tcl
- *
- * Purpose:	Tcl binding to XPAAccess procedure
- *
- * Tcl call:
- *
- *     set got [xpaaccess xpa template paramlist mode names errs n]
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPAAccess_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPAAccess_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  XPA xpa;
-  int got;
-  int n;
-  int i;
-  char *xpastr;
-  char *tmpl;
-  char *paramlist;
-  char *mode;
-  char *names;
-  char *errs;
-  char **cnames=NULL;
-  char **cerrs=NULL;
-  Tcl_Obj *resultPtr;
-  Tcl_Obj *nullPtr;
-  Tcl_Obj *namesPtr;
-  Tcl_Obj *errsPtr;
-  Tcl_Obj **namesObjv=NULL;
-  Tcl_Obj **errsObjv=NULL;
-
-  /* make sure argument count is correct */
-  if( objc != 8 ){
-    Tcl_WrongNumArgs(interp, 1, objv,
-		     "xpa template paramlist mode names errs n");
-    return(TCL_ERROR);
-  }
-
-  /* get result pointer */
-  resultPtr = Tcl_GetObjResult(interp);
-
-  /* get xpa struct pointer, which might be NULL */
-  xpastr = Tcl_GetStringFromObj(objv[1], NULL);
-  if( TCL_NULLSTR(xpastr) )
-    xpa = NULL;
-  else{
-    /* get xpa, which is always arg 1 */
-    if( Tcl_GetXPAFromObj(interp, objv[1], TY_CLIENT, &xpa) != TCL_OK){
-      Tcl_SetStringObj(resultPtr, "XPA$ERROR: invalid xpa client handle", -1);
-      return(TCL_ERROR);
-    }
-  }
-
-  /* get other args */
-  tmpl = Tcl_GetStringFromObj(objv[2], NULL);
-  paramlist = Tcl_GetStringFromObj(objv[3], NULL);
-  mode = Tcl_GetStringFromObj(objv[4], NULL);
-  names = Tcl_GetStringFromObj(objv[5], NULL);
-  errs = Tcl_GetStringFromObj(objv[6], NULL);
-  if( (Tcl_GetIntFromObj(interp, objv[7], &n) != TCL_OK) || (n < 1) ){
-    n = 1;
-  }
-
-  if( !TCL_NULLSTR(names) ){
-    cnames = (char **)xcalloc(n, sizeof(char *));
-    namesObjv = (Tcl_Obj **)xcalloc(n, sizeof(Tcl_Obj *));
-  }
-  if( !TCL_NULLSTR(errs) ){
-    cerrs  = (char **)xcalloc(n, sizeof(char *));
-    errsObjv = (Tcl_Obj **)xcalloc(n, sizeof(Tcl_Obj *));
-  }
-
-  /* reset before we make C call */
-  Tcl_ResetResult(interp);
-
-  /* make the XPA C call */
-  got = XPAAccess(xpa, tmpl, paramlist, mode, cnames, cerrs, n);
-
-  /* if we got anything, fill in the blanks */
-  if( got > 0 ){
-    /* generate a Tcl object for each return argument */
-    for(i=0; i<got; i++){
-      if( cnames ){
-	namesObjv[i] = Tcl_NewObj();
-	Tcl_SetStringObj(namesObjv[i], cnames[i],
-			 cnames[i] ? strlen(cnames[i]) : 0);
-      }
-      if( cerrs ){
-	errsObjv[i] = Tcl_NewObj();
-	Tcl_SetStringObj(errsObjv[i], cerrs[i], 
-			 cerrs[i] ? strlen(cerrs[i]) : 0);
-      }
-    }
-    /* make lists from the return arguments and set the return variables */
-    if( cnames ){
-      namesPtr = Tcl_NewObj();
-      Tcl_SetListObj(namesPtr, got, namesObjv);
-      Tcl_ObjSetVar2(interp, objv[5], NULL, namesPtr, TCL_PARSE_PART1);
-    }
-    if( cerrs ){
-      errsPtr = Tcl_NewObj();
-      Tcl_SetListObj(errsPtr, got, errsObjv);
-      Tcl_ObjSetVar2(interp, objv[6], NULL, errsPtr, TCL_PARSE_PART1);
-    }
-  }
-  else{
-    nullPtr = Tcl_NewObj();
-    Tcl_SetStringObj(nullPtr, "", -1);
-    if( cnames )
-      Tcl_ObjSetVar2(interp, objv[5], NULL, nullPtr, TCL_PARSE_PART1);
-    if( cerrs )
-      Tcl_ObjSetVar2(interp, objv[6], NULL, nullPtr, TCL_PARSE_PART1);
-  }
-
-  /* free up space */
-  for(i=0; i<got; i++){
-    if( cnames[i] ) xfree((char *)cnames[i]);
-    if( cerrs[i]  ) xfree((char *)cerrs[i]);
-  }
-  if( cnames )    xfree((char *)cnames);
-  if( cerrs  )    xfree((char *)cerrs);
-  if( namesObjv ) xfree((char *)namesObjv);
-  if( errsObjv  ) xfree((char *)errsObjv);
-
-  /* return the number of accesses as the tcl function result */
-  Tcl_SetIntObj(resultPtr, got);
-
-  /* return status */
-  return(TCL_OK);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPANSLookup_Tcl
- *
- * Purpose:	Tcl binding to XPANSLookup procedure
- *
- * Tcl call:
- *
- *     set got [xpanslookup template type]
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPANSLookup_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPANSLookup_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  XPA xpa;
-  int i;
-  int got;
-  char *xpastr;
-  char *tmpl;
-  char *ttype;
-  char **xclasses;
-  char **names;
-  char **methods;
-  char **infos;
-  Tcl_Obj *resultPtr;
-  Tcl_Obj *nullPtr;
-  Tcl_Obj *classesPtr;
-  Tcl_Obj *namesPtr;
-  Tcl_Obj *methodsPtr;
-  Tcl_Obj *infosPtr;
-  Tcl_Obj **classesObjv;
-  Tcl_Obj **namesObjv;
-  Tcl_Obj **methodsObjv;
-  Tcl_Obj **infosObjv;
-
-  /* make sure argument count is correct */
-  if( objc != 7 ){
-    Tcl_WrongNumArgs(interp, 1, objv,
-		     "template type classes names methods infos");
-    return(TCL_ERROR);
-  }
-
-  /* get result pointer */
-  resultPtr = Tcl_GetObjResult(interp);
-
-  /* get other args */
-  tmpl = Tcl_GetStringFromObj(objv[1], NULL);
-  ttype = Tcl_GetStringFromObj(objv[2], NULL);
-
-  /* reset before we make C call */
-  Tcl_ResetResult(interp);
-
-  /* get xpa struct pointer, which might be NULL */
-  xpastr = Tcl_GetStringFromObj(objv[1], NULL);
-  if( TCL_NULLSTR(xpastr) )
-    xpa = NULL;
-  else{
-    /* get xpa, which is always arg 1 */
-    if( Tcl_GetXPAFromObj(interp, objv[1], TY_CLIENT, &xpa) != TCL_OK){
-      Tcl_SetStringObj(resultPtr, "XPA$ERROR: invalid xpa client handle", -1);
-      return(TCL_ERROR);
-    }
-  }
-
-  /* make the XPA C call */
-  got = XPANSLookup(xpa, tmpl, ttype, &xclasses, &names, &methods, &infos);
-
-  /* if we got anything, fill in the blanks */
-  if( got > 0 ){
-    /* allocate just enough pointers */
-    classesObjv = (Tcl_Obj **)xcalloc(got, sizeof(Tcl_Obj *));
-    namesObjv = (Tcl_Obj **)xcalloc(got, sizeof(Tcl_Obj *));
-    methodsObjv = (Tcl_Obj **)xcalloc(got, sizeof(Tcl_Obj *));
-    infosObjv = (Tcl_Obj **)xcalloc(got, sizeof(Tcl_Obj *));
-
-    /* generate a Tcl object for each return argument */
-    for(i=0; i<got; i++){
-      classesObjv[i] = Tcl_NewObj();
-      Tcl_SetStringObj(classesObjv[i], xclasses[i], strlen(xclasses[i]));
-      namesObjv[i] = Tcl_NewObj();
-      Tcl_SetStringObj(namesObjv[i], names[i], strlen(names[i]));
-      methodsObjv[i] = Tcl_NewObj();
-      Tcl_SetStringObj(methodsObjv[i], methods[i], strlen(methods[i]));
-      infosObjv[i] = Tcl_NewObj();
-      Tcl_SetStringObj(infosObjv[i], infos[i], strlen(infos[i]));
-    }
-    /* make lists from the return arguments and set the return variables */
-    classesPtr = Tcl_NewObj();
-    Tcl_SetListObj(classesPtr, got, classesObjv);
-    Tcl_ObjSetVar2(interp, objv[3], NULL, classesPtr, TCL_PARSE_PART1);
-
-    namesPtr = Tcl_NewObj();
-    Tcl_SetListObj(namesPtr, got, namesObjv);
-    Tcl_ObjSetVar2(interp, objv[4], NULL, namesPtr, TCL_PARSE_PART1);
-    
-    methodsPtr = Tcl_NewObj();
-    Tcl_SetListObj(methodsPtr, got, methodsObjv);
-    Tcl_ObjSetVar2(interp, objv[5], NULL, methodsPtr, TCL_PARSE_PART1);
-    
-    infosPtr = Tcl_NewObj();
-    Tcl_SetListObj(infosPtr, got, infosObjv);
-    Tcl_ObjSetVar2(interp, objv[5], NULL, infosPtr, TCL_PARSE_PART1);
-    
-    /* free up the space */
-    for(i=0; i<got; i++){
-      /* done with these strings */
-      xfree(xclasses[i]);
-      xfree(names[i]);
-      xfree(methods[i]);
-      xfree(infos[i]);
-    }
-    /* free up arrays alloc'ed by name server */
-    if( got > 0 ){
-      xfree(xclasses);
-      xfree(names);
-      xfree(methods);
-      xfree(infos);
-      xfree(classesObjv);
-      xfree(namesObjv);
-      xfree(methodsObjv);
-      xfree(infosObjv);
-    }
-  }
-  else{
-    nullPtr = Tcl_NewObj();
-    Tcl_SetStringObj(nullPtr, "", -1);
-    Tcl_ObjSetVar2(interp, objv[3], NULL, nullPtr, TCL_PARSE_PART1);
-    Tcl_ObjSetVar2(interp, objv[4], NULL, nullPtr, TCL_PARSE_PART1);
-    Tcl_ObjSetVar2(interp, objv[5], NULL, nullPtr, TCL_PARSE_PART1);
-    Tcl_ObjSetVar2(interp, objv[6], NULL, nullPtr, TCL_PARSE_PART1);
-  }
-
-  /* return the number of accesses as the tcl function result */
-  Tcl_SetIntObj(resultPtr, got);
-
-  /* return status */
-  return(TCL_OK);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPANSKeepAlive_Tcl
- *
- * Purpose:	Tcl binding to XPANSKeepAlive procedure
- *
- * Tcl call:
- *
- *     xpafree xpa
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPANSKeepAlive_Tcl(ClientData clientData, Tcl_Interp *interp,
-		   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPANSKeepAlive_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  XPA xpa;
-  int type=0;
-  char *s=NULL;
-
-  /* make sure argument count is correct */
-  if( objc < 2 ){
-    Tcl_WrongNumArgs(interp, 1, objv, "xpa [type]");
-    return(TCL_ERROR);
-  }
-
-  /* get xpa, which is always arg 1 */
-  if( Tcl_GetXPAFromObj(interp, objv[1], TY_SERVER, &xpa) != TCL_OK){
-    return(TCL_ERROR);
-  }
-
-  /* optional type, usually not specified for default */
-  if( (objc >= 3) && (s = Tcl_GetStringFromObj(objv[2], NULL)) != NULL )
-    type = atoi(s);
-
-  /* reset error/result condition */
-  Tcl_ResetResult(interp);
-
-  /* call the XPANSKeepAlive routine */
-  XPANSKeepAlive(xpa, type);
-
-  return(TCL_OK);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPARemote_Tcl
- *
- * Purpose:	Tcl binding to XPARemote procedure
- *
- * Tcl call:
- *
- *     xpaRemote xpa host acl
- *
- * use the empty string to specify NULL arguments
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPARemote_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPARemote_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  int got;
-  char *host;
-  char *acl="+";
-  char *s;
-  char *mode=NULL;
-  char tbuf[SZ_LINE];
-  XPA xpa;
-  Tcl_Obj *resultPtr;
-
-  /* make sure argument count is correct */
-  if( (objc < 3) || (objc > 5) ){
-    Tcl_WrongNumArgs(interp, 1, objv, "xpa host [acl] [-proxy]");
-    return(TCL_ERROR);
-  }
-
-  /* get result pointer */
-  resultPtr = Tcl_GetObjResult(interp);
-
-  /* get xpa, which is always arg 1 */
-  if( Tcl_GetXPAFromObj(interp, objv[1],  TY_SERVER, &xpa) != TCL_OK){
-    return(TCL_ERROR);
-  }
-
-  /* make sure we are using inet sockets */
-  if( XPAMtype() != XPA_INET ){
-    snprintf(tbuf, SZ_LINE, "remote requires that XPA_METHOD be 'inet'\n");
-    Tcl_SetStringObj(resultPtr, tbuf, -1);
-    return(TCL_ERROR);
-  }
-
-  /* get required host  */
-  host = Tcl_GetStringFromObj(objv[2], NULL);
-
-  /* get optional acl */
-  if( objc >= 4 ){
-    s = Tcl_GetStringFromObj(objv[3], NULL);
-    if( !strcmp(s, "-proxy") ){
-      mode="proxy=true";
-    }
-    else{
-      acl = s;
-    }
-  }
-
-  /* get optional -proxy switch */
-  if( objc == 5 ){
-    s = Tcl_GetStringFromObj(objv[4], NULL);
-    if( !strcmp(s, "-proxy") ){
-      mode="proxy=true";
-    }
-    else if( mode ){
-      acl = s;
-    }
-    else{
-      snprintf(tbuf, SZ_LINE,
-	      "XPA$ERROR: invalid arg (%s): xpa -remote host [acl] [-proxy]\n",
-	      s);
-      Tcl_SetStringObj(resultPtr, tbuf, -1);
-      return(TCL_ERROR);
-    }
-  }
-
-  /* reset error/result condition */
-  Tcl_ResetResult(interp);
-
-  /* set up the tcl handler for the xpa access point */
-  got = XPARemote(xpa, host, acl, mode);
-  if( got >= 0 ){
-    return(TCL_OK);
-  }
-  else{
-    snprintf(tbuf, SZ_LINE,
-	     "XPA$ERROR: remote xpans %s failed to process %s\n",
-	     host, xpa->name);
-    Tcl_SetStringObj(resultPtr, tbuf, -1);
-    return(TCL_ERROR);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAError_Tcl
- *
- * Purpose:	Tcl binding to XPAError procedure
- *
- * Tcl call:
- *
- *     xpaerror xpa errmess
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPAError_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPAError_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  char *message;
-  XPA xpa;
-
-  /* make sure argument count is correct */
-  if( objc != 3 ){
-    Tcl_WrongNumArgs(interp, 1, objv, "xpa message");
-    return(TCL_ERROR);
-  }
-
-  /* get xpa, which is always arg 1 */
-  if( Tcl_GetXPAFromObj(interp, objv[1], TY_SERVER, &xpa) != TCL_OK){
-    return(TCL_ERROR);
-  }
-
-  /* get message string */
-  message = Tcl_GetStringFromObj(objv[2], NULL);
-
-  /* reset error/result condition */
-  Tcl_ResetResult(interp);
-
-  /* call the XPAError routine */
-  XPAError(xpa, message);
-
-  /* no error message (too lazy) */
-  return(TCL_OK);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAMessage_Tcl
- *
- * Purpose:	Tcl binding to XPAMessage procedure
- *
- * Tcl call:
- *
- *     xpamessage xpa errmess
- *
- * Returns:	Tcl error code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPAMessage_Tcl(ClientData clientData, Tcl_Interp *interp,
-	   int objc, Tcl_Obj *CONST objv[])
-#else
-static int XPAMessage_Tcl(clientData, interp, objc, objv)
-     ClientData clientData;
-     Tcl_Interp *interp;
-     int objc;
-     Tcl_Obj *CONST objv[];
-#endif
-{
-  char *message;
-  XPA xpa;
-
-  /* make sure argument count is correct */
-  if( objc != 3 ){
-    Tcl_WrongNumArgs(interp, 1, objv, "xpa message");
-    return(TCL_ERROR);
-  }
-
-  /* get xpa, which is always arg 1 */
-  if( Tcl_GetXPAFromObj(interp, objv[1], TY_SERVER, &xpa) != TCL_OK){
-    return(TCL_ERROR);
-  }
-
-  /* get message string */
-  message = Tcl_GetStringFromObj(objv[2], NULL);
-
-  /* reset error/result condition */
-  Tcl_ResetResult(interp);
-
-  /* call the XPAMessage routine */
-  XPAMessage(xpa, message);
-
-  /* no error message (too lazy) */
-  return(TCL_OK);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- * 			Public Routines and Data
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	Xpa_Init
- *
- * Purpose:	initialize Tcl xpa package
- *
- * Returns:	tcl return code
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int
-Tclxpa_Init (void *vinterp)
-#else
-int Tclxpa_Init (vinterp)
-     void *vinterp;
-#endif
-{
-  Tcl_Interp *interp = (Tcl_Interp *)vinterp;
-
-  if(
-#ifdef USE_TCL_STUBS
-     Tcl_InitStubs(interp, "8.4", 0)
-#else
-     Tcl_PkgRequire(interp, "Tcl", "8.4", 0)
-#endif
-     == NULL) {
-    return TCL_ERROR;
-  }
-
-  /* add xpa commands to this interpreter */
-  Tcl_CreateObjCommand(interp, "xpanew", XPANew_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xpafree", XPAFree_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xpainfonew", XPAInfoNew_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xpacmdnew", XPACmdNew_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xpacmddel", XPACmdDel_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xpacmdadd", XPACmdAdd_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xparec", XPARec_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xpasetbuf", XPASetBuf_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xpaopen", XPAOpen_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xpaclose", XPAClose_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xpaget", XPAGet_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xpagetfd", XPAGetFd_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xpaset", XPASet_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xpasetfd", XPASetFd_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xpainfo", XPAInfo_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xpaaccess", XPAAccess_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xpanslookup", XPANSLookup_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xpanskeepalive", XPANSKeepAlive_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xparemote", XPARemote_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xpaerror", XPAError_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_CreateObjCommand(interp, "xpamessage", XPAMessage_Tcl,
-		       (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL);
-
-  Tcl_PkgProvide(interp, "tclxpa", "2.1");
-  return(TCL_OK);
-}
-
-/* required for tclkit 8.6 */
-int Tclxpa_Unload() { return TCL_ERROR; }
-int Tclxpa_SafeUnload() { return TCL_ERROR; }
-int Tclxpa_SafeInit() { return TCL_ERROR; }
-
-
-int xpa_tclbinding = 1;
-
-#else
-
-int xpa_tclbinding = 0;
-
-#endif
diff --git a/xpa/tcl.m4 b/xpa/tcl.m4
deleted file mode 100644
index 8125361..0000000
--- a/xpa/tcl.m4
+++ /dev/null
@@ -1,2464 +0,0 @@
-#------------------------------------------------------------------------
-# SC_PATH_TCLCONFIG --
-#
-#	Locate the tclConfig.sh file and perform a sanity check on
-#	the Tcl compile flags
-#
-# Arguments:
-#	none
-#
-# Results:
-#
-#	Adds the following arguments to configure:
-#		--with-tcl=...
-#
-#	Defines the following vars:
-#		TCL_BIN_DIR	Full path to the directory containing
-#				the tclConfig.sh file
-#------------------------------------------------------------------------
-
-AC_DEFUN(SC_PATH_TCLCONFIG, [
-    #
-    # Ok, lets find the tcl configuration
-    # First, look for one uninstalled.
-    # the alternative search directory is invoked by --with-tcl
-    #
-
-    if test x"${no_tcl}" = x ; then
-	# we reset no_tcl in case something fails here
-	no_tcl=true
-	AC_ARG_WITH(tcl, [  --with-tcl              directory containing tcl configuration (tclConfig.sh)], with_tclconfig=${withval})
-	AC_MSG_CHECKING([for Tcl configuration])
-	if test x"${withval}" != xno ; then
-	AC_CACHE_VAL(ac_cv_c_tclconfig,[
-
-	    # First check to see if --with-tcl was specified.
-	    if test x"${with_tclconfig}" != x ; then
-		if test -f "${with_tclconfig}/tclConfig.sh" ; then
-		    ac_cv_c_tclconfig=`(cd ${with_tclconfig}; pwd)`
-		else
-		    AC_MSG_RESULT([${with_tclconfig} directory doesn't contain tclConfig.sh])
-		fi
-	    fi
-
-	    # then check for a private Tcl installation
-	    if test x"${ac_cv_c_tclconfig}" = x ; then
-		for i in \
-			../tcl \
-			`ls -dr ../tcl[[8-9]].[[0-9]]* 2>/dev/null` \
-			../../tcl \
-			`ls -dr ../../tcl[[8-9]].[[0-9]]* 2>/dev/null` \
-			../../../tcl \
-			`ls -dr ../../../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do
-		    if test -f "$i/unix/tclConfig.sh" ; then
-			ac_cv_c_tclconfig=`(cd $i/unix; pwd)`
-			break
-		    fi
-		done
-	    fi
-
-	    # check in a few common install locations
-	    if test x"${ac_cv_c_tclconfig}" = x ; then
-		for i in `ls -d ${libdir} 2>/dev/null` \
-			`ls -d /usr/local/lib 2>/dev/null` \
-			`ls -d /usr/contrib/lib 2>/dev/null` \
-			`ls -d /usr/lib 2>/dev/null` \
-			; do
-		    if test -f "$i/tclConfig.sh" ; then
-			ac_cv_c_tclconfig=`(cd $i; pwd)`
-			break
-		    fi
-		done
-	    fi
-
-	    # check in a few other private locations
-	    if test x"${ac_cv_c_tclconfig}" = x ; then
-		for i in \
-			${srcdir}/../tcl \
-			`ls -dr ${srcdir}/../tcl[[8-9]].[[0-9]]* 2>/dev/null` ; do
-		    if test -f "$i/unix/tclConfig.sh" ; then
-		    ac_cv_c_tclconfig=`(cd $i/unix; pwd)`
-		    break
-		fi
-		done
-	    fi
-	])
-	else
-	    AC_MSG_RESULT(skipping Tcl configuration)
-	    ac_cv_c_tclconfig="none"
-	fi
-
-	if test x"${ac_cv_c_tclconfig}" = x ; then
-	    TCL_BIN_DIR="# no Tcl configs found"
-	    AC_MSG_RESULT(can't find Tcl configuration definitions)
-# no Tcl is OK egm 03/25/03
-#	    AC_MSG_WARN(Can't find Tcl configuration definitions)
-#	    exit 0
-	elif test x"${ac_cv_c_tclconfig}" = xnone ; then
-	    TCL_BIN_DIR=""
-	else
-	    no_tcl=
-	    TCL_BIN_DIR=${ac_cv_c_tclconfig}
-	    AC_MSG_RESULT(found $TCL_BIN_DIR/tclConfig.sh)
-	fi
-    fi
-])
-
-#------------------------------------------------------------------------
-# SC_PATH_TKCONFIG --
-#
-#	Locate the tkConfig.sh file
-#
-# Arguments:
-#	none
-#
-# Results:
-#
-#	Adds the following arguments to configure:
-#		--with-tk=...
-#
-#	Defines the following vars:
-#		TK_BIN_DIR	Full path to the directory containing
-#				the tkConfig.sh file
-#------------------------------------------------------------------------
-
-AC_DEFUN(SC_PATH_TKCONFIG, [
-    #
-    # Ok, lets find the tk configuration
-    # First, look for one uninstalled.
-    # the alternative search directory is invoked by --with-tk
-    #
-
-    if test x"${no_tk}" = x ; then
-	# we reset no_tk in case something fails here
-	no_tk=true
-	AC_ARG_WITH(tk, [  --with-tk               directory containing tk configuration (tkConfig.sh)], with_tkconfig=${withval})
-	AC_MSG_CHECKING([for Tk configuration])
-	AC_CACHE_VAL(ac_cv_c_tkconfig,[
-
-	    # First check to see if --with-tkconfig was specified.
-	    if test x"${with_tkconfig}" != x ; then
-		if test -f "${with_tkconfig}/tkConfig.sh" ; then
-		    ac_cv_c_tkconfig=`(cd ${with_tkconfig}; pwd)`
-		else
-		    AC_MSG_RESULT([${with_tkconfig} directory doesn't contain tkConfig.sh])
-		fi
-	    fi
-
-	    # then check for a private Tk library
-	    if test x"${ac_cv_c_tkconfig}" = x ; then
-		for i in \
-			../tk \
-			`ls -dr ../tk[[8-9]].[[0-9]]* 2>/dev/null` \
-			../../tk \
-			`ls -dr ../../tk[[8-9]].[[0-9]]* 2>/dev/null` \
-			../../../tk \
-			`ls -dr ../../../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do
-		    if test -f "$i/unix/tkConfig.sh" ; then
-			ac_cv_c_tkconfig=`(cd $i/unix; pwd)`
-			break
-		    fi
-		done
-	    fi
-	    # check in a few common install locations
-	    if test x"${ac_cv_c_tkconfig}" = x ; then
-		for i in `ls -d ${libdir} 2>/dev/null` \
-			`ls -d /usr/local/lib 2>/dev/null` \
-			`ls -d /usr/contrib/lib 2>/dev/null` \
-			`ls -d /usr/lib 2>/dev/null` \
-			; do
-		    if test -f "$i/tkConfig.sh" ; then
-			ac_cv_c_tkconfig=`(cd $i; pwd)`
-			break
-		    fi
-		done
-	    fi
-	    # check in a few other private locations
-	    if test x"${ac_cv_c_tkconfig}" = x ; then
-		for i in \
-			${srcdir}/../tk \
-			`ls -dr ${srcdir}/../tk[[8-9]].[[0-9]]* 2>/dev/null` ; do
-		    if test -f "$i/unix/tkConfig.sh" ; then
-			ac_cv_c_tkconfig=`(cd $i/unix; pwd)`
-			break
-		    fi
-		done
-	    fi
-	])
-	if test x"${ac_cv_c_tkconfig}" = x ; then
-	    TK_BIN_DIR="# no Tk configs found"
-	    AC_MSG_RESULT(can't find Tk configuration definitions)
-# no Tk is OK egm 03/25/03
-#	    AC_MSG_WARN(Can't find Tk configuration definitions)
-#	    exit 0
-	else
-	    no_tk=
-	    TK_BIN_DIR=${ac_cv_c_tkconfig}
-	    AC_MSG_RESULT(found $TK_BIN_DIR/tkConfig.sh)
-	fi
-    fi
-
-])
-
-#------------------------------------------------------------------------
-# SC_LOAD_TCLCONFIG --
-#
-#	Load the tclConfig.sh file
-#
-# Arguments:
-#	
-#	Requires the following vars to be set:
-#		TCL_BIN_DIR
-#
-# Results:
-#
-#	Subst the following vars:
-#		TCL_BIN_DIR
-#		TCL_SRC_DIR
-#		TCL_LIB_FILE
-#
-#------------------------------------------------------------------------
-
-AC_DEFUN(SC_LOAD_TCLCONFIG, [
-    AC_MSG_CHECKING([for existence of $TCL_BIN_DIR/tclConfig.sh])
-
-    if test -f "$TCL_BIN_DIR/tclConfig.sh" ; then
-        AC_MSG_RESULT([loading])
-	. $TCL_BIN_DIR/tclConfig.sh
-    else
-        AC_MSG_RESULT([file not found])
-    fi
-
-    #
-    # If the TCL_BIN_DIR is the build directory (not the install directory),
-    # then set the common variable name to the value of the build variables.
-    # For example, the variable TCL_LIB_SPEC will be set to the value
-    # of TCL_BUILD_LIB_SPEC. An extension should make use of TCL_LIB_SPEC
-    # instead of TCL_BUILD_LIB_SPEC since it will work with both an
-    # installed and uninstalled version of Tcl.
-    #
-
-    if test -f $TCL_BIN_DIR/Makefile ; then
-        TCL_LIB_SPEC=${TCL_BUILD_LIB_SPEC}
-        TCL_STUB_LIB_SPEC=${TCL_BUILD_STUB_LIB_SPEC}
-        TCL_STUB_LIB_PATH=${TCL_BUILD_STUB_LIB_PATH}
-    fi
-
-    #
-    # eval is required to do the TCL_DBGX substitution
-    #
-
-    eval "TCL_LIB_FILE=\"${TCL_LIB_FILE}\""
-    eval "TCL_LIB_FLAG=\"${TCL_LIB_FLAG}\""
-    eval "TCL_LIB_SPEC=\"${TCL_LIB_SPEC}\""
-
-    eval "TCL_STUB_LIB_FILE=\"${TCL_STUB_LIB_FILE}\""
-    eval "TCL_STUB_LIB_FLAG=\"${TCL_STUB_LIB_FLAG}\""
-    eval "TCL_STUB_LIB_SPEC=\"${TCL_STUB_LIB_SPEC}\""
-
-    AC_SUBST(TCL_VERSION)
-    AC_SUBST(TCL_BIN_DIR)
-    AC_SUBST(TCL_SRC_DIR)
-
-    AC_SUBST(TCL_LIB_FILE)
-    AC_SUBST(TCL_LIB_FLAG)
-    AC_SUBST(TCL_LIB_SPEC)
-
-    AC_SUBST(TCL_STUB_LIB_FILE)
-    AC_SUBST(TCL_STUB_LIB_FLAG)
-    AC_SUBST(TCL_STUB_LIB_SPEC)
-])
-
-#------------------------------------------------------------------------
-# SC_LOAD_TKCONFIG --
-#
-#	Load the tkConfig.sh file
-#
-# Arguments:
-#	
-#	Requires the following vars to be set:
-#		TK_BIN_DIR
-#
-# Results:
-#
-#	Sets the following vars that should be in tkConfig.sh:
-#		TK_BIN_DIR
-#------------------------------------------------------------------------
-
-AC_DEFUN(SC_LOAD_TKCONFIG, [
-    AC_MSG_CHECKING([for existence of $TK_BIN_DIR/tkConfig.sh])
-
-    if test -f "$TK_BIN_DIR/tkConfig.sh" ; then
-        AC_MSG_RESULT([loading])
-	. $TK_BIN_DIR/tkConfig.sh
-    else
-        AC_MSG_RESULT([could not find $TK_BIN_DIR/tkConfig.sh])
-    fi
-
-    AC_SUBST(TK_VERSION)
-    AC_SUBST(TK_BIN_DIR)
-    AC_SUBST(TK_SRC_DIR)
-    AC_SUBST(TK_LIB_FILE)
-])
-
-#------------------------------------------------------------------------
-# SC_ENABLE_SHARED --
-#
-#	Allows the building of shared libraries
-#
-# Arguments:
-#	none
-#	
-# Results:
-#
-#	Adds the following arguments to configure:
-#		--enable-shared=yes|no
-#
-#	Defines the following vars:
-#		STATIC_BUILD	Used for building import/export libraries
-#				on Windows.
-#
-#	Sets the following vars:
-#		SHARED_BUILD	Value of 1 or 0
-#------------------------------------------------------------------------
-
-AC_DEFUN(SC_ENABLE_SHARED, [
-    AC_MSG_CHECKING([how to build libraries])
-    AC_ARG_ENABLE(shared,
-	[  --enable-shared         build and link with shared libraries [--enable-shared]],
-	[tcl_ok=$enableval], [tcl_ok=yes])
-
-    if test "${enable_shared+set}" = set; then
-	enableval="$enable_shared"
-	tcl_ok=$enableval
-    else
-	tcl_ok=yes
-    fi
-
-    if test "$tcl_ok" = "yes" ; then
-	AC_MSG_RESULT([shared])
-	SHARED_BUILD=1
-    else
-	AC_MSG_RESULT([static])
-	SHARED_BUILD=0
-	AC_DEFINE(STATIC_BUILD)
-    fi
-])
-
-#------------------------------------------------------------------------
-# SC_ENABLE_FRAMEWORK --
-#
-#	Allows the building of shared libraries into frameworks
-#
-# Arguments:
-#	none
-#	
-# Results:
-#
-#	Adds the following arguments to configure:
-#		--enable-framework=yes|no
-#
-#	Sets the following vars:
-#		FRAMEWORK_BUILD	Value of 1 or 0
-#------------------------------------------------------------------------
-
-AC_DEFUN(SC_ENABLE_FRAMEWORK, [
-    AC_MSG_CHECKING([how to package libraries])
-    AC_ARG_ENABLE(framework,
-	[  --enable-framework      package shared libraries in frameworks [--disable-framework]],
-	[tcl_ok=$enableval], [tcl_ok=no])
-
-    if test "${enable_framework+set}" = set; then
-	enableval="$enable_framework"
-	tcl_ok=$enableval
-    else
-	tcl_ok=no
-    fi
-
-    if test "$tcl_ok" = "yes" ; then
-	AC_MSG_RESULT([framework])
-	FRAMEWORK_BUILD=1
-	if test "${SHARED_BUILD}" = "0" ; then
-	    AC_MSG_WARN("Frameworks can only be built if --enable-shared is yes")
-	    FRAMEWORK_BUILD=0
-	fi
-    else
-	AC_MSG_RESULT([standard shared library])
-	FRAMEWORK_BUILD=0
-    fi
-])
-
-#------------------------------------------------------------------------
-# SC_ENABLE_THREADS --
-#
-#	Specify if thread support should be enabled
-#
-# Arguments:
-#	none
-#	
-# Results:
-#
-#	Adds the following arguments to configure:
-#		--enable-threads
-#
-#	Sets the following vars:
-#		THREADS_LIBS	Thread library(s)
-#
-#	Defines the following vars:
-#		TCL_THREADS
-#		_REENTRANT
-#		_THREAD_SAFE
-#
-#------------------------------------------------------------------------
-
-AC_DEFUN(SC_ENABLE_THREADS, [
-    AC_MSG_CHECKING(for building with threads)
-    AC_ARG_ENABLE(threads, [  --enable-threads        build with threads],
-	[tcl_ok=$enableval], [tcl_ok=no])
-
-    if test "$tcl_ok" = "yes"; then
-	AC_MSG_RESULT(yes)
-	TCL_THREADS=1
-	AC_DEFINE(TCL_THREADS)
-	# USE_THREAD_ALLOC tells us to try the special thread-based
-	# allocator that significantly reduces lock contention
-	AC_DEFINE(USE_THREAD_ALLOC)
-	AC_DEFINE(_REENTRANT)
-	AC_DEFINE(_THREAD_SAFE)
-	AC_CHECK_LIB(pthread,pthread_mutex_init,tcl_ok=yes,tcl_ok=no)
-	if test "$tcl_ok" = "no"; then
-	    # Check a little harder for __pthread_mutex_init in the same
-	    # library, as some systems hide it there until pthread.h is
-	    # defined.  We could alternatively do an AC_TRY_COMPILE with
-	    # pthread.h, but that will work with libpthread really doesn't
-	    # exist, like AIX 4.2.  [Bug: 4359]
-	    AC_CHECK_LIB(pthread,__pthread_mutex_init,tcl_ok=yes,tcl_ok=no)
-	fi
-
-	if test "$tcl_ok" = "yes"; then
-	    # The space is needed
-	    THREADS_LIBS=" -lpthread"
-	else
-	    AC_CHECK_LIB(pthreads,pthread_mutex_init,tcl_ok=yes,tcl_ok=no)
-	    if test "$tcl_ok" = "yes"; then
-		# The space is needed
-		THREADS_LIBS=" -lpthreads"
-	    else
-		AC_CHECK_LIB(c,pthread_mutex_init,tcl_ok=yes,tcl_ok=no)
-	    	if test "$tcl_ok" = "no"; then
-		    AC_CHECK_LIB(c_r,pthread_mutex_init,tcl_ok=yes,tcl_ok=no)
-		    if test "$tcl_ok" = "yes"; then
-			# The space is needed
-			THREADS_LIBS=" -pthread"
-		    else
-			TCL_THREADS=0
-			AC_MSG_WARN("Don t know how to find pthread lib on your system - you must disable thread support or edit the LIBS in the Makefile...")
-		    fi
-	    	fi
-	    fi
-	fi
-
-	# Does the pthread-implementation provide
-	# 'pthread_attr_setstacksize' ?
-
-	ac_saved_libs=$LIBS
-	LIBS="$LIBS $THREADS_LIBS"
-	AC_CHECK_FUNCS(pthread_attr_setstacksize)
-	LIBS=$ac_saved_libs
-	AC_CHECK_FUNCS(readdir_r)
-    else
-	TCL_THREADS=0
-	AC_MSG_RESULT([no (default)])
-    fi
-    AC_SUBST(TCL_THREADS)
-])
-
-#------------------------------------------------------------------------
-# SC_ENABLE_SYMBOLS --
-#
-#	Specify if debugging symbols should be used.
-#	Memory (TCL_MEM_DEBUG) and compile (TCL_COMPILE_DEBUG) debugging
-#	can also be enabled.
-#
-# Arguments:
-#	none
-#	
-#	Requires the following vars to be set in the Makefile:
-#		CFLAGS_DEBUG
-#		CFLAGS_OPTIMIZE
-#		LDFLAGS_DEBUG
-#		LDFLAGS_OPTIMIZE
-#	
-# Results:
-#
-#	Adds the following arguments to configure:
-#		--enable-symbols
-#
-#	Defines the following vars:
-#		CFLAGS_DEFAULT	Sets to $(CFLAGS_DEBUG) if true
-#				Sets to $(CFLAGS_OPTIMIZE) if false
-#		LDFLAGS_DEFAULT	Sets to $(LDFLAGS_DEBUG) if true
-#				Sets to $(LDFLAGS_OPTIMIZE) if false
-#		DBGX		Debug library extension
-#
-#------------------------------------------------------------------------
-
-AC_DEFUN(SC_ENABLE_SYMBOLS, [
-    AC_MSG_CHECKING([for build with symbols])
-    AC_ARG_ENABLE(symbols, [  --enable-symbols        build with debugging symbols [--disable-symbols]],    [tcl_ok=$enableval], [tcl_ok=no])
-# FIXME: Currently, LDFLAGS_DEFAULT is not used, it should work like CFLAGS_DEFAULT.
-    if test "$tcl_ok" = "no"; then
-	CFLAGS_DEFAULT='$(CFLAGS_OPTIMIZE)'
-	LDFLAGS_DEFAULT='$(LDFLAGS_OPTIMIZE)'
-	DBGX=""
-	AC_MSG_RESULT([no])
-    else
-	CFLAGS_DEFAULT='$(CFLAGS_DEBUG)'
-	LDFLAGS_DEFAULT='$(LDFLAGS_DEBUG)'
-	DBGX=g
-	if test "$tcl_ok" = "yes"; then
-	    AC_MSG_RESULT([yes (standard debugging)])
-	fi
-    fi
-    AC_SUBST(CFLAGS_DEFAULT)
-    AC_SUBST(LDFLAGS_DEFAULT)
-
-    if test "$tcl_ok" = "mem" -o "$tcl_ok" = "all"; then
-	AC_DEFINE(TCL_MEM_DEBUG)
-    fi
-
-    if test "$tcl_ok" = "compile" -o "$tcl_ok" = "all"; then
-	AC_DEFINE(TCL_COMPILE_DEBUG)
-	AC_DEFINE(TCL_COMPILE_STATS)
-    fi
-
-    if test "$tcl_ok" != "yes" -a "$tcl_ok" != "no"; then
-	if test "$tcl_ok" = "all"; then
-	    AC_MSG_RESULT([enabled symbols mem compile debugging])
-	else
-	    AC_MSG_RESULT([enabled $tcl_ok debugging])
-	fi
-    fi
-])
-
-#------------------------------------------------------------------------
-# SC_ENABLE_LANGINFO --
-#
-#	Allows use of modern nl_langinfo check for better l10n.
-#	This is only relevant for Unix.
-#
-# Arguments:
-#	none
-#	
-# Results:
-#
-#	Adds the following arguments to configure:
-#		--enable-langinfo=yes|no (default is yes)
-#
-#	Defines the following vars:
-#		HAVE_LANGINFO	Triggers use of nl_langinfo if defined.
-#
-#------------------------------------------------------------------------
-
-AC_DEFUN(SC_ENABLE_LANGINFO, [
-    AC_ARG_ENABLE(langinfo,
-	[  --enable-langinfo	  use nl_langinfo if possible to determine
-			  encoding at startup, otherwise use old heuristic],
-	[langinfo_ok=$enableval], [langinfo_ok=yes])
-
-    HAVE_LANGINFO=0
-    if test "$langinfo_ok" = "yes"; then
-	if test "$langinfo_ok" = "yes"; then
-	    AC_CHECK_HEADER(langinfo.h,[langinfo_ok=yes],[langinfo_ok=no])
-	fi
-    fi
-    AC_MSG_CHECKING([whether to use nl_langinfo])
-    if test "$langinfo_ok" = "yes"; then
-	AC_TRY_COMPILE([#include <langinfo.h>],
-		[nl_langinfo(CODESET);],[langinfo_ok=yes],[langinfo_ok=no])
-	if test "$langinfo_ok" = "no"; then
-	    langinfo_ok="no (could not compile with nl_langinfo)";
-	fi
-	if test "$langinfo_ok" = "yes"; then
-	    AC_DEFINE(HAVE_LANGINFO)
-	fi
-    fi
-    AC_MSG_RESULT([$langinfo_ok])
-])
-
-#--------------------------------------------------------------------
-# SC_CONFIG_MANPAGES
-#	
-#	Decide whether to use symlinks for linking the manpages and
-#	whether to compress the manpages after installation.
-#
-# Arguments:
-#	none
-#
-# Results:
-#
-#	Adds the following arguments to configure:
-#		--enable-man-symlinks
-#		--enable-man-compression=PROG
-#
-#	Defines the following variable:
-#
-#	MKLINKS_FLAGS -		The apropriate flags for mkLinks
-#				according to the user's selection.
-#
-#--------------------------------------------------------------------
-AC_DEFUN(SC_CONFIG_MANPAGES, [
-
-	AC_MSG_CHECKING([whether to use symlinks for manpages])
-	AC_ARG_ENABLE(man-symlinks,
-		[  --enable-man-symlinks   use symlinks for the manpages],
-		test "$enableval" != "no" && MKLINKS_FLAGS="$MKLINKS_FLAGS --symlinks",
-		enableval="no")
-	AC_MSG_RESULT([$enableval])
-
-	AC_MSG_CHECKING([compression for manpages])
-	AC_ARG_ENABLE(man-compression,
-		[  --enable-man-compression=PROG
-                          compress the manpages with PROG],
-		test "$enableval" = "yes" && echo && AC_MSG_ERROR([missing argument to --enable-man-compression])
-		test "$enableval" != "no" && MKLINKS_FLAGS="$MKLINKS_FLAGS --compress $enableval",
-		enableval="no")
-	AC_MSG_RESULT([$enableval])
-
-	AC_SUBST(MKLINKS_FLAGS)
-])
-
-#--------------------------------------------------------------------
-# SC_CONFIG_CFLAGS
-#
-#	Try to determine the proper flags to pass to the compiler
-#	for building shared libraries and other such nonsense.
-#
-# Arguments:
-#	none
-#
-# Results:
-#
-#	Defines and substitutes the following vars:
-#
-#       DL_OBJS -       Name of the object file that implements dynamic
-#                       loading for Tcl on this system.
-#       DL_LIBS -       Library file(s) to include in tclsh and other base
-#                       applications in order for the "load" command to work.
-#       LDFLAGS -      Flags to pass to the compiler when linking object
-#                       files into an executable application binary such
-#                       as tclsh.
-#       LD_SEARCH_FLAGS-Flags to pass to ld, such as "-R /usr/local/tcl/lib",
-#                       that tell the run-time dynamic linker where to look
-#                       for shared libraries such as libtcl.so.  Depends on
-#                       the variable LIB_RUNTIME_DIR in the Makefile. Could
-#                       be the same as CC_SEARCH_FLAGS if ${CC} is used to link.
-#       CC_SEARCH_FLAGS-Flags to pass to ${CC}, such as "-Wl,-rpath,/usr/local/tcl/lib",
-#                       that tell the run-time dynamic linker where to look
-#                       for shared libraries such as libtcl.so.  Depends on
-#                       the variable LIB_RUNTIME_DIR in the Makefile.
-#       MAKE_LIB -      Command to execute to build the a library;
-#                       differs when building shared or static.
-#       MAKE_STUB_LIB -
-#                       Command to execute to build a stub library.
-#       INSTALL_LIB -   Command to execute to install a library;
-#                       differs when building shared or static.
-#       INSTALL_STUB_LIB -
-#                       Command to execute to install a stub library.
-#       STLIB_LD -      Base command to use for combining object files
-#                       into a static library.
-#       SHLIB_CFLAGS -  Flags to pass to cc when compiling the components
-#                       of a shared library (may request position-independent
-#                       code, among other things).
-#       SHLIB_LD -      Base command to use for combining object files
-#                       into a shared library.
-#       SHLIB_LD_FLAGS -Flags to pass when building a shared library. This
-#                       differes from the SHLIB_CFLAGS as it is not used
-#                       when building object files or executables.
-#       SHLIB_LD_LIBS - Dependent libraries for the linker to scan when
-#                       creating shared libraries.  This symbol typically
-#                       goes at the end of the "ld" commands that build
-#                       shared libraries. The value of the symbol is
-#                       "${LIBS}" if all of the dependent libraries should
-#                       be specified when creating a shared library.  If
-#                       dependent libraries should not be specified (as on
-#                       SunOS 4.x, where they cause the link to fail, or in
-#                       general if Tcl and Tk aren't themselves shared
-#                       libraries), then this symbol has an empty string
-#                       as its value.
-#       SHLIB_SUFFIX -  Suffix to use for the names of dynamically loadable
-#                       extensions.  An empty string means we don't know how
-#                       to use shared libraries on this platform.
-# TCL_SHLIB_LD_EXTRAS - Additional element which are added to SHLIB_LD_LIBS
-#  TK_SHLIB_LD_EXTRAS   for the build of Tcl and Tk, but not recorded in the
-#                       tclConfig.sh, since they are only used for the build
-#                       of Tcl and Tk. 
-#                       Examples: MacOS X records the library version and
-#                       compatibility version in the shared library.  But
-#                       of course the Tcl version of this is only used for Tcl.
-#       LIB_SUFFIX -    Specifies everything that comes after the "libfoo"
-#                       in a static or shared library name, using the $VERSION variable
-#                       to put the version in the right place.  This is used
-#                       by platforms that need non-standard library names.
-#                       Examples:  ${VERSION}.so.1.1 on NetBSD, since it needs
-#                       to have a version after the .so, and ${VERSION}.a
-#                       on AIX, since a shared library needs to have
-#                       a .a extension whereas shared objects for loadable
-#                       extensions have a .so extension.  Defaults to
-#                       ${VERSION}${SHLIB_SUFFIX}.
-#       TCL_NEEDS_EXP_FILE -
-#                       1 means that an export file is needed to link to a
-#                       shared library.
-#       TCL_EXP_FILE -  The name of the installed export / import file which
-#                       should be used to link to the Tcl shared library.
-#                       Empty if Tcl is unshared.
-#       TCL_BUILD_EXP_FILE -
-#                       The name of the built export / import file which
-#                       should be used to link to the Tcl shared library.
-#                       Empty if Tcl is unshared.
-#	CFLAGS_DEBUG -
-#			Flags used when running the compiler in debug mode
-#	CFLAGS_OPTIMIZE -
-#			Flags used when running the compiler in optimize mode
-#	EXTRA_CFLAGS
-#
-#--------------------------------------------------------------------
-
-AC_DEFUN(SC_CONFIG_CFLAGS, [
-
-    # Step 0.a: Enable 64 bit support?
-
-    AC_MSG_CHECKING([if 64bit support is requested])
-    AC_ARG_ENABLE(64bit,[  --enable-64bit          enable 64bit support (where applicable)],,enableval="no")
-
-    if test "$enableval" = "yes"; then
-	do64bit=yes
-    else
-	do64bit=no
-    fi
-    AC_MSG_RESULT($do64bit)
-
-    # Step 0.b: Enable Solaris 64 bit VIS support?
-
-    AC_MSG_CHECKING([if 64bit Sparc VIS support is requested])
-    AC_ARG_ENABLE(64bit-vis,[  --enable-64bit-vis      enable 64bit Sparc VIS support],,enableval="no")
-
-    if test "$enableval" = "yes"; then
-	# Force 64bit on with VIS
-	do64bit=yes
-	do64bitVIS=yes
-    else
-	do64bitVIS=no
-    fi
-    AC_MSG_RESULT($do64bitVIS)
-
-    # Step 1: set the variable "system" to hold the name and version number
-    # for the system.  This can usually be done via the "uname" command, but
-    # there are a few systems, like Next, where this doesn't work.
-
-    AC_MSG_CHECKING([system version (for dynamic loading)])
-    if test -f /usr/lib/NextStep/software_version; then
-	system=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version`
-    else
-	system=`uname -s`-`uname -r`
-	if test "$?" -ne 0 ; then
-	    AC_MSG_RESULT([unknown (can't find uname command)])
-	    system=unknown
-	else
-	    # Special check for weird MP-RAS system (uname returns weird
-	    # results, and the version is kept in special file).
-	
-	    if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then
-		system=MP-RAS-`awk '{print $3}' /etc/.relid'`
-	    fi
-	    if test "`uname -s`" = "AIX" ; then
-		system=AIX-`uname -v`.`uname -r`
-	    fi
-	    AC_MSG_RESULT($system)
-	fi
-    fi
-
-    # Step 2: check for existence of -ldl library.  This is needed because
-    # Linux can use either -ldl or -ldld for dynamic loading.
-
-    AC_CHECK_LIB(dl, dlopen, have_dl=yes, have_dl=no)
-
-    # Require ranlib early so we can override it in special cases below.
-
-    AC_REQUIRE([AC_PROG_RANLIB])
-
-    # Step 3: set configuration options based on system name and version.
-
-    do64bit_ok=no
-    EXTRA_CFLAGS=""
-    TCL_EXPORT_FILE_SUFFIX=""
-    UNSHARED_LIB_SUFFIX=""
-    TCL_TRIM_DOTS='`echo ${VERSION} | tr -d .`'
-    ECHO_VERSION='`echo ${VERSION}`'
-    TCL_LIB_VERSIONS_OK=ok
-    CFLAGS_DEBUG=-g
-    CFLAGS_OPTIMIZE=-O
-    if test "$GCC" = "yes" ; then
-	CFLAGS_WARNING="-Wall -Wconversion -Wno-implicit-int"
-    else
-	CFLAGS_WARNING=""
-    fi
-    TCL_NEEDS_EXP_FILE=0
-    TCL_BUILD_EXP_FILE=""
-    TCL_EXP_FILE=""
-dnl FIXME: Replace AC_CHECK_PROG with AC_CHECK_TOOL once cross compiling is fixed.
-dnl AC_CHECK_TOOL(AR, ar)
-    AC_CHECK_PROG(AR, ar, ar)
-    if test "${AR}" = "" ; then
-	AC_MSG_ERROR([Required archive tool 'ar' not found on PATH.])
-    fi
-    STLIB_LD='${AR} cr'
-    LD_LIBRARY_PATH_VAR="LD_LIBRARY_PATH"
-    PLAT_OBJS=""
-    case $system in
-	AIX-5.*)
-	    if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes" ; then
-		# AIX requires the _r compiler when gcc isn't being used
-		if test "${CC}" != "cc_r" ; then
-		    CC=${CC}_r
-		fi
-		AC_MSG_RESULT(Using $CC for compiling with threads)
-	    fi
-	    LIBS="$LIBS -lc"
-	    # AIX-5 uses ELF style dynamic libraries
-	    SHLIB_CFLAGS=""
-	    SHLIB_LD_LIBS='${LIBS}'
-	    SHLIB_SUFFIX=".so"
-	    if test "`uname -m`" = "ia64" ; then
-		# AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC
-		SHLIB_LD="/usr/ccs/bin/ld -G -z text"
-		# AIX-5 has dl* in libc.so
-		DL_LIBS=""
-		if test "$GCC" = "yes" ; then
-		    CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
-		else
-		    CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}'
-		fi
-		LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}'
-	    else
-		SHLIB_LD="${TCL_SRC_DIR}/unix/ldAix /bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry"
-		DL_LIBS="-ldl"
-		CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
-		LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
-		TCL_NEEDS_EXP_FILE=1
-		TCL_EXPORT_FILE_SUFFIX='${VERSION}\$\{DBGX\}.exp'
-	    fi
-
-	    # Note: need the LIBS below, otherwise Tk won't find Tcl's
-	    # symbols when dynamically loaded into tclsh.
-
-	    DL_OBJS="tclLoadDl.o"
-	    LDFLAGS=""
-
-	    LD_LIBRARY_PATH_VAR="LIBPATH"
-
-	    # Check to enable 64-bit flags for compiler/linker
-	    if test "$do64bit" = "yes" ; then
-		if test "$GCC" = "yes" ; then
-		    AC_MSG_WARN("64bit mode not supported with GCC on $system")
-		else 
-		    do64bit_ok=yes
-		    EXTRA_CFLAGS="-q64"
-		    LDFLAGS="-q64"
-		    RANLIB="${RANLIB} -X64"
-		    AR="${AR} -X64"
-		    SHLIB_LD_FLAGS="-b64"
-		fi
-	    fi
-	    ;;
-	AIX-*)
-	    if test "${TCL_THREADS}" = "1" -a "$GCC" != "yes" ; then
-		# AIX requires the _r compiler when gcc isn't being used
-		if test "${CC}" != "cc_r" ; then
-		    CC=${CC}_r
-		fi
-		AC_MSG_RESULT(Using $CC for compiling with threads)
-	    fi
-	    LIBS="$LIBS -lc"
-	    SHLIB_CFLAGS=""
-	    SHLIB_LD="${TCL_SRC_DIR}/unix/ldAix /bin/ld -bhalt:4 -bM:SRE -bE:lib.exp -H512 -T512 -bnoentry"
-	    SHLIB_LD_LIBS='${LIBS}'
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    DL_LIBS="-ldl"
-	    LDFLAGS=""
-	    CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
-	    LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
-	    LD_LIBRARY_PATH_VAR="LIBPATH"
-	    TCL_NEEDS_EXP_FILE=1
-	    TCL_EXPORT_FILE_SUFFIX='${VERSION}\$\{DBGX\}.exp'
-
-	    # AIX v<=4.1 has some different flags than 4.2+
-	    if test "$system" = "AIX-4.1" -o "`uname -v`" -lt "4" ; then
-		# upgrade to 2.5x egm 3/25/03
-		AC_LIBOBJ(tclLoadAix.o)
-		HAVE_COMPAT=true
-		DL_LIBS="-lld"
-	    fi
-
-	    # On AIX <=v4 systems, libbsd.a has to be linked in to support
-	    # non-blocking file IO.  This library has to be linked in after
-	    # the MATH_LIBS or it breaks the pow() function.  The way to
-	    # insure proper sequencing, is to add it to the tail of MATH_LIBS.
-	    # This library also supplies gettimeofday.
-	    #
-	    # AIX does not have a timezone field in struct tm. When the AIX
-	    # bsd library is used, the timezone global and the gettimeofday
-	    # methods are to be avoided for timezone deduction instead, we
-	    # deduce the timezone by comparing the localtime result on a
-	    # known GMT value.
-
-	    AC_CHECK_LIB(bsd, gettimeofday, libbsd=yes, libbsd=no)
-	    if test $libbsd = yes; then
-	    	MATH_LIBS="$MATH_LIBS -lbsd"
-	    	AC_DEFINE(USE_DELTA_FOR_TZ)
-	    fi
-
-	    # Check to enable 64-bit flags for compiler/linker
-	    if test "$do64bit" = "yes" ; then
-		if test "$GCC" = "yes" ; then
-		    AC_MSG_WARN("64bit mode not supported with GCC on $system")
-		else 
-		    do64bit_ok=yes
-		    EXTRA_CFLAGS="-q64"
-		    LDFLAGS="-q64"
-		    RANLIB="${RANLIB} -X64"
-		    AR="${AR} -X64"
-		    SHLIB_LD_FLAGS="-b64"
-		fi
-	    fi
-	    ;;
-	BSD/OS-2.1*|BSD/OS-3*)
-	    SHLIB_CFLAGS=""
-	    SHLIB_LD="shlicc -r"
-	    SHLIB_LD_LIBS='${LIBS}'
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    DL_LIBS="-ldl"
-	    LDFLAGS=""
-	    CC_SEARCH_FLAGS=""
-	    LD_SEARCH_FLAGS=""
-	    ;;
-	BSD/OS-4.*)
-	    SHLIB_CFLAGS="-export-dynamic -fPIC"
-	    SHLIB_LD="cc -shared"
-	    SHLIB_LD_LIBS='${LIBS}'
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    DL_LIBS="-ldl"
-	    LDFLAGS="-export-dynamic"
-	    CC_SEARCH_FLAGS=""
-	    LD_SEARCH_FLAGS=""
-	    ;;
-	dgux*)
-	    SHLIB_CFLAGS="-K PIC"
-	    SHLIB_LD="cc -G"
-	    SHLIB_LD_LIBS=""
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    DL_LIBS="-ldl"
-	    LDFLAGS=""
-	    CC_SEARCH_FLAGS=""
-	    LD_SEARCH_FLAGS=""
-	    ;;
-	HP-UX-*.11.*)
-	    # Use updated header definitions where possible
-	    AC_DEFINE(_XOPEN_SOURCE)          # Use the XOPEN network library
-	    AC_DEFINE(_XOPEN_SOURCE_EXTENDED) # Use the XOPEN network library
-	    LIBS="$LIBS -lxnet"               # Use the XOPEN network library
-
-	    SHLIB_SUFFIX=".sl"
-	    AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no)
-	    if test "$tcl_ok" = yes; then
-		SHLIB_CFLAGS="+z"
-		SHLIB_LD="ld -b"
-		SHLIB_LD_LIBS='${LIBS}'
-		DL_OBJS="tclLoadShl.o"
-		DL_LIBS="-ldld"
-		LDFLAGS="-Wl,-E"
-		CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.'
-		LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.'
-		LD_LIBRARY_PATH_VAR="SHLIB_PATH"
-	    fi
-
-	    # Users may want PA-RISC 1.1/2.0 portable code - needs HP cc
-	    #EXTRA_CFLAGS="+DAportable"
-
-	    # Check to enable 64-bit flags for compiler/linker
-	    if test "$do64bit" = "yes" ; then
-		if test "$GCC" = "yes" ; then
-		    hpux_arch=`gcc -dumpmachine`
-		    case $hpux_arch in
-			hppa64*)
-			    # 64-bit gcc in use.  Fix flags for GNU ld.
-			    do64bit_ok=yes
-			    SHLIB_LD="gcc -shared"
-			    SHLIB_LD_LIBS=""
-			    LD_SEARCH_FLAGS=''
-			    CC_SEARCH_FLAGS=''
-			    ;;
-			*)
-			    AC_MSG_WARN("64bit mode not supported with GCC on $system")
-			    ;;
-		    esac
-		else
-		    do64bit_ok=yes
-		    if test "`uname -m`" = "ia64" ; then
-			EXTRA_CFLAGS="+DD64"
-			LDFLAGS="+DD64 $LDFLAGS"
-		    else
-			EXTRA_CFLAGS="+DA2.0W"
-			LDFLAGS="+DA2.0W $LDFLAGS"
-		    fi
-		fi
-	    fi
-	    ;;
-	HP-UX-*.08.*|HP-UX-*.09.*|HP-UX-*.10.*)
-	    SHLIB_SUFFIX=".sl"
-	    AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no)
-	    if test "$tcl_ok" = yes; then
-		SHLIB_CFLAGS="+z"
-		SHLIB_LD="ld -b"
-		SHLIB_LD_LIBS=""
-		DL_OBJS="tclLoadShl.o"
-		DL_LIBS="-ldld"
-		LDFLAGS="-Wl,-E"
-		CC_SEARCH_FLAGS='-Wl,+s,+b,${LIB_RUNTIME_DIR}:.'
-		LD_SEARCH_FLAGS='+s +b ${LIB_RUNTIME_DIR}:.'
-		LD_LIBRARY_PATH_VAR="SHLIB_PATH"
-	    fi
-	    ;;
-	IRIX-4.*)
-	    SHLIB_CFLAGS="-G 0"
-	    SHLIB_SUFFIX=".a"
-	    SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0"
-	    SHLIB_LD_LIBS='${LIBS}'
-	    DL_OBJS="tclLoadAout.o"
-	    DL_LIBS=""
-	    LDFLAGS="-Wl,-D,08000000"
-	    CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
-	    LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
-	    SHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}.a'
-	    ;;
-	IRIX-5.*)
-	    SHLIB_CFLAGS=""
-	    SHLIB_LD="ld -shared -rdata_shared"
-	    SHLIB_LD_LIBS='${LIBS}'
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    DL_LIBS=""
-	    CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
-	    LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}'
-	    EXTRA_CFLAGS=""
-	    LDFLAGS=""
-	    ;;
-	IRIX-6.*|IRIX64-6.5*)
-	    SHLIB_CFLAGS=""
-	    SHLIB_LD="ld -n32 -shared -rdata_shared"
-	    SHLIB_LD_LIBS='${LIBS}'
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    DL_LIBS=""
-	    CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
-	    LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}'
-	    if test "$GCC" = "yes" ; then
-		EXTRA_CFLAGS="-mabi=n32"
-		LDFLAGS="-mabi=n32"
-	    else
-		case $system in
-		    IRIX-6.3)
-			# Use to build 6.2 compatible binaries on 6.3.
-			EXTRA_CFLAGS="-n32 -D_OLD_TERMIOS"
-			;;
-		    *)
-			EXTRA_CFLAGS="-n32"
-			;;
-		esac
-		LDFLAGS="-n32"
-	    fi
-	    ;;
-	IRIX64-6.*)
-	    SHLIB_CFLAGS=""
-	    SHLIB_LD="ld -n32 -shared -rdata_shared"
-	    SHLIB_LD_LIBS='${LIBS}'
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    DL_LIBS=""
-	    LDFLAGS=""
-	    CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
-	    LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}'
-
-	    # Check to enable 64-bit flags for compiler/linker
-
-	    if test "$do64bit" = "yes" ; then
-	        if test "$GCC" = "yes" ; then
-	            AC_MSG_WARN([64bit mode not supported by gcc])
-	        else
-	            do64bit_ok=yes
-	            SHLIB_LD="ld -64 -shared -rdata_shared"
-	            EXTRA_CFLAGS="-64"
-	            LDFLAGS="-64"
-	        fi
-	    fi
-	    ;;
-	Linux*)
-	    SHLIB_CFLAGS="-fPIC"
-	    SHLIB_LD_LIBS='${LIBS}'
-	    SHLIB_SUFFIX=".so"
-
-	    # egcs-2.91.66 on Redhat Linux 6.0 generates lots of warnings 
-	    # when you inline the string and math operations.  Turn this off to
-	    # get rid of the warnings.
-
-	    CFLAGS_OPTIMIZE="${CFLAGS_OPTIMIZE} -D__NO_STRING_INLINES -D__NO_MATH_INLINES"
-
-	    if test "$have_dl" = yes; then
-		SHLIB_LD="${CC} -shared"
-		DL_OBJS="tclLoadDl.o"
-		DL_LIBS="-ldl"
-		LDFLAGS="-rdynamic"
-		CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
-		LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
-	    else
-		AC_CHECK_HEADER(dld.h, [
-		    SHLIB_LD="ld -shared"
-		    DL_OBJS="tclLoadDld.o"
-		    DL_LIBS="-ldld"
-		    LDFLAGS=""
-		    CC_SEARCH_FLAGS=""
-		    LD_SEARCH_FLAGS=""])
-	    fi
-	    if test "`uname -m`" = "alpha" ; then
-		EXTRA_CFLAGS="-mieee"
-	    fi
-
-	    # The combo of gcc + glibc has a bug related
-	    # to inlining of functions like strtod(). The
-	    # -fno-builtin flag should address this problem
-	    # but it does not work. The -fno-inline flag
-	    # is kind of overkill but it works.
-	    # Disable inlining only when one of the
-	    # files in compat/*.c is being linked in.
-	    if test x"${HAVE_COMPAT}" = "xtrue" ; then
-	        EXTRA_CFLAGS="${EXTRA_CFLAGS} -fno-inline"
-	    fi
-
-	    # XIM peeking works under XFree86.
-	    AC_DEFINE(PEEK_XCLOSEIM)
-
-	    ;;
-	GNU*)
-	    SHLIB_CFLAGS="-fPIC"
-	    SHLIB_LD_LIBS='${LIBS}'
-	    SHLIB_SUFFIX=".so"
-
-	    if test "$have_dl" = yes; then
-		SHLIB_LD="${CC} -shared"
-		DL_OBJS=""
-		DL_LIBS="-ldl"
-		LDFLAGS="-rdynamic"
-		CC_SEARCH_FLAGS=""
-		LD_SEARCH_FLAGS=""
-	    else
-		AC_CHECK_HEADER(dld.h, [
-		    SHLIB_LD="ld -shared"
-		    DL_OBJS=""
-		    DL_LIBS="-ldld"
-		    LDFLAGS=""
-		    CC_SEARCH_FLAGS=""
-		    LD_SEARCH_FLAGS=""])
-	    fi
-	    if test "`uname -m`" = "alpha" ; then
-		EXTRA_CFLAGS="-mieee"
-	    fi
-	    ;;
-	MP-RAS-02*)
-	    SHLIB_CFLAGS="-K PIC"
-	    SHLIB_LD="cc -G"
-	    SHLIB_LD_LIBS=""
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    DL_LIBS="-ldl"
-	    LDFLAGS=""
-	    CC_SEARCH_FLAGS=""
-	    LD_SEARCH_FLAGS=""
-	    ;;
-	MP-RAS-*)
-	    SHLIB_CFLAGS="-K PIC"
-	    SHLIB_LD="cc -G"
-	    SHLIB_LD_LIBS=""
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    DL_LIBS="-ldl"
-	    LDFLAGS="-Wl,-Bexport"
-	    CC_SEARCH_FLAGS=""
-	    LD_SEARCH_FLAGS=""
-	    ;;
-	NetBSD-*|FreeBSD-[[1-2]].*|OpenBSD-*)
-	    # Not available on all versions:  check for include file.
-	    AC_CHECK_HEADER(dlfcn.h, [
-		# NetBSD/SPARC needs -fPIC, -fpic will not do.
-		SHLIB_CFLAGS="-fPIC"
-		SHLIB_LD="ld -Bshareable -x"
-		SHLIB_LD_LIBS=""
-		SHLIB_SUFFIX=".so"
-		DL_OBJS="tclLoadDl.o"
-		DL_LIBS=""
-		LDFLAGS=""
-		CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
-		LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}'
-		AC_MSG_CHECKING(for ELF)
-		AC_EGREP_CPP(yes, [
-#ifdef __ELF__
-	yes
-#endif
-		],
-		    AC_MSG_RESULT(yes)
-		    SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so',
-		    AC_MSG_RESULT(no)
-		    SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1.0'
-		)
-	    ], [
-		SHLIB_CFLAGS=""
-		SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r"
-		SHLIB_LD_LIBS='${LIBS}'
-		SHLIB_SUFFIX=".a"
-		DL_OBJS="tclLoadAout.o"
-		DL_LIBS=""
-		LDFLAGS=""
-		CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
-		LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
-		SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
-	    ])
-
-	    # FreeBSD doesn't handle version numbers with dots.
-
-	    UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
-	    TCL_LIB_VERSIONS_OK=nodots
-	    ;;
-	FreeBSD-*)
-	    # FreeBSD 3.* and greater have ELF.
-	    SHLIB_CFLAGS="-fPIC"
-	    SHLIB_LD="ld -Bshareable -x"
-	    SHLIB_LD_LIBS='${LIBS}'
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    DL_LIBS=""
-	    LDFLAGS="-export-dynamic"
-	    CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
-	    LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}'
-	    if test "${TCL_THREADS}" = "1" ; then
-		# The -pthread needs to go in the CFLAGS, not LIBS
-		LIBS=`echo $LIBS | sed s/-pthread//`
-		EXTRA_CFLAGS="-pthread"
-	    	LDFLAGS="$LDFLAGS -pthread"
-	    fi
-	    case $system in
-	    FreeBSD-3.*)
-	    	# FreeBSD-3 doesn't handle version numbers with dots.
-	    	UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
-	    	SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so'
-	    	TCL_LIB_VERSIONS_OK=nodots
-		;;
-	    esac
-	    ;;
-	Rhapsody-*|Darwin-*)
-	    SHLIB_CFLAGS="-fno-common"
-	    SHLIB_LD="cc -dynamiclib \${LDFLAGS}"
-	    TCL_SHLIB_LD_EXTRAS="-compatibility_version ${TCL_VERSION} -current_version \${VERSION} -install_name \${DYLIB_INSTALL_DIR}/\${TCL_LIB_FILE} -prebind -seg1addr 0xa000000"
-	    TK_SHLIB_LD_EXTRAS="-compatibility_version ${TK_VERSION} -current_version \${VERSION} -install_name \${DYLIB_INSTALL_DIR}/\${TK_LIB_FILE} -prebind -seg1addr 0xb000000"
-	    SHLIB_LD_LIBS='${LIBS}'
-	    SHLIB_SUFFIX=".dylib"
-	    DL_OBJS="tclLoadDyld.o"
-	    PLAT_OBJS="tclMacOSXBundle.o"
-	    DL_LIBS=""
-	    LDFLAGS="-prebind"
-	    CC_SEARCH_FLAGS=""
-	    LD_SEARCH_FLAGS=""
-	    CFLAGS_OPTIMIZE="-Os"
-	    LD_LIBRARY_PATH_VAR="DYLD_LIBRARY_PATH"
-	    # for compatibility with autoconf vers 2.13 :
-	    HACK=""
-	    EXTRA_CFLAGS="-DMA${HACK}C_OSX_TCL -DHAVE_CFBUNDLE -DUSE_VFORK -DTCL_DEFAULT_ENCODING=\\\"utf-8\\\""
-	    LIBS="$LIBS -framework CoreFoundation"
-	    ;;
-	NEXTSTEP-*)
-	    SHLIB_CFLAGS=""
-	    SHLIB_LD="cc -nostdlib -r"
-	    SHLIB_LD_LIBS=""
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadNext.o"
-	    DL_LIBS=""
-	    LDFLAGS=""
-	    CC_SEARCH_FLAGS=""
-	    LD_SEARCH_FLAGS=""
-	    ;;
-	OS/390-*)
-	    CFLAGS_OPTIMIZE=""      # Optimizer is buggy
-	    AC_DEFINE(_OE_SOCKETS)  # needed in sys/socket.h
-	    ;;      
-	OSF1-1.0|OSF1-1.1|OSF1-1.2)
-	    # OSF/1 1.[012] from OSF, and derivatives, including Paragon OSF/1
-	    SHLIB_CFLAGS=""
-	    # Hack: make package name same as library name
-	    SHLIB_LD='ld -R -export $@:'
-	    SHLIB_LD_LIBS=""
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadOSF.o"
-	    DL_LIBS=""
-	    LDFLAGS=""
-	    CC_SEARCH_FLAGS=""
-	    LD_SEARCH_FLAGS=""
-	    ;;
-	OSF1-1.*)
-	    # OSF/1 1.3 from OSF using ELF, and derivatives, including AD2
-	    SHLIB_CFLAGS="-fPIC"
-	    if test "$SHARED_BUILD" = "1" ; then
-	        SHLIB_LD="ld -shared"
-	    else
-	        SHLIB_LD="ld -non_shared"
-	    fi
-	    SHLIB_LD_LIBS=""
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    DL_LIBS=""
-	    LDFLAGS=""
-	    CC_SEARCH_FLAGS=""
-	    LD_SEARCH_FLAGS=""
-	    ;;
-	OSF1-V*)
-	    # Digital OSF/1
-	    SHLIB_CFLAGS=""
-	    if test "$SHARED_BUILD" = "1" ; then
-	        SHLIB_LD='ld -shared -expect_unresolved "*"'
-	    else
-	        SHLIB_LD='ld -non_shared -expect_unresolved "*"'
-	    fi
-	    SHLIB_LD_LIBS=""
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    DL_LIBS=""
-	    LDFLAGS=""
-	    CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}'
-	    LD_SEARCH_FLAGS='-rpath ${LIB_RUNTIME_DIR}'
-	    if test "$GCC" != "yes" ; then
-		EXTRA_CFLAGS="-DHAVE_TZSET -std1"
-	    fi
-	    # see pthread_intro(3) for pthread support on osf1, k.furukawa
-	    if test "${TCL_THREADS}" = "1" ; then
-		EXTRA_CFLAGS="${EXTRA_CFLAGS} -DHAVE_PTHREAD_ATTR_SETSTACKSIZE"
-		EXTRA_CFLAGS="${EXTRA_CFLAGS} -DTCL_THREAD_STACK_MIN=PTHREAD_STACK_MIN*64"
-		LIBS=`echo $LIBS | sed s/-lpthreads//`
-		if test "$GCC" = "yes" ; then
-		    LIBS="$LIBS -lpthread -lmach -lexc"
-		else
-		    EXTRA_CFLAGS="${EXTRA_CFLAGS} -pthread"
-		    LDFLAGS="-pthread"
-		fi
-	    fi
-
-	    ;;
-	QNX-6*)
-	    # QNX RTP
-	    # This may work for all QNX, but it was only reported for v6.
-	    SHLIB_CFLAGS="-fPIC"
-	    SHLIB_LD="ld -Bshareable -x"
-	    SHLIB_LD_LIBS=""
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    # dlopen is in -lc on QNX
-	    DL_LIBS=""
-	    LDFLAGS=""
-	    CC_SEARCH_FLAGS=""
-	    LD_SEARCH_FLAGS=""
-	    ;;
-	RISCos-*)
-	    SHLIB_CFLAGS="-G 0"
-	    SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0"
-	    SHLIB_LD_LIBS='${LIBS}'
-	    SHLIB_SUFFIX=".a"
-	    DL_OBJS="tclLoadAout.o"
-	    DL_LIBS=""
-	    LDFLAGS="-Wl,-D,08000000"
-	    CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
-	    LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
-	    ;;
-	SCO_SV-3.2*)
-	    # Note, dlopen is available only on SCO 3.2.5 and greater. However,
-	    # this test works, since "uname -s" was non-standard in 3.2.4 and
-	    # below.
-	    if test "$GCC" = "yes" ; then
-	    	SHLIB_CFLAGS="-fPIC -melf"
-	    	LDFLAGS="-melf -Wl,-Bexport"
-	    else
-	    	SHLIB_CFLAGS="-Kpic -belf"
-	    	LDFLAGS="-belf -Wl,-Bexport"
-	    fi
-	    SHLIB_LD="ld -G"
-	    SHLIB_LD_LIBS=""
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    DL_LIBS=""
-	    CC_SEARCH_FLAGS=""
-	    LD_SEARCH_FLAGS=""
-	    ;;
-	SINIX*5.4*)
-	    SHLIB_CFLAGS="-K PIC"
-	    SHLIB_LD="cc -G"
-	    SHLIB_LD_LIBS=""
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    DL_LIBS="-ldl"
-	    LDFLAGS=""
-	    CC_SEARCH_FLAGS=""
-	    LD_SEARCH_FLAGS=""
-	    ;;
-	SunOS-4*)
-	    SHLIB_CFLAGS="-PIC"
-	    SHLIB_LD="ld"
-	    SHLIB_LD_LIBS=""
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    DL_LIBS="-ldl"
-	    LDFLAGS=""
-	    CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
-	    LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
-
-	    # SunOS can't handle version numbers with dots in them in library
-	    # specs, like -ltcl7.5, so use -ltcl75 instead.  Also, it
-	    # requires an extra version number at the end of .so file names.
-	    # So, the library has to have a name like libtcl75.so.1.0
-
-	    SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.so.1.0'
-	    UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}\$\{DBGX\}.a'
-	    TCL_LIB_VERSIONS_OK=nodots
-	    ;;
-	SunOS-5.[[0-6]]*)
-
-	    # Note: If _REENTRANT isn't defined, then Solaris
-	    # won't define thread-safe library routines.
-
-	    AC_DEFINE(_REENTRANT)
-	    AC_DEFINE(_POSIX_PTHREAD_SEMANTICS)
-
-	    SHLIB_CFLAGS="-KPIC"
-
-	    # Note: need the LIBS below, otherwise Tk won't find Tcl's
-	    # symbols when dynamically loaded into tclsh.
-
-	    SHLIB_LD_LIBS='${LIBS}'
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    DL_LIBS="-ldl"
-	    LDFLAGS=""
-	    if test "$GCC" = "yes" ; then
-		SHLIB_LD="$CC -shared"
-		CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
-		LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
-	    else
-		SHLIB_LD="/usr/ccs/bin/ld -G -z text"
-		CC_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}'
-		LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
-	    fi
-	    ;;
-	SunOS-5*)
-
-	    # Note: If _REENTRANT isn't defined, then Solaris
-	    # won't define thread-safe library routines.
-
-	    AC_DEFINE(_REENTRANT)
-	    AC_DEFINE(_POSIX_PTHREAD_SEMANTICS)
-
-	    SHLIB_CFLAGS="-KPIC"
-	    LDFLAGS=""
-    
-	    # Check to enable 64-bit flags for compiler/linker
-	    if test "$do64bit" = "yes" ; then
-		arch=`isainfo`
-		if test "$arch" = "sparcv9 sparc" ; then
-			if test "$GCC" = "yes" ; then
-			    AC_MSG_WARN("64bit mode not supported with GCC on $system")
-			else
-			    do64bit_ok=yes
-			    if test "$do64bitVIS" = "yes" ; then
-				EXTRA_CFLAGS="-xarch=v9a"
-			    	LDFLAGS="-xarch=v9a"
-			    else
-				EXTRA_CFLAGS="-xarch=v9"
-			    	LDFLAGS="-xarch=v9"
-			    fi
-			fi
-		else
-		    AC_MSG_WARN("64bit mode only supported sparcv9 system")
-		fi
-	    fi
-	    
-	    # Note: need the LIBS below, otherwise Tk won't find Tcl's
-	    # symbols when dynamically loaded into tclsh.
-
-	    SHLIB_LD_LIBS='${LIBS}'
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    DL_LIBS="-ldl"
-	    if test "$GCC" = "yes" ; then
-		SHLIB_LD="$CC -shared"
-		CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
-		LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
-	    else
-		SHLIB_LD="/usr/ccs/bin/ld -G -z text"
-		CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
-		LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}'
-	    fi
-	    ;;
-	ULTRIX-4.*)
-	    SHLIB_CFLAGS="-G 0"
-	    SHLIB_SUFFIX=".a"
-	    SHLIB_LD="echo tclLdAout $CC \{$SHLIB_CFLAGS\} | `pwd`/tclsh -r -G 0"
-	    SHLIB_LD_LIBS='${LIBS}'
-	    DL_OBJS="tclLoadAout.o"
-	    DL_LIBS=""
-	    LDFLAGS="-Wl,-D,08000000"
-	    CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}'
-	    LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
-	    if test "$GCC" != "yes" ; then
-		EXTRA_CFLAGS="-DHAVE_TZSET -std1"
-	    fi
-	    ;;
-	UNIX_SV* | UnixWare-5*)
-	    SHLIB_CFLAGS="-KPIC"
-	    SHLIB_LD="cc -G"
-	    SHLIB_LD_LIBS=""
-	    SHLIB_SUFFIX=".so"
-	    DL_OBJS="tclLoadDl.o"
-	    DL_LIBS="-ldl"
-	    # Some UNIX_SV* systems (unixware 1.1.2 for example) have linkers
-	    # that don't grok the -Bexport option.  Test that it does.
-	    hold_ldflags=$LDFLAGS
-	    AC_MSG_CHECKING(for ld accepts -Bexport flag)
-	    LDFLAGS="${LDFLAGS} -Wl,-Bexport"
-	    AC_TRY_LINK(, [int i;], found=yes, found=no)
-	    LDFLAGS=$hold_ldflags
-	    AC_MSG_RESULT($found)
-	    if test $found = yes; then
-	    LDFLAGS="-Wl,-Bexport"
-	    else
-	    LDFLAGS=""
-	    fi
-	    CC_SEARCH_FLAGS=""
-	    LD_SEARCH_FLAGS=""
-	    ;;
-    esac
-
-    if test "$do64bit" = "yes" -a "$do64bit_ok" = "no" ; then
-    AC_MSG_WARN("64bit support being disabled -- don\'t know magic for this platform")
-    fi
-
-    # Step 4: If pseudo-static linking is in use (see K. B. Kenny, "Dynamic
-    # Loading for Tcl -- What Became of It?".  Proc. 2nd Tcl/Tk Workshop,
-    # New Orleans, LA, Computerized Processes Unlimited, 1994), then we need
-    # to determine which of several header files defines the a.out file
-    # format (a.out.h, sys/exec.h, or sys/exec_aout.h).  At present, we
-    # support only a file format that is more or less version-7-compatible. 
-    # In particular,
-    #	- a.out files must begin with `struct exec'.
-    #	- the N_TXTOFF on the `struct exec' must compute the seek address
-    #	  of the text segment
-    #	- The `struct exec' must contain a_magic, a_text, a_data, a_bss
-    #	  and a_entry fields.
-    # The following compilation should succeed if and only if either sys/exec.h
-    # or a.out.h is usable for the purpose.
-    #
-    # Note that the modified COFF format used on MIPS Ultrix 4.x is usable; the
-    # `struct exec' includes a second header that contains information that
-    # duplicates the v7 fields that are needed.
-
-    if test "x$DL_OBJS" = "xtclLoadAout.o" ; then
-	AC_MSG_CHECKING(sys/exec.h)
-	AC_TRY_COMPILE([#include <sys/exec.h>],[
-	    struct exec foo;
-	    unsigned long seek;
-	    int flag;
-#if defined(__mips) || defined(mips)
-	    seek = N_TXTOFF (foo.ex_f, foo.ex_o);
-#else
-	    seek = N_TXTOFF (foo);
-#endif
-	    flag = (foo.a_magic == OMAGIC);
-	    return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry;
-    ], tcl_ok=usable, tcl_ok=unusable)
-	AC_MSG_RESULT($tcl_ok)
-	if test $tcl_ok = usable; then
-	    AC_DEFINE(USE_SYS_EXEC_H)
-	else
-	    AC_MSG_CHECKING(a.out.h)
-	    AC_TRY_COMPILE([#include <a.out.h>],[
-		struct exec foo;
-		unsigned long seek;
-		int flag;
-#if defined(__mips) || defined(mips)
-		seek = N_TXTOFF (foo.ex_f, foo.ex_o);
-#else
-		seek = N_TXTOFF (foo);
-#endif
-		flag = (foo.a_magic == OMAGIC);
-		return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry;
-	    ], tcl_ok=usable, tcl_ok=unusable)
-	    AC_MSG_RESULT($tcl_ok)
-	    if test $tcl_ok = usable; then
-		AC_DEFINE(USE_A_OUT_H)
-	    else
-		AC_MSG_CHECKING(sys/exec_aout.h)
-		AC_TRY_COMPILE([#include <sys/exec_aout.h>],[
-		    struct exec foo;
-		    unsigned long seek;
-		    int flag;
-#if defined(__mips) || defined(mips)
-		    seek = N_TXTOFF (foo.ex_f, foo.ex_o);
-#else
-		    seek = N_TXTOFF (foo);
-#endif
-		    flag = (foo.a_midmag == OMAGIC);
-		    return foo.a_text + foo.a_data + foo.a_bss + foo.a_entry;
-		], tcl_ok=usable, tcl_ok=unusable)
-		AC_MSG_RESULT($tcl_ok)
-		if test $tcl_ok = usable; then
-		    AC_DEFINE(USE_SYS_EXEC_AOUT_H)
-		else
-		    DL_OBJS=""
-		fi
-	    fi
-	fi
-    fi
-
-    # Step 5: disable dynamic loading if requested via a command-line switch.
-
-    AC_ARG_ENABLE(load, [  --disable-load          disallow dynamic loading and "load" command],
-	[tcl_ok=$enableval], [tcl_ok=yes])
-    if test "$tcl_ok" = "no"; then
-	DL_OBJS=""
-    fi
-
-    if test "x$DL_OBJS" != "x" ; then
-	BUILD_DLTEST="\$(DLTEST_TARGETS)"
-    else
-	echo "Can't figure out how to do dynamic loading or shared libraries"
-	echo "on this system."
-	SHLIB_CFLAGS=""
-	SHLIB_LD=""
-	SHLIB_SUFFIX=""
-	DL_OBJS="tclLoadNone.o"
-	DL_LIBS=""
-	LDFLAGS=""
-	CC_SEARCH_FLAGS=""
-	LD_SEARCH_FLAGS=""
-	BUILD_DLTEST=""
-    fi
-
-    # If we're running gcc, then change the C flags for compiling shared
-    # libraries to the right flags for gcc, instead of those for the
-    # standard manufacturer compiler.
-
-    if test "$DL_OBJS" != "tclLoadNone.o" ; then
-	if test "$GCC" = "yes" ; then
-	    case $system in
-		AIX-*)
-		    ;;
-		BSD/OS*)
-		    ;;
-		IRIX*)
-		    ;;
-		NetBSD-*|FreeBSD-*|OpenBSD-*)
-		    ;;
-		Rhapsody-*|Darwin-*)
-		    ;;
-		RISCos-*)
-		    ;;
-		SCO_SV-3.2*)
-		    ;;
-		ULTRIX-4.*)
-		    ;;
-		*)
-		    SHLIB_CFLAGS="-fPIC"
-		    ;;
-	    esac
-	fi
-    fi
-
-    if test "$SHARED_LIB_SUFFIX" = "" ; then
-	SHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}${SHLIB_SUFFIX}'
-    fi
-    if test "$UNSHARED_LIB_SUFFIX" = "" ; then
-	UNSHARED_LIB_SUFFIX='${VERSION}\$\{DBGX\}.a'
-    fi
-
-    if test "${SHARED_BUILD}" = "1" && test "${SHLIB_SUFFIX}" != "" ; then
-        LIB_SUFFIX=${SHARED_LIB_SUFFIX}
-        MAKE_LIB='${SHLIB_LD} -o [$]@ ${SHLIB_LD_FLAGS} ${OBJS} ${SHLIB_LD_LIBS} ${TCL_SHLIB_LD_EXTRAS} ${TK_SHLIB_LD_EXTRAS} ${LD_SEARCH_FLAGS}'
-        INSTALL_LIB='$(INSTALL_LIBRARY) $(LIB_FILE) $(LIB_INSTALL_DIR)/$(LIB_FILE)'
-    else
-        LIB_SUFFIX=${UNSHARED_LIB_SUFFIX}
-
-        if test "$RANLIB" = "" ; then
-            MAKE_LIB='$(STLIB_LD) [$]@ ${OBJS}'
-            INSTALL_LIB='$(INSTALL_LIBRARY) $(LIB_FILE) $(LIB_INSTALL_DIR)/$(LIB_FILE)'
-        else
-            MAKE_LIB='${STLIB_LD} [$]@ ${OBJS} ; ${RANLIB} [$]@'
-            INSTALL_LIB='$(INSTALL_LIBRARY) $(LIB_FILE) $(LIB_INSTALL_DIR)/$(LIB_FILE) ; (cd $(LIB_INSTALL_DIR) ; $(RANLIB) $(LIB_FILE))'
-        fi
-
-dnl        Not at all clear what this was doing in Tcl's configure.in
-dnl        or why it was needed was needed. In any event, this sort of
-dnl        things needs to be done in the big loop above.
-dnl        REMOVE THIS BLOCK LATER! (mdejong)
-dnl        case $system in
-dnl            BSD/OS*)
-dnl                ;;
-dnl            AIX-[[1-4]].*)
-dnl                ;;
-dnl            *)
-dnl                SHLIB_LD_LIBS=""
-dnl                ;;
-dnl        esac
-    fi
-
-
-    # Stub lib does not depend on shared/static configuration
-    if test "$RANLIB" = "" ; then
-        MAKE_STUB_LIB='${STLIB_LD} [$]@ ${STUB_LIB_OBJS}'
-        INSTALL_STUB_LIB='$(INSTALL_LIBRARY) $(STUB_LIB_FILE) $(LIB_INSTALL_DIR)/$(STUB_LIB_FILE)'
-    else
-        MAKE_STUB_LIB='${STLIB_LD} [$]@ ${STUB_LIB_OBJS} ; ${RANLIB} [$]@'
-        INSTALL_STUB_LIB='$(INSTALL_LIBRARY) $(STUB_LIB_FILE) $(LIB_INSTALL_DIR)/$(STUB_LIB_FILE) ; (cd $(LIB_INSTALL_DIR) ; $(RANLIB) $(STUB_LIB_FILE))'
-    fi
-
-
-    AC_SUBST(DL_LIBS)
-
-    AC_SUBST(DL_OBJS)
-    AC_SUBST(PLAT_OBJS)
-    AC_SUBST(CFLAGS)
-    AC_SUBST(CFLAGS_DEBUG)
-    AC_SUBST(CFLAGS_OPTIMIZE)
-    AC_SUBST(CFLAGS_WARNING)
-    AC_SUBST(EXTRA_CFLAGS)
-
-    AC_SUBST(LDFLAGS)
-    AC_SUBST(LDFLAGS_DEBUG)
-    AC_SUBST(LDFLAGS_OPTIMIZE)
-    AC_SUBST(CC_SEARCH_FLAGS)
-    AC_SUBST(LD_SEARCH_FLAGS)
-
-    AC_SUBST(STLIB_LD)
-    AC_SUBST(SHLIB_LD)
-    AC_SUBST(TCL_SHLIB_LD_EXTRAS)
-    AC_SUBST(TK_SHLIB_LD_EXTRAS)
-    AC_SUBST(SHLIB_LD_FLAGS)
-    AC_SUBST(SHLIB_LD_LIBS)
-    AC_SUBST(SHLIB_CFLAGS)
-    AC_SUBST(SHLIB_SUFFIX)
-
-    AC_SUBST(MAKE_LIB)
-    AC_SUBST(MAKE_STUB_LIB)
-    AC_SUBST(INSTALL_LIB)
-    AC_SUBST(INSTALL_STUB_LIB)
-    AC_SUBST(RANLIB)
-])
-
-#--------------------------------------------------------------------
-# SC_SERIAL_PORT
-#
-#	Determine which interface to use to talk to the serial port.
-#	Note that #include lines must begin in leftmost column for
-#	some compilers to recognize them as preprocessor directives,
-#	and some build environments have stdin not pointing at a
-#	pseudo-terminal (usually /dev/null instead.)
-#
-# Arguments:
-#	none
-#	
-# Results:
-#
-#	Defines only one of the following vars:
-#		HAVE_SYS_MODEM_H
-#		USE_TERMIOS
-#		USE_TERMIO
-#		USE_SGTTY
-#
-#--------------------------------------------------------------------
-
-AC_DEFUN(SC_SERIAL_PORT, [
-    AC_CHECK_HEADERS(sys/modem.h)
-    AC_MSG_CHECKING([termios vs. termio vs. sgtty])
-    AC_CACHE_VAL(tcl_cv_api_serial, [
-    AC_TRY_RUN([
-#include <termios.h>
-
-int main() {
-    struct termios t;
-    if (tcgetattr(0, &t) == 0) {
-	cfsetospeed(&t, 0);
-	t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB;
-	return 0;
-    }
-    return 1;
-}], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no)
-    if test $tcl_cv_api_serial = no ; then
-	AC_TRY_RUN([
-#include <termio.h>
-
-int main() {
-    struct termio t;
-    if (ioctl(0, TCGETA, &t) == 0) {
-	t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB;
-	return 0;
-    }
-    return 1;
-}], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no)
-    fi
-    if test $tcl_cv_api_serial = no ; then
-	AC_TRY_RUN([
-#include <sgtty.h>
-
-int main() {
-    struct sgttyb t;
-    if (ioctl(0, TIOCGETP, &t) == 0) {
-	t.sg_ospeed = 0;
-	t.sg_flags |= ODDP | EVENP | RAW;
-	return 0;
-    }
-    return 1;
-}], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=no, tcl_cv_api_serial=no)
-    fi
-    if test $tcl_cv_api_serial = no ; then
-	AC_TRY_RUN([
-#include <termios.h>
-#include <errno.h>
-
-int main() {
-    struct termios t;
-    if (tcgetattr(0, &t) == 0
-	|| errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
-	cfsetospeed(&t, 0);
-	t.c_cflag |= PARENB | PARODD | CSIZE | CSTOPB;
-	return 0;
-    }
-    return 1;
-}], tcl_cv_api_serial=termios, tcl_cv_api_serial=no, tcl_cv_api_serial=no)
-    fi
-    if test $tcl_cv_api_serial = no; then
-	AC_TRY_RUN([
-#include <termio.h>
-#include <errno.h>
-
-int main() {
-    struct termio t;
-    if (ioctl(0, TCGETA, &t) == 0
-	|| errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
-	t.c_cflag |= CBAUD | PARENB | PARODD | CSIZE | CSTOPB;
-	return 0;
-    }
-    return 1;
-    }], tcl_cv_api_serial=termio, tcl_cv_api_serial=no, tcl_cv_api_serial=no)
-    fi
-    if test $tcl_cv_api_serial = no; then
-	AC_TRY_RUN([
-#include <sgtty.h>
-#include <errno.h>
-
-int main() {
-    struct sgttyb t;
-    if (ioctl(0, TIOCGETP, &t) == 0
-	|| errno == ENOTTY || errno == ENXIO || errno == EINVAL) {
-	t.sg_ospeed = 0;
-	t.sg_flags |= ODDP | EVENP | RAW;
-	return 0;
-    }
-    return 1;
-}], tcl_cv_api_serial=sgtty, tcl_cv_api_serial=none, tcl_cv_api_serial=none)
-    fi])
-    case $tcl_cv_api_serial in
-	termios) AC_DEFINE(USE_TERMIOS);;
-	termio)  AC_DEFINE(USE_TERMIO);;
-	sgtty)   AC_DEFINE(USE_SGTTY);;
-    esac
-    AC_MSG_RESULT($tcl_cv_api_serial)
-])
-
-#--------------------------------------------------------------------
-# SC_MISSING_POSIX_HEADERS
-#
-#	Supply substitutes for missing POSIX header files.  Special
-#	notes:
-#	    - stdlib.h doesn't define strtol, strtoul, or
-#	      strtod insome versions of SunOS
-#	    - some versions of string.h don't declare procedures such
-#	      as strstr
-#
-# Arguments:
-#	none
-#	
-# Results:
-#
-#	Defines some of the following vars:
-#		NO_DIRENT_H
-#		NO_ERRNO_H
-#		NO_VALUES_H
-#		NO_LIMITS_H
-#		NO_STDLIB_H
-#		NO_STRING_H
-#		NO_SYS_WAIT_H
-#		NO_DLFCN_H
-#		HAVE_UNISTD_H
-#		HAVE_SYS_PARAM_H
-#
-#		HAVE_STRING_H ?
-#
-#--------------------------------------------------------------------
-
-AC_DEFUN(SC_MISSING_POSIX_HEADERS, [
-    AC_MSG_CHECKING(dirent.h)
-    AC_TRY_LINK([#include <sys/types.h>
-#include <dirent.h>], [
-#ifndef _POSIX_SOURCE
-#   ifdef __Lynx__
-	/*
-	 * Generate compilation error to make the test fail:  Lynx headers
-	 * are only valid if really in the POSIX environment.
-	 */
-
-	missing_procedure();
-#   endif
-#endif
-DIR *d;
-struct dirent *entryPtr;
-char *p;
-d = opendir("foobar");
-entryPtr = readdir(d);
-p = entryPtr->d_name;
-closedir(d);
-], tcl_ok=yes, tcl_ok=no)
-
-    if test $tcl_ok = no; then
-	AC_DEFINE(NO_DIRENT_H)
-    fi
-
-    AC_MSG_RESULT($tcl_ok)
-    AC_CHECK_HEADER(errno.h, , [AC_DEFINE(NO_ERRNO_H)])
-    AC_CHECK_HEADER(float.h, , [AC_DEFINE(NO_FLOAT_H)])
-    AC_CHECK_HEADER(values.h, , [AC_DEFINE(NO_VALUES_H)])
-    AC_CHECK_HEADER(limits.h, , [AC_DEFINE(NO_LIMITS_H)])
-    AC_CHECK_HEADER(stdlib.h, tcl_ok=1, tcl_ok=0)
-    AC_EGREP_HEADER(strtol, stdlib.h, , tcl_ok=0)
-    AC_EGREP_HEADER(strtoul, stdlib.h, , tcl_ok=0)
-    AC_EGREP_HEADER(strtod, stdlib.h, , tcl_ok=0)
-    if test $tcl_ok = 0; then
-	AC_DEFINE(NO_STDLIB_H)
-    fi
-    AC_CHECK_HEADER(string.h, tcl_ok=1, tcl_ok=0)
-    AC_EGREP_HEADER(strstr, string.h, , tcl_ok=0)
-    AC_EGREP_HEADER(strerror, string.h, , tcl_ok=0)
-
-    # See also memmove check below for a place where NO_STRING_H can be
-    # set and why.
-
-    if test $tcl_ok = 0; then
-	AC_DEFINE(NO_STRING_H)
-    fi
-
-    AC_CHECK_HEADER(sys/wait.h, , [AC_DEFINE(NO_SYS_WAIT_H)])
-    AC_CHECK_HEADER(dlfcn.h, , [AC_DEFINE(NO_DLFCN_H)])
-
-    # OS/390 lacks sys/param.h (and doesn't need it, by chance).
-
-    AC_HAVE_HEADERS(unistd.h sys/param.h)
-
-])
-
-#--------------------------------------------------------------------
-# SC_PATH_X
-#
-#	Locate the X11 header files and the X11 library archive.  Try
-#	the ac_path_x macro first, but if it doesn't find the X stuff
-#	(e.g. because there's no xmkmf program) then check through
-#	a list of possible directories.  Under some conditions the
-#	autoconf macro will return an include directory that contains
-#	no include files, so double-check its result just to be safe.
-#
-# Arguments:
-#	none
-#	
-# Results:
-#
-#	Sets the the following vars:
-#		XINCLUDES
-#		XLIBSW
-#
-#--------------------------------------------------------------------
-
-AC_DEFUN(SC_PATH_X, [
-    AC_PATH_X
-    not_really_there=""
-    if test "$no_x" = ""; then
-	if test "$x_includes" = ""; then
-	    AC_TRY_CPP([#include <X11/XIntrinsic.h>], , not_really_there="yes")
-	else
-	    if test ! -r $x_includes/X11/Intrinsic.h; then
-		not_really_there="yes"
-	    fi
-	fi
-    fi
-    if test "$no_x" = "yes" -o "$not_really_there" = "yes"; then
-	AC_MSG_CHECKING(for X11 header files)
-	found_xincludes="no"
-	AC_TRY_CPP([#include <X11/Intrinsic.h>], found_xincludes="yes", found_xincludes="no")
-	if test "$found_xincludes" = "no"; then
-	    dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/X11R6/include /usr/X11R5/include /usr/include/X11R5 /usr/include/X11R4 /usr/openwin/include /usr/X11/include /usr/sww/include"
-	    for i in $dirs ; do
-		if test -r $i/X11/Intrinsic.h; then
-		    AC_MSG_RESULT($i)
-		    XINCLUDES=" -I$i"
-		    found_xincludes="yes"
-		    break
-		fi
-	    done
-	fi
-    else
-	if test "$x_includes" != ""; then
-	    XINCLUDES="-I$x_includes"
-	    found_xincludes="yes"
-	fi
-    fi
-    if test found_xincludes = "no"; then
-	AC_MSG_RESULT(couldn't find any!)
-    fi
-
-    if test "$no_x" = yes; then
-	AC_MSG_CHECKING(for X11 libraries)
-	XLIBSW=nope
-	dirs="/usr/unsupported/lib /usr/local/lib /usr/X386/lib /usr/X11R6/lib /usr/X11R5/lib /usr/lib/X11R5 /usr/lib/X11R4 /usr/openwin/lib /usr/X11/lib /usr/sww/X11/lib"
-	for i in $dirs ; do
-	    if test -r $i/libX11.a -o -r $i/libX11.so -o -r $i/libX11.sl; then
-		AC_MSG_RESULT($i)
-		XLIBSW="-L$i -lX11"
-		x_libraries="$i"
-		break
-	    fi
-	done
-    else
-	if test "$x_libraries" = ""; then
-	    XLIBSW=-lX11
-	else
-	    XLIBSW="-L$x_libraries -lX11"
-	fi
-    fi
-    if test "$XLIBSW" = nope ; then
-	AC_CHECK_LIB(Xwindow, XCreateWindow, XLIBSW=-lXwindow)
-    fi
-    if test "$XLIBSW" = nope ; then
-	AC_MSG_RESULT(couldn't find any!  Using -lX11.)
-	XLIBSW=-lX11
-    fi
-])
-#--------------------------------------------------------------------
-# SC_BLOCKING_STYLE
-#
-#	The statements below check for systems where POSIX-style
-#	non-blocking I/O (O_NONBLOCK) doesn't work or is unimplemented. 
-#	On these systems (mostly older ones), use the old BSD-style
-#	FIONBIO approach instead.
-#
-# Arguments:
-#	none
-#	
-# Results:
-#
-#	Defines some of the following vars:
-#		HAVE_SYS_IOCTL_H
-#		HAVE_SYS_FILIO_H
-#		USE_FIONBIO
-#		O_NONBLOCK
-#
-#--------------------------------------------------------------------
-
-AC_DEFUN(SC_BLOCKING_STYLE, [
-    AC_CHECK_HEADERS(sys/ioctl.h)
-    AC_CHECK_HEADERS(sys/filio.h)
-    AC_MSG_CHECKING([FIONBIO vs. O_NONBLOCK for nonblocking I/O])
-    if test -f /usr/lib/NextStep/software_version; then
-	system=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version`
-    else
-	system=`uname -s`-`uname -r`
-	if test "$?" -ne 0 ; then
-	    system=unknown
-	else
-	    # Special check for weird MP-RAS system (uname returns weird
-	    # results, and the version is kept in special file).
-	
-	    if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then
-		system=MP-RAS-`awk '{print $3}' /etc/.relid'`
-	    fi
-	    if test "`uname -s`" = "AIX" ; then
-		system=AIX-`uname -v`.`uname -r`
-	    fi
-	fi
-    fi
-    case $system in
-	# There used to be code here to use FIONBIO under AIX.  However, it
-	# was reported that FIONBIO doesn't work under AIX 3.2.5.  Since
-	# using O_NONBLOCK seems fine under AIX 4.*, I removed the FIONBIO
-	# code (JO, 5/31/97).
-
-	OSF*)
-	    AC_DEFINE(USE_FIONBIO)
-	    AC_MSG_RESULT(FIONBIO)
-	    ;;
-	SunOS-4*)
-	    AC_DEFINE(USE_FIONBIO)
-	    AC_MSG_RESULT(FIONBIO)
-	    ;;
-	ULTRIX-4.*)
-	    AC_DEFINE(USE_FIONBIO)
-	    AC_MSG_RESULT(FIONBIO)
-	    ;;
-	*)
-	    AC_MSG_RESULT(O_NONBLOCK)
-	    ;;
-    esac
-])
-
-#--------------------------------------------------------------------
-# SC_TIME_HANLDER
-#
-#	Checks how the system deals with time.h, what time structures
-#	are used on the system, and what fields the structures have.
-#
-# Arguments:
-#	none
-#	
-# Results:
-#
-#	Defines some of the following vars:
-#		USE_DELTA_FOR_TZ
-#		HAVE_TM_GMTOFF
-#		HAVE_TM_TZADJ
-#		HAVE_TIMEZONE_VAR
-#
-#--------------------------------------------------------------------
-
-AC_DEFUN(SC_TIME_HANDLER, [
-    AC_CHECK_HEADERS(sys/time.h)
-    AC_HEADER_TIME
-    AC_STRUCT_TIMEZONE
-
-    AC_CHECK_FUNCS(gmtime_r localtime_r)
-
-    AC_MSG_CHECKING([tm_tzadj in struct tm])
-    AC_CACHE_VAL(tcl_cv_member_tm_tzadj,
-	AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_tzadj;],
-	    tcl_cv_member_tm_tzadj=yes, tcl_cv_member_tm_tzadj=no))
-    AC_MSG_RESULT($tcl_cv_member_tm_tzadj)
-    if test $tcl_cv_member_tm_tzadj = yes ; then
-	AC_DEFINE(HAVE_TM_TZADJ)
-    fi
-
-    AC_MSG_CHECKING([tm_gmtoff in struct tm])
-    AC_CACHE_VAL(tcl_cv_member_tm_gmtoff,
-	AC_TRY_COMPILE([#include <time.h>], [struct tm tm; tm.tm_gmtoff;],
-	    tcl_cv_member_tm_gmtoff=yes, tcl_cv_member_tm_gmtoff=no))
-    AC_MSG_RESULT($tcl_cv_member_tm_gmtoff)
-    if test $tcl_cv_member_tm_gmtoff = yes ; then
-	AC_DEFINE(HAVE_TM_GMTOFF)
-    fi
-
-    #
-    # Its important to include time.h in this check, as some systems
-    # (like convex) have timezone functions, etc.
-    #
-    AC_MSG_CHECKING([long timezone variable])
-    AC_CACHE_VAL(tcl_cv_var_timezone,
-	AC_TRY_COMPILE([#include <time.h>],
-	    [extern long timezone;
-	    timezone += 1;
-	    exit (0);],
-	    tcl_cv_timezone_long=yes, tcl_cv_timezone_long=no))
-    AC_MSG_RESULT($tcl_cv_timezone_long)
-    if test $tcl_cv_timezone_long = yes ; then
-	AC_DEFINE(HAVE_TIMEZONE_VAR)
-    else
-	#
-	# On some systems (eg IRIX 6.2), timezone is a time_t and not a long.
-	#
-	AC_MSG_CHECKING([time_t timezone variable])
-	AC_CACHE_VAL(tcl_cv_timezone_time,
-	    AC_TRY_COMPILE([#include <time.h>],
-		[extern time_t timezone;
-		timezone += 1;
-		exit (0);],
-		tcl_cv_timezone_time=yes, tcl_cv_timezone_time=no))
-	AC_MSG_RESULT($tcl_cv_timezone_time)
-	if test $tcl_cv_timezone_time = yes ; then
-	    AC_DEFINE(HAVE_TIMEZONE_VAR)
-	fi
-    fi
-])
-
-#--------------------------------------------------------------------
-# SC_BUGGY_STRTOD
-#
-#	Under Solaris 2.4, strtod returns the wrong value for the
-#	terminating character under some conditions.  Check for this
-#	and if the problem exists use a substitute procedure
-#	"fixstrtod" (provided by Tcl) that corrects the error.
-#	Also, on Compaq's Tru64 Unix 5.0,
-#	strtod(" ") returns 0.0 instead of a failure to convert.
-#
-# Arguments:
-#	none
-#	
-# Results:
-#
-#	Might defines some of the following vars:
-#		strtod (=fixstrtod)
-#
-#--------------------------------------------------------------------
-
-AC_DEFUN(SC_BUGGY_STRTOD, [
-    AC_CHECK_FUNC(strtod, tcl_strtod=1, tcl_strtod=0)
-    if test "$tcl_strtod" = 1; then
-	AC_MSG_CHECKING([for Solaris2.4/Tru64 strtod bugs])
-	AC_CACHE_VAL(tcl_cv_strtod_buggy,[
-	    AC_TRY_RUN([
-		extern double strtod();
-		int main() {
-		    char *infString="Inf", *nanString="NaN", *spaceString=" ";
-		    char *term;
-		    double value;
-		    value = strtod(infString, &term);
-		    if ((term != infString) && (term[-1] == 0)) {
-			exit(1);
-		    }
-		    value = strtod(nanString, &term);
-		    if ((term != nanString) && (term[-1] == 0)) {
-			exit(1);
-		    }
-		    value = strtod(spaceString, &term);
-		    if (term == (spaceString+1)) {
-			exit(1);
-		    }
-		    exit(0);
-		}], tcl_cv_strtod_buggy=1, tcl_cv_strtod_buggy=0, tcl_cv_strtod_buggy=0)])
-	if test "$tcl_cv_strtod_buggy" = 1; then
-	    AC_MSG_RESULT(ok)
-	else
-	    AC_MSG_RESULT(buggy)
-	    # upgrade to 2.5x egm 3/25/03
-	    AC_LIBOBJ(fixstrtod.o)
-	    HAVE_COMPAT=true
-	    AC_DEFINE(strtod, fixstrtod)
-	fi
-    fi
-])
-
-#--------------------------------------------------------------------
-# SC_TCL_LINK_LIBS
-#
-#	Search for the libraries needed to link the Tcl shell.
-#	Things like the math library (-lm) and socket stuff (-lsocket vs.
-#	-lnsl) are dealt with here.
-#
-# Arguments:
-#	Requires the following vars to be set in the Makefile:
-#		DL_LIBS
-#		LIBS
-#		MATH_LIBS
-#	
-# Results:
-#
-#	Subst's the following var:
-#		TCL_LIBS
-#		MATH_LIBS
-#
-#	Might append to the following vars:
-#		LIBS
-#
-#	Might define the following vars:
-#		HAVE_NET_ERRNO_H
-#
-#--------------------------------------------------------------------
-
-AC_DEFUN(SC_TCL_LINK_LIBS, [
-    #--------------------------------------------------------------------
-    # On a few very rare systems, all of the libm.a stuff is
-    # already in libc.a.  Set compiler flags accordingly.
-    # Also, Linux requires the "ieee" library for math to work
-    # right (and it must appear before "-lm").
-    #--------------------------------------------------------------------
-
-    AC_CHECK_FUNC(sin, MATH_LIBS="", MATH_LIBS="-lm")
-    AC_CHECK_LIB(ieee, main, [MATH_LIBS="-lieee $MATH_LIBS"])
-
-    #--------------------------------------------------------------------
-    # Interactive UNIX requires -linet instead of -lsocket, plus it
-    # needs net/errno.h to define the socket-related error codes.
-    #--------------------------------------------------------------------
-
-    AC_CHECK_LIB(inet, main, [LIBS="$LIBS -linet"])
-    AC_CHECK_HEADER(net/errno.h, [AC_DEFINE(HAVE_NET_ERRNO_H)])
-
-    #--------------------------------------------------------------------
-    #	Check for the existence of the -lsocket and -lnsl libraries.
-    #	The order here is important, so that they end up in the right
-    #	order in the command line generated by make.  Here are some
-    #	special considerations:
-    #	1. Use "connect" and "accept" to check for -lsocket, and
-    #	   "gethostbyname" to check for -lnsl.
-    #	2. Use each function name only once:  can't redo a check because
-    #	   autoconf caches the results of the last check and won't redo it.
-    #	3. Use -lnsl and -lsocket only if they supply procedures that
-    #	   aren't already present in the normal libraries.  This is because
-    #	   IRIX 5.2 has libraries, but they aren't needed and they're
-    #	   bogus:  they goof up name resolution if used.
-    #	4. On some SVR4 systems, can't use -lsocket without -lnsl too.
-    #	   To get around this problem, check for both libraries together
-    #	   if -lsocket doesn't work by itself.
-    #--------------------------------------------------------------------
-
-    tcl_checkBoth=0
-    AC_CHECK_FUNC(connect, tcl_checkSocket=0, tcl_checkSocket=1)
-    if test "$tcl_checkSocket" = 1; then
-	AC_CHECK_FUNC(setsockopt, , [AC_CHECK_LIB(socket, setsockopt,
-	    LIBS="$LIBS -lsocket", tcl_checkBoth=1)])
-    fi
-    if test "$tcl_checkBoth" = 1; then
-	tk_oldLibs=$LIBS
-	LIBS="$LIBS -lsocket -lnsl"
-	AC_CHECK_FUNC(accept, tcl_checkNsl=0, [LIBS=$tk_oldLibs])
-    fi
-    AC_CHECK_FUNC(gethostbyname, , [AC_CHECK_LIB(nsl, gethostbyname,
-	    [LIBS="$LIBS -lnsl"])])
-    
-    # Don't perform the eval of the libraries here because DL_LIBS
-    # won't be set until we call SC_CONFIG_CFLAGS
-
-    TCL_LIBS='${DL_LIBS} ${LIBS} ${MATH_LIBS}'
-    AC_SUBST(TCL_LIBS)
-    AC_SUBST(MATH_LIBS)
-])
-
-#--------------------------------------------------------------------
-# SC_TCL_EARLY_FLAGS
-#
-#	Check for what flags are needed to be passed so the correct OS
-#	features are available.
-#
-# Arguments:
-#	None
-#	
-# Results:
-#
-#	Might define the following vars:
-#		_ISOC99_SOURCE
-#		_LARGEFILE64_SOURCE
-#
-#--------------------------------------------------------------------
-
-AC_DEFUN(SC_TCL_EARLY_FLAG,[
-    AC_CACHE_VAL([tcl_cv_flag_]translit($1,[A-Z],[a-z]),
-	AC_TRY_COMPILE([$2], $3, [tcl_cv_flag_]translit($1,[A-Z],[a-z])=no,
-	    AC_TRY_COMPILE([[#define ]$1[ 1
-]$2], $3,
-		[tcl_cv_flag_]translit($1,[A-Z],[a-z])=yes,
-		[tcl_cv_flag_]translit($1,[A-Z],[a-z])=no)))
-    if test ["x${tcl_cv_flag_]translit($1,[A-Z],[a-z])[}" = "xyes"] ; then
-	AC_DEFINE($1)
-	tcl_flags="$tcl_flags $1"
-    fi])
-
-AC_DEFUN(SC_TCL_EARLY_FLAGS,[
-    AC_MSG_CHECKING([for required early compiler flags])
-    tcl_flags=""
-    SC_TCL_EARLY_FLAG(_ISOC99_SOURCE,[#include <stdlib.h>],
-	[char *p = (char *)strtoll; char *q = (char *)strtoull;])
-    SC_TCL_EARLY_FLAG(_LARGEFILE64_SOURCE,[#include <sys/stat.h>],
-	[struct stat64 buf; int i = stat64("/", &buf);])
-    if test "x${tcl_flags}" = "x" ; then
-	AC_MSG_RESULT(none)
-    else
-	AC_MSG_RESULT(${tcl_flags})
-    fi])
-
-#--------------------------------------------------------------------
-# SC_TCL_64BIT_FLAGS
-#
-#	Check for what is defined in the way of 64-bit features.
-#
-# Arguments:
-#	None
-#	
-# Results:
-#
-#	Might define the following vars:
-#		TCL_WIDE_INT_IS_LONG
-#		TCL_WIDE_INT_TYPE
-#		HAVE_STRUCT_DIRENT64
-#		HAVE_STRUCT_STAT64
-#		HAVE_TYPE_OFF64_T
-#
-#--------------------------------------------------------------------
-
-AC_DEFUN(SC_TCL_64BIT_FLAGS, [
-    AC_MSG_CHECKING([for 64-bit integer type])
-    AC_CACHE_VAL(tcl_cv_type_64bit,[
-	tcl_cv_type_64bit=none
-	# See if the compiler knows natively about __int64
-	AC_TRY_COMPILE(,[__int64 value = (__int64) 0;],
-	    tcl_type_64bit=__int64, tcl_type_64bit="long long")
-	# See if we should use long anyway  Note that we substitute in the
-	# type that is our current guess for a 64-bit type inside this check
-	# program, so it should be modified only carefully...
-	AC_TRY_RUN([#include <unistd.h>
-	    int main() {exit(!(sizeof(]${tcl_type_64bit}[) > sizeof(long)));}
-	    ], tcl_cv_type_64bit=${tcl_type_64bit},:,:)])
-    if test "${tcl_cv_type_64bit}" = none ; then
-	AC_DEFINE(TCL_WIDE_INT_IS_LONG)
-	AC_MSG_RESULT(using long)
-    else
-	AC_DEFINE_UNQUOTED(TCL_WIDE_INT_TYPE,${tcl_cv_type_64bit})
-	AC_MSG_RESULT(${tcl_cv_type_64bit})
-
-	# Now check for auxiliary declarations
-	AC_MSG_CHECKING([for struct dirent64])
-	AC_CACHE_VAL(tcl_cv_struct_dirent64,[
-	    AC_TRY_COMPILE([#include <sys/types.h>
-#include <sys/dirent.h>],[struct dirent64 p;],
-		tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)])
-	if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then
-	    AC_DEFINE(HAVE_STRUCT_DIRENT64)
-	fi
-	AC_MSG_RESULT(${tcl_cv_struct_dirent64})
-
-	AC_MSG_CHECKING([for struct stat64])
-	AC_CACHE_VAL(tcl_cv_struct_stat64,[
-	    AC_TRY_COMPILE([#include <sys/stat.h>],[struct stat64 p;
-],
-		tcl_cv_struct_stat64=yes,tcl_cv_struct_stat64=no)])
-	if test "x${tcl_cv_struct_stat64}" = "xyes" ; then
-	    AC_DEFINE(HAVE_STRUCT_STAT64)
-	fi
-	AC_MSG_RESULT(${tcl_cv_struct_stat64})
-
-	AC_MSG_CHECKING([for off64_t])
-	AC_CACHE_VAL(tcl_cv_type_off64_t,[
-	    AC_TRY_COMPILE([#include <sys/types.h>],[off64_t offset;
-],
-		tcl_cv_type_off64_t=yes,tcl_cv_type_off64_t=no)])
-	if test "x${tcl_cv_type_off64_t}" = "xyes" ; then
-	    AC_DEFINE(HAVE_TYPE_OFF64_T)
-	fi
-	AC_MSG_RESULT(${tcl_cv_type_off64_t})
-    fi])
diff --git a/xpa/tclloop.c b/xpa/tclloop.c
deleted file mode 100644
index a8b4ac5..0000000
--- a/xpa/tclloop.c
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-#include <xpap.h>
-
-#if HAVE_TCL
-
-#include <tcl.h>
-
-/* We build XPA on Windows using Cygwin and, for convenience, we sense the
-   presence of Windows by the presence of Cygwin. This is important for Tcl
-   because Windows does not support Tcl_CreateFileHandler */
-#ifndef HAVE_TCLFILEHANDLER
-#if HAVE_CYGWIN|HAVE_MINGW32
-#define HAVE_TCLFILEHANDLER 0
-#else
-#define HAVE_TCLFILEHANDLER 1
-#endif
-#endif
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- * 			Private Routines and Data
- *
- *
- *----------------------------------------------------------------------------
- */
-
-#define TCL_SOCKET TCL_UNIX_FD
-
-/* 
- *
- * record struct for maintining Tcl info in Tcl select loop
- *
- */
-typedef struct xpatclrec{
-  Tcl_Event header;
-  int fd;
-  void *client_data;
-} *XPATcl, XPATclRec;
-
-
-#if HAVE_TCLFILEHANDLER
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPATclHandler
- *
- * Purpose:	handle one request for an xpaset or xpaget
- *
- * Return:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-XPATclHandler (ClientData client_data, int mask)
-#else
-static void XPATclHandler(client_data, mask)
-     ClientData client_data;
-     int mask;
-#endif
-{
-  XPATcl xptr = (XPATcl)client_data;
-  if( (xptr == NULL) || (xptr->client_data == NULL) )
-    return;
-  XPAHandler((XPA)xptr->client_data, xptr->fd);
-}
-
-#else
-
-#define TCL_BLOCKTIME_SEC   0
-#define TCL_BLOCKTIME_USEC  1000
-
-/*
- *----------------------------------------------------------------------
- *
- * XPAEventProc --
- *
- *	This procedure is called by Tcl_ServiceEvent when an XPA event
- *	reaches the front of the event queue.  This procedure is
- *	responsible for notifying the generic channel code.
- *
- * Results:
- *	Returns 1 if the event was handled, meaning it should be removed
- *	from the queue.  Returns 0 if the event was not handled, meaning
- *	it should stay on the queue.  The only time the event isn't
- *	handled is if the TCL_FILE_EVENTS flag bit isn't set.
- *
- * Side effects:
- *	Whatever the channel callback procedures do.
- *
- *----------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPAEventProc(Tcl_Event *evPtr, int flags)
-#else
-static int
-XPAEventProc(evPtr, flags)
-    Tcl_Event *evPtr;		/* Event to service. */
-    int flags;			/* Flags that indicate what events to
-				 * handle, such as TCL_FILE_EVENTS. */
-#endif
-{
-  XPATcl xptr = (XPATcl)evPtr;
-  if( xptr && xptr->client_data )
-    XPAHandler((XPA)xptr->client_data, xptr->fd);
-  return 1;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XPASetupProc --
- *
- *	This procedure is invoked before Tcl_DoOneEvent blocks waiting
- *	for an event.
- *
- * Results:
- *	None.
- *
- * Side effects:
- *	Adjusts the block time if needed.
- *
- *----------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void
-XPASetupProc(ClientData data, int flags)
-#else
-static void
-XPASetupProc(data, flags)
-     ClientData data;
-    int flags;
-#endif
-{
-  Tcl_Time blockTime = { TCL_BLOCKTIME_SEC, TCL_BLOCKTIME_USEC };
-
-  Tcl_SetMaxBlockTime(&blockTime);
-  return;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XPACheckProc --
- *
- *	This procedure is called by Tcl_DoOneEvent to check the XPA
- *	event source for events. 
- *
- * Results:
- *	None.
- *
- * Side effects:
- *	May queue an event.
- *
- *----------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void
-XPACheckProc(ClientData data, int flags)
-#else
-static void
-XPACheckProc(data, flags)
-     ClientData data;
-     int flags;
-#endif
-{
-  XPATcl xptr = (XPATcl)data;
-  XPATcl evPtr;
-  fd_set readfds;
-  struct timeval tv;
-  int got;
-
-again:
-  FD_ZERO(&readfds);
-  if( XPAActiveFd(xptr->fd) ){
-    FD_SET(xptr->fd, &readfds);
-    tv.tv_sec = 0;
-    tv.tv_usec = 0;
-    got = xselect(xptr->fd+1, &readfds, NULL, NULL, &tv);
-    if( got < 0 ){
-      if( errno == EINTR )
-	goto again;
-      perror("xpa select event");
-      Tcl_DeleteEventSource(XPASetupProc, XPACheckProc, xptr);
-    }
-    else if( got ){
-      evPtr = (XPATcl)Tcl_Alloc(sizeof(XPATclRec));
-      memcpy(evPtr, xptr, sizeof(XPATclRec));
-      evPtr->header.proc = XPAEventProc;
-      Tcl_QueueEvent((Tcl_Event *) evPtr, TCL_QUEUE_TAIL);
-    }
-  }
-}
-#endif
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPATclEnableOneInput
- *
- * Purpose:	Enable 1 XPA entry from the Tcl event loop
- *
- * Results:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-XPATclEnableOneInput (void *client_data)
-#else
-static void XPATclEnableOneInput(client_data)
-     void *client_data;
-#endif
-{
-  XPATcl xptr = (XPATcl)client_data;
-  if( xptr == NULL )
-    return;
-#if HAVE_TCLFILEHANDLER
-  Tcl_CreateFileHandler(xptr->fd, TCL_READABLE, XPATclHandler, xptr);
-#else
-  Tcl_CreateEventSource(XPASetupProc, XPACheckProc, xptr);
-#endif
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPATclDisableOneInput
- *
- * Purpose:	Disable 1 XPA entry from the Tcl event loop
- *
- * Results:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-XPATclDisableOneInput (void *client_data)
-#else
-static void XPATclDisableOneInput(client_data)
-     void *client_data;
-#endif
-{
-  XPATcl xptr = (XPATcl)client_data;
-  if( xptr == NULL )
-    return;
-#if HAVE_TCLFILEHANDLER
-  Tcl_CreateFileHandler(xptr->fd, 0, XPATclHandler, xptr->client_data);
-#else
-  Tcl_DeleteEventSource(XPASetupProc, XPACheckProc, xptr);
-#endif
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPATclAddOneInput
- *
- * Purpose:	Add 1 XPA entry to the Tcl event loop
- *
- * Results:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void *
-XPATclAddOneInput (void *client_data, int fd)
-#else
-static void *XPATclAddOneInput(client_data, fd)
-     void *client_data;
-     int fd;
-#endif
-{
-  XPATcl xptr;
-  if( fd < 0 )
-    return(NULL);
-  xptr = (XPATcl)xcalloc(1, sizeof(XPATclRec));
-  xptr->fd = fd;
-  xptr->client_data = (XPA)client_data;
-  XPATclEnableOneInput(xptr);
-  return(xptr);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPATclDelOneInput
- *
- * Purpose:	Delete 1 XPA entry from the Tcl event loop (called by XPAFree)
- *
- * Results:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-XPATclDelOneInput (void *client_data)
-#else
-static void XPATclDelOneInput(client_data)
-     void *client_data;
-#endif
-{
-  XPATcl xptr = (XPATcl)client_data;
-  if( xptr == NULL )
-    return;
-  XPATclDisableOneInput(xptr);
-  xfree(xptr);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- * 			Public Routines and Data
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPATclAddInput
- *
- * Purpose:	Add XPA entries to the Tcl event loop
- *
- * Results:	number of xpa entried added
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPATclAddInput (XPA xpa)
-#else
-int XPATclAddInput(xpa)
-     XPA xpa;
-#endif
-{
-  XPA cur;
-  int got=0;
-
-  /* if a specific xpa was specified, just add it */
-  if( xpa != NULL ){
-    /* remove old one */
-    if( xpa->seldel && xpa->selptr ){
-      (xpa->seldel)(xpa->selptr);
-    }
-    /* add new one */
-    xpa->seladd = XPATclAddOneInput;
-    xpa->seldel = XPATclDelOneInput;
-#if HAVE_TCLFILEHANDLER
-    xpa->selon =  XPATclEnableOneInput;
-    xpa->seloff = XPATclDisableOneInput;
-#endif
-    xpa->selptr = XPATclAddOneInput((void *)xpa, xpa->fd);
-    got = 1;
-  }
-  /* otherwise set up all xpa's */
-  else{
-    for(cur=(XPA)XPAListHead(); cur!=NULL; cur=cur->next){
-      /* remove old one */
-      if( cur->seldel && cur->selptr ){
-	(cur->seldel)(cur->selptr);
-      }
-      /* add new one */
-      cur->seladd = XPATclAddOneInput;
-      cur->seldel = XPATclDelOneInput;
-#if HAVE_TCLFILEHANDLER
-      cur->selon =  XPATclEnableOneInput;
-      cur->seloff = XPATclDisableOneInput;
-#endif
-      cur->selptr = XPATclAddOneInput((void *)cur, cur->fd);
-      got++;
-    }
-  }
-  return(got);
-}
-
-int xpa_tcl = 1;
-
-#else
-
-int xpa_tcl = 0;
-
-#endif
diff --git a/xpa/tcp.c b/xpa/tcp.c
deleted file mode 100644
index ddd4366..0000000
--- a/xpa/tcp.c
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * tcp.c -- unix tcp connection routines
- *
- */
-#if HAVE_CONFIG_H
-#include <conf.h>
-#endif
-
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#if HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <xport.h>
-#include <tcp.h>
-
-/* the ever-present */
-#ifndef SZ_LINE
-#define SZ_LINE 1024
-#endif
-
-/* name of user environment variable specifying this host */
-#ifndef MYHOST
-#define MYHOST "XPA_HOST"
-#endif
-
-/* other modules can set this variable and the default for various routines
-   will be "localhost" instead of the DNS-dependent hostname */
-int use_localhost=0;
-
-static char myhost[SZ_LINE]; 	/* hostname to registering access points */
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- * 			Private Routines and Data
- *
- *
- *----------------------------------------------------------------------------
- */
-
-static char ipstr[SZ_LINE];
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- *			Public Routines
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/*
- *--------------------------------------------------------------
- *
- * Routines:	gethost
- *
- * Purpose:	Find the current hostname
- *
- * Results:	1 on success, 0 for failure
- *
- *--------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-gethost (
-    char *xhost,		/* (out) corresponding hostname */
-    int len			/* (in) length of host buffer */
-)
-#else
-int gethost(xhost, len)
-    char *xhost;		/* (out) corresponding hostname */
-    int len;			/* (in) length of host buffer */
-#endif
-{
-    char *s=NULL;
-    struct hostent *hent;
-    static int init=0;
-
-    if( use_localhost == 0 ){
-      if( init == 0 ){
-	if( (s=(char *)getenv(MYHOST)) != NULL ){
-	  strncpy(myhost, s, SZ_LINE-1);
-	} else {
-	  gethostname(myhost, SZ_LINE-1);
-	}
-	init++;
-      }
-      strncpy(xhost, myhost, len-1);
-      if( (hent = gethostbyname(xhost)) == NULL ){
-	return(-1);
-      }
-      strncpy(xhost, hent->h_name, len-1);
-    }
-    else{
-      strncpy(xhost, "localhost", len-1);
-    }
-    xhost[len-1] = '\0';
-    return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	gethostip
- *
- * Purpose:	Find the IP address corresponding to a hostname
- *
- * Results: 	ip (host byte order) on success, 0 if host is unknown
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-unsigned int 
-gethostip (
-    char *xhost		/* (in) Hostname (human readable) */
-)
-#else
-unsigned int gethostip(xhost)
-    char *xhost;		/* (in) Hostname (human readable) */
-#endif
-{
-    struct hostent *hostent;
-    unsigned int ip;
-    char temp[SZ_LINE];
-    int saveip=0;
-    static unsigned int myip=0;
-    
-    
-    /* null input means current host */
-    if( (xhost == NULL) || (*xhost == '\0') || !strcmp(xhost, "$host") ){
-      if( myip != 0 )
-	return(myip);
-      saveip = 1;
-      gethost(temp, SZ_LINE);
-    }
-    else if( !strcmp(xhost, "$localhost")  ){
-      strcpy(temp, "localhost");
-    } else {
-      strncpy(temp, xhost, SZ_LINE-1);
-      temp[SZ_LINE-1] = '\0';
-    }
-
-    /* special check */
-    if( !strcmp(temp, "localhost") || !strcmp(temp, "localhost.localdomain") ){
-      ip = htonl(0x7F000001);
-      goto done;
-    }
-
-    /*
-     * Try looking by address (i.e., host is something like "128.84.253.1").
-     * Do this first because it's much faster (no trip to the DNS)
-     */
-    if( (int)(ip = inet_addr(temp)) != -1 ){
-      goto done;
-    }
-
-    /*
-     * Try looking it up by name. If successful, the IP address is in
-     * hostent->h_addr_list[0]
-     */
-    if( (hostent = gethostbyname(temp)) != NULL ){
-      memcpy(&ip, hostent->h_addr_list[0], (size_t)hostent->h_length);
-      goto done;
-    }
-
-    /* could not convert */
-    ip = 0;
-    saveip = 0;
-
-done:
-    ip = ntohl(ip);
-    if( saveip ) myip = ip;
-    return(ip);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	getiphost
- *
- * Purpose:	Find the IP address in dot format corresponding to an ip
- *
- * Results: 	ip string (in static buffer) or NULL
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-char *
-getiphost (unsigned int ip)
-#else
-char *getiphost(ip)
-     unsigned int ip;
-#endif
-{
-  char *s;
-  struct sockaddr_in sockbuf;
-
-  if( ip == 0x7F000001 ){
-    strcpy(ipstr, "localhost");
-    return(ipstr);
-  }
-
-  sockbuf.sin_addr.s_addr = htonl(ip);
-  s = (char *)inet_ntoa(sockbuf.sin_addr);
-  if( s != NULL ){
-    strcpy(ipstr, s);
-    return(ipstr);
-  }
-  else
-    return(NULL);
-}
diff --git a/xpa/tcp.h b/xpa/tcp.h
deleted file mode 100644
index c22b874..0000000
--- a/xpa/tcp.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * tcp.h - include file for tcp support in xpa
- *
- */
-
-#ifndef	__tcp_h
-#define	__tcp_h
-
-#include <prsetup.h>
-
-_PRbeg
-
-int gethost _PRx((char *host, int len));
-unsigned int gethostip _PRx((char *host));
-char *getiphost _PRx((unsigned int ip));
-
-_PRend
-
-#endif
diff --git a/xpa/test.tcl b/xpa/test.tcl
deleted file mode 100644
index bfc413c..0000000
--- a/xpa/test.tcl
+++ /dev/null
@@ -1,261 +0,0 @@
-lappend auto_path .
-
-package require tclxpa 2.1
-
-# set rmode "fillbuf=false"
-set rmode ""
-set imode ""
-
-set smode ""
-set sbuf "initial message\n"
-set slen  [string length $sbuf]
-set schan ""
-
-set n 0
-
-proc DoIt {xpa cdata param buf len} {
-    puts [format "entering %s" $cdata]
-    tk_messageBox -parent . -type ok -message "$cdata"
-    puts [format "exiting  %s" $cdata]
-}
-
-proc reccb { xpa client_data paramlist buf len }\
-{
-  global sbuf slen rmode n
-  global sfile sfilebuf schan
-  puts " "
-  puts [format "Entering receive callback routine %s" $n]
-  puts [format "xpa class: %s" [xparec $xpa class]]
-  puts [format "xpa name: %s" [xparec $xpa name]]
-  puts [format "xpa method: %s" [xparec $xpa method]]
-  puts [format "xpa cmdfd: %s" [xparec $xpa cmdfd]]
-  puts [format "xpa cmdchan: %s" [xparec $xpa cmdchan]]
-  puts [format "xpa datafd: %s" [xparec $xpa datafd]]
-  puts [format "xpa datachan: %s" [xparec $xpa datachan]]
-  puts [format "xpa sendian: %s" [xparec $xpa sendian]]
-  puts [format "xpa cendian: %s" [xparec $xpa cendian]]
-  puts [format "client_data: %s" $client_data]
-  puts [format "paramlist:   %s" $paramlist]
-  incr n
-  
-  if { $rmode == "fillbuf=false" } {
-    set dchan [xparec $xpa datachan]
-    fconfigure $dchan -translation binary
-    set mybuf [read $dchan]
-    set mylen [string length $mybuf]
-    puts [format "read %s bytes" $mylen]
-    set sbuf $mybuf
-    set slen $mylen
-    if { $mylen < 512 } {
-      puts $mybuf
-    } else {
-	xpaerror $xpa [format "Jeez! %s is too many bytes" $mylen]
-	return -code error
-    }
-  } else {
-    puts [format "entering with %s bytes" $len]
-    if { $len < 512 } {
-      puts $buf
-    }
-    set sbuf $buf
-    set slen $len
-  }
-  if { $paramlist == "open" } {
-    if { $schan != "" } {
-      close $schan
-    }
-    set sfile [string trimright $sbuf]
-    set schan [open $sfile r]
-    set sfilebuf [read $schan]
-    puts [format "read %d bytes from '%s'" [string length $sfilebuf] $sfile]
-  }
-}
-
-proc sendcb { xpa client_data paramlist }\
-{
-  global sbuf slen n
-  puts " "
-  puts [format "Entering send callback routine %s for %s" $n $xpa]
-  puts [format "xpa class: %s" [xparec $xpa class]]
-  puts [format "xpa name: %s" [xparec $xpa name]]
-  puts [format "xpa method: %s" [xparec $xpa method]]
-  puts [format "xpa cmdfd: %s" [xparec $xpa cmdfd]]
-  puts [format "xpa cmdchan: %s" [xparec $xpa cmdchan]]
-  puts [format "xpa datafd: %s" [xparec $xpa datafd]]
-  puts [format "xpa datachan: %s" [xparec $xpa datachan]]
-  puts [format "xpa sendian: %s" [xparec $xpa sendian]]
-  puts [format "xpa cendian: %s" [xparec $xpa cendian]]
-  puts [format "client_data: %s" $client_data]
-  puts [format "paramlist: %s" $paramlist]
-  incr n
-
-  if { $slen > 0 } {
-    puts [format "sending %s bytes of data" $slen]
-    xpasetbuf $xpa $sbuf $slen
-  } else {
-   xpaerror $xpa [format "no data to send from %s\n" $client_data]
-   return -code error
-  }
-}
-
-proc infocb { xpa client_data paramlist }\
-{
-  puts " "
-  puts "Entering info callback routine"
-  puts [format "xpa class: %s" [xparec $xpa class]]
-  puts [format "xpa name: %s" [xparec $xpa name]]
-  puts [format "xpa method: %s" [xparec $xpa method]]
-  puts [format "xpa sendian: %s" [xparec $xpa sendian]]
-  puts [format "xpa cendian: %s" [xparec $xpa cendian]]
-  puts [format "client_data: %s" $client_data]
-  puts [format "paramlist: %s" $paramlist]
-}
-
-if { [info exists class] == 0 } {
-  set class "XPA"
-}
-puts [format "class: %s" $class]
-
-if { [info exists name] == 0 } {
-  set name "xpa"
-}
-puts [format "name: %s" $name]
-
-if { [info exists initxpa] } {
-
-puts "initializing xpa access points ..."
-
-set xpa  [xpanew [format "%s" $class] [format "%s" $name] "xpa1 help" \
-	  sendcb "xpa1" $smode reccb "xpa1" $rmode]
-puts [format "xpa=%s" $xpa]
-
-set xpa1 [xpanew [format "%s" $class]  [format "%s1" $name] "xpa1a help" \
-	  sendcb "xpa1a" $smode reccb "xpa1a" $rmode]
-puts [format "xpa1=%s" $xpa1]
-
-set xpac [xpacmdnew [format "%s" $class] [format "%sc" $name]]
-puts [format "xpac=%s" $xpac]
-
-set cmd1 [xpacmdadd $xpac "cmd1" "cmd1 help" \
-	  sendcb "xpac/cmd1" $smode reccb "xpac/cmd1" $rmode]
-puts [format "cmd1=%s" $cmd1]
-
-set cmd2 [xpacmdadd $xpac "cmd2" "cmd2 help" \
-	  sendcb "xpac/cmd2" $smode reccb "xpac/cmd2" $rmode]
-puts [format "cmd2=%s" $cmd2]
-
-set cmd3 [xpacmdadd $xpac cmd3 "help cmd 3" "" "" "" DoIt "cmd 3" ""]
-puts [format "cmd3=%s" $cmd3]
-
-set cmd4 [xpacmdadd $xpac cmd4 "help cmd 4" "" "" "" DoIt "cmd 4" ""]
-puts [format "cmd4=%s" $cmd4]
-
-set xpai [xpainfonew XPA [format "%si" $name] infocb "xpai" $imode]
-puts [format "xpai=%s" $xpai]
-
-}
-
-proc getloop { xpa loops } {
-  for {set i 0} {$i < $loops} {incr i} {
-    set got [xpaget "" $xpa [format "testing xpaget %s" $i] \
-	    "" bufs lens names errs 10]
-    for {set j 0} {$j < $got} {incr j} {
-	set err [lindex $errs $j]
-	if { $err != "" } {
-	    puts $err
-	} else {
-	    set buf [lindex $bufs $j]
-	    puts [format "return buf %s: %s" $j $buf]
-	}
-    }
-  } 
-}
-
-proc setloop { loops } {
-  for {set i 0} {$i < $loops} {incr i} {
-    set got [xpaset "" "xpa*" [format "testing xpaset %s" $i] \
-	    "" "dummy buffer" "" names errs 10]
-    puts $names
-  } 
-}
-
-proc infoloop { loops } {
-  for {set i 0} {$i < $loops} {incr i} {
-    set got [xpainfo "" "i_xpa" [format "testing xpainfo %s" $i] \
-	    "" names errs 10]
-    puts $names
-  } 
-}
-
-if { 0 } {
-  set got [xpaget "" "xpa1" "this is a test" "" bufs lens names errs 10]
-  puts $got
-  puts $lens
-  puts $bufs
-
-  set got [xpaset "" "xpa1" "test" "" "this is a test" "" names errs 10]
-  puts $got
-  puts $errs
-
-  set got [xpainfo "" "i_xpa" "info test" "" names errs 10]
-  puts $got
-  puts $errs
-
-  set got [xpaaccess "" "xpa*" "" "" names errs 10]
-  puts $got
-  puts $names
-  puts $errs
-
-  set xpa [xpaopen ""]
-  set got [xpaset $xpa "xpa1" "test" "" "this is a test" "" names errs 10]
-  set got [xpainfo $xpa xpai "info test" "" names errs 10]
-  xpaclose $xpa
-
-  set wchan1 [open foo1.log w+]
-  set wchan2 [open foo2.log w+]
-  set wchans [list $wchan1 $wchan2]
-  set got [xpagetfd "" "xpa1" "this is a test" "" $wchans names errs 10]
-  set got [xpasetfd "" "xpa1" "this is a test" "" $rchan names errs 10]
-  set got [xpanslookup "xpa1" "" classes names methods]
-}
-
-proc wsbuf { fname } {
-  global sbuf
-  set fid [open $fname w 0600]
-  puts -nonewline $fid $sbuf
-  close $fid
-}
-
-set _xpakeepalive 1
-proc xpakeepalive { xpa sec {type 0} } {
-    global _xpakeepalive
-    if { $_xpakeepalive > 0 } {
-      puts "sending keepalive ..."
-      xpanskeepalive $xpa $type
-      after [expr $sec * 1000] xpakeepalive $xpa $sec $type
-    }
-}
-
-proc katest { host sec {type 0} } {
-  global xpa
-  xparemote $xpa $host + -proxy
-  after [expr $sec * 1000] xpakeepalive $xpa $sec $type
-}
-
-if { 0 } {
-  puts "You can now execute:"
-  puts " "
-  puts "    katest bynars.harvard.edu:28571 60"
-  puts "    (if this is tclsh, you need to run vwait)"
-  # katest bynars.harvard.edu:28571 60
-  puts " "
-  puts "or:"
-  puts " "
-  puts "    xparemote $xpa bynars.harvard.edu:28571 + -proxy"
-  puts " "
-  # xparemote $xpa bynars.harvard.edu:28571 + -proxy
-}
-
-# vwait forever
-
-
diff --git a/xpa/timedconn.c b/xpa/timedconn.c
deleted file mode 100644
index ff8202f..0000000
--- a/xpa/timedconn.c
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-#include <xpap.h>
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- * 			Private Routines and Data
- *
- *
- *----------------------------------------------------------------------------
- */
-
-#if HAVE_MINGW32==0
-
-static int alarm_flag=0;
-
-#ifdef ANSI_FUNC
-static void AlarmFunc (int signo)
-#else
-static void AlarmFunc (signo)
-     int signo;
-#endif
-{
-  alarm_flag = 1;
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- * 			Public Routines and Data
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	alrmconnect
- *
- * Purpose:	connect with alarm-based timeout
- *
- * Returns:	status
- *
- *  adapted from the connect_alarm() code in:
- *  W. Richard Stevens
- *  "Advanced Programming in the Unix Environment" 
- *  Addison-Wesley Publishing Co, 1992
- *  p. 350
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int alrmconnect(int sockfd, void *saptr, int salen, int nsec)
-#else
-int alrmconnect(sockfd, saptr, salen, nsec)
-     int sockfd;
-     void *saptr;
-     int salen;
-     int nsec;
-#endif
-{
-  int status=0;
-  struct sigaction act1, oact1;
-
-  /* no error yet */
-  alarm_flag = 0;
-  errno = 0;
-
-  /* set up alarm */
-  if( nsec ){
-    act1.sa_handler = AlarmFunc;
-    sigemptyset(&act1.sa_mask);
-    act1.sa_flags = 0;
-#ifdef SA_INTERRUPT
-    act1.sa_flags |= SA_INTERRUPT;
-#endif
-    if( sigaction(SIGALRM, &act1, &oact1) < 0 ){
-      goto done;
-    }
-    /* start alarm */
-    alarm(nsec);
-  }
-
-  /* try to connect */
-  status=connect(sockfd, (struct sockaddr *)saptr, salen);
-
-  /* turn off alarm if it did not go off */
-  if( nsec )
-    alarm(0);
-
-done:
-  /* check for alarm => we timed out */
-  if( alarm_flag ){
-    xclose(sockfd);
-    errno = ETIMEDOUT;
-    status = -1;
-  }
-
-  return(status);
-}
-
-#endif
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	noblkconnect
- *
- * Purpose:	non-blocking connect with select-based timeout
- *
- * Returns:	status
- *
- *  adapted from the connect_nonb() code in:
- *  W. Richard Stevens
- *  "Advanced Programming in the Unix Environment" 
- *  Addison-Wesley Publishing Co, 1992
- *  p. 411
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int noblkconnect(int sockfd, void *saptr, int salen, int nsec)
-#else
-int noblkconnect(sockfd, saptr, salen, nsec)
-     int sockfd;
-     void *saptr;
-     int salen;
-     int nsec;
-#endif
-{
-	int			flags, n, error;
-	socklen_t		len;
-	fd_set			rset, wset;
-	struct timeval	tval;
-
-	/* save state and set in non-blocking mode */
-	xfcntl_nonblock(sockfd, flags);
-
-	error = 0;
-	if( (n = connect(sockfd, (struct sockaddr *) saptr, salen)) < 0){
-	  if((xerrno != EINPROGRESS) && (xerrno != EWOULDBLOCK))
-	    return(-1);
-	}
-
-	/* Do whatever we want while the connect is taking place. */
-	if(n == 0)
-	  goto done;	/* connect completed immediately */
-
-	FD_ZERO(&rset);
-	FD_SET(sockfd, &rset);
-	wset = rset;
-	tval.tv_sec = nsec;
-	tval.tv_usec = 0;
-
-	if( (n = xselect(sockfd+1, &rset, &wset, NULL,
-			nsec ? &tval : NULL)) == 0) {
-	  xclose(sockfd);		/* timeout */
-	  errno = ETIMEDOUT;
-	  return(-1);
-	}
-
-	if(FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset)) {
-	  len = sizeof(error);
-	  if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (void *)&error, &len) <0)
-	    return(-1);			/* Solaris pending error */
-	} else{
-	  errno = ETIMEDOUT;
-	}
-
-done:
-	xfcntl_restore(sockfd, flags);	/* restore file status flags */
-
-	if(error) {
-	  xclose(sockfd);		/* just in case */
-	  errno = error;
-	  return(-1);
-	}
-	return(0);
-}
-
-#ifdef DO_MAIN
-/*
- * solaris: gcc -o atest atest.c -lsocket -lnsl
- * linux: gcc -o atest atest.c
- * os x: gcc -o atest atest.c
- */
-#include <stdio.h>
-
-extern char *optarg;
-extern int optind;
-
-int main(int argc, char **argv)
-{
-  int c;
-  int args;
-  int status;
-  int fd;
-  int doalarm=0;
-  int nsec=2;
-  unsigned int ip;
-  char *sip;
-  struct sockaddr_in sock_in;
-
-  /* process switch arguments */
-  while ((c = getopt(argc, argv, "ab")) != -1){
-    switch(c){
-    case 'a':
-      doalarm = 1;
-      break;
-    case 'b':
-      doalarm = 0;
-      break;
-    }
-  }
-
-  args = argc - optind;
-  if( args > 0 )
-    sip = argv[optind];
-  /* this ip is bogus and normally will cause connect to hang */
-  else
-    sip ="209.1.1.1";
-
-  /* set up socket to a bogus ip and port */
-  if( (int)(ip = inet_addr(sip)) == -1 ){
-    perror("inet_addr");
-    exit(1);
-  }
-  if( (fd = xsocket(AF_INET, SOCK_STREAM, 0)) < 0 ){
-    perror("socket");
-    exit(1);
-  }
-  memset((char *)&sock_in, 0, sizeof(sock_in));
-  sock_in.sin_family = AF_INET;
-  sock_in.sin_addr.s_addr = ip;
-  sock_in.sin_port = htons(80);
-
-  if( doalarm ){
-    fprintf(stderr, "alarm-based connect() ...\n");
-    status=alrmconnect(fd, (void *)&sock_in, sizeof(sock_in), nsec);
-  }
-  else{
-    fprintf(stderr, "non-blocking connect() ...\n");
-    status=noblkconnect(fd, (void *)&sock_in, sizeof(sock_in), nsec);
-  }
-
-  /* if alarm_flag is 1, alarm went off and interrupted connect */
-  fprintf(stderr, "alarm_flag=%d status=%d\n", alarm_flag, status);
-  if( status != 0 )
-    perror("connect");
-}
-
-#endif
diff --git a/xpa/timedconn.h b/xpa/timedconn.h
deleted file mode 100644
index e46e69d..0000000
--- a/xpa/timedconn.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * timedconn.h -- declarations for connect w/ timeout
- *
- */
-
-#ifndef	__timedconn_h
-#define	__timedconn_h
-
-#include <prsetup.h>
-
-_PRbeg
-
-int alrmconnect  _PRx((int sockfd, void *saptr, int salen, int nsec));
-
-int noblkconnect _PRx((int sockfd, void *saptr, int salen, int nsec));
-
-_PRend
-
-#endif
diff --git a/xpa/word.c b/xpa/word.c
deleted file mode 100644
index 2d60eb0..0000000
--- a/xpa/word.c
+++ /dev/null
@@ -1,1097 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-/*
- *    word.c -- token parser, pattern matcher, macro expander, 
- *		and other word-related routines
- *
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <word.h>
-
-/* SAOMOD_CTYPE -- work around Slackware/RedHat incompatibility */
-#ifdef linux
-#ifdef isalnum
-#undef isalnum
-#define isalnum(c) (isalpha(c)||isdigit(c))
-#endif
-#endif
-
-/* **************************************************************************
- *
- *
- * 			PRIVATE ROUTINES AND DATA
- *
- *
- * **************************************************************************/
-
-/* word */
-#define MAXDELIM 256
-#define MAXDTABLES 1024
-#define BUFINC 5000
-
-static char lastd;
-static char dtable[MAXDELIM];
-static char *dtables[MAXDTABLES];
-static int ndtable=0;
-
-/* tmatch */
-#define ALL '*'
-#define ANY '?'
-#define RANGE '['
-#define ENDRANGE ']'
-#define RANGEDELIM '-'
-#define NOTRANGE '~'
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	checkrange (from tmatch)
- *
- * Purpose:	see if character is in specified range
- *
- * Returns:	1 if in range, otherwise 0
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-checkrange (char *xtemplate, int *ptr, int c)
-#else
-static int checkrange(xtemplate, ptr, c)
-     char *xtemplate;
-     int *ptr;
-     int c;
-#endif
-{
-  int inrange, notrange;
-  char lorange, hirange;
-  int tptr;
-  
-  tptr = *ptr;	
-  /* make sure we have a close bracket */
-  if( strchr(&xtemplate[tptr], ENDRANGE) == NULL )
-    return(0);
-  /* check for negation - match if not in range */
-  if( xtemplate [tptr+1] == NOTRANGE ){
-    notrange = 1; tptr++;
-  }
-  else
-    notrange = 0;
-  /* start pessimistically */
-  inrange = 0;
-  /* point past RANGE character */
-  tptr++;
-  while( xtemplate[tptr] != ENDRANGE ){
-    /* get lo range */
-    lorange = xtemplate[tptr];
-    /* and hi range */
-    tptr++;
-    if( xtemplate[tptr] != RANGEDELIM )
-      hirange = lorange;
-    else{
-      tptr++;hirange = xtemplate[tptr];tptr++;
-    }
-    if( (c>=lorange) && (c<=hirange) ){
-      inrange = 1; break;
-    }
-  }
-  /* only exclusive OR of inrange and notrange is ok */
-  if( (inrange ^ notrange) ==0 )
-    return(0);
-  else{
-    *ptr = strchr(&xtemplate[tptr],']') - xtemplate + 1;
-    return(1);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	addstring (from macro)
- *
- * Purpose:	add a string to a buffer
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-addstring (char **buf, int *blen, int *maxlen, char *str)
-#else
-static void addstring(buf, blen, maxlen, str)
-     char **buf;
-     int *blen;
-     int *maxlen;
-     char *str;
-#endif
-{
-  int slen;
-
-  slen = strlen(str) + 1;
-  while( (*blen + slen) >= *maxlen ){
-    *maxlen += BUFINC;
-    *buf = (char *)xrealloc(*buf, *maxlen);
-  }
-  strcat(*buf, str);
-  *blen += slen;
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	addchar (from macro)
- *
- * Purpose:	add a single char to a buffer
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-addchar (char **buf, int *blen, int *maxlen, int c)
-#else
-static void addchar(buf, blen, maxlen, c)
-     char **buf;
-     int *blen;
-     int *maxlen;
-     int c;
-#endif
-{
-  char tbuf[2];
-
-  tbuf[0] = c;
-  tbuf[1] = '\0';
-  addstring(buf, blen, maxlen, tbuf);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	lookupkeywords (from macro)
- *
- * Purpose:	lookup a name in a list of keywords
- *
- * Returns:	return the associated value or NULL
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static char *
-lookupkeywords (char *name, char **keyword, char **value, int nkey)
-#else
-static char *lookupkeywords(name, keyword, value, nkey)
-     char *name;
-     char **keyword;
-     char **value;
-     int nkey;
-#endif
-{
-  int i;
-  for(i=0; i<nkey; i++){
-    if( !strcmp(name, keyword[i]) )
-      return(value[i]);
-  }
-  return(NULL);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	hexval (from strtoul16)
- *
- * Purpose:	return the int value corresponding to a hex character
- *
- * Returns:	hex value or -1 if the character is not legal hex
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-hexval (int c)
-#else
-static int hexval(c)
-     int c;
-#endif
-{
-  switch(c){
-  case '0':     return  0;
-  case '1':     return  1;
-  case '2':     return  2;
-  case '3':     return  3;
-  case '4':     return  4;
-  case '5':     return  5;
-  case '6':     return  6;
-  case '7':     return  7;
-  case '8':     return  8;
-  case '9':     return  9;
-  case 'A':     return 10;
-  case 'a':     return 10;
-  case 'B':     return 11;
-  case 'b':     return 11;
-  case 'C':     return 12;
-  case 'c':     return 12;
-  case 'D':     return 13;
-  case 'd':     return 13;
-  case 'E':     return 14;
-  case 'e':     return 14;
-  case 'F':     return 15;
-  case 'f':     return 15;
-  default:	return -1;
-  }
-}
-
-/* **************************************************************************
- *
- *
- * 			PUBLIC ROUTINES
- *
- *
- * **************************************************************************/
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	word
- *
- * Purpose:	a simple spaced parser
- *
- * Returns:	1 if word was found, else 0
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-word (char *lbuf, char *tbuf, int *lptr)
-#else
-int word(lbuf, tbuf, lptr)
-     char *lbuf;
-     char *tbuf;
-     int *lptr;
-#endif
-{
-  int ip;
-  int i;
-  char quotes;
-
-  /* reset last delimiter */
-  lastd='\0';
-
-  /* null out the output string */
-  *tbuf = '\0';
-
-  /* if no string was specified, just return */
-  if( lbuf == NULL )
-    return(0);
-
-  /* just a more convenient pointer ... */
-  ip = *lptr;
-
-  /* if we are at the end of string, just return */
-  if( lbuf[ip] == '\0' )
-    return(0);
-
-  /* skip over white space */
-  while( isspace((int)lbuf[ip]) || (dtable[(int)lbuf[ip]]>0) ){
-    if( lbuf[ip] == '\0' ){
-      *lptr = ip;
-      return(0);
-    }
-    else
-      ip++;
-  }
-
-  /* check for an explicit quote */
-  quotes = '\0';
-  if( lbuf[ip] == '"' ){
-    quotes = '"';
-    lastd = '"';
-  }
-  if( lbuf[ip] == '\'' ){
-    quotes = '\'';
-    lastd = '\'';
-  }
-
-  /* grab next token */
-  if( quotes  != '\0' ){
-    /* bump past quotes */
-    ip++;
-    /* grab up to next quotes -- but skip escaped quotes */
-    for(i=0; lbuf[ip] != '\0'; i++, ip++){
-      if( (lbuf[ip] == quotes) && (lbuf[ip-1] != '\\') )
-	break;
-      else
-	tbuf[i] = lbuf[ip];
-    }
-  }
-  else{
-    /* grab up to next whitespace */
-    for(i=0;
-	lbuf[ip] && !isspace((int)lbuf[ip]) && (dtable[(int)lbuf[ip]]==0);
-	i++, ip++)
-      tbuf[i] = lbuf[ip];
-    /* save this delimiter */
-    lastd = lbuf[ip];
-  }
-  /* bump past delimiter (but not null terminator) */
-  if( lbuf[ip] )
-    ip++;
-
-  /* null terminate */
-  tbuf[i] = '\0';
-  
-  /* got something */
-  *lptr = ip;
-  return(1);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	newdtable
- *
- * Purpose:	save the current delim table and init a new one
- *
- * Returns:	1 if another delim table can be allocated, 0 otherwise
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-newdtable (char *s)
-#else
-int newdtable(s)
-     char *s;
-#endif
-{
-  int i;
-  char *cur;
-
-  if( ndtable >= MAXDTABLES ){
-    fprintf(stderr, "ERROR: no more delimiter tables available\n");
-    return(0);
-  }
-  /* save another dtable */
-  ndtable++;
-  /* allocate new space for this table */
-  dtables[ndtable-1] = (char *)xmalloc(MAXDELIM);
-  cur = dtables[ndtable-1];
-  /* copy and zero the old table */
-  for(i=0; i<MAXDELIM; i++){
-    cur[i] = dtable[i];
-    dtable[i] = 0;
-  }
-  /* add delims to the new table */
-  if( s != NULL ){
-    for(; *s; s++)
-      dtable[(int)*s] = 1;
-  }
-  return(1);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	freedtable
- *
- * Purpose:	restore last delim table as the current
- *
- * Returns:	1 if there is a table to restore, else 0
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-freedtable (void)
-#else
-int freedtable()
-#endif
-{
-  int i;
-  char *cur;
-
-  if( ndtable <= 0 ){
-    fprintf(stderr, "ERROR: no delimiter tables to restore\n");
-    return(0);
-  }
-  cur = dtables[ndtable-1];
-  /* copy the restored table into 'current' */
-  for(i=0; i<MAXDELIM; i++){
-    dtable[i] = cur[i];
-  }
-  /* free up this dtable */
-  xfree((void *)cur);
-  /* one less dtable to worry about */
-  ndtable--;
-  return(1);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	newdelim
- *
- * Purpose:	add a string delimiters to the parse table
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void 
-newdelim (char *s)
-#else
-void newdelim(s)
-     char *s;
-#endif
-{
-  if( s != NULL ){
-    for(; *s; s++)
-      dtable[(int)*s] = 1;
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	freedelim
- *
- * Purpose:	remove delims from current delim table
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void 
-freedelim (char *s)
-#else
-void freedelim(s)
-     char *s;
-#endif
-{
-  int i;
-
-  if( s ){
-    for(; *s; s++)
-      if( dtable[(int)*s] > 0 ) 
-	dtable[(int)*s] -= 1;
-  }
-  else{
-    for(i=0; i<MAXDELIM; i++)
-      if( dtable[i] > 0 ) 
-	dtable[i] -= 1;
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	lastdelim
- *
- * Purpose:	return the last delimiter
- *
- * Returns:	delim character
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-lastdelim (void)
-#else
-int lastdelim()
-#endif
-{
-  return((int)lastd);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	tmatch
- *
- * Purpose:	match string to a template
- *
- *	the legal meta characters in a template are just like the
- *	C-shell meta characters, i.e:
- *	?   		match any character, but there must be one
- *	*		match anything, or nothing
- *	[<c>...]	match an inclusive set
- *
- *
- * Returns:	non-zero if match, zero otherwise
-
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-tmatch (char *string, char *xtemplate)
-#else
-int tmatch(string, xtemplate)
-     char *string;
-     char *xtemplate;
-#endif
-{
-  char *lastmeta=0;
-  char *nonabsorbed=0;
-  int sptr=0;
-  int tptr=0;
-  
-  /* loop through string and template */
-  while( (xtemplate[tptr] != '\0') || (string[sptr] != '\0') ){
-    /* if exact match, just bump both pointers */
-    if( string[sptr] == xtemplate[tptr] ){
-      sptr++; tptr++; continue;
-    }
-    /* if range character, check ranges */
-    if( xtemplate[tptr] == RANGE ){
-      if( checkrange(xtemplate, &tptr, string[sptr]) == 0 ){
-        /* no match - was there a meta character before */
-	if( lastmeta == 0 ) return(0);
-	/* if so, back up to it and try again */
-	xtemplate = lastmeta; tptr=0;
-	/* begin checking at the non-absorbed point */
-	string = nonabsorbed; sptr=0;
-	continue;
-      }
-      /* got a match, so bump past */
-      else{
-	sptr++; continue;
-      }
-    }
-    /* if ANY, any character if fine, but there must be one */
-    if( xtemplate[tptr] == ANY ){
-      if( string[sptr] == '\0' )
-	return(0);
-      else{
-	sptr++; tptr++; continue;
-      }
-    }			
-    /* if ALL, we can match anything */
-    if( xtemplate[tptr] == ALL ){
-      /*  remember where the * is */
-      lastmeta = &xtemplate[tptr];
-      tptr++;
-      /* no more template after this means a win */
-      if( xtemplate[tptr] == '\0' ) return(1);
-      /* if the next template char is not a meta,
-	 we skip up to its match in the string */
-      if( xtemplate[tptr] == RANGE){
-	while( checkrange(xtemplate, &tptr, string[sptr]) == 0 ){
-	  /* missing the next template char */
-	  if( string[sptr] == '\0' ) return(0);
-	  sptr++;
-	}
-				/* remember the first non-absorbed character */
-	nonabsorbed = &string[sptr];nonabsorbed++;
-	sptr++;
-	continue;
-      }
-      /* skip past characters, if next template char is not a meta */
-      else if( xtemplate[tptr] != ANY && xtemplate[tptr] != ALL ){
-	while(string[sptr] != xtemplate[tptr]){
-	  /* not finding the next template char
-	     is bad */
-	  if( string[sptr] == '\0' ) return(0);
-	  sptr++;
-	}
-				/* remember the first non-absorbed character */
-	nonabsorbed = &string[sptr];nonabsorbed++;
-	continue;
-      }
-      else{
-				/* remember the first non-absorbed character */
-	nonabsorbed = &string[sptr];nonabsorbed++;
-	continue;
-      }
-    }
-    /* no match, no meta char - see if we once had a meta */
-    else{
-      if( lastmeta == 0 ) return(0);
-      /* if so, back up to it and try again */
-      xtemplate = lastmeta; tptr=0;
-      /* begin checking at the non-absorbed point */
-      string = nonabsorbed; sptr=0;
-      continue;
-    }
-  }
-  /* matched to the nulls - we win */
-  return(1);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	keyword
- *
- * Purpose:	look for a keyword=<value> string inside another string,
- *		remove and return the <value> in another buffer
- *
- * Returns:	len if keyword was found, 0 otherwise
- *
- * NB: ibuf cannot be static, as it is modified in place
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-keyword (char *ibuf, char *key, char *obuf, int maxlen)
-#else
-int keyword(ibuf, key, obuf, maxlen)
-     char *ibuf;
-     char *key;
-     char *obuf;
-     int maxlen;
-#endif
-{
-  int len;
-  int qlev;
-  char *s;
-  char *t;
-  char *u;
-  char *v;
-  char *iptr;
-  char quote;
-
-  /* if we have no input string, we are done */
-  if( (ibuf == NULL) || (*ibuf == '\0') ){
-    return(0);
-  }
-
-  /* start out pessimistically */
-  *obuf = '\0';
-  iptr = ibuf;
-
-  /* maxlen generally is 1 more than we can handle */
-  maxlen--;
-
-  /* keep trying */
-  while( *iptr ){
-    /* look for key from current position */
-    if( (s = (char *)strstr(iptr, key)) == NULL )
-      return(0);
-    /* if we found a key, we need to make sure ... */
-    /* it must be preceeded by beginning of string, beginning of bracket,
-       or by a "," from previous keyword */
-    if( (s == ibuf) || (*(s-1) == ',') || (*(s-1) == '[') ){
-      /* it can be followed by spaces ... */
-      t = s + strlen(key);
-      while( isspace((int)*t) )
-	t++;
-      /* but must be followed by an "=" */
-      if( *t == '=' ){
-	t++;
-	/* skip spaces again */
-	while( isspace((int)*t) )
-	  t++;
-	/* this is where the actual value part of the string begins */
-	u = t;
-	/* this will be where it ends */
-	v = t;
-	/* gather up everything to the next "," or end of filter */
-	if( (*t == '"') || (*t == '\'') || (*t == '(') || (*t == '[') ){
-	  switch(*t){
-	  case '"':
-	  case '\'':
-	    quote = *t;
-	    break;
-	  case '(':
-	    quote = ')';
-	    break;
-	  case '[':
-	    quote = ']';
-	    break;
-	  }
-	  /* bump past opening quote char */
-	  t++; u++; v++;
-	  while( *t && (*t != quote) ){
-	    t++; v++;
-	  }
-	  if( *t == quote ){
-	    t++;
-	  }
-	}
-	else{
-	  qlev = 0;
-	  while( *t && 
-		 ((qlev != 0) || (*t != ',')) &&
-		 ((qlev != 0) || (*t != ']')) ){
-	    if( *t == '[' )
-	      qlev++;
-	    else if( *t == ']' )
-	      qlev--;
-	    t++; v++;
-	  }
-	}
-	len = MIN(maxlen, v - u);
-	strncpy(obuf, u, len);
-	obuf[len] = '\0';
-	/* remove keyword=value string from the original buffer */
-	/* first remove preceding comma, if necessary */
-	if( (s > ibuf) && (*(s-1) == ',') )
-	  s--;
-	/* but leave 1 comma in place */
-	else if( *t == ',' )
-	  t++;
-	/* now overwrite original from where the keyword started */
-	memmove(s, t, strlen(t)+1);
-	return(len);
-      }
-    }
-    /* start next search just past this one */
-    iptr = s+1;
-  }
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	macro
- *
- * Purpose:	expand a macro using a client's callback
- *
- * Returns:	expanded macro as an allocated string
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-char *
-macro (char *icmd, char **keyword, char **value, int nkey,
-       MacroCB client_callback, void *client_data)
-#else
-char *macro(icmd, keyword, value, nkey, client_callback, client_data)
-     char *icmd;
-     char **keyword;
-     char **value;
-     int nkey;
-     MacroCB client_callback;
-     void *client_data;
-#endif
-{
-  int  i, j;
-  int  maxlen;
-  char brace;
-  char *result;
-  char tbuf[1000];
-  char tbuf1[1000];
-  char *s;
-  char *ip;
-  char *mip;
-
-  /* make a new string using the command as a base, but substituting
-     for "$" values as needed */
-  result = (char *)xmalloc(BUFINC+1);
-  maxlen = BUFINC;
-  *result = '\0';
-  for(i=0, ip=icmd; *ip; ip++){
-    if( *ip != '$' ){
-      addchar(&result, &i, &maxlen, *ip);
-    }
-    else{
-      /* save beginning of macro */
-      mip = ip;
-      /* skip past '$' */
-      ip++;
-      /* check for brace mode */
-      if( *ip == '{' ){
-	brace = '{';
-	ip++;
-      }
-      else if( *ip == '(' ){
-	brace = '(';
-	ip++;
-      }
-      else
-	brace = '\0';
-      /* get variable up to next non-alpha character or close brace */
-      for(*tbuf='\0', j=0; *ip; ip++ ){
-	/* if we are in brace mode, look for trailing brace */
-	if( brace && *ip == (brace == '(' ? ')' : '}') ){
-	  ip++;
-	  break;
-	}
-	/* else look for a non-alpha character */
-	else if( !isalnum((int)*ip) && *ip != '_'){
-	  break;
-	}
-	else{
-	  tbuf[j++] = *ip;
-	  tbuf[j] = '\0';
-	}
-      }
-      /* back up so the outer loop adds this delimiting char to the output */
-      ip--;
-      /* search for keyword from the list */
-      if( (nkey > 0) && 
-	  (s=lookupkeywords(tbuf, keyword, value, nkey)) != NULL ){
-	   addstring(&result, &i, &maxlen, s);
-      }
-      /* execute the client routine to expand macros */
-      else if( (client_callback != NULL) &&
-	  ((s=(*client_callback)(tbuf, client_data)) != NULL) ){
-	    addstring(&result, &i, &maxlen, s);
-      }
-      /* look for an environment variable */
-      else if( (s = (char *)getenv(tbuf)) != NULL ){
-	addstring(&result, &i, &maxlen, s);
-      }
-      /* if we don't recognize this macro, put it back onto the string */
-      else{
-	int len;
-	len = ip - mip + 1;
-	strncpy(tbuf1, mip, len);
-	tbuf1[len] = '\0';
-	addstring(&result, &i, &maxlen, tbuf1);
-      }
-    }
-  }
-  /* null terminate and save the string */
-  result[i] = '\0';
-  result = (char *)xrealloc(result, i+1);
-  return(result);
-}
-
-/* **************************************************************************
- *
- *	misc word routines
- *
- * **************************************************************************/
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	cluc
- *
- * Purpose:	convert lower to upper case string in place
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void 
-cluc (char *s)
-#else
-void cluc(s)
-     char *s;
-#endif
-{
-  while(*s){
-    if( islower((int)*s) )
-      *s = toupper(*s);
-    s++;
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	culc
- *
- * Purpose:	convert upper to lower case string in place
- *
- * Returns:	
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void 
-culc (char *s)
-#else
-void culc(s)
-     char *s;
-#endif
-{
-  while(*s){
-    if( isupper((int)*s) )
-      *s = tolower(*s);
-    s++;
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	nowhite
- *
- * Purpose:	removes all beginning and ending white space from string
- *
- * Returns:	returns the number of characters
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-nowhite (
-    char *c,      /* buffer to be cleaned */
-    char *cr     /* buffer for returned string */
-)
-#else
-int nowhite(c,cr)
-char *c;      /* buffer to be cleaned */
-char *cr;     /* buffer for returned string */
-#endif
-{
-  char *cr0;    /* initial value of cr */
-  int n;        /* the number of characters */
-
-  /* skip leading white space */
-  while(*c && isspace((int)*c))
-    c++;
-  /* copy up to the null */
-  cr0 = cr;
-  while(*c)
-    *cr++ = *c++;
-  n = cr - cr0;   /* the number of characters */
-  *cr-- = '\0';   /* Null and point to the last character */
-  /* remove trailing white space */
-  while( n && isspace((int)*cr) ){
-    *cr-- = '\0';
-    n--;
-  }
-  return(n);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	nocr
- *
- * Purpose:	remove trailing <CR> from a string (in place)
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void 
-nocr (char *s)
-#else
-void nocr(s)
-     char *s;
-#endif
-{
-  int len;
-
-  if( (s==NULL) || (*s=='\0') )
-    return;
-  len = strlen(s);
-  if( s[len-1] == '\n' )
-    s[len-1] = '\0';
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	istrue
- *
- * Purpose:	check if a string is "true" or "yes" or "on"
- *
- * Returns:	1 if true string, 0 otherwise
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-istrue (char *s)
-#else
-int istrue(s)
-     char *s;
-#endif
-{
-  char *t;
-  int result;
-
-  if( (s==NULL) || (*s=='\0') )
-    return(0);
-  t = (char *)xmalloc(strlen(s)+1);
-  nowhite(s, t);
-  culc(t);
-  result = (!strcmp(t, "true") || !strcmp(t, "yes") ||
-	    !strcmp(t, "on")   || !strcmp(t, "1")   );
-  xfree(t);
-  return(result);
-}
-
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	isfalse
- *
- * Purpose:	check if a string is "false" or "no" or "off"
- *
- * Returns:	1 if false string, 0 otherwise
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-isfalse (char *s)
-#else
-int isfalse(s)
-     char *s;
-#endif
-{
-  char *t;
-  int result;
-
-  if( (s==NULL) || (*s=='\0') )
-    return(0);
-  t = (char *)xmalloc(strlen(s)+1);
-  nowhite(s, t);
-  culc(t);
-  result = (!strcmp(t, "false") || !strcmp(t, "no") ||
-	    !strcmp(t, "off")   || !strcmp(t, "0")  );
-  xfree(t);
-  return(result);
-}
-
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	strtoul16
- *
- * Purpose:	convert a string to an unsigned long hex value
- *
- * Returns:	converted hex value (end of converted string is in t)
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-unsigned long strtoul16 (char *s, char **t)
-#else
-unsigned long strtoul16(s, t)
-     char *s;
-     char **t;
-#endif
-{
-  unsigned long v=0;
-  int h;
-
-  while ( *s != ' '	&&
-	  *s != '\n'	&&
-	  *s != '\r'	&&
-	  *s != '\0' 	){
-    v *= 16;
-    if( (h = hexval(*s)) >= 0 ){
-      v += h;
-      s++;
-    }
-    else{
-      break;
-    }
-  }
-  if( t != NULL )
-    *t = s;
-  return(v);
-}
diff --git a/xpa/word.h b/xpa/word.h
deleted file mode 100644
index 5778574..0000000
--- a/xpa/word.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * word.h -- declarations for word parsing
- *
- */
-
-#ifndef	__word_h
-#define	__word_h
-
-#if HAVE_CONFIG_H
-#include <conf.h>
-#endif
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-#if HAVE_MALLOC_H
-#include <malloc.h>
-#endif
-#if HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#include <prsetup.h>
-#include <xalloc.h>
-
-/* defines the types of callback procedure we use */
-typedef char *(*MacroCB)(
-#ifdef ANSI_FUNC
-    char *buf,
-    void *client_data
-#endif
-);
-
-_PRbeg
-
-int word _PRx((char *lbuf, char *tbuf, int *lptr));
-int newdtable _PRx((char *s));
-int freedtable _PRx((void));
-void newdelim _PRx((char *s));
-void freedelim _PRx((char *s));
-int lastdelim _PRx((void));
-int tmatch _PRx((char *string, char *xtemplate));
-int keyword _PRx((char *ibuf, char *key, char *obuf, int maxlen));
-char *macro _PRx((char *icmd, char **keyword, char **value, int nkey,
-		  MacroCB client_callback, void *client_data));
-void cluc _PRx((char *s));
-void culc _PRx((char *s));
-int nowhite _PRx((char *c, char *cr));
-void nocr _PRx((char *s));
-int istrue _PRx((char *s));
-int isfalse _PRx((char *s));
-unsigned long strtoul16 _PRx((char *s, char **t));
-
-_PRend
-
-#endif
diff --git a/xpa/xalloc.c b/xpa/xalloc.c
deleted file mode 100644
index 18234db..0000000
--- a/xpa/xalloc.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- *	Copyright (c) 2004-2009 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * xalloc -- safe memory allocation with error checking
- *
- */
-
-/* this module is compiled within a funtools filter and must not require
-   the header files */
-#ifdef FILTER_PTYPE
-#define ANSI_FUNC 1
-#else
-#include <xalloc.h>
-#endif
-
-#define XALLOC_ERROR "ERROR: can't allocate memory (xalloc)\n"
-
-#if XALLOC_SETJMP
-
-static jmp_buf *xalloc_envptr=NULL;
-
-#ifdef ANSI_FUNC
-void xalloc_savejmp(jmp_buf *env)
-#else
-void xalloc_savejmp(env)
-     jmp_buf *env;
-#endif
-{
-  xalloc_envptr = env;
-}
-#endif
-
-
-#ifdef ANSI_FUNC
-static void _xalloc_error(void)
-#else
-static void _xalloc_error()
-#endif
-{
-  write(1, XALLOC_ERROR, strlen(XALLOC_ERROR));
-#if XALLOC_SETJMP
-  if( xalloc_envptr )
-    longjmp(*xalloc_envptr, XALLOC_SETJMP);
-  else
-#endif
-  exit(1);
-}
-
-#ifdef ANSI_FUNC
-void *xmalloc(size_t n)
-#else
-void *xmalloc(n)
-     size_t n;
-#endif
-{
-  void *p;
-  
-  if( !(p = (void *)malloc(n)) )
-    _xalloc_error();
-  return p;
-}
-
-#ifdef ANSI_FUNC
-void *xcalloc (size_t n, size_t s)
-#else
-void *xcalloc (n, s)
-     size_t n, s;
-#endif
-{
-  void *p;
-
-  if( !(p = (void *)calloc(n, s)) )
-    _xalloc_error();
-  return p;
-}
-
-#ifdef ANSI_FUNC
-void *xrealloc (void *p, size_t n)
-#else
-void *xrealloc (p, n)
-     void *p;
-     size_t n;
-#endif
-{
-  if( !p )
-    return xmalloc(n);
-  if( !(p = (void *)realloc(p, n)) )
-    _xalloc_error();
-  return p;
-}
-
-#ifdef ANSI_FUNC
-void xfree (void *p)
-#else
-void xfree (p)
-     void *p;
-#endif
-{
-  if( p )
-    free(p);
-}
-
-#ifdef ANSI_FUNC
-char *xstrdup (char *s)
-#else
-char *xstrdup (s)
-     char *s;
-#endif
-{
-  if( s )
-    return((char *)strcpy((char *)xmalloc((size_t)strlen(s)+1), s));
-  else
-    return NULL;
-}
diff --git a/xpa/xalloc.h b/xpa/xalloc.h
deleted file mode 100644
index c25fb32..0000000
--- a/xpa/xalloc.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *	Copyright (c) 2004 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * xalloc.h -- declarations for safe (error-checked) memory allocation
- *
- */
-
-#ifndef	__xalloc_h
-#define	__xalloc_h
-
-#if HAVE_CONFIG_H
-#include <conf.h>
-#endif
-
-#include <sys/types.h>
-#if HAVE_STRING_H
-#include <string.h>
-#endif
-#if HAVE_MALLOC_H
-#include <malloc.h>
-#endif
-#if HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#ifdef HAVE_SETJMP_H
-#define XALLOC_SETJMP 142857
-#include <setjmp.h>
-#endif
-
-#include <prsetup.h>
-
-_PRbeg
-
-void *xmalloc _PRx((size_t n));
-void *xcalloc _PRx((size_t n, size_t s));
-void *xrealloc _PRx((void *p, size_t n));
-void xfree _PRx((void *p));
-char *xstrdup _PRx((char *s));
-#if HAVE_SETJMP_H
-void xalloc_savejmp _PRx((jmp_buf *env));
-#endif
-
-_PRend
-
-#endif
diff --git a/xpa/xlaunch.c b/xpa/xlaunch.c
deleted file mode 100644
index 9f064d1..0000000
--- a/xpa/xlaunch.c
+++ /dev/null
@@ -1,657 +0,0 @@
-/*
- *	Copyright (c) 1999-2007 Smithsonian Astrophysical Observatory
- */
-
-#include <xlaunch.h>
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- * 			Private Routines and Data
- *
- *
- *----------------------------------------------------------------------------
- */
-
-static pid_t pid=0;
-
-#if HAVE_MINGW32==0
-
-/* wait for child process to start, using waitpid() */
-#ifdef ANSI_FUNC
-static int launch_pipes(int *pipes, int flag)
-#else
-static int launch_pipes(pipes, flag)
-     int *pipes;
-     int flag;
-#endif
-{
-  int i;
-  char tbuf[SZ_LINE];
-  if( pipes ){
-    for(i=0; i<4; i++){
-      pipes[i] = -1;
-    }
-    if( (pipe(&pipes[0]) < 0) || (pipe(&pipes[2]) < 0) ) return -1;
-    if( flag ){
-#if HAVE_SETENV
-      snprintf(tbuf, SZ_LINE-1, "%d,%d,%d,%d", 
-	       pipes[0], pipes[1], pipes[2], pipes[3]);
-      setenv("LAUNCH_PIPES", tbuf, 1);
-#else
-      snprintf(tbuf, SZ_LINE-1, "LAUNCH_PIPES=%d,%d,%d,%d", 
-	       pipes[0], pipes[1], pipes[2], pipes[3]);
-      putenv(xstrdup(tbuf));
-#endif
-    }
-  }
-  return 0;
-}
-
-#ifdef ANSI_FUNC
-static int cleanup_pipes(int *pipes)
-#else
-static int cleanup_pipes(pipes)
-     int *pipes;
-#endif
-{
-  if( pipes ){
-    /* close child pipes */
-    close(pipes[1]);
-    close(pipes[2]);
-    /* move parent write into slot 1 */
-    pipes[1] = pipes[3];
-    /* set unused pipes to impossible value */
-    pipes[2] = -1;
-    pipes[3] = -1;
-  }
-  return 0;
-}
-
-#if LAUNCH_USE_WAITPID
-/* wait for child process to start, using waitpid() */
-#ifdef ANSI_FUNC
-static int launch_waitstart(pid_t pid)
-#else
-static int launch_waitstart(pid)
-     pid_t pid;
-#endif
-{
-  int i, got;
-  int status=0;
-  struct timeval tv;
-  /* wait up to LAUNCH_WAIT_TRIES millisec to make sure the child started,
-     but if we get an error, we can exit immediately */
-  for(i=0; i<LAUNCH_WAIT_TRIES; i++){
-    errno = 0;
-    got=waitpid(pid, &status, WNOHANG);
-    /* look for error termination */
-    if( (got < 0) || ((got == 0) && xerrno) ){
-      got = -1;
-      /* make sure status shows error */
-      if( status == 0 )
-	status = -1;
-      break;
-    }
-    /* look for normal termination */
-    else if( got > 0 ){
-      break;
-    }
-    /* no termination, sleep and wait some more */
-    else{
-      tv.tv_sec = 0;
-      tv.tv_usec = LAUNCH_WAIT_MSEC;
-      xselect(1, NULL, NULL, NULL, &tv);
-    }
-  }
-  /* no termination means the child is still running */
-  if( got == 0 ) status = 0;
-  /* return the news */
-  return status;
-}
-#endif
-
-/* 
- *  standard unix version of launch:
- *  adapted from the system() code in:
- *  W. Richard Stevens
- *  "Advanced Programming in the Unix Environment" 
- *  Addison-Wesley Publishing Co, 1992
- *  p. 314
- */
-#ifdef ANSI_FUNC
-static int launch_fork_exec(char *cmdstring, int attach, 
-			    char **stdfiles, int *pipes)
-#else
-  static int launch_fork_exec(cmdstring, attach, stdfiles, pipes)
-     char *cmdstring;
-     int attach;
-     char **stdfiles;
-     int *pipes;
-#endif
-{
-  int status;
-  int tpipes[4];
-  struct sigaction ignore, saveintr, savequit;
-  sigset_t chldmask, savemask;
-#if LAUNCH_USE_PIPE
-  int fd[2];
-#endif
-
-  /* return false if no command is specified */
-  if( !cmdstring || !*cmdstring ) return -1;
-
-  ignore.sa_handler = SIG_IGN;	/* ignore SIGINT and SIGQUIT */
-  sigemptyset(&ignore.sa_mask);
-  ignore.sa_flags = 0;
-  if (sigaction(SIGINT, &ignore, &saveintr) < 0)
-    return -1;
-  if (sigaction(SIGQUIT, &ignore, &savequit) < 0)
-    return -1;
-  
-  sigemptyset(&chldmask);	/* now block SIGCHLD */
-  sigaddset(&chldmask, SIGCHLD);
-  if (sigprocmask(SIG_BLOCK, &chldmask, &savemask) < 0)
-    return -1;
-  
-#if LAUNCH_USE_PIPE
-  /* open a pipe so parent can hear if the child fails to exec */
-  if( !attach ){
-    if( pipe(fd) < 0 )
-      return -1;
-    xfcntl(fd[0], F_SETFD, FD_CLOEXEC);
-    xfcntl(fd[1], F_SETFD, FD_CLOEXEC);
-  }
-#endif
-
-  /* create temp ipc pipes if necessary */
-  if( pipes ){
-    if( launch_pipes(tpipes, 0) < 0 ) return -1;
-  }
-
-  /* start new process */
-  if( (pid = fork()) < 0 ){
-#if LAUNCH_USE_PIPE
-    if( !attach ){
-      close(fd[0]);
-      close(fd[1]);
-    }
-#endif
-    if( pipes ){
-      close(tpipes[0]);
-      close(tpipes[1]);
-      close(tpipes[2]);
-      close(tpipes[3]);
-    }
-    status = -1;		/* ERROR: probably out of processes */
-  } else if( pid == 0 ){	/* child */
-    int i, j, len;
-    char *argv[LAUNCH_ARGS+1];
-    char *path=NULL;
-    char *s=NULL, *t=NULL;
-
-    /* reset pipes, if necessary */
-    if( pipes ){
-      /* close parent's read/write pipes */
-      close(tpipes[0]);
-      close(tpipes[3]);
-      /* change child's stdin/stdout to use the passed pipes to parent */
-      dup2(tpipes[2], 0);  close(tpipes[2]);
-      dup2(tpipes[1], 1);  close(tpipes[1]);
-    }
-
-    /* close and reopen stdio files, if necessary */
-    if( stdfiles ){
-      for(i=0; i<3; i++){
-	if( stdfiles[i] ){
-	  close(i);
-	  switch(i){
-	  case 0:
-	    if( open(stdfiles[i], O_RDONLY) < 0){
-	      _exit(-1);
-	    }
-	    break;
-	  case 1:
-	    if( open(stdfiles[i], O_CREAT|O_WRONLY|O_TRUNC, 0600) < 0){
-	      _exit(-1);
-	    }
-	    break;
-	  case 2:
-	    /* if stderr is the same as stdout, just dup */
-	    if( stdfiles[1] && !strcmp(stdfiles[1], stdfiles[i]) ){
-	      dup(1);
-	    }
-	    else{
-	      if( open(stdfiles[i], O_CREAT|O_WRONLY|O_TRUNC, 0600) < 0){
-		_exit(-1);
-	      }
-	    }
-	    break;
-	  }
-	}
-      }
-    }
-
-    /* restore previous signal actions & reset signal mask, but only if
-       parent is waiting for completion (i.e., we are "attached") */
-    if( attach ){
-      sigaction(SIGINT, &saveintr, NULL);
-      sigaction(SIGQUIT, &savequit, NULL);
-      sigprocmask(SIG_SETMASK, &savemask, NULL);
-    }
-#if LAUNCH_USE_PIPE
-    /* child closes reader -- only writes status */
-    else{
-      close(fd[0]);
-    }
-#endif
-
-    /* package up the arguments for new process */
-    t = (char *)xstrdup(cmdstring);
-    for(i=0, s=(char *)strtok(t, " \t"); s;
-	i++, s=(char *)strtok(NULL," \t")){
-      if( i < LAUNCH_ARGS ){ 
-	/* save argument */
-	argv[i] = xstrdup(s);
-	/* change back special char to spaces, if necessary */
-	len = strlen(argv[i]);
-	for(j=0; j<len; j++){
-	  if( argv[i][j] == LAUNCH_SPACE){
-	    argv[i][j] = ' ';
-	  }
-	}
-	argv[i+1] = NULL;
-	/* save program name */
-	if( i == 0 ) path = argv[i];
-      }
-    }
-    if( t ) xfree(t);
-#ifndef HAVE_CYGWIN
-    /* this call is broken in cygwin */
-    /* for unattached processes, start a new session (with new process id),
-       so that we do not inherit signals from parent (particularly SIGTERM) */
-    if( !attach )
-      setsid();
-#endif
-    /* start up the new program */
-    if( execvp(path, argv) ){
-      status = 127;
-#if LAUNCH_USE_PIPE
-      if( !attach ){
-	write(fd[1], &status, 4);
-	close(fd[1]);
-      }
-#endif
-      _exit(status);		/* exec error */
-    }
-  } else {			/* parent */
-    /* wait for program termination from attached process */
-    if( attach ){
-      while( waitpid(pid, &status, 0) < 0 ){
-	if( xerrno != EINTR ){
-	  status = -1; /* error other than EINTR from waitpid() */
-	  break;
-	}
-      }
-    }
-    else{
-#if LAUNCH_USE_WAITPID
-      status = launch_waitstart(pid);
-#endif
-#if LAUNCH_USE_PIPE
-      close(fd[1]);
-      if( read(fd[0], &status, 4) == 0 ){
-	status = 0;
-      }
-      close(fd[0]);
-#endif
-    }
-  }
-  
-  /* cleanup temp ipc pipes and move into user space */
-  if( pipes ){
-    cleanup_pipes(tpipes);
-    pipes[0] = tpipes[0];
-    pipes[1] = tpipes[1];
-  }
-
-  /* restore previous signal actions & reset signal mask */
-  if( sigaction(SIGINT, &saveintr, NULL) < 0 )        return -1;
-  if( sigaction(SIGQUIT, &savequit, NULL) < 0 )       return -1;
-  if( sigprocmask(SIG_SETMASK, &savemask, NULL) < 0 ) return -1;
-  
-  /* return the news */
-  return status;
-}
-
-#endif
-
-#if HAVE_POSIX_SPAWN
-
-#if defined(HAVE__NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H)
-#include <crt_externs.h>
-#define environ (*_NSGetEnviron())
-#else
-extern char **environ;
-#endif
-
-/* spawn calls POSIX posix_spawn */
-#ifdef ANSI_FUNC
-static int launch_posix_spawn(char *cmdstring, int attach, 
-			      char **stdfiles, int *pipes)
-#else
-  static int launch_posix_spawn(cmdstring, attach, stdfiles, pipes)
-     char *cmdstring;
-     int attach;
-     char **stdfiles;
-     int *pipes;
-#endif
-{
-  int i, j, len;
-  int status=0;
-  int got=0;
-  int tpipes[4];
-  char *argv[LAUNCH_ARGS+1];
-  char *path=NULL;
-  char *s=NULL, *t=NULL;
-  posix_spawn_file_actions_t act;
-  posix_spawn_file_actions_t *pact=NULL;
-
-  /* return false if no command is specified */
-  if( !cmdstring || !*cmdstring )
-    return -1;
-
-  /* create temp ipc pipes if necessary */
-  if( pipes ){
-    if( launch_pipes(tpipes, 1) < 0 ) return -1;
-  }
-
-  /* package up the arguments for new process */
-  t = (char *)xstrdup(cmdstring);
-  for(i=0, s=(char *)strtok(t, " \t"); s;
-      i++, s=(char *)strtok(NULL," \t")){
-    if( i < LAUNCH_ARGS ){ 
-      /* save argument */
-      argv[i] = xstrdup(s);
-      /* change back special char to spaces, if necessary */
-      len = strlen(argv[i]);
-      for(j=0; j<len; j++){
-	if( argv[i][j] == LAUNCH_SPACE){
-	  argv[i][j] = ' ';
-	}
-      }
-      /* last arg is always a NULL */
-      argv[i+1] = NULL;
-      /* save program name */
-      if( i == 0 ) path = argv[i];
-      /* inc arg count */
-      got++;
-    }
-  }
-  if( t ) xfree(t);
-  /* arrange stdfiles files, if necessary */
-  if( stdfiles ){
-    if( posix_spawn_file_actions_init(&act) != 0) 
-      return -1;
-    /* stdin */
-    if(stdfiles[0] && 
-       posix_spawn_file_actions_addopen(&act, 0, stdfiles[0], O_RDONLY, 0))
-      return -1;
-    /* stdout */
-    if(stdfiles[1] && 
-       posix_spawn_file_actions_addopen(&act, 1, stdfiles[1], O_CREAT|O_WRONLY|O_TRUNC, 0600))
-      return -1;
-    /* stderr */
-    if(stdfiles[2] && 
-       posix_spawn_file_actions_addopen(&act, 2, stdfiles[2], O_CREAT|O_WRONLY|O_TRUNC, 0600))
-      return -1;
-    pact = &act;
-  }
-  /* start the new process */
-  if( (status = posix_spawnp(&pid, path, pact, NULL, argv, environ)) )
-    return status;
-  /* wait for program termination from attached process */
-  if( attach ){
-    while( waitpid(pid, &status, 0) < 0 ){
-      if( xerrno != EINTR ){
-	status = -1; /* error other than EINTR from waitpid() */
-	break;
-      }
-    }
-  }
-#if BIG_DELAY_WHEN_USING_THIS
-  /* wait for child process to start */
-  else{
-    status = launch_waitstart(pid);
-  }
-#endif
-  /* clean up */
-  if( stdfiles ) posix_spawn_file_actions_destroy(&act);
-  /* cleanup temp ipc pipes and move into user space */
-  if( pipes ){
-    cleanup_pipes(tpipes);
-    pipes[0] = tpipes[0];
-    pipes[1] = tpipes[1];
-  }
-  for(i=0; i<got; i++){
-    if( argv[i] ) xfree((char *)argv[i]);
-  }
-  /* return status */
-  return status;
-}
-
-#endif
-
-#if HAVE_SPAWNVP
-
-#ifdef ANSI_FUNC
-static int launch_spawnvp(char *cmdstring, int attach, 
-			  char **stdfiles, int *pipes)
-#else
-  static int launch_spawnvp(cmdstring, attach, stdfiles, pipes)
-     char *cmdstring;
-     int attach;
-     char **stdfiles;
-     int *pipes;
-#endif
-{
-  int i, j;
-  int len;
-  int got;
-  int status;
-  int tpipes[4];
-  char *argv[LAUNCH_ARGS+1];
-  char *path=NULL;
-  char *s=NULL, *t=NULL;
-  struct timeval tv;
-
-  /* return false if no command is specified */
-  if( !cmdstring || !*cmdstring ) return -1;
-
-  /* for now, we can't support stdfiles */
-  if( stdfiles ) return -1;
-
-  /* create temp ipc pipes if necessary */
-  if( pipes ){
-#if HAVE_MINGW32==0
-    if( launch_pipes(tpipes, 1) < 0 ) return -1;
-#else
-    fprintf(stderr, "ERROR: launch_pipes() not available in mingw\n");
-    exit(1);
-#endif
-  }
-
-
-  /* package up the arguments for new process */
-  t = (char *)xstrdup(cmdstring);
-  for(i=0, got=0, s=(char *)strtok(t, " \t"); s;
-      i++, s=(char *)strtok(NULL," \t")){
-    if( i < LAUNCH_ARGS ){ 
-      /* save argument */
-      argv[i] = xstrdup(s);
-      /* change back special char to spaces, if necessary */
-      len = strlen(argv[i]);
-      for(j=0; j<len; j++){
-	if( argv[i][j] == LAUNCH_SPACE){
-	  argv[i][j] = ' ';
-	}
-      }
-      /* last arg is always a NULL */
-      argv[i+1] = NULL;
-      /* save program name */
-      if( i == 0 ) path = (char *)argv[i];
-      /* inc arg count */
-      got++;
-    }
-  }
-  if( t ) xfree(t);
-  if( attach )
-    i = _P_WAIT;
-  else
-    i = _P_NOWAIT;
-  if((status = spawnvp(i, path, (void *)argv)) != -1){
-    status = 0;
-    /* wait for child to start */
-    tv.tv_sec = 0;
-    tv.tv_usec = LAUNCH_WAIT_MSEC;
-    xselect(1, NULL, NULL, NULL, &tv);
-  }
-  /* clean up */
-  for(i=0; i<got; i++){
-    if( argv[i] ) xfree((char *)argv[i]);
-  }
-  /* cleanup temp ipc pipes and move into user space */
-  if( pipes ){
-#if HAVE_MINGW32==0
-    cleanup_pipes(tpipes);
-    pipes[0] = tpipes[0];
-    pipes[1] = tpipes[1];
-#else
-    fprintf(stderr, "ERROR: launch_pipes() not available in mingw\n");
-    exit(1);
-#endif
-  }
-  return status;
-}
-
-#endif
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- * 			Public Routines and Data
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/*
- *
- * LaunchPid() -- return pid of last  launched process 
- *
- */
-#ifdef ANSI_FUNC
-pid_t LaunchPid(void)
-#else
-pid_t LaunchPid()
-#endif
-{
-  return pid;
-}
-
-#ifdef ANSI_FUNC
-int Launch(char *cmdstring, int attach, char **stdfiles, int *pipes)
-#else
-int Launch(cmdstring, attach, stdfiles, piles)
-     char *cmdstring;
-     int attach;
-     char **stdfiles;
-     int *pipes;
-#endif
-{
-  static int which_launch=0;
-  static int which_debug=0;
-  char *s=NULL;
-
-  /* return false if no command is specified */
-  if( !cmdstring || !*cmdstring ) return -1;
-
-  /* sanity check: don't specify stdfiles and pipes simultaneously */
-  if( stdfiles && pipes ){
-    fprintf(stderr, 
-	    "ERROR: stdfiles and pipes are mutually exclusive in Launch()\n");
-    return -1;
-  }
-
-  /* if pipes are specified, we don't attach */
-  if( pipes ) attach = 0;
-
-  /* determine launch method */
-  if( !which_launch ){
-    which_launch = LAUNCH_DEFAULT_WHICH;
-    if( (s=getenv("LAUNCH_ROUTINE")) ){
-      /* fork_exec */
-      if( !strncasecmp(s, "f", 1) ){
-	which_launch = 1;
-	if( *s == 'F' ) which_debug = 1;
-      }
-      /* posix_spawn */
-      else if( !strncasecmp(s, "p", 1) ){
-	which_launch = 2;
-	if( *s == 'P' ) which_debug = 1;
-      }
-      /* spawnvp */
-      else if( !strncasecmp(s, "s", 1) ){
-	which_launch = 3;
-	if( *s == 'S' ) which_debug = 1;
-      }
-      else if( *s == 'V' ) {
-	which_debug = 1;
-      }
-    }
-  }
-  /* call the correct launch method */
-  switch(which_launch){
-  case 1:
-#if HAVE_MINGW32==0
-    if( which_debug ) fprintf(stderr, "launch_fork_exec: %s\n", cmdstring);
-    return launch_fork_exec(cmdstring, attach, stdfiles, pipes);
-#else
-    fprintf(stderr, "ERROR: fork_exec() not available on this host\n");
-    exit(1);
-#endif
-    break;
-  case 2:
-#if HAVE_POSIX_SPAWN
-    if( which_debug ) fprintf(stderr, "launch_posix_spawn: %s\n", cmdstring);
-    return launch_posix_spawn(cmdstring, attach, stdfiles, pipes);
-#else
-    fprintf(stderr, "ERROR: posix_spawn() not available on this host\n");
-    exit(1);
-#endif
-    break;
-  case 3:
-#if HAVE_SPAWNVP
-    if( which_debug ) fprintf(stderr, "launch_spawnvp: %s\n", cmdstring);
-    return launch_spawnvp(cmdstring, attach, stdfiles, pipes);
-#else
-    fprintf(stderr, "ERROR: spawnvp() not available on this host\n");
-    exit(1);
-#endif
-    break;
-  default:
-#if HAVE_MINGW32==0
-    if( which_debug ) fprintf(stderr, "launch_fork_exec: %s\n", cmdstring);
-    return launch_fork_exec(cmdstring, attach, stdfiles, pipes);
-#else
-    fprintf(stderr, "ERROR: no launch techniques available on this host\n");
-    exit(1);
-#endif
-    break;
-  }
-  /* can't happen */
-  return -1;
-}
-
diff --git a/xpa/xlaunch.h b/xpa/xlaunch.h
deleted file mode 100644
index 2c20cb8..0000000
--- a/xpa/xlaunch.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * xlaunch.h -- declarations for launching a program
- *
- */
-
-#ifndef	__xlaunch_h
-#define	__xlaunch_h
-
-#if HAVE_CONFIG_H
-#include <conf.h>
-#endif
-
-#include <stdio.h>
-#include <errno.h>
-#include <signal.h>
-#include <fcntl.h>                                                       
-#include <sys/time.h>
-#include <sys/stat.h>
-#if HAVE_STRING_H
-#include <string.h>
-#endif
-#if HAVE_STRINGS_H
-#include <strings.h>
-#endif
-#if HAVE_MALLOC_H
-#include <malloc.h>
-#endif
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#if HAVE_POSIX_SPAWN
-#include <spawn.h>
-#endif
-#include <xport.h>
-#include <word.h>
-#include <xalloc.h>
-#include <prsetup.h>
-
-#define LAUNCH_ARGS 1024
-
-#define LAUNCH_SPACE '\001'
-
-/* for fork/exec, one of these is required to specify the technique to be used
-   by the parent when determining if the child started successfully */
-#if !defined(LAUNCH_USE_PIPE) && !defined(LAUNCH_USE_WAITPID)
-#define LAUNCH_USE_PIPE 1
-#endif
-/* ... but not both */
-#if defined(LAUNCH_USE_PIPE) && defined(LAUNCH_USE_WAITPID)
-#error "LAUNCH_USE_PIPE and LAUNCH_USE_WAITPID are mutually exclusive"
-#endif
-
-#ifndef LAUNCH_WAIT_TRIES
-#define LAUNCH_WAIT_TRIES  100
-#endif
-#ifndef LAUNCH_WAIT_MSEC
-#define LAUNCH_WAIT_MSEC  5000
-#endif
-
-#if HAVE_MINGW32|HAVE_CYGWIN
-#define HAVE_SPAWNVP 1
-#endif
-
-#if HAVE_MINGW32
-/* for now, ensure that MinGW utilizes spawnvp() */
-#define LAUNCH_DEFAULT_WHICH 3
-#elif HAVE_POSIX_SPAWN
-/* use posix_spawn if possible (required for OS X 10.5) */
-#define LAUNCH_DEFAULT_WHICH 2
-#else
-/* use our home-grown version */
-#define LAUNCH_DEFAULT_WHICH 1
-#endif
-
-_PRbeg
-
-int Launch _PRx((char *cmdstring, int wait, char **stdfiles, int *pipes));
-pid_t LaunchPid _PRx((void));
-
-_PRend
-
-#endif
diff --git a/xpa/xpa.c b/xpa/xpa.c
deleted file mode 100644
index 2454d64..0000000
--- a/xpa/xpa.c
+++ /dev/null
@@ -1,4712 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-#include <xpap.h>
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- * 			Private Routines and Data
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/* this is the head of the global list -- too lazy to do anything more */
-static XPA xpahead=NULL;
-
-/* globals for the xpa environment, controlled by environment variables */
-static int stimeout=XPA_SHORT_TIMEOUT; 	/* select, gets timeout in secs */
-static int ltimeout=XPA_LONG_TIMEOUT; 	/* fillbuf timeout in secs */
-static int ctimeout=XPA_CONNECT_TIMEOUT;/* local xpans connect */
-static int verbosity=XPA_VERBOSITY;	/* 0=quiet, 1=normal, 2=full */
-static int guseacl=1;		/* 0=don't use acls, 1=enable acls */
-static int etimestamp=0;	/* 0=don't timestamp errors, 1=do timestamp */
-static int nsregister=1;	/* 0=don't register with xpans, 1=register */
-static int sigusr1=1;		/* 0=don't use sigusr1, 1=enable sigusr1 */
-static int vercheck=1;		/* 0=don't check version, 1=check version */
-static char *tmpdir=NULL;  	/* temporary dir for logs. etc. */
-#if HAVE_ATEXIT
-static int atexitinit=0;	/* whether atexit has been registered */
-#endif
-
-/* variables used by all XPAs in this process */
-static char activefds[FD_SETSIZE];
-static char nsmethod[SZ_LINE];
-static char nsusers[SZ_LINE];
-
-/* global method type: unix or inet */
-static int mtype=0;
-
-/* width of select channel flag */
-static int swidth=FD_SETSIZE;
-
-/* defined in tcp.c */
-extern int use_localhost;
-
-/* erro code strings -- must match the error codes in xpap.h */
-char *xpaMessbuf[] = {
-  "oh, what a mess we've made!",
-  "authentication failed",
-  "xpa connection refused",
-  "can't resolve host name for xpa",
-  "can't read initialization info for xpa",
-  "invalid xpa command in initialization string",
-  "no receive function defined for this xpa",
-  "no send function defined for this xpa",
-  "no info function defined for this xpa",
-  "undefined command for this xpa",
-  "missing command for this xpa",
-  "name does not match target template",
-  "can't create data channel socket",
-  "could not read data buf (possible timeout)",
-  "illegal command or command switch"
-};
-
-/* temp static time buffer */
-static char ctimebuf[SZ_LINE];
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAProxyConnect
- *
- * Purpose:	connect to a client (in proxy mode)
- *
- * Returns:	0 if successfull, otherwise -1
- *
- *----------------------------------------------------------------------------
- */
-
-#ifdef ANSI_FUNC
-static int 
-XPAProxyConnect(XPA xpa, char *method, 
-		unsigned int *rip, unsigned short *rport, char *rname)
-#else
-static int XPAProxyConnect(xpa, method, rip, rport, rname)
-     XPA xpa;
-     char *method;
-     unsigned int *rip;
-     unsigned short *rport; 
-     char *rname;
-#endif
-{
-  int ofd;
-  int tries=0;
-  int keep_alive=1;
-  unsigned int ip;
-  unsigned short port;
-  struct sockaddr_in sock_in;
-#if HAVE_SYS_UN_H
-  struct sockaddr_un sock_un;
-#endif
-
-  FPRINTF((stderr, "%sXPAProxyConnect to %s\n", _sp, method));
-  /* initialize results */
-  if( rip )   *rip = 0;
-  if( rport ) *rport = 0;
-  if( rname ) *rname = '\0';
-
-  switch(XPAMethod(method)){
-  case XPA_INET:
-again1:
-    if( !XPAParseIpPort(method, &ip, &port) ){
-      goto error;
-    }
-    /* use $localhost over $host (we don't trust host to be correct) */
-    if( (ip == gethostip("$host")) && (tries == 0) ){
-      ip = gethostip("$localhost");
-    }
-    /* connect to the server before we go further */
-    if( (ofd = xsocket(AF_INET, SOCK_STREAM, 0)) < 0 ){
-      PERROR(("XPAProxyConnect: socket()"));
-      goto error;
-    }
-    setsockopt(ofd, SOL_SOCKET, SO_KEEPALIVE,
-	       (char *)&keep_alive, sizeof(keep_alive));
-    memset((char *)&sock_in, 0, sizeof(sock_in));
-    sock_in.sin_family = AF_INET;
-    sock_in.sin_addr.s_addr = htonl(ip);
-    sock_in.sin_port = htons(port);
-    /* make the connection with the server */
-    if(connect(ofd, (struct sockaddr *)&sock_in, sizeof(sock_in))<0){
-      xclose(ofd);
-      /* if localhost doesn't work, make one try with the host ip */
-      /* we also try again just in case there was an odd error such
-	 as "permission denied", which we have seen once or twice */
-      if( tries < 2 ){
-	tries++;
-	goto again1;
-      }
-      /* give up */
-      else{
-	PERROR(("XPAProxyConnect: connect()"));
-	goto error;
-      }
-    }
-    break;
-#if HAVE_SYS_UN_H
-  case XPA_UNIX:
-again2:
-    ip = 0;
-    port = 0;
-    /* open a socket and fill in socket information */
-    if( (ofd = xsocket(AF_UNIX, SOCK_STREAM, 0)) < 0 ){
-      goto error;
-    }
-    setsockopt(ofd, SOL_SOCKET, SO_KEEPALIVE,
-	       (char *)&keep_alive, sizeof(keep_alive));
-    memset((char *)&sock_un, 0, sizeof(sock_un));
-    sock_un.sun_family = AF_UNIX;
-    strcpy(sock_un.sun_path, method);
-    /* make the connection with the server */
-    if(connect(ofd, (struct sockaddr *)&sock_un, sizeof(sock_un))<0){
-      xclose(ofd);
-      /* Unix sockets get ECONNREFUSED when the listen queue is full,
-	 so we try a few times to give the server a chance to recover */
-      if( (xerrno == ECONNREFUSED) && (tries < XPA_RETRIES) ){
-	tries++;
-	XPASleep(10);
-	goto again2;
-      }
-      /* give up */
-      else{
-	goto error;
-      }
-    }
-    break;
-#endif
-  default:
-    goto error;
-  }
-
-  /* fill in blansk */
-  if( rip )   *rip   = ip;
-  if( rport ) *rport = port;
-  if( rname ){
-    strncpy(rname, method, SZ_LINE-1);
-    rname[SZ_LINE-1] = '\0';
-  }
-  return(ofd);
-
-error:
-  return -1;
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	CommNew
- *
- * Purpose:	allocate a new comm record and add to end of list
- *
- * Returns:	allocated comm record
- *
- *----------------------------------------------------------------------------
- */
-
-#ifdef ANSI_FUNC
-static XPAComm 
-CommNew (XPA xpa, int fd, unsigned int ip, int port, char *name, NS ns)
-#else
-static XPAComm CommNew(xpa, fd, ip, port, name, ns)
-     XPA xpa;
-     int fd;
-     unsigned int ip;
-     int port;
-     char *name;
-     NS ns;
-#endif
-{
-  XPAComm comm, cur;
-  int i;
-  socklen_t slen;
-  struct sockaddr_in sock_in;
-#if HAVE_SYS_UN_H
-  struct sockaddr_un sock_un;
-#endif
-
-  /* create the comm struct */
-  if( (comm = (XPAComm)xcalloc(1, sizeof(XPACommRec))) == NULL )
-    return(NULL);
-  
-  /* if fd < 0, we accept a connection to get the fd */
-  if( fd < 0 ){
-    /* accept the connection */
-    switch(mtype){
-    case XPA_INET:
-      while( 1 ){
-	slen = sizeof(struct sockaddr_in);
-        if((comm->cmdfd=xaccept(xpa->fd,(struct sockaddr *)&sock_in,&slen))>=0){
-	  comm->cmdip = ntohl(sock_in.sin_addr.s_addr);
-	  comm->cmdport = ntohs(sock_in.sin_port);
-	  break;
-	}
-	else{
-	  if( xerrno == EINTR )
-	    continue;
-	  else{
-	    xfree(comm);
-	    return(NULL);
-	  }
-	}
-      }
-      break;
-#if HAVE_SYS_UN_H
-    case XPA_UNIX:
-      while( 1 ){
-	slen = sizeof(struct sockaddr_un);
-	if((comm->cmdfd=xaccept(xpa->fd,(struct sockaddr *)&sock_un,&slen))>=0){
-	  comm->cmdname = xstrdup(sock_un.sun_path);
-	  break;
-	}
-	else{
-	  if( xerrno == EINTR )
-	    continue;
-	  else{
-	    xfree(comm);
-	    return(NULL);
-	  }
-	}
-      }
-      break;
-#endif
-    default:
-      xfree(comm);
-      return(NULL);
-    }
-  }
-  /* all info is supplied */
-  else{
-    switch(mtype){
-    case XPA_INET:
-      comm->cmdip = ip;
-      comm->cmdport = port;
-      break;
-    case XPA_UNIX:
-      comm->cmdname = xstrdup(name);
-      break;
-    }
-    comm->cmdfd = fd;
-    /* store name server record */
-    comm->ns = ns;
-  }
-
-  /* set back pointer */
-  /* make sure we close on exec */
-  xfcntl(comm->cmdfd, F_SETFD, FD_CLOEXEC);
-  /* mark data socket with impossible value */
-  comm->datafd = -1;
-  /* default is to ack */
-  comm->ack = 1;
-  /* set default cendian flag */
-  comm->cendian = "?";
-  /* clear the acl flags */
-  for(i=0; i<XPA_CMDS+1; i++){
-    comm->acl[i] = -1;
-  }
-
-  /* add this comm to end of list of comms */
-  if( xpa->commhead == NULL ){
-    xpa->commhead = comm;
-  }
-  else{
-    for(cur=xpa->commhead; cur->next!=NULL; cur=cur->next){
-      ;
-    }
-    cur->next = comm;
-  }
-
-  /* we might have to add this fd specially to a non-select event loop */
-  if( xpa->seladd )
-    comm->selcptr = (xpa->seladd)(xpa, comm->cmdfd);
-
-  /* make this fd active */
-  XPAActive(xpa, comm, 1);
-
-  FPRINTF((stderr, "%sCommNew: ip=%x port=%d fd=%d\n", _sp,
-	   comm->cmdip, comm->cmdport, comm->cmdfd));
-
-  /* return the good news */
-  return(comm);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	CommFree
- *
- * Purpose:	free a comm record and remove from list
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-CommFree (XPA xpa, XPAComm comm, int flag)
-#else
-static void CommFree(xpa, comm, flag)
-     XPA xpa;
-     XPAComm comm;
-     int flag;
-#endif
-{
-  XPAComm cur;
-
-  if( !comm )
-    return;
-
-  FPRINTF((stderr, "%sCommFree: ip=%x port=%d fd=%d dfd=%d\n", _sp,
-	   comm->cmdip, comm->cmdport, comm->cmdfd, comm->datafd));
-  /* remove from list of this xpa's comms */
-  if( xpa ){
-    if( xpa->commhead ){
-      if( xpa->commhead == comm ){
-	xpa->commhead = comm->next;
-      }
-      else{
-	for(cur=xpa->commhead; cur!=NULL; cur=cur->next){
-	  if( cur->next == comm ){
-	    cur->next = comm->next;
-	    break;
-	  }
-	}
-      }
-    }
-  }
-  /* must check all xpas */
-  else{
-    for(xpa=xpahead; xpa!=NULL; xpa=xpa->next){
-      if( xpa->commhead ){
-	if( xpa->commhead == comm ){
-	  xpa->commhead = comm->next;
-	}
-	else{
-	  for(cur=xpa->commhead; cur!=NULL; cur=cur->next){
-	    if( cur->next == comm ){
-	      cur->next = comm->next;
-	      break;
-	    }
-	  }
-	}
-      }
-    }
-  }
-
-  /* close socket connections */
-  if( flag && (comm->cmdfd >= 0) ){
-    FPRINTF((stderr, "%sCommFree closing cmd fd: %d\n", _sp, comm->cmdfd));
-    /* remove from active */
-    if( comm->cmdfd < FD_SETSIZE )
-	activefds[comm->cmdfd] = 0;
-    /* delete the comm cmd fd specially from a non-select event loop */
-    if( xpa && xpa->seldel && comm->selcptr ){
-      (xpa->seldel)(comm->selcptr);
-      comm->selcptr = NULL;
-    }
-    /* close file */
-    xclose(comm->cmdfd);
-  }
-  /* close data channel */
-  XPACloseData(xpa, comm);
-  /* if we have a file name (unix sockets), free it */
-  if( comm->cmdname != NULL ){
-    unlink(comm->cmdname);
-    xfree(comm->cmdname);
-  }
-  if( comm->dataname != NULL ){
-    unlink(comm->dataname);
-    xfree(comm->dataname);
-  }
-
-  /* free up the space */
-  if( comm->id != NULL )        xfree(comm->id);
-  if( comm->info != NULL )      xfree(comm->info);
-  if( comm->target != NULL )    xfree(comm->target);
-  if( comm->paramlist != NULL ) xfree(comm->paramlist);
-
-  /* this comm is no longer associated with an ns */
-  if( comm->ns ){
-    comm->ns->nproxy -= 1;
-  }
-
-  /* disassociate from parent xpa */
-  if( xpa ){
-    xpa->comm = NULL;
-  }
-
-  /* free up structure */
-  xfree(comm);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPANSOpen
- *
- * Purpose:	open a connection to the name service
- *
- * Returns:	connection fd on success, -1 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static NS
-XPANSOpen (XPA xpa, char *host, int force)
-#else
-static NS XPANSOpen(xpa, host, force)
-     XPA xpa;
-     char *host;
-     int force;
-#endif
-{
-  int i;
-  int status;
-  int xnsfd=0;
-  int keep_alive=1;
-  int tries=0;
-  int ip=0;
-  int dowarn=0;
-  int contmode=XPA_CONNECT_TIMEOUT_MODE;
-  unsigned short xnsport=0;
-  unsigned int xnsip=0;
-  static int errinit=0;
-  char *s;
-  char *path;
-  char *method;
-  char nscmd[SZ_LINE];
-  char tbuf[SZ_LINE];
-  char tbuf2[SZ_LINE];
-  struct sockaddr_in sock_in;
-  struct passwd *pw;
-#if HAVE_SYS_UN_H
-  struct sockaddr_un sock_un;
-#endif
-  char *findname=NULL;
-  NS ns, cur;
-
-  /* get name server method */
-  method = XPANSMethod(host, 0);
-
-  /* if the name service already is open, just return fd */
-  if( xpa ){
-    for(ns=xpa->nshead; ns!=NULL; ns=ns->next){
-      if( !strcmp(ns->method, method) ){
-	/* if forcing, see if the connection is valid */
-	if( force >= 0 ){
-	  if( (XPAPuts(xpa, ns->fd, "status\n", stimeout) >0)     &&
-	      (XPAGets(xpa, ns->fd, tbuf, SZ_LINE, stimeout) >0)  && 
-	      !strncmp(tbuf, "XPA$OK", 6)		     ){
-	    FPRINTF((stderr, "%sXPANSOpen: found existing ns: %s\n",
-		     _sp, ns->method));
-	    return ns;
-	  }
-	  /* found the ns, but its not open */
-	  else{
-	    FPRINTF((stderr, "%sXPANSOpen: existing ns is dead: %s\n",
-		     _sp, ns->method));
-	    XPANSClose(xpa, ns);
-	    break;
-	  }
-	}
-	/* just return whatever we have if we are not forcing */
-	else{
-	  return ns;
-	}
-      }
-    }
-  }
-
-  /* if no existing ns and flag is negative, we are done */
-  if( force == -1 )
-    return(NULL);
-
-  /* we always make up the command afresh */
-  *nscmd = '\0';
-
-  /* get users for this user */
-  if( (s=(char *)getenv("XPA_NSUSERS")) != NULL )
-    strncpy(nsusers, s, SZ_LINE-1);
-  /* default is just this use's userrname, from the environment */
-  else if( (s=(char *)getenv("LOGNAME")) != NULL )
-    strncpy(nsusers, s, SZ_LINE-1);
-#if HAVE_MINGW32==0
-  /* this is a last resort */
-  else if( (pw=getpwuid(geteuid())) )
-    strncpy(nsusers, pw->pw_name, SZ_LINE-1);
-#endif
-  /* if nothing good has happened, make it "all" */
-  if( *nsusers == '\0' )
-    strcpy(nsusers, "*");
-  /* null-terminate string */
-  nsusers[SZ_LINE-1] = '\0';
-
-  /* set up communications socket for this method */
-  switch(mtype){
-  case XPA_INET:
-again1:
-    XPAParseIpPort(method, &xnsip, &xnsport);
-    /* use $localhost over $host (we do not trust host to be correct) */
-    if( (xnsip == gethostip("$host")) && (tries == 0) ){
-      xnsip = gethostip("$localhost");
-    }
-    if( xnsip == 0 ){
-      fprintf(stderr,
-	      "XPA$ERROR: invalid host name specified: %s.\n", method);
-      return(NULL);
-    }
-    if( (xnsfd = xsocket(AF_INET, SOCK_STREAM, 0)) < 0 )
-      goto nons;
-    memset((char *)&sock_in, 0, sizeof(sock_in));
-    sock_in.sin_family = AF_INET;
-    sock_in.sin_addr.s_addr = htonl(xnsip);
-    sock_in.sin_port = htons(xnsport);
-    /* try connecting to the name server */
-    if( ctimeout <= 0 ) contmode = 0;
-    switch(contmode){
-    case 1:
-#if HAVE_MINGW32==0
-      status=alrmconnect(xnsfd, (void *)&sock_in, sizeof(sock_in), ctimeout);
-#else
-      status=noblkconnect(xnsfd, (void *)&sock_in, sizeof(sock_in), ctimeout);
-#endif
-      break;
-    case 2:
-      status=noblkconnect(xnsfd, (void *)&sock_in, sizeof(sock_in), ctimeout);
-      break;
-    default:
-      status=connect(xnsfd, (struct sockaddr *)&sock_in, sizeof(sock_in));
-      break;
-    }
-    if( status == 0 ){
-      FPRINTF((stderr, "%sXPANSOpen: connect to xpans\n", _sp));
-      goto okns;
-    }
-    else{
-      xclose(xnsfd);
-      /* if localhost doesn't work, make one try with the host ip */
-      if( (xerrno == ECONNREFUSED) && (tries < 1) ){
-	tries++;
-	goto again1;
-      }
-    }
-    break;
-#if HAVE_SYS_UN_H
-  case XPA_UNIX:
-again2:
-    /* open a socket and fill in socket information */
-    if( (xnsfd = xsocket(AF_UNIX, SOCK_STREAM, 0)) < 0 )
-      goto nons;
-    memset((char *)&sock_un, 0, sizeof(sock_un));
-    sock_un.sun_family = AF_UNIX;
-    strcpy(sock_un.sun_path, method);
-    xnsip = 0;
-    /* try connecting to the name server */
-    status=connect(xnsfd, (struct sockaddr *)&sock_un, sizeof(sock_un));
-    if( status == 0 ){
-      FPRINTF((stderr, "%sXPANSOpen: connect to xpans\n", _sp));
-      goto okns;
-    }
-    else{
-      xclose(xnsfd);
-      /* Unix sockets get ECONNREFUSED when the listen queue is full,
-	 so we try a few times to give the server a chance to recover */
-      if( (xerrno == ECONNREFUSED) && (tries < XPA_RETRIES) ){
-	tries++;
-	XPASleep(10);
-	goto again2;
-      }
-    }
-    break;
-#endif
-  }
-
-  /* if force is set, we try to start up the name server */
-  if( force == 0 )
-    goto noforce;
-
-  /* make up the xpans command we will use */
-  if( *nscmd == '\0' ){
-    if(	(mtype == XPA_UNIX) || LOCALIP(xnsip) ){
-      path = (char *)getenv("PATH");
-      findname = (char *)Find(XPANSNAME, "x", NULL, path);
-#if HAVE_CYGWIN
-      /* this will help start up xpans under Windows */
-      if( !findname ) findname = (char *)Find(XPANSNAME, "x", NULL, ".");
-#endif
-    }
-    if( findname != NULL ){
-      switch(mtype){
-      case XPA_INET:
-#if USE_LAUNCH
-	/* change spaces to special launch space */
-	for(i=0; i<strlen(findname); i++){
-	  if( findname[i] == ' '){
-	    findname[i] = LAUNCH_SPACE;
-	  }
-	}
-	snprintf(nscmd, SZ_LINE, "%s -e -p %d -l %s/xpans_%d.log",
-		 findname, xnsport, tmpdir, xnsport);
-#else
-	snprintf(nscmd, SZ_LINE, "\"%s\" -e -p %d -l %s/xpans_%d.log &\n",
-		 findname, xnsport, tmpdir, xnsport);
-#endif
-	break;
-#if HAVE_SYS_UN_H
-      case XPA_UNIX:
-#if USE_LAUNCH
-	/* change spaces to special launch space */
-	for(i=0; i<strlen(findname); i++){
-	  if( findname[i] == ' '){
-	    findname[i] = LAUNCH_SPACE;
-	  }
-	}
-	snprintf(nscmd, SZ_LINE, "%s -e -f %s -l %s.log",
-		 findname, method, method);
-#else
-	snprintf(nscmd, SZ_LINE, "\"%s\" -e -f %s -l %s.log &\n",
-		 findname, method, method);
-#endif
-	break;
-#endif
-      }
-    }
-    else{
-      *nscmd = '\0';
-    }
-  }
-
-  /* did not find the name server -- start it up if we can, i.e.,
-     if its on the same machine as we are on and we found it in the path */
-  if((*nscmd != '\0') && ((mtype == XPA_UNIX) || LOCALIP(xnsip)) ){
-    FPRINTF((stderr, "%sLaunching: %s\n", _sp, nscmd));
-#if USE_LAUNCH
-    if( Launch(nscmd, 0, NULL, NULL) != 0 )
-      goto nons;
-#else
-    if( system(nscmd) != 0 )
-      goto nons;
-#endif
-    /* enter loop looking to connect */
-    for(tries=0; tries<XPA_RETRIES; tries++){
-      switch(mtype){
-      case XPA_INET:
-	/* use $localhost alternately with $host */
-	if( (xnsip == gethostip("$host")) && (tries % 2 == 0) ){
-	  xnsip = gethostip("$localhost");
-	}
-	if( xnsip == 0 ){
-	  fprintf(stderr,
-		  "XPA$ERROR: invalid host name specified: %s.\n", method);
-	  return(NULL);
-	}
-	if( (xnsfd = xsocket(AF_INET, SOCK_STREAM, 0)) < 0 )
-	  goto nons;
-	memset((char *)&sock_in, 0, sizeof(sock_in));
-	sock_in.sin_family = AF_INET;
-	sock_in.sin_addr.s_addr = htonl(xnsip);
-	sock_in.sin_port = htons(xnsport);
-	FPRINTF((stderr, "%sXPANSOPEN: attempting connect to %x\n",
-		 _sp, xnsip));
-	if(connect(xnsfd, (struct sockaddr *)&sock_in, sizeof(sock_in)) ==0)
-	  goto okns;
-	break;
-#if HAVE_SYS_UN_H
-      case XPA_UNIX:
-	if( (xnsfd = xsocket(AF_UNIX, SOCK_STREAM, 0)) < 0 )
-	  goto nons;
-	if(connect(xnsfd, (struct sockaddr *)&sock_un, sizeof(sock_un)) ==0)
-	  goto okns;
-	break;
-#endif
-      }
-      xclose(xnsfd);
-      XPASleep(XPA_NSDELAY);
-    }
-    /* if we got here, we did not connect */
-    goto nons;
-  }
-  /* name server is on a remote machine, so there is no hope */
-  else{
-    goto nons;
-  }
-
-okns:
-  /* make sure we close on exec */
-  xfcntl(xnsfd, F_SETFD, FD_CLOEXEC);
-  setsockopt(xnsfd, SOL_SOCKET, SO_KEEPALIVE,
-	     (char *)&keep_alive, sizeof(keep_alive));
-  /* fill in new record */
-  if( (ns = (NS)xcalloc(1, sizeof(NSRec))) == NULL ){
-    xclose(xnsfd);
-    return NULL;
-  }
-  ns->method = xstrdup(method);
-  ns->host = xstrdup(host);
-  ns->fd = xnsfd;
-  FPRINTF((stderr, "%sXPANSOpen: host %s opened on fd %d\n", _sp, 
-	   host?host:"<unknown>", xnsfd));
-  switch(mtype){
-  case XPA_INET:
-    ns->ip = xnsip;
-    ns->port = xnsport;
-    break;
-#if HAVE_SYS_UN_H
-  case XPA_UNIX:
-    ns->name = xstrdup(method);
-    break;
-#endif	
-  }
-  if( xpa ){
-    /* add to list of name servers */
-    if( xpa->nshead == NULL ){
-      xpa->nshead = ns;
-    }
-    else{
-      for(cur=xpa->nshead; cur->next!=NULL; cur=cur->next)
-	;
-      cur->next = ns;
-    }
-  }
-  /* check version with xpans */
-  snprintf(tbuf, SZ_LINE, "version %s\n", XPA_VERSION);
-  if( (XPAPuts(xpa, ns->fd, tbuf, stimeout) >0)           &&
-      (XPAGets(xpa, ns->fd, tbuf, SZ_LINE, stimeout) >0)  ){
-    if( word(tbuf, tbuf2, &ip) ){
-      if( !strcmp(tbuf2, "XPA$VERSION") ){
-	if( word(tbuf, tbuf2, &ip) ){
-	  /* version check: our server version should be <= xpans version */
-	  dowarn = (XPAVersionCheck(XPA_VERSION, tbuf2)>0);
-	}
-	else{
-	  strcpy(tbuf2, "unknown/pre-2.1 (noversion)");
-	  dowarn = 1;
-	}
-      }
-      else{
-	strcpy(tbuf2, "unknown/pre-2.1 (badformat)");
-	dowarn = 1;
-      }
-    }
-    FPRINTF((stderr, "%sXPANSOpen: version info: %s\n", _sp, tbuf));
-    if( dowarn ){
-      XPAVersionWarn(XPA_VERSION, tbuf2);
-    }
-  }
-
-  /* clean up */
-  if( findname != NULL ) xfree(findname);
-  return(ns);
-
-nons:
-  /* if we specified an explicit port, we don't need the name server,
-     so don't bother with any warning or error messages */
-  if( XPAPort(xpa) >0 )
-    return NULL;
-  switch(mtype){
-  case XPA_INET:
-    if( !errinit && verbosity ){
-      if( LOCALIP(xnsip) ){
-	fprintf(stderr,
-		"XPA$WARNING: xpans needs to be running on this machine.\n");
-      }
-      else{
-	fprintf(stderr,
-		"XPA$WARNING: xpans needs to be running on machine: ");
-	fprintf(stderr, "%s\n", getiphost(xnsip));
-      }
-    }
-    break;
-#if HAVE_SYS_UN_H
-  case XPA_UNIX:
-    if( !errinit && verbosity ){
-      fprintf(stderr,
-	      "XPA$WARNING: xpans needs to be running on this machine.\n");
-    }
-    break;
-#endif
-  default:
-    break;
-  }
-  if( xpa && verbosity ){
-    if( !errinit ){
-      /* make up the command users will need to start xpans */
-      if( *nscmd == '\0' ){
-	switch(mtype){
-	case XPA_INET:
-	  snprintf(nscmd, SZ_LINE, "xpans -e -p %d -l %s/xpans_%d.log", 
-		   xnsport, tmpdir, xnsport);
-	  break;
-#if HAVE_SYS_UN_H
-	case XPA_UNIX:
-	  snprintf(nscmd, SZ_LINE, "xpans -e -f %s -l %s.log", method, method);
-	  break;
-#endif
-	}
-      }
-      fprintf(stderr, "Please start xpans using the command:\n\t%s\n", nscmd);
-      fprintf(stderr, "Once xpans is running, register all xpas in this process using:\n");
-      fprintf(stderr, "\txpaset -p %s -nsconnect\n", xpa->method);
-    }
-    fprintf(stderr, "For now, contact %s using:", xpa->name);
-    fprintf(stderr, " xpaset %s .. or xpaget %s ..\n",
-	    xpa->method, xpa->method);
-  }
-  errinit++;
-
-noforce:
-  if( findname != NULL ) xfree(findname);
-  return(NULL);
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * Routine: 	_XPAFree
- *
- * Purpose: 	free up memory in the XPA record structure
- *		(internal version)
- *
- * Results:	0 on success, -1 for failure
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-_XPAFree (XPA xpa)
-#else
-static int _XPAFree(xpa)
-     XPA xpa;
-#endif
-{
-  char tbuf[SZ_LINE];
-  XPACmd cmd, tcmd;
-  XPAComm comm, tcomm;
-  XPAClip clip, tclip;
-  NS ns, tns;
-
-  /* make sure we have something to do */
-  if( xpa == NULL )
-    return(-1);
-
-  FPRINTF((stderr, "%s_XPAFree: freeing xpa struct\n", _sp));
-  /* remove this xpa from public availability */
-  if( xpa->type != NULL )
-    XPANSDel(xpa, NULL, NULL);
-
-  /* free all sub-commands */
-  for(cmd=xpa->commands; cmd!=NULL; ){
-    tcmd = cmd->next;
-    XPACmdDel(xpa, cmd);
-    cmd = tcmd;
-  }
-
-  /* remove from list of xpas */
-  XPAListDel(&xpahead, xpa);
-
-  /* close down listening socket */
-  if( xpa->fd >= 0 )
-    xclose(xpa->fd);
-
-  /* perform method-specific cleanup */
-  switch(mtype){
-#if HAVE_SYS_UN_H
-  case XPA_UNIX:
-    /* delete the unix socket files */
-    unlink(xpa->method);
-    snprintf(tbuf, SZ_LINE, "%s_data", xpa->method);
-    unlink(tbuf);
-    break;
-#endif
-  default:
-    break;
-  }
-
-  /* free up space */
-  if( xpa->version )	xfree(xpa->version);
-  if( xpa->type )	xfree(xpa->type);
-  if( xpa->method )	xfree(xpa->method);
-  if( xpa->xclass ) 	xfree(xpa->xclass);
-  if( xpa->name )	xfree(xpa->name);
-  if( xpa->help )	xfree(xpa->help);
-  if( xpa->sendian )	xfree(xpa->sendian);
-
-  /* call the select free routine for the listening socket and loop type.
-     we use an indirect routine to avoid having to link Xt, Tcl, etc. */
-  if( xpa->seldel && xpa->selptr ){
-    (xpa->seldel)(xpa->selptr);
-    xpa->selptr = NULL;
-  }
-
-  /* close communication channels */
-  for(comm=xpa->commhead; comm!=NULL; ){
-    tcomm = comm->next;
-    CommFree(xpa, comm, 1);
-    comm = tcomm;
-  }
-
-  /* free up clipboards */
-  for(clip=xpa->cliphead; clip!=NULL; ){
-    tclip = clip->next;
-    ClipBoardFree(xpa, clip);
-    clip = tclip;
-  }
-
-  /* close down the name server and all of the remotes for this xpa */
-  for(ns=xpa->nshead; ns!=NULL; ){
-    tns = ns->next;
-    XPANSClose(xpa, ns);
-    ns = tns;
-  }
-
-  /* free up record struct */
-  xfree((char *)xpa);
-
-  return(0);
-}
-
-#if HAVE_ATEXIT
-/*
- *---------------------------------------------------------------------------
- *
- * Routine: 	_XPAAtExit
- *
- * Purpose: 	XPA cleanup on exit
- *		The main purpose of this routine is to try to delete the
- *		unix socket files when an XPA server exits.
- *
- * Results:	none
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void
-_XPAAtExit (void)
-#else
-static void _XPAAtExit()
-#endif
-{
-  XPA xpa, txpa;
-  static int done=0;
-
-  if( !done ){
-    /* return if we were not initialized */
-    if( !atexitinit ) return;
-    /* return if I am not the process who initialized (I'm a child) */
-    if( atexitinit != getpid() ) return;
-    FPRINTF((stderr, "calling XPAAtExit\n"));
-    for(xpa=xpahead; xpa!=NULL; ){
-      /* use temp in case we destroy structure in the cleanup */
-      txpa = xpa->next;
-      _XPAFree(xpa);
-      xpa = txpa;
-    }
-    /* platform-dependent cleanup */
-    xsocketcleanup();
-    /* done with cleanup */
-    done++;
-  }
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * Routine: 	XPAAtExit
- *
- * Purpose: 	set up XPA cleanup on exit
- *
- * Results:	none
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void
-XPAAtExit (void)
-#else
-void XPAAtExit()
-#endif
-{
-  if( !atexitinit ){
-    atexit(_XPAAtExit);
-    atexitinit = getpid();
-  }
-}
-
-#endif
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- *			Semi-Public Routines
- *			(mainly used by xpaset and xpaget)
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/*
- *---------------------------------------------------------------------------
- *
- * Routine: 	_XPAValid
- *
- * Purpose: 	see if the xpa struct is valid
- *
- * Results:	1 on success, 0 for failure
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-_XPAValid (XPA head, XPA xpa, char *type)
-#else
-int _XPAValid(head, xpa, type)
-     XPA head;
-     XPA xpa;
-     char *type;
-#endif
-{
-  XPA cur;
-
-  if( xpa == NULL )
-    return(0);
-  for(cur=head; cur!=NULL; cur=cur->next){
-    if( (cur == xpa) && !strcspn(cur->type, type) ){
-      return(1);
-    }
-  }
-  return(0);
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * Routine: 	XPAValid
- *
- * Purpose: 	see if the xpa struct is valid
- *
- * Results:	1 on success, 0 for failure
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAValid (XPA xpa)
-#else
-int XPAValid(xpa)
-     XPA xpa;
-#endif
-{
-  if( _XPAValid(xpahead, xpa, XPA_ACLS) )
-    return(1);
-  else
-    return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAEndian
- *
- * Purpose:	semi-public routine to return the endian-ness of this
- *		machine
- *
- * Results:	0 if little endian, 1 if bigendian
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAEndian(void)
-#else
-int XPAEndian()
-#endif
-{
-  union
-  {
-    long l;
-    char c[sizeof (long)];
-  } u;
-  u.l = 1;
-  return(u.c[sizeof (long) - 1] == 1);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAListHead
- *
- * Purpose:	semi-public routine to return the head of the xpa list
- *
- * Results:	XPA list pointer on success
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-XPA 
-XPAListHead (void)
-#else
-XPA XPAListHead()
-#endif
-{
-  return(xpahead);
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * Routine: 	XPAListAdd
- *
- * Purpose: 	add a member of an xpa list
- *
- * Results:	1 on success, 0 for failure
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void
-XPAListAdd (XPA *head, XPA xpa)
-#else
-void XPAListAdd(head, xpa)
-     XPA *head;
-     XPA xpa;
-#endif
-{
-  XPA cur;
-
-  if( *head == NULL ){
-    *head = xpa;
-  }
-  else{
-    for(cur=*head; cur->next!=NULL; cur=cur->next)
-      ;
-    cur->next = xpa;
-  }
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * Routine: 	XPAListDel
- *
- * Purpose: 	remove a member of an xpa list
- *
- * Results:	1 on success, 0 for failure
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void
-XPAListDel (XPA *head, XPA xpa)
-#else
-void XPAListDel(head, xpa)
-     XPA *head;
-     XPA xpa;
-#endif
-{
-  XPA cur;
-
-  /* remove from list of xpas */
-  if( *head ){
-    if( *head == xpa ){
-      *head = xpa->next;
-    }
-    else{
-      for(cur=*head; cur!=NULL; cur=cur->next){
-	if( cur->next == xpa ){
-	  cur->next = xpa->next;
-	  break;
-	}
-      }
-    }
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAActive
- *
- * Purpose:	make the xpa, cmd and data fds active or inactive for select
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int
-XPAActive (XPA xpa, XPAComm comm, int flag)
-#else
-int XPAActive(xpa, comm, flag)
-     XPA xpa;
-     XPAComm comm;
-     int flag;
-#endif
-{
-  int prev=0;
-
-  /* sanity check */
-  if( !xpa ) return(0);
-
-  switch(flag){
-  /* remove this xpa from the active list */
-  case 0:
-    if( (xpa->fd >= 0) && (xpa->fd < FD_SETSIZE) ){
-      FPRINTF((stderr, "%sXPAActive: clearing fd %d\n", _sp, xpa->fd));
-      prev = activefds[xpa->fd];
-      activefds[xpa->fd] = 0;
-      if( xpa->seloff && xpa->selptr )
-	(xpa->seloff)(xpa->selptr);
-    }
-    if( comm ){
-      if( (comm->cmdfd >= 0) && (comm->cmdfd < FD_SETSIZE) ){
-	activefds[comm->cmdfd] = 0;
-	if( xpa->seloff && comm->selcptr )
-	  (xpa->seloff)(comm->selcptr);
-      }
-      if( (comm->datafd >= 0) && (comm->datafd < FD_SETSIZE) ){
-	activefds[comm->datafd] = 0;
-	if( xpa->seloff && comm->seldptr )
-	  (xpa->seloff)(comm->seldptr);
-      }
-    }
-    break;
-  /* add this xpa/comm to the active list */
-  case 1:
-    if( (xpa->fd >= 0) && (xpa->fd < FD_SETSIZE) ){
-      FPRINTF((stderr, "%sXPAActive: activating fd %d\n", _sp, xpa->fd));
-      prev = activefds[xpa->fd];
-      activefds[xpa->fd] = 1;
-      if( xpa->selon && xpa->selptr )
-	(xpa->selon)(xpa->selptr);
-    }
-    if( comm ){
-      if( (comm->cmdfd >= 0) && (comm->cmdfd < FD_SETSIZE) ){
-	activefds[comm->cmdfd] = 1;
-	if( xpa->selon && comm->selcptr )
-	  (xpa->selon)(comm->selcptr);
-      }
-      if( (comm->datafd >= 0) && (comm->datafd < FD_SETSIZE) ){
-	activefds[comm->datafd] = 1;
-	if( xpa->selon && comm->seldptr )
-	  (xpa->selon)(comm->seldptr);
-      }
-    }
-    break;
-  default:
-    break;
-  }
-  return(prev);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAActiveFd
- *
- * Purpose:	semi-public routine to return flag if fd is active
- *
- * Results:	1 is active, 0 is inactive
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int
-XPAActiveFd (int fd)
-#else
-int XPAActiveFd(fd)
-     int fd;
-#endif
-{
-  if( (fd >= 0) && (fd < FD_SETSIZE) && (activefds[fd] > 0) )
-    return(1);
-  else
-    return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAAddSelect
- *
- * Purpose:	add one or more xpa sockets to the select flags
- *
- * Return:	number of xpas that were added to the select flags
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAAddSelect (XPA xpa, fd_set *readfdsptr)
-#else
-int XPAAddSelect(xpa, readfdsptr)
-     XPA xpa;
-     fd_set *readfdsptr;
-#endif
-{
-  XPA cur;
-  XPAComm comm;
-  int got=0;
-
-  /* better have some place to set the flags */
-  if( readfdsptr == NULL )
-    return(0);
-
-  /* if a specific xpa was specified, just set its select flags */
-  if( xpa != NULL ){
-    if( XPAActiveFd(xpa->fd) ){
-      FD_SET(xpa->fd, readfdsptr);
-      got++;
-      /* note that we only select on coms if the main fd is active */
-      for(comm=xpa->commhead; comm!=NULL; comm=comm->next){
-	if( XPAActiveFd(comm->cmdfd) ){
-	  FD_SET(comm->cmdfd, readfdsptr);
-	  got++;
-	}
-	if( XPAActiveFd(comm->datafd) && (comm->datafd != comm->cmdfd) ){
-	  FD_SET(comm->datafd, readfdsptr);
-	  got++;
-	}
-      }
-    }
-  }
-  /* otherwise set select flags for all xpas */
-  else{
-    for(cur=xpahead; cur!=NULL; cur=cur->next){
-      if( XPAActiveFd(cur->fd) ){
-	FPRINTF((stderr, "%sXPAAddSelect: adding fd %d\n", _sp, cur->fd));
-	FD_SET(cur->fd, readfdsptr);
-	got++;
-	/* note that we only select on coms if the main fd is active */
-	for(comm=cur->commhead; comm!=NULL; comm=comm->next){
-	  if( XPAActiveFd(comm->cmdfd) ){
-	    FPRINTF((stderr, "%sXPAAddSelect: adding cmdfd %d\n",
-		     _sp, comm->cmdfd));
-	    FD_SET(comm->cmdfd, readfdsptr);
-	    got++;
-	  }
-	  if( XPAActiveFd(comm->datafd) && (comm->datafd != comm->cmdfd) ){
-	    FPRINTF((stderr, "%sXPAAddSelect: adding datafd %d\n",
-		     _sp, comm->datafd));
-	    FD_SET(comm->datafd, readfdsptr);
-	    got++;
-	  }
-	}
-      }
-    }
-  }
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAProcessSelect
- *
- * Purpose:	process xpas that have pending reads or writes
- *
- * Return:	number of xpas processed
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAProcessSelect (fd_set *readfdsptr, int maxreq)
-#else
-int XPAProcessSelect(readfdsptr, maxreq)
-     fd_set *readfdsptr;
-     int maxreq;
-#endif
-{
-  int got=0;
-  XPA xpa;
-  XPAComm comm;
-#ifdef OLD
-  XPA txpa;
-  XPAComm tcomm;
-#endif
-
-  /* <= 0 means do all of them */
-  if( maxreq < 0 ){
-    maxreq = 0;
-  }
-
-again:
-  for(xpa=xpahead; xpa!=NULL; xpa=xpa->next){
-    /* handle command requests */
-    for(comm=xpa->commhead; comm!=NULL; comm=comm->next){
-      if( (comm->cmdfd >=0) && FD_ISSET(comm->cmdfd, readfdsptr) ){
-	FD_CLR(comm->cmdfd, readfdsptr);
-	XPAHandler(xpa, comm->cmdfd);
-	got++;
-	if( maxreq && (got >= maxreq) ) return(got);
-	goto again;
-      }
-    }
-    /* handle data requests */
-    for(comm=xpa->commhead; comm!=NULL; comm=comm->next){
-      if( (comm->datafd >=0) && FD_ISSET(comm->datafd, readfdsptr) ){
-	FD_CLR(comm->datafd, readfdsptr);
-	XPAHandler(xpa, comm->datafd);
-	got++;
-	if( maxreq && (got >= maxreq) ) return(got);
-	goto again;
-      }
-    }
-    /* handle new requests */
-    if( (xpa->fd >= 0) && FD_ISSET(xpa->fd, readfdsptr) ){
-      FD_CLR(xpa->fd, readfdsptr);
-      XPAHandler(xpa, xpa->fd);
-      got++;
-      if( maxreq && (got >= maxreq) ) return(got);
-      goto again;
-    }
-  }
-
-#ifdef OLD
-  for(xpa=xpahead; xpa!=NULL; ){
-    txpa = xpa->next;
-    /* handle command requests */
-    for(comm=xpa->commhead; comm!=NULL; ){
-      tcomm = comm->next;
-      if( (comm->cmdfd >=0) && FD_ISSET(comm->cmdfd, readfdsptr) ){
-	FD_CLR(comm->cmdfd, readfdsptr);
-	FPRINTF((stderr, "%sXPAProcessSelect: cmd %d\n", _sp, comm->cmdfd));
-	/* if we got an error on this xpa, skip processing rest of it */
-	if( XPAHandler(xpa, comm->cmdfd) != XPA_RTN_OK ){
-	  goto nextxpa;
-	}
-	got++;
-	/* if we freed this xpa, skip processing rest of it */
-	if( !_XPAValid(xpahead, xpa, XPA_ACLS) ){
-	  goto nextxpa;
-	}
-	/* if we are have processed the max reqests, we are done */
-	if( maxreq && (got >= maxreq) ){
-	  return(got);
-	}
-      }
-      comm = tcomm;
-    }
-    /* handle data requests */
-    for(comm=xpa->commhead; comm!=NULL; ){
-      tcomm = comm->next;
-      if( (comm->datafd >=0) && FD_ISSET(comm->datafd, readfdsptr) ){
-	FD_CLR(comm->datafd, readfdsptr);
-	FPRINTF((stderr, "%sXPAProcessSelect: data %d\n", _sp, comm->datafd));
-	/* if we got an error on this xpa, skip processing rest of it */
-	if( XPAHandler(xpa, comm->datafd) != XPA_RTN_OK ){
-	  goto nextxpa;
-	}
-	got++;
-	/* if we freed this xpa, skip processing rest of it */
-	if( !_XPAValid(xpahead, xpa, XPA_ACLS) ){
-	  goto nextxpa;
-	}
-	/* if we are have processed the max reqests, we are done */
-	if( maxreq && (got >= maxreq) ){
-	  return(got);
-	}
-      }
-      comm = tcomm;
-    }
-    /* handle new requests */
-    if( (xpa->fd >= 0) && FD_ISSET(xpa->fd, readfdsptr) ){
-      FD_CLR(xpa->fd, readfdsptr);
-      FPRINTF((stderr, "%sXPAProcessSelect: xpa %d\n", _sp, xpa->fd));
-      /* if we got an error on this xpa, skip processing rest of it */
-      if( XPAHandler(xpa, xpa->fd) != XPA_RTN_OK ){
-	goto nextxpa;
-      }
-      got++;
-      /* if we freed this xpa, skip processing rest of it */
-      if( !_XPAValid(xpahead, xpa, XPA_ACLS) ){
-	goto nextxpa;
-      }
-      /* if we are have processed the max reqests, we are done */
-      if( maxreq && (got >= maxreq) ){
-	return(got);
-      }
-    }
-
-nextxpa:
-    /* must check to see if last xpa freed the next xpa */
-    if( _XPAValid(xpahead, txpa, XPA_ACLS) )
-      xpa = txpa;
-    else
-      break;
-  }
-#endif
-  FPRINTF((stderr, "%sXPAProcessSelect: returns %d\n", _sp, got));
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPACloseData
- *
- * Purpose:	close data fd if its not the cmd fd
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void 
-XPACloseData (XPA xpa, XPAComm comm)
-#else
-void XPACloseData(xpa, comm)
-     XPA xpa;
-     XPAComm comm;
-#endif
-{
-  /* we close the data channel if its not the command channel */
-  if( comm && (comm->datafd >=0)  ){
-    if( comm->cmdfd != comm->datafd ){ 
-      FPRINTF((stderr, "%sXPACloseData: close fd %d for cmd fd %d\n", _sp, 
-	       comm->datafd, comm->cmdfd));
-      /* remove from active */
-      if( comm->datafd < FD_SETSIZE )
-	activefds[comm->datafd] = 0;
-      /* delete the comm data fd specially from a non-select event loop */
-      if( xpa && xpa->seldel && comm->seldptr ){
-	(xpa->seldel)(comm->seldptr);
-	comm->seldptr = NULL;
-      }
-      /* close file */
-      xclose(comm->datafd);
-    }
-    /* reset data channel to impossible value */
-    comm->datafd = -1;
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAHandler
- *
- * Purpose:	handle one request for an xpaset or xpaget
- *
- * Return:	0 on success, xpa error code on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAHandler (XPA xpa, int fd)
-#else
-int XPAHandler(xpa, fd)
-     XPA xpa;
-     int fd;
-#endif
-{
-  char tbuf[SZ_LINE];
-  char tbuf2[SZ_LINE];
-  char lbuf[SZ_LINE];
-  char cmd[SZ_LINE];
-  char target[SZ_LINE];
-  char method[SZ_LINE];
-  char ctmpl[SZ_LINE];
-  char ntmpl[SZ_LINE];
-  char *paramlist=NULL;
-  char *acl;
-  int save_ack;
-  int tcmd;
-  int got=0;
-  int lp=0;
-  int cmdfd=-1;
-  unsigned short port=0;
-  unsigned int ip=0;
-  struct timeval tv;
-  XPAComm comm=NULL, tcomm=NULL, xcomm=NULL, ocomm=NULL;
-  XPA txpa=NULL;
-  NS ns=NULL;
-  fd_set readfds;
-  FPRINTF((stderr, "%sXPAHandler: entering with fd %d\n", _sp, fd));
-
-  /*  this is a defensive measure: we have to guard against an external
-      loop calling the XPA handler with a bogus XPA record. This has been
-      seen with the Tcl event loop.
-   */
-  for(txpa=xpahead; txpa!=NULL; txpa=txpa->next){
-    if( txpa == xpa ) break;
-  }
-  if( txpa == NULL ){
-    FPRINTF((stderr, "%sXPAHandler: xpa record %p is not in list\n",
-	     _sp, xpa));
-    return(XPA_RTN_NOCMD);
-  }
-
-  /*  this is a defensive measure: we have to ensure that there really
-   *  is a request read.  It is possible that a user-defined select loop
-   *  might call us to handle a request that we had already handled
-   *  (i.e. we handle a request but can't reset someone else's select flags)
-   */
-  FD_ZERO(&readfds);
-  FD_SET(fd, &readfds);
-  tv.tv_sec = 0;
-  tv.tv_usec = 0;
-  while( xselect(fd+1, &readfds, NULL, NULL, &tv) <=0 ){
-    if( xerrno == EINTR )
-      continue;
-    FPRINTF((stderr, "%sXPAHandler: xpa fd %d is not ready\n", _sp, fd));
-    return(XPA_RTN_NOCMD);
-  }
-
-  /* if this is a first connection, we create a new comm channel and exit */
-  if( fd == xpa->fd ){
-    if( (comm = CommNew(xpa, -1, 0, 0, NULL, NULL)) == NULL )
-      return(XPA_RTN_NOCONN);
-    /* Return to prevent xpa from finishing before other xpa's are started.
-       Otherwise, each xpa's associated with a target template will be
-       processed serially, which will defeat all the hard work done on
-       the client side to send data to servers when they ask for it.
-    */
-    else{
-      FPRINTF((stderr, "%sXPAHandler: returning after CommNew on fd %d\n",
-	      _sp, fd));
-      got = XPA_RTN_OK;
-      goto end;
-    }
-  }
-
-  /* look for a currently active comm channel: cmd or data */
-  for(comm=xpa->commhead; comm!= NULL; comm=comm->next){
-    if( (fd == comm->cmdfd) || (fd == comm->datafd) ){
-      break;
-    }
-  }
-  /* make sure we have something */
-  if( comm == NULL ){
-    /* read extraenous message */
-    if( XPAGets(xpa, fd, tbuf, SZ_LINE, 1) >0 ){
-      got = XPA_RTN_UNCMD;
-      FPRINTF((stderr, "%sXPAHandler: fd %d received extra message:\n%s\n",
-	      _sp,  fd, tbuf));
-    }
-    else{
-      FPRINTF((stderr, "%sXPAHandler: no active comm record for fd %d\n",
-	    _sp, fd));
-      got = XPA_RTN_NOCMD2;
-    }
-    goto error;
-  }
-  /* but don't recurse */
-  if( comm->status & XPA_STATUS_ACTIVE ){
-    FPRINTF((stderr, "%sXPAHandler: fd %d returning to avoid recursion\n", 
-	    _sp, fd));
-    got = 0;
-    goto end;
-  }
-  /* set current comm for this xpa */
-  ocomm = xpa->comm;
-  xpa->comm = comm;
-  /* no message sent yet */
-  comm->message = 0;
-
-  /* data ready on data channel: go right to data handling section */
-  if( fd == comm->datafd ){
-    FPRINTF((stderr, "%sXPAHandler: jumping to cb for %d\n", _sp, fd));
-    goto cb;
-  }
-
-  /* cmd channel: we are processing a new command */
-retry:
-  /* reset line buffer pointer for parsing */
-  lp = 0;
-  /* read next command */
-  if( XPAGets(xpa, comm->cmdfd, lbuf, SZ_LINE, stimeout) <=0 ){
-    FPRINTF((stderr, "%sXPAHandler: fd %d read EOF\n", _sp, comm->cmdfd));
-    got = XPA_RTN_OK;
-    goto eof;
-  }
-  /* new-lines imply we entered telnet mode on local host */
-  else if( (*lbuf == '\n') || (*lbuf == '\r') || !strcmp(lbuf, "telnet") ){
-    if( (mtype == XPA_UNIX) || LOCALIP(comm->cmdip) ){
-      if( comm->telnet == 0 )
-	XPAPuts(xpa, comm->cmdfd, "Entering telnet mode ...\n", stimeout);
-      comm->telnet = 1;
-      comm->ack = 0;
-      comm->datafd = comm->cmdfd;
-      stimeout = -1;
-      goto retry;
-    }
-    else{
-      XPAError(xpa, xpaMessbuf[XPA_RTN_NOCMD]);
-      got = XPA_RTN_NOCMD;
-      goto error;
-    }
-  }
-
-  FPRINTF((stderr, "%sXPAHandler: fd %d read command: %s",
-	  _sp, comm->cmdfd, lbuf));
-
-  /* validate the command */
-  if( !word(lbuf, cmd, &lp) ){
-    FPRINTF((stderr, "%sXPAHandler: missing target for fd %d\n",
-	     _sp, comm->cmd));
-    XPAError(xpa, xpaMessbuf[XPA_RTN_NOCMD]);
-    got = XPA_RTN_NOCMD;
-    goto error;
-  }
-
-  /* send help message (local support only) */
-  if( !strcmp(cmd, "help") ){
-    if( (mtype == XPA_UNIX) || LOCALIP(comm->cmdip) ){
-      XPAPuts(xpa, comm->cmdfd,
-	   "xpaset|xpaget|xpainfo|xpaaccess [switches] class:name [params]\n",
-	    stimeout);
-      XPAPuts(xpa, comm->cmdfd,
-	      "switches:\n",
-	      stimeout);
-      XPAPuts(xpa, comm->cmdfd,
-	      "\t-a\t\tclient wants to accept() data connection\n",
-	      stimeout);
-      XPAPuts(xpa, comm->cmdfd,
-	      "\t-e <b|l>\tclient endian-ness: big(b) or little(l)\n",
-	      stimeout);
-      XPAPuts(xpa, comm->cmdfd,
-	      "\t-i id\t\tclient id string\n",
-	      stimeout);
-      XPAPuts(xpa, comm->cmdfd,
-	      "\t-p <proxyinfo>\t\tfrom xpans (e.g., for proxy processing)\n",
-	      stimeout);
-      XPAPuts(xpa, comm->cmdfd,
-	      "\t-n\t\tdon't ack back to client\n",
-	      stimeout);
-      XPAPuts(xpa, comm->cmdfd,
-	      "\t-t\t\tenter telnet mode (local only)\n",
-	      stimeout);
-      /* we must be in telnet mode */
-      comm->telnet = 1;
-      comm->ack = 0;
-      goto retry;
-    }
-    else{
-      XPAError(xpa, xpaMessbuf[XPA_RTN_NOCMD]);
-      got = XPA_RTN_NOCMD;
-      goto error;
-    }
-  }
-
-  /* determine which command was specified */
-  if( !strcmp(cmd, "xpaset") )
-    tcmd = XPA_SET;
-  else if( !strcmp(cmd, "xpaget") )
-    tcmd = XPA_GET;
-  else if( !strcmp(cmd, "xpainfo") )
-    tcmd = XPA_INFO;
-  else if( !strcmp(cmd, "xpaaccess") )
-    tcmd = XPA_ACCESS;
-  else if( !strcmp(cmd, "xpadata") )
-    tcmd = XPA_DATA;
-  else if( !strcmp(cmd, "xpaaccept") )
-    tcmd = XPA_ACCEPT;
-  else if( !strcmp(cmd, "xpanagle") || !strcmp(cmd, "XPA$OK") )
-    tcmd = XPA_NAGLE;
-  else{
-    FPRINTF((stderr, "%sXPAHandler: unknown command '%s' for fd %d\n",
-	     _sp, cmd, comm->cmdfd));
-    XPAError(xpa, xpaMessbuf[XPA_RTN_NOCMD]);
-    got = XPA_RTN_NOCMD;
-    goto error;
-  }
-
-  /* process switches */
-  while( word(lbuf, tbuf, &lp) ){
-    if( *tbuf != '-' )
-      break;
-    if( !strcmp(tbuf, "-a") ){
-      comm->mode |= COMM_CONNECT;
-    }
-    else if( !strcmp(tbuf, "-e") ){
-      if( word(lbuf, tbuf, &lp) ){
-	if( *tbuf == 'b' )
-	  comm->cendian = "big";
-	else if( *tbuf == 'l' )
-	  comm->cendian = "little";
-      }
-      else{
-	got = XPA_RTN_ILLCMD;
-	goto error;
-      }
-    }
-    else if( !strcmp(tbuf, "-f") ){
-      /* B.Schoenhammer@bit-field.de 2009-09-21 */
-#if HAVE_MINGW32==0
-      if( !word(lbuf, tbuf, &lp) || (sscanf(tbuf, "%p", &xcomm) != 1) ){
-#else
-      if( !word(lbuf, tbuf, &lp) || (sscanf(tbuf, "%x", &xcomm) != 1) ){
-#endif
-	got = XPA_RTN_ILLCMD;
-	goto done;
-      }
-      if( !word(lbuf, tbuf, &lp) || ((cmdfd = atoi(tbuf)) < 0) ){
-	got = XPA_RTN_ILLCMD;
-	goto done;
-      }
-    }
-    else if( !strcmp(tbuf, "-i") ){
-      if( word(lbuf, tbuf, &lp) ){
-	if( comm->id != NULL ) xfree(comm->id);
-	comm->id = xstrdup(tbuf);
-      }
-      else{
-	XPAError(xpa, xpaMessbuf[XPA_RTN_ILLCMD]);
-	got = XPA_RTN_ILLCMD;
-	goto error;
-      }
-    }
-    else if( !strcmp(tbuf, "-n") ){
-      comm->ack = 0;
-    }
-    else if( !strcmp(tbuf, "-p") ){
-      if( word(lbuf, tbuf, &lp) ){
-	if( comm->info != NULL ) xfree(comm->info);
-	comm->info = xstrdup(tbuf);
-      }
-      else{
-	XPAError(xpa, xpaMessbuf[XPA_RTN_ILLCMD]);
-	got = XPA_RTN_ILLCMD;
-	goto error;
-      }
-    }
-    else if( !strcmp(tbuf, "-t") ){
-      comm->telnet = 1;
-    }
-    else{
-      break;
-    }
-  }
-
-  /* make sure we have some sort of id */
-  if( comm->id == NULL ){
-    comm->id = xstrdup("?");
-  }
-
-  /* process nagle ack */
-  if( tcmd == XPA_NAGLE ){
-    /* if data is forthcoming, exit and wait for data */
-    if( comm->usebuf ){
-      got = XPA_RTN_OK;
-      goto end;
-    }
-    /* go process callback */
-    else{
-      goto cb;
-    }
-  }
-
-  /* connect (proxy) request: connect back to client */
-  if( tcmd == XPA_ACCEPT ){
-    FPRINTF((stderr, "%scmd is xpaaccept from client %d: %s", _sp, fd, lbuf));
-    /* syntax: xpaaccept <method> ... */
-    lp = 0;
-    if( !word(lbuf, tbuf, &lp)      ||
-	strcmp(tbuf, "xpaaccept")   ||
-	!word(lbuf, method, &lp)    ){
-      got = -1;
-      goto error;
-    }
-    if( (cmdfd=XPAProxyConnect(xpa, method, &ip, &port, tbuf)) <0 ){
-      FPRINTF((stderr, "%sXPAProxyConnect failed for: %d\n", _sp, fd));
-      got = -1;
-      goto error;
-    }
-    if( (tcomm = CommNew(xpa, cmdfd, ip, port, method, NULL)) == NULL ){
-      got = XPA_RTN_NOCONN;
-      goto error;
-    } 
-    else{
-      /* now exit and wait for client to send command */
-      FPRINTF((stderr,
-	       "%sXPAHandler: fd %d exiting after proxy connect\n", _sp,
-	       tcomm->cmdfd));
-      got = XPA_RTN_OK;
-      goto end;
-    }
-  }
-
-  /* data request: find associated command request, and process the command */
-  if( tcmd == XPA_DATA ){
-    FPRINTF((stderr, "%sXPAHandler: processing data fd %d\n",
-	     _sp, comm->cmdfd));
-    /* find the cmd record with which this data is associated */
-    for(tcomm=xpa->commhead; tcomm!= NULL; tcomm=tcomm->next){
-      if( (tcomm == xcomm) && (tcomm->cmdfd == cmdfd) ){
-	break;
-      }
-    }
-    /* if we found an associated command, copy in data info and process */
-    if( tcomm ){
-      /* fill in command comm */
-      tcomm->datafd = comm->cmdfd;
-      tcomm->seldptr = comm->selcptr;
-      if( tcomm->dataname ) xfree(tcomm->dataname);
-      tcomm->dataname = xstrdup(comm->cmdname);
-      /* done with data comm */
-      CommFree(xpa, comm, 0);
-      /* reset comm pointers */
-      comm = tcomm;
-      xpa->comm = comm;
-      FPRINTF((stderr, "%sXPAHandler: found cmd fd %d for this data fd %d\n",
-	       _sp, comm->cmdfd, comm->datafd));
-      if( comm->cmd == XPA_SET ){
-	FPRINTF((stderr, "%sXPAHandler: data %d returning await xpaset\n",
-		 _sp, comm->datafd));
-	got = XPA_RTN_OK;
-	goto end;
-      }
-      else{
-	FPRINTF((stderr, "%sXPAHandler: data %d going on to process data\n",
-		 _sp, comm->datafd));
-	goto cb;
-      }
-    }
-    else{
-      FPRINTF((stderr, "%sXPAHandler: data fd has no corresponding cmd %d\n",
-	       _sp, comm->cmdfd));
-      XPAError(xpa, xpaMessbuf[XPA_RTN_ILLCMD]);
-      got = XPA_RTN_ILLCMD;
-      goto error;
-    }
-  }
-
-  /* for a command, the first non-switch word we found was the target */
-  if( *tbuf == '\0' ){
-    FPRINTF((stderr, "%sXPAHandler: missing target for fd %d\n",
-	     _sp, comm->cmdfd));
-    XPAError(xpa, xpaMessbuf[XPA_RTN_NOCMD]);
-    got = XPA_RTN_NOCMD;
-    goto error;
-  }
-  else{
-    strcpy(target, tbuf);
-  }
-
-  /* validate the target (except for xpans for use as proxy) */
-  if( strcmp(xpa->xclass, XPANS_CLASS) || strcmp(xpa->name, XPANS_NAME) ){
-    XPAParseName(target, ctmpl, ntmpl, SZ_LINE);
-    if( (strcmp(ctmpl,"?") && !tmatch(xpa->xclass, ctmpl)) || 
-	(strcmp(ntmpl,"?") && !tmatch(xpa->name, ntmpl))   ){
-      got = XPA_RTN_NOTARG;
-      goto error;
-    }
-  }
-  if( comm->target != NULL ) xfree(comm->target);
-  comm->target = xstrdup(target);
-
-  /* the rest of the input string is paramlist */
-  paramlist = &(lbuf[lp]);
-  nowhite(paramlist, paramlist);
-  if( comm->paramlist != NULL ) xfree(comm->paramlist);
-  comm->paramlist = xstrdup(paramlist);
-  /* save command */
-  comm->cmd = tcmd;
-
-  FPRINTF((stderr,
-	   "%sXPAHandler: processing command fd %d for target %s (%d)\n",
-	   _sp, comm->cmdfd, target, comm->cmd));
-
-  /* a reserved command can only be called from the same host as the server,
-     or from local (unix) sockets */
-  lp = 0;
-  if( XPACmdLookupReserved(xpa, comm->paramlist, &lp) ){
-    comm->mode |= COMM_RESERVED;
-  }
-
-  /* set up command-specific info */
-  switch(comm->cmd){
-  case XPA_SET:
-    if( comm->mode & COMM_RESERVED ){
-      comm->usebuf = 1;
-      comm->useacl = guseacl && (mtype != XPA_UNIX);
-      acl = "s";
-    }
-    else if( xpa->receive_callback ){
-      comm->usebuf = (xpa->receive_mode & XPA_MODE_BUF);
-      comm->useacl = guseacl && 
-	(xpa->receive_mode & XPA_MODE_ACL) && (mtype != XPA_UNIX);
-      acl = "s";
-    }
-    else{
-      XPAError(xpa, xpaMessbuf[XPA_RTN_NOREC]);
-      got = XPA_RTN_NOREC;
-      goto error;
-    }
-    break;
-  case XPA_GET:
-    if( comm->mode & COMM_RESERVED ){
-      comm->usebuf = 1;
-      comm->useacl = guseacl && (mtype != XPA_UNIX);
-      acl = "g";
-    }
-    else if( xpa->send_callback ){
-      comm->usebuf = (xpa->send_mode & XPA_MODE_BUF);
-      comm->useacl = guseacl &&
-	(xpa->send_mode & XPA_MODE_ACL) && (mtype != XPA_UNIX);
-      acl = "g";
-    }
-    else{
-      XPAError(xpa, xpaMessbuf[XPA_RTN_NOSEND]);
-      got = XPA_RTN_NOSEND;
-      goto error;
-    }
-    break;
-  case XPA_INFO:
-    if( xpa->info_callback ){
-      comm->usebuf = 0;
-      comm->useacl = guseacl &&
-	(xpa->info_mode & XPA_MODE_ACL) && (mtype != XPA_UNIX);
-      acl = "i";
-    }
-    else{
-      XPAError(xpa, xpaMessbuf[XPA_RTN_NOINFO]);
-      got = XPA_RTN_NOINFO;
-      goto error;
-    }
-    break;
-  case XPA_ACCESS:
-    comm->usebuf = 0;
-    comm->useacl = guseacl && (mtype != XPA_UNIX);
-    /* may as well check access mode as well */
-    snprintf(tbuf2, SZ_LINE, "%sa%s", _sp, comm->paramlist?comm->paramlist:"");
-    acl = tbuf2;
-    break;
-  default:
-    FPRINTF((stderr, "%sXPAHandler: invalid access control check for fd %d\n",
-	     _sp, comm->cmdfd));
-    XPAError(xpa, xpaMessbuf[XPA_RTN_NOCMD]);
-    got = XPA_RTN_NOCMD;
-    goto error;
-  }
-
-  /* perform access authentication */
-  if( comm->useacl ){
-    /* determine acl for this ip, if necessary */
-    if( comm->acl[comm->cmd] < 0 ){
-      comm->acl[comm->cmd] = XPAAclCheck(xpa, comm->cmdip, acl);
-    }
-    /* check acl */
-    if( comm->acl[comm->cmd] <= 0 ){
-      FPRINTF((stderr, "%sXPAHandler: fd %d FAILED acl check\n",
-	       _sp, comm->cmdfd));
-      XPAError(xpa, xpaMessbuf[XPA_RTN_NOAUTH]);
-      got = XPA_RTN_NOAUTH;
-      goto error;
-    }
-    FPRINTF((stderr, "%sXPAHandler: fd %d passed acl check\n",
-	     _sp, comm->cmdfd));
-  }
-
-  /* for telnet mode, just use cmdfd for data */
-  if( comm->telnet ){
-    comm->datafd = comm->cmdfd;
-  }
-  /* for xpainfo and no ack, just go to the vallback */
-  else if( (comm->cmd == XPA_INFO) && !comm->ack ){
-    goto cb;
-  }
-  /* in general, we must tell the client how we will handle data */
-  else{
-    if( comm->usebuf ){
-      if( comm->mode & COMM_CONNECT ){
-	snprintf(lbuf, SZ_LINE, "%s XPA$DATA accept %p %d (%s:%s %s)\n",
-		 comm->id, comm,  comm->cmdfd,
-		 xpa->xclass, xpa->name, xpa->method);
-      }
-      else{
-	snprintf(lbuf, SZ_LINE, "%s XPA$DATA connect %p %d (%s:%s %s)\n",
-		 comm->id, comm, comm->cmdfd,
-		 xpa->xclass, xpa->name, xpa->method);
-      }
-    }
-    /* no data channel being set up */
-    else{
-      snprintf(lbuf, SZ_LINE, "%s XPA$NODATA (%s:%s %s)\n",
-	       comm->id, xpa->xclass, xpa->name, xpa->method);
-    }
-    FPRINTF((stderr, "%sXPAHandler: fd %d sends string: %s",
-	     _sp, comm->cmdfd, lbuf));
-    if( XPAPuts(xpa, comm->cmdfd, lbuf, stimeout) <= 0 ){
-      FPRINTF((stderr, "%sXPAHandler: fd %d couldn't send string: %s",
-	       _sp, comm->cmdfd, lbuf));
-      got = -1;
-      goto error;
-    }
-    /* now exit and wait for nagle ack and for client to send data */
-    FPRINTF((stderr,
-	     "%sXPAHandler: fd %d exiting to wait for nagle or connect req\n",
-	     _sp, comm->cmdfd));
-    got = XPA_RTN_OK;
-    goto end;
-  }
-
-  /* data channel complete (or no data): ready to execute the user callback */
-cb:  
-  /* we are now active */
-  comm->status |= XPA_STATUS_ACTIVE;
-
-  /* remove the current comm from the list of active fds,
-     in case the server callback re-enters the event loop */
-  XPAActive(xpa, comm, 0);
-
-  /* zero out buf and len, just to make sure (don't free buf, in case
-     application is using previous) */
-  comm->buf = NULL;
-  comm->len = 0;
-
-  /* if we are not ack'ing after callback, do it now so client can exit */
-  /* but don't do this for xpainfo/noack */
-  if( !comm->ack && (comm->cmd != XPA_INFO) ){
-    FPRINTF((stderr, "%sXPAHandler: sending OK to non-acking client %d %d\n",
-	     _sp,  comm->cmdfd, comm->datafd));
-    comm->ack = 1;
-    XPAOK(xpa);
-    comm->ack = 0;
-  }
-
-  /* process command */
-  switch(comm->cmd){
-  case XPA_GET:
-    FPRINTF((stderr,
-	     "%sXPAHandler: processing xpaget for %d %d\n", _sp,
-	     comm->cmdfd, comm->datafd));
-    /* check for a reserved command */
-    if( comm->mode & COMM_RESERVED ){
-      got = XPASendCommands(xpa->send_data, xpa, comm->paramlist,
-			    &(comm->buf), &(comm->len));
-    }
-    else{
-      got = (xpa->send_callback)(xpa->send_data, xpa, comm->paramlist,
-				  &(comm->buf), &(comm->len));
-    }
-    if( (got == 0) && (comm->buf != NULL) && (comm->len > 0) ){
-      if( XPAPutBuf(xpa, comm->datafd, comm->buf, comm->len, ltimeout) < 0 ){
-	PERROR(("XPAHandler write buf"));
-	XPAError(xpa, "XPA could not write data to client");
-	goto done;
-      }
-    }
-    if( (xpa->send_mode & XPA_MODE_FREEBUF) && (comm->buf != NULL) ){
-      if( xpa->comm->myfree != NULL ){
-	if( xpa->comm->myfree_ptr != NULL ){
-	  xpa->comm->myfree(xpa->comm->myfree_ptr);
-	}
-	else{
-	  xpa->comm->myfree(comm->buf);
-	}
-      }
-      else{
-	xfree(comm->buf);
-      }
-    }
-    /* send client a message, unless its already been done */
-    if( !comm->message ){
-      if( got )
-	XPAError(xpa, "error detected in send callback routine");
-      else
-	XPAOK(xpa);
-    }
-    FPRINTF((stderr,
-	     "%sXPAHandler: finished xpaget for %d %d\n", _sp,
-	     comm->cmdfd, comm->datafd));
-    break;
-  case XPA_SET:
-    FPRINTF((stderr,
-	     "%sXPAHandler: processing xpaset for %d %d\n", _sp,
-	     comm->cmdfd, comm->datafd));
-    /* check for a reserved command */
-    if( comm->mode & COMM_RESERVED ){
-      got=XPAReceiveCommands(xpa->receive_data, xpa,
-			     comm->paramlist, NULL, 0);
-    }
-    else{
-      /* fill buf if necessary */
-      if( (comm->datafd >= 0) &&
-	  comm->usebuf && (xpa->receive_mode & XPA_MODE_FILLBUF) ){
-	if(XPAGetBuf(xpa, comm->datafd, &(comm->buf), &(comm->len), -1) <0){
-	  XPAError(xpa, xpaMessbuf[XPA_RTN_NODATA]);
-	  FPRINTF((stderr, "%sXPAHandler: no data for XPAGetBuf on %d\n", _sp,
-		   comm->datafd));
-	  got = -1;
-	  goto done;
-	}
-	else{
-	  /* close the data fd now that we are done with it */
-	  XPACloseData(xpa, comm);
-	}
-      }
-      /* execute the receive callback */
-      got = (xpa->receive_callback)(xpa->receive_data, xpa,
-				     comm->paramlist, comm->buf, comm->len);
-    }
-    if( (xpa->receive_mode & XPA_MODE_FREEBUF) && (comm->buf != NULL) ){
-      if( xpa->comm->myfree != NULL ){
-	if( xpa->comm->myfree_ptr != NULL ){
-	  xpa->comm->myfree(xpa->comm->myfree_ptr);
-	}
-	else{
-	  xpa->comm->myfree(comm->buf);
-	}
-      }
-      else{
-	xfree(comm->buf);
-      }
-    }
-    /* send client an error message, unless its already been done */
-    if( !comm->message ){
-      if( got ){
-	XPAError(xpa, "error detected in receive callback routine");
-      }
-      else{
-	XPAOK(xpa);
-      }
-    }
-    FPRINTF((stderr,
-	     "%sXPAHandler: finished xpaset for %d %d\n", _sp,
-	     comm->cmdfd, comm->datafd));
-    break;
-  case XPA_INFO:
-    /* send OK before callback because we do not want the client waiting */
-    if( comm->ack )
-      XPAOK(xpa);
-    save_ack = comm->ack;
-    /* don't ever ack in callback */
-    comm->ack = 0;
-    /* execute the info callback -- don't bother checking for errors */
-    (xpa->info_callback)(xpa->info_data, xpa, comm->paramlist);
-    comm->ack = save_ack;
-    break;
-  case XPA_ACCESS:
-    /* return errors -- that how we know if we have access */
-    comm->ack = 1;
-    /* type is in paramlist */
-    if( comm->paramlist && *comm->paramlist ){
-      char *s;
-      for(s=comm->paramlist; *s; s++){
-	switch(*s){
-	case 'g':
-	  if( !xpa->send_callback ){
-	    XPAError(xpa, "no send callback (i.e., can't xpaget)");
-	    goto done;
-	  }
-	  break;
-	case 'i':
-	  if( !xpa->info_callback ){
-	    XPAError(xpa, "no info callback (i.e., can't xpainfo)");
-	    goto done;
-	  }
-	  break;
-	case 's':
-	  if( !xpa->receive_callback ){
-	    XPAError(xpa, "no receive callback (i.e., can't xpaset)");
-	    goto done;
-	  }
-	  break;
-	case 'a':
-	  break;
-	default:
-	  XPAError(xpa, "unknown xpa access type");
-	  goto done;
-	}
-      }
-      /* if we got here, its OK */
-      XPAOK(xpa);
-    }
-    /* no type, anything is OK */
-    else
-      XPAOK(xpa);
-    break;
-  default:
-    /* something is really wrong if we have no command  */
-    FPRINTF((stderr, "%sXPAHandler: invalid command #%d for fd %d\n",
-	     _sp, comm->cmd, comm->cmdfd));
-    got = XPA_RTN_NOCMD;
-    goto error;
-    break;
-  }
-
-done:
-  FPRINTF((stderr,
-	   "%sXPAHandler: finished processing %d with status %d\n", _sp,
-	   fd, got));
-  /* add xpa back to list of active ones */
-  XPAActive(xpa, comm, 1);
-
-  /* finalize comm record */
-  if( comm ){
-    /* close data channel */
-    XPACloseData(xpa, comm);
-    /* xpa is no longer active */
-    comm->status &= ~XPA_STATUS_ACTIVE;
-  }
-
-  /* join common code */
-  goto end;
-
-eof:
-  /* on eof, free up comm */
-  if( comm ){
-    ns = comm->ns;
-    CommFree(xpa, comm, 1);
-    comm = NULL;
-    if( ns && !ns->nproxy && !ns->nxpa ){
-      FPRINTF((stderr, "%sXPAHandler: closing ns %s\n", _sp, ns->name));
-      XPANSClose(xpa, ns);
-    }
-  }
-  /* join common code */
-  goto end;
-  
-
-error:
-  FPRINTF((stderr, "%sXPAHandler ERROR: return code %d on %d\n",
-	   _sp, got, fd));
-  /* add xpa back to list of active ones (but not comm) */
-  XPAActive(xpa, comm, 1);
-  /* xpa is no longer using this comm */
-  xpa->comm = NULL;
-  /* don't accidentally close ns on error */
-  if( comm ){
-    if( comm->ns )
-      CommFree(xpa, comm, 0);
-    else
-      CommFree(xpa, comm, 1);
-    comm = NULL;
-  }
-  /* join common code */
-  goto end;
-
-end:
-  /* if a free was requested by the callback, do it now when its safe */
-  if( xpa->status & XPA_STATUS_FREE ){
-    XPAFree(xpa);
-  }
-  /* restore old value of comm */
-  else{
-    xpa->comm = ocomm;
-  }
-
-  /* return the status */
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAMode
- *
- * Purpose:	parse the mode string and set flags
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void 
-XPAMode (char *mode, int *flag, char *name, int mask, int def)
-#else
-void XPAMode(mode, flag, name, mask, def)
-     char *mode;
-     int *flag;
-     char *name;
-     int mask;
-     int def;
-#endif
-{
-  char tbuf[SZ_LINE];
-  char s[SZ_LINE];
-
-  /* keyword routine requires an input buffer that can be modified */
-  if( mode && *mode ){
-    strncpy(s, mode, SZ_LINE-1);
-    s[SZ_LINE-1] = '\0';
-  }
-  else
-    goto error;
-  /* look for the keyword=<value> string */
-  if( keyword(s, name, tbuf, SZ_LINE) ){
-    if( istrue(tbuf) )
-      *flag |= mask;
-    else
-      *flag &= ~mask;
-    return;
-  }
-  else
-    goto error;
-
-error:
-  if( def )
-    *flag |= mask;
-  else
-    *flag &= ~mask;
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAShortTimeout
- *
- * Purpose:	return short (select, gets) timeout value
- *
- * Return:	timeout in seconds
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAShortTimeout (void)
-#else
-int XPAShortTimeout()
-#endif
-{
-  return(stimeout);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPALongTimeout
- *
- * Purpose:	return long (fillbuf) timeout value
- *
- * Return:	timeout in seconds
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPALongTimeout (void)
-#else
-int XPALongTimeout()
-#endif
-{
-  return(ltimeout);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAReceiveLTimeout
- *
- * Purpose:	modify long timeout value for this process
- *
- * Returns:	0 for success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAReceiveLTimeout (void *client_data, void *call_data, char *paramlist,
-	       char *buf, size_t len)
-#else
-int XPAReceiveLTimeout(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     size_t len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  char tbuf[SZ_LINE];
-  char *s;
-
-  if( paramlist && *paramlist ){
-    strncpy(tbuf, paramlist, SZ_LINE-1);
-    tbuf[SZ_LINE-1] = '\0';
-    nocr(tbuf);
-    culc(tbuf);
-    if( !strcmp(tbuf, "reset") ){
-      ltimeout = XPA_LONG_TIMEOUT;
-      if( (s=(char *)getenv("XPA_LONG_TIMEOUT")) != NULL )
-	ltimeout = atoi(s);
-    }
-    else{
-      ltimeout = atoi(tbuf);
-    }
-    return(0);
-  }
-  else{
-    XPAError(xpa, "missing long timeout value");
-    return(-1);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASendLTimeout
- *
- * Purpose:	return the long timeout for this process
- *
- * Returns:	0 for success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPASendLTimeout (void *client_data, void *call_data, char *paramlist,
-	    char **buf, size_t *len)
-#else
-int XPASendLTimeout(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char **buf;
-     size_t *len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  char tbuf[SZ_LINE];
-
-  snprintf(tbuf, SZ_LINE, "%d\n", ltimeout);
-  send(xpa_datafd(xpa), tbuf, strlen(tbuf), 0);
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAReceiveSTimeout
- *
- * Purpose:	modify short timeout value for this process
- *
- * Returns:	0 for success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAReceiveSTimeout (void *client_data, void *call_data, char *paramlist,
-	       char *buf, size_t len)
-#else
-int XPAReceiveSTimeout(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     size_t len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  char tbuf[SZ_LINE];
-  char *s;
-
-  if( paramlist && *paramlist ){
-    strncpy(tbuf, paramlist, SZ_LINE-1);
-    tbuf[SZ_LINE-1] = '\0';
-    nocr(tbuf);
-    culc(tbuf);
-    if( !strcmp(tbuf, "reset") ){
-      stimeout = XPA_SHORT_TIMEOUT;
-      if( (s=(char *)getenv("XPA_SHORT_TIMEOUT")) != NULL )
-	stimeout = atoi(s);
-    }
-    else{
-      stimeout = atoi(tbuf);
-    }
-    return(0);
-  }
-  else{
-    XPAError(xpa, "missing short timeout value");
-    return(-1);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASendSTimeout
- *
- * Purpose:	return the short timeout for this process
- *
- * Returns:	0 for success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPASendSTimeout (void *client_data, void *call_data, char *paramlist,
-	    char **buf, size_t *len)
-#else
-int XPASendSTimeout(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char **buf;
-     size_t *len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  char tbuf[SZ_LINE];
-
-  snprintf(tbuf, SZ_LINE, "%d\n", stimeout);
-  send(xpa_datafd(xpa), tbuf, strlen(tbuf), 0);
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAVerbosity
- *
- * Purpose:	return verbosity value
- *
- * Return:	verbosity value (0, 1, 2)
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAVerbosity (void)
-#else
-int XPAVerbosity()
-#endif
-{
-  return(verbosity);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASigusr1
- *
- * Purpose:	return flag for using sigusr1
- *
- * Return:	0 or 1
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPASigusr1 (void)
-#else
-int XPASigusr1()
-#endif
-{
-  return(sigusr1);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAInitEnv
- *
- * Purpose:	initialize the xpa environment
- *
- * Return:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void 
-XPAInitEnv (void)
-#else
-void XPAInitEnv()
-#endif
-{
-  char *s;
-
-  if( !tmpdir ){
-    /* determine the communication method */
-    mtype=XPAMethod(NULL);
-    /* enable access controls and port management */
-    if( mtype != XPA_UNIX ){
-      XPAAclNew(NULL, 0);
-      XPAPortNew(NULL, 0);
-    }
-    /* set short (select,gets) timeout, if necessary */
-    if( (s=(char *)getenv("XPA_SHORT_TIMEOUT")) != NULL )
-      stimeout = atoi(s);
-    /* set long (fillbuf) timeout, if necessary */
-    if( (s=(char *)getenv("XPA_LONG_TIMEOUT")) != NULL )
-      ltimeout = atoi(s);
-    /* set xpans connect timeout, if necessary */
-    if( (s=(char *)getenv("XPA_CONNECT_TIMEOUT")) != NULL )
-      ctimeout = atoi(s);
-    /* set verbosity level, if necessary */
-    if( (s=(char *)getenv("XPA_VERBOSITY")) != NULL ){
-      if( istrue(s) )
-	verbosity = XPA_VERBOSITY;
-      else if( isfalse(s) )
-	verbosity = 0;
-      else
-	verbosity = atoi(s);
-      if( verbosity < 0 )
-	verbosity = 0;
-    }
-    /* check for acl enable/disable */
-    if( (s=(char *)getenv("XPA_ACL")) != NULL )
-      guseacl = istrue(s);
-    /* check for timestamp on errors */
-    if( (s=(char *)getenv("XPA_TIMESTAMP_ERRORS")) != NULL )
-      etimestamp = istrue(s);
-    /* check for xpans register flag */
-    if( (s=(char *)getenv("XPA_NSREGISTER")) != NULL )
-      nsregister = istrue(s);
-    /* check for use of siguser1 */
-    if( (s=(char *)getenv("XPA_SIGUSR1")) != NULL )
-      sigusr1 = istrue(s);
-    /* check for version checking */
-    if( (s=(char *)getenv("XPA_VERSIONCHECK")) != NULL ){
-      if( istrue(s) )
-	vercheck = 1;
-      else if( isfalse(s) )
-	vercheck = 0;
-      else
-	vercheck = atoi(s);
-    }
-    /* check for io loop calling xpa */
-    if( (s=(char *)getenv("XPA_IOCALLSXPA")) != NULL ){
-      if( istrue(s) ){
-	XPAIOCallsXPA(1);
-      }
-      else if( isfalse(s) ){
-	XPAIOCallsXPA(0);
-      }
-    }
-    /* make sure we have a temp dir */
-    if( tmpdir == NULL ){
-      if( (s=(char *)getenv("XPA_TMPDIR")) != NULL )
-	tmpdir = xstrdup(s);
-      else if( (s=(char *)getenv("TMPDIR")) != NULL )
-	tmpdir = xstrdup(s);
-      else if( (s=(char *)getenv("TMP")) != NULL )
-	tmpdir = xstrdup(s);
-      else
-	tmpdir = xstrdup(XPA_TMPDIR);
-    }
-    /* create directory, if necessary */
-    xmkdir(tmpdir, 0777);
-    xchmod(tmpdir, 0777);
-#if HAVE_MINGW32==0
-    /* Disable SIGPIPE so we do not die if the client dies.
-     * Rather, we will get an EOF on reading or writing.
-     */
-    xsignal_sigpipe();
-#endif
-    /* platform-dependent startup */
-    xsocketstartup();
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPANSAdd
- *
- * Purpose:	add this XPA to the name service
- *
- * Returns:	0 on success, -1 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPANSAdd (XPA xpa, char *host, char *mode)
-#else
-int XPANSAdd(xpa, host, mode)
-     XPA xpa;
-     char *host;
-     char *mode;
-#endif
-{
-  char username[SZ_LINE];
-  char tbuf[SZ_LINE];
-  char xmode[SZ_LINE];
-  char *cmd="add";
-  char *s;
-  NS ns;
-  struct passwd *pw;
-
-  /* sanity check */
-  if( !xpa )
-    return(0);
-
-  /* handle special case of the name server itself -- its a known entry */
-  if( !strcmp(xpa->name, XPANS_NAME) ){
-    return(0);
-  }
-
-  /* look for the proxy=<true|false> string */
-  if( mode ){
-    strncpy(xmode, mode, SZ_LINE-1);
-    xmode[SZ_LINE-1] = '\0';
-    if( keyword(xmode, "proxy", tbuf, SZ_LINE) && istrue(tbuf) ){
-      cmd="addproxy";
-    }
-  }
-
-  /* open a connection to the name service */
-  if( (ns=XPANSOpen(xpa, host, 1)) != NULL ){
-    /* get the user name, from the environment */
-    if( (s=(char *)getenv("XPA_LOGNAME")) != NULL )
-      strncpy(username, s, SZ_LINE-1);
-    else if( (s=(char *)getenv("LOGNAME")) != NULL )
-      strncpy(username, s, SZ_LINE-1);
-#if HAVE_MINGW32==0
-    /* this is a last resort */
-    else if( (pw=getpwuid(geteuid())) )
-      strncpy(username, pw->pw_name, SZ_LINE-1);
-#endif
-    /* if nothing good has happened, make it "unknown" */
-    if( *username == '\0' )
-      strcpy(username, "unknown");
-    /* null-terminate string */
-    username[SZ_LINE-1] = '\0';
-
-    /* write the command to add this xpa */
-    snprintf(tbuf, SZ_LINE, "%s %s %s:%s %s %s\n",
-	     cmd, xpa->method, xpa->xclass, xpa->name, xpa->type, username);
-    if( XPAPuts(xpa, ns->fd, tbuf, stimeout) < 0 ){
-      return(-1);
-    }
-    /* get result */
-    if( XPAGets(xpa, ns->fd, tbuf, SZ_LINE, stimeout) >0 ){
-      if( !strncmp(tbuf, "XPA$OK", 6) ){
-	/* for proxy, we now must listen for xpa requests on this ns */
-	if( !strcmp(cmd, "addproxy") && xpa ){
-	  if( CommNew(xpa, ns->fd, ns->ip, ns->port, ns->name, ns) ){
-	    /* one more proxy is using this name server */
-	    ns->nproxy += 1;
-	  }
-	}
-	else{
-	  /* one more access point is using this name server */
-	  ns->nxpa += 1;
-	}
-	return(0);
-      }
-      else if( !strncmp(tbuf, "XPA$EXISTS", 10) )
-	return(0);
-      else
-	return(-1);
-    }
-    else{
-      return(-1);
-    }
-  }
-  else{
-    return(-1);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPANSDel
- *
- * Purpose:	remove public knowledge of this XPA from the name service
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPANSDel (XPA xpa, char *host, char *mode)
-#else
-int XPANSDel(xpa, host, mode)
-     XPA xpa;
-     char *host;
-     char *mode;
-#endif
-{
-  int got=0;
-  char tbuf[SZ_LINE];
-  char xmode[SZ_LINE];
-  char *cmd="del";
-  NS ns;
-
-  /* sanity check */
-  if( !xpa )
-    return(0);
-
-  /* handle special case of the name server itself -- its a known entry */
-  if( xpa->name && !strcmp(xpa->name, XPANS_NAME) ){
-    return(0);
-  }
-
-  /* if there is no method, just return */
-  if( (xpa->method == NULL) || (*xpa->method == '\0') ){
-    return(0);
-  }
-
-  /* look for the proxy=<true|false> string */
-  if( mode ){
-    strncpy(xmode, mode, SZ_LINE-1);
-    xmode[SZ_LINE-1] = '\0';
-    if( keyword(xmode, "proxy", tbuf, SZ_LINE) && istrue(tbuf) ){
-      cmd="delproxy";
-    }
-  }
-
-  /* open a connection to the name service */
-  if( (ns=XPANSOpen(xpa, host, -1)) != NULL ){
-    /* write the command to delete this xpa */
-    snprintf(tbuf, SZ_LINE, "%s %s\n", cmd, xpa->method);
-    XPAPuts(xpa, ns->fd, tbuf, stimeout);
-    /* get result */
-    if( XPAGets(xpa, ns->fd, tbuf, SZ_LINE, stimeout) >0 ){
-      if( !strncmp(tbuf, "XPA$OK", 6) ){
-	/* one less access point is using this name server */
-	ns->nxpa -= 1;
-	/* if there are no more access points using this xpans, close it */
-	if( !ns->nxpa && !ns->nproxy ){
-	  XPANSClose(xpa, ns);
-	}
-      }
-      else{
-	got = -1;
-      }
-    }
-    else{
-      got = -1;
-    }
-  }
-  else
-    got = -1;
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAVersionCheck
- *
- * Purpose:	check our version vs. xpans version
- *
- * Returns:	-1,0,1 for our<=>xpans
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAVersionCheck (char *serv, char *nsv)
-#else
-int XPAVersionCheck(serv, nsv)
-     char *serv;
-     char *nsv;
-#endif
-{
-  int i;
-  int ip1=0;
-  int ip2=0;
-  int v1=0;
-  int v2=0;
-  int got=0;
-  int vsize=2;
-  char s1[SZ_LINE];
-  char s2[SZ_LINE];
-
-  /* return if not checking version */
-  if( vercheck <=0 )
-    return(0);
-  /* if either does not exist, its a mismatch */
-  if( !word(serv, s1, &ip1) || !word(nsv, s2, &ip2) )
-    return(1);
-  /* if strings are equal, versions are equal */
-  if( !strcasecmp(s1, s2) )
-    return(0);
-
-  /* format for version is maj.min.patch[be]beta */
-  newdtable(".be");
-  /* we check only the major and minor version for incompatibilities */
-  for(i=0; i<vsize; i++){
-    if( !word(serv, s1, &ip1) || !word(nsv, s2, &ip2) ){
-      break;
-    }
-    v1 = atoi(s1);
-    v2 = atoi(s2);
-    if( v1 > v2 ){
-      got = 1;
-      break;
-    }
-    if( v1 < v2 ){
-      got = -1;
-      break;
-    }
-  }
-
-  freedtable();
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAVersionWarn
- *
- * Purpose:	warn about mismatched versions
- *
- * Returns:	NONE
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void
-XPAVersionWarn (char *serv, char *nsv)
-#else
-void XPAVersionWarn(serv, nsv)
-     char *serv;
-     char *nsv;
-#endif
-{
-  /* return if not checking version */
-  if( vercheck <=0 )
-    return;
-
-  /* output warning */
-  fprintf(stderr,
-	  "XPA$WARNING: version mismatch detected between XPA-enabled server (%s)\n", serv?serv:"unknown");
-  fprintf(stderr, "and xpans (%s).", nsv?nsv:"unknown");
-  fprintf(stderr, " You probably will get bad results.\n");
-  fprintf(stderr, "Please consider updating XPA to match the XPA-enabled server you are running.\n");
-
-  /* we did it */
-  vercheck--;
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- *			Public Routines
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAMethod
- *
- * Purpose:	return communication method type
- *
- * Returns:	XPA__INET, XPA_UNIX
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAMethod (char *method)
-#else
-int XPAMethod(method)
-     char *method;
-#endif
-{
-  char *s1;
-
-  /* if no method is passed, we return the default method type */
-  if( method == NULL ){
-    if( mtype == 0 ){
-      s1 = (char *)getenv("XPA_METHOD");
-      if( s1 == NULL )
-	mtype = XPA_INET;
-      else if( !strcasecmp(s1, "inet") )
-	mtype = XPA_INET;
-      else if( !strcasecmp(s1, "localhost") ){
-	mtype = XPA_INET;
-	use_localhost = 1;
-      }
-      else if( !strcasecmp(s1, "unix") ){
-#if HAVE_SYS_UN_H
-	mtype = XPA_UNIX;
-#else
-        mtype = XPA_INET;
-	use_localhost = 1;
-#endif
-      }
-      else if( !strcasecmp(s1, "local") ){
-#if HAVE_SYS_UN_H
-	mtype = XPA_UNIX;
-#else
-        mtype = XPA_INET;
-	use_localhost = 1;
-
-#endif
-      }
-      else
-	mtype = XPA_INET;
-    }
-    return(mtype);
-  }
-  /* otherwise, we analyze the input method to get the type */
-  else{
-    /* inet is ip:port, else unix filename */
-    if( strchr(method, ':') != NULL )
-      return(XPA_INET);
-    else
-#if HAVE_SYS_UN_H
-      return(XPA_UNIX);
-#else
-      return(XPA_INET);
-#endif
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPANSMethod
- *
- * Purpose:	return string containing name server method
- *
- * Returns:	name server method string
- *
- *----------------------------------------------------------------------------
- */
-
-#ifdef ANSI_FUNC
-char * 
-XPANSMethod (char *host, int flag)
-#else
-char *XPANSMethod(host, flag)
-     char *host;
-     int flag;
-#endif
-{
-  char *s, *t;
-  char tbuf[SZ_LINE];
-  int i;
-  int ip;
-  int port;
-  unsigned int bip;
-  unsigned short bport;
-
-  switch( XPAMethod(host) ){
-  case XPA_INET:
-    if( (host != NULL) && (*host != '\0') )
-      strncpy(nsmethod, host, SZ_LINE-1);
-    else if( (s=(char *)getenv("XPA_NSINET")) != NULL )
-      strncpy(nsmethod, s, SZ_LINE-1);
-    else
-      strncpy(nsmethod, XPA_NSINET, SZ_LINE-1);
-    /* always null-terminate */
-    nsmethod[SZ_LINE-1] = '\0';
-    /* if flag, we want the XPA access ip and port, not the communication
-       channel between xpa servers and the name service */
-    if( flag ){
-      if( (s=strrchr(nsmethod, ':')) != NULL ){
-	/* this is where we will overwrite the port */
-	t = s+1;
-	/* get base port for default */
-	XPAParseIpPort(nsmethod, &bip, &bport);
-	newdtable(",");
-	for(ip=0, i=0; i<=flag; i++){
-	  if( !word(t, tbuf, &ip) ){
-	    *tbuf = '\0';
-	    break;
-	  }
-	}
-	freedtable();
-	if( *tbuf )
-	  port = atoi(tbuf);
-	else
-	  port = bport + flag;
-	snprintf(t, SZ_LINE, "%d", port);
-      }
-    }
-    break;
-#if HAVE_SYS_UN_H
-  case XPA_UNIX:
-    if( host != NULL )
-      strncpy(nsmethod, host, SZ_LINE-1);
-    else if( (s=(char *)getenv("XPA_NSUNIX")) != NULL )
-      strncpy(nsmethod, s, SZ_LINE-1);
-    else
-      snprintf(nsmethod, SZ_LINE, "%s/%s", tmpdir, XPA_NSUNIX);
-    /* always null-terminate */
-    nsmethod[SZ_LINE-1] = '\0';
-    /* if flag is set, we are getting the XPA access file, not the
-       socket file and we have to change the name slightly */
-    if( flag ){
-      /* replace the ending, if possible */
-      s = strrchr(nsmethod, '.');
-      t = strrchr(nsmethod, '/');
-      if( (s != NULL) && (s > t) )
-	*s = '\0';
-      snprintf(tbuf, SZ_LINE, ".xpa-%d", flag);
-      strcat(nsmethod, tbuf);
-    }
-    break;
-#endif
-  default:
-    if( (s=(char *)getenv("XPA_NSINET")) != NULL )
-      strncpy(nsmethod, s, SZ_LINE-1);
-    else
-      strncpy(nsmethod, XPA_NSINET, SZ_LINE-1);
-    /* always null-terminate */
-    nsmethod[SZ_LINE-1] = '\0';
-    break;
-  }
-
-  /* return the static method string */
-  return(nsmethod);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAParseName
- *
- * Purpose:	split the xpaname into a class and name string
- *
- * Results:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void 
-XPAParseName (char *xpaname, char *xclass, char *name, int len)
-#else
-void XPAParseName(xpaname, xclass, name, len)
-     char *xpaname;
-     char *xclass;
-     char *name;
-     int len;
-#endif
-{
-  char *s;
-  char *t;
-  char *cptr=NULL;
-  char *nptr=NULL;
-
-  /* if nothing is passed to us, allow everything */
-  if( (xpaname == NULL) || (*xpaname == '\0') ){
-    strncpy(xclass, "*", len-1);
-    strncpy(name, "*", len-1);
-    return;
-  }
-    
-  /* split the xpaname into class and name */
-  s = xstrdup(xpaname);
-  if( (t=(char *)strchr(s, ':')) != NULL ){
-    cptr = s;
-    *t = '\0';
-    nptr = t+1;
-  }
-  else{
-    nptr = s;
-    cptr = "*";
-  }
-  if( *cptr == '\0' )
-    cptr = "*";
-  if( *nptr == '\0' )
-    nptr = "*";
-
-  strncpy(xclass, cptr, len-1);
-  strncpy(name, nptr, len-1);
-  xfree(s);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAParseIpPort
- *
- * Purpose:	split the host into ip and port
- *
- * Results:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAParseIpPort (char *host, unsigned int *ip, unsigned short *port)
-#else
-int XPAParseIpPort(host, ip, port)
-     char *host;
-     unsigned int *ip;
-     unsigned short *port;
-#endif
-{
-  char *s1, *s2, *s3, *p1, *p2;
-  int got;
-
-  /* make sure we have something to work with */
-  if( (host == NULL) || (*host == '\0') )
-    return(0);
-
-  /* parse up the string and look for a port number (which is essential) */
-  s1 = xstrdup(host);
-  /* if we have a ",", null it out since what comes after is aux info */
-  if( (p1 = (char *)strchr(s1, ',')) != NULL ){
-    *p1 = '\0';
-  }
-  /* if we have a ":", we will null it out (so that what comes before is
-     the host name) and bump past it to point to the port */
-  if( (p1 = (char *)strchr(s1, ':')) == NULL ){
-    /* there is no ":", so the whole string is the port */
-    p1 = s1;
-    s2 = NULL;
-  } else {
-    /* null out ':' and bump port pointer */
-    *p1 = '\0';
-    p1++;
-    s2 = s1;
-  }
-
-  /* get port */
-  p2 = NULL;
-  if( p1 && !strcmp(p1, "$port") )
-    *port = XPA_NSPORT;
-  /* NB: port number might be followed by other stuff */
-  else
-    *port = (unsigned short)strtol(p1, &p2, 0);
-  /* check for bad port number -- we lose */
-  if( *port <=0 || (p1 == p2) || (p2 && (*p2 != '\0')) ){
-    *ip = 0;
-    *port = 0;
-    got = 0;
-    goto done;
-  }
-
-  /* get ip */
-  if( s2 && *s2 ){
-    /* see if this already is a hex address in network byte order */
-    *ip = strtoul16(s2, &s3);
-    if( *s3 == '\0' ){
-      got = 1;
-      goto done;
-    }
-  }
-  /* not hex or proxy -- convert ip string to an ip address */
-  if( (*ip = gethostip(s2)) == 0 ){
-    *port = 0;
-    got = 0;
-  }
-  else{
-    got = 1;
-  }
-
-done:
-  xfree(s1);
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAParseUnixSocket
- *
- * Purpose:	see if host is actually a unix socket file
- *
- * Results:	1 if its a socket, 0 otherwise
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAParseUnixSocket (char *host)
-#else
-int XPAParseUnixSocket(host)
-     char *host;
-#endif
-{
-  struct stat buf;
-
-  /* see if its a file in the right directory */
-  if( !strncmp(host, tmpdir, strlen(tmpdir)) &&
-      !stat(host, &buf) ){
-    return(1);
-  }
-  else{
-    return(0);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAOK
- *
- * Purpose:	send an XPA OK message to the client
- *
- * Returns:	0 on success, -1 on error
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int
-XPAOK (XPA xpa)
-#else
-int XPAOK(xpa)
-     XPA xpa;
-#endif
-{
-  int len;
-  int status=0;
-  char tbuf[SZ_LINE];
-
-  /* make sure we have a valid struct */
-  if( (xpa == NULL) || (xpa_cmdfd(xpa) <0) )
-    return(-1);
-
-  /* send message, if necessary */
-  if( !(xpa_status(xpa) & XPA_STATUS_ACTIVE) || (xpa_ack(xpa) == 1) ){
-    snprintf(tbuf, SZ_LINE, "%s XPA$OK (%s:%s %s)\n",
-	     xpa_id(xpa), xpa_class(xpa), xpa_name(xpa), xpa_method(xpa));
-    len = strlen(tbuf);
-    if( XPAPuts(xpa, xpa_cmdfd(xpa), tbuf, stimeout) != len ){
-      status = -1;
-    }
-  }
-
-  /* flag that there was a message sent for this xpa */
-  xpa->comm->message = 1;
-
-  /* return status */
-  return(status);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPATimestamp
- *
- * Purpose:	generate string with current date/time
- *
- * Returns:	time string (in static buffer)
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-char *
-XPATimestamp(void)
-#else
-char *XPATimestamp()
-#endif
-{
-  time_t t;
-  struct tm *lt;
-
-  *ctimebuf = '\0';
-  if( etimestamp ){
-    if( (t = time(NULL)) != (time_t)-1 ){
-      if( (lt = localtime(&t)) != NULL ){
-	snprintf(ctimebuf, SZ_LINE, " %02d/%02d/%d:%d:%d:%d",
-		 lt->tm_mday, lt->tm_mon+1, lt->tm_year+1900,
-		 lt->tm_hour, lt->tm_min, lt->tm_sec);
-      }
-    }
-  }
-  return ctimebuf;
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAError
- *
- * Purpose:	send an XPA error message to the client
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int
-XPAError (XPA xpa, char *s)
-#else
-int XPAError(xpa, s)
-     XPA xpa;
-     char *s;
-#endif
-{
-  int status=0;
-  int ip=0;
-  char tbuf[SZ_LINE];
-  char *t;
-  char *u;
-
-  /* make sure we have a valid struct */
-  if( (xpa == NULL) || (xpa_cmdfd(xpa) <0) )
-    return(-1);
-
-  /* send message, if necessary */
-  if( !(xpa_status(xpa) & XPA_STATUS_ACTIVE) || (xpa_ack(xpa) == 1) ){
-    t = xstrdup(s);
-    /* get rid of CR in message -- we add one at the end */
-    nowhite(t, t);
-    if( !strncmp(t, "XPA$", 4) )
-      word(t, tbuf, &ip);
-    u = (char *)xcalloc(strlen(t)+SZ_LINE, sizeof(char));
-    /* package up and write the message */
-    snprintf(u, SZ_LINE, "%s XPA$ERROR %s (%s:%s %s%s)\n",
-	     xpa_id(xpa),
-	     &t[ip], xpa_class(xpa), xpa_name(xpa), xpa_method(xpa),
-	     XPATimestamp());
-    if( XPAPuts(xpa, xpa_cmdfd(xpa), u, stimeout) != (int)strlen(u) ){
-      status = -1;
-    }
-    if( t )
-      xfree(t);
-    if( u )
-      xfree(u);
-  }
-
-  /* flag that there was a message sent for this xpa */
-  xpa->comm->message = 1;
-
-  /* return status */
-  return(status);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAMessage
- *
- * Purpose:	send an XPA message to the client
- *
- * Returns:	0 on success, -1 on error
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAMessage (XPA xpa, char *s)
-#else
-int XPAMessage(xpa, s)
-     XPA xpa;
-     char *s;
-#endif
-{
-  int status=0;
-  int ip=0;
-  char tbuf[SZ_LINE];
-  char *t;
-  char *u;
-
-  /* make sure we have a valid struct */
-  if( (xpa == NULL) || (xpa_cmdfd(xpa) <0) )
-    return(-1);
-
-  /* send message, if necessary */
-  if( !(xpa_status(xpa) & XPA_STATUS_ACTIVE) || (xpa_ack(xpa) == 1) ){
-    t = xstrdup(s);
-    /* get rid of CR in message -- we add one at the end */
-    nowhite(t, t);
-    if( !strncmp(t, "XPA$", 4) )
-      word(t, tbuf, &ip);
-    u = (char *)xcalloc(strlen(t)+SZ_LINE, sizeof(char));
-    /* package up and write the message */
-    snprintf(u, SZ_LINE, "%s XPA$MESSAGE %s (%s:%s %s%s)\n",
-	     xpa_id(xpa),
-	     &t[ip], xpa_class(xpa), xpa_name(xpa), xpa_method(xpa),
-	     XPATimestamp());
-    if( XPAPuts(xpa, xpa_cmdfd(xpa), u, stimeout) != (int)strlen(u) ){
-      status = -1;
-    }
-    if( t )
-      xfree(t);
-    if( u )
-      xfree(u);
-  }
-
-  /* flag that there was a message sent for this xpa */
-  xpa->comm->message = 1;
-
-  /* return status */
-  return(status);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAArgvParamlist
- *
- * Purpose:	generate a paramlist string from an argv
- *
- * Results:	allocated paramlist string
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-char *
-XPAArgvParamlist (int argc, char **argv, int start)
-#else
-char *XPAArgvParamlist(argc, argv, start)
-     int argc;
-     char **argv;
-     int start;
-#endif
-{
-  int plen;
-  int i;
-  char *paramlist;
-
-  /* get length of paramlist */
-  for(plen=0, i=start; i<argc; i++){
-    plen += (strlen(argv[i])+1);
-  }
-
-  /* allocate enough space for it */
-  if( (paramlist = (char *)xcalloc(plen+1, sizeof(char))) == NULL ){
-    return(NULL);
-  }
-
-  /* gather up the paramlist */
-  for(i=start; i<argc; i++){
-    strcat(paramlist, argv[i]);
-    strcat(paramlist, " ");
-  }
-
-  /* remove whitespace from beginning and end */
-  nowhite(paramlist, paramlist);
-
-  /* return paramlist */
-  return(paramlist);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPANSLookup
- *
- * Purpose:	get name server matches
- *
- * Returns:	number of matches
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPANSLookup (XPA xpa, char *tname, char *ttype,
-	     char ***xclasses, char ***names, char ***methods, char ***infos)
-#else
-int XPANSLookup(xpa, tname, ttype, xclasses, names, methods, infos)
-     XPA xpa;
-     char *tname;
-     char *ttype;
-     char ***xclasses;
-     char ***names;
-     char ***methods;
-     char ***infos;
-#endif
-{
-  unsigned short port;
-  unsigned int ip;
-  int own;
-  int lp=0;
-  int got=0;
-  int nentry=100;
-  char *xtype;
-  char xclass[SZ_LINE];
-  char name[SZ_LINE];
-  char method[SZ_LINE];
-  char info[SZ_LINE];
-  char user[SZ_LINE];
-  char type[SZ_LINE];
-  char tbuf[SZ_LINE];
-  char lbuf[SZ_LINE];
-  NS ns;
-  XPA txpa;
-
-  /* do some initialization */
-  XPAInitEnv();
-
-  /* use "*" as default if no type was specified */
-  if( (ttype == NULL) || (*ttype == '\0') )
-    xtype = "*";
-  /* type 'a' means we are only trying to access */
-  else if( *ttype == 'a' )
-    xtype = "*";
-  else
-    xtype = ttype;
-
-  /* special case of name server */
-  if( !strcmp(tname, XPANS_NAME) ){
-    *xclasses  = (char **)xmalloc(sizeof(char *));
-    *names     = (char **)xmalloc(sizeof(char *));
-    *methods   = (char **)xmalloc(sizeof(char *));
-    *infos     = (char **)xmalloc(sizeof(char *));
-    (*xclasses)[0] = xstrdup(XPANS_CLASS);
-    (*names)[0]   = xstrdup(XPANS_NAME);
-    (*methods)[0]   = xstrdup(XPANSMethod(NULL, 1));
-    (*infos)[0] = xstrdup(XPA_DEF_CLIENT_INFO);
-    return(1);
-  }
-
-  /* special case of a string containing ip:port -- avoid trip to ns */
-  if( XPAParseIpPort(tname, &ip, &port) ){
-    *xclasses   = (char **)xmalloc(sizeof(char *));
-    *names      = (char **)xmalloc(sizeof(char *));
-    *methods    = (char **)xmalloc(sizeof(char *));
-    *infos      = (char **)xmalloc(sizeof(char *));
-    (*xclasses)[0] = xstrdup("?");
-    (*names)[0]   = xstrdup("?");
-    (*methods)[0] = xstrdup(tname);
-    (*infos)[0] = xstrdup(XPA_DEF_CLIENT_INFO);
-    return(1);
-  }
-
-  /* special case of a string containing unix socket -- avoid trip to ns */
-  if( XPAParseUnixSocket(tname) ){
-    *xclasses   = (char **)xmalloc(sizeof(char *));
-    *names      = (char **)xmalloc(sizeof(char *));
-    *methods    = (char **)xmalloc(sizeof(char *));
-    *infos      = (char **)xmalloc(sizeof(char *));
-    (*xclasses)[0] = xstrdup("?");
-    (*names)[0]   = xstrdup("?");
-    (*methods)[0] = xstrdup(tname);
-    (*infos)[0] = xstrdup(XPA_DEF_CLIENT_INFO);
-    return(1);
-  }
-
-  /* pre-allocate the various arrays to an absurd number */
-  *xclasses = (char **)xmalloc(nentry * sizeof(char *));
-  *names    = (char **)xmalloc(nentry * sizeof(char *));
-  *methods  = (char **)xmalloc(nentry * sizeof(char *));
-  *infos    = (char **)xmalloc(nentry * sizeof(char *));
-
-  /* open a connection to the name service */
-  if( (ns=XPANSOpen(xpa, NULL, 0)) != NULL ){
-    while( word(tname, lbuf, &lp) ){
-      XPAParseName(lbuf, xclass, name, SZ_LINE);
-      /* write the command to add this xpa */
-      snprintf(tbuf, SZ_LINE, "lookup %s:%s %s %s\n",
-	       xclass, name, xtype, nsusers);
-      FPRINTF((stderr, "%sXPANSLookup: sending command %s", _sp, tbuf));
-      XPAPuts(xpa, ns->fd, tbuf, stimeout);
-      /* read matches from the name server */
-      while( 1 ){
-	if( XPAGets(xpa, ns->fd, tbuf, SZ_LINE, stimeout) <=0 ){
-	  FPRINTF((stderr, "%sXPANSLookup: unexpected EOF from xpans\n", _sp));
-	  break;
-	}
-	FPRINTF((stderr, "%sXPANSLookup: receiving %s", _sp, tbuf));
-	/* XPA$<result> signals end of input */
-	if( !strncmp(tbuf, "XPA$", 4) )
-	  break;
-	/* otherwise scan next line */
-	if( sscanf(tbuf, "%s %s %s %s %s %s\n", 
-		   xclass, name, type, method, user, info) != EOF ){
-	  /* make sure this entry is not in the current process
-	     (i.e., we can't ever xpa ourselves!) */
-	  for(own=0, txpa=xpahead; txpa!=NULL; txpa=txpa->next){
-	    if( !strcmp(txpa->xclass, xclass) && !strcmp(txpa->name, name) &&
-		!strcmp(txpa->method, method)				   ){
-	      own = 1;
-	      break;
-	    }
-	  }
-	  /* if this xpa is in the current process, skip it */
-	  if( own )
-	    continue;
-	  /* make sure we have enough space */
-	  if( got >= nentry ){
-	    nentry *= 2;
-	    *xclasses = (char **)xrealloc(*xclasses, nentry * sizeof(char *));
-	    *names    = (char **)xrealloc(*names, nentry * sizeof(char *));
-	    *methods  = (char **)xrealloc(*methods, nentry * sizeof(char *));
-	    *infos    = (char **)xrealloc(*infos, nentry * sizeof(char *));
-	  }
-	  /* add this entry to the list */
-	  (*xclasses)[got] = xstrdup(xclass);
-	  (*names)[got] = xstrdup(name);
-	  (*methods)[got] = xstrdup(method);
-	  (*infos)[got] = xstrdup(info);
-	  got++;
-	}
-      }
-    }
-    /* if we did not add to an xpa record, close up here */
-    if( xpa == NULL ){
-      XPANSClose(NULL, ns);
-    }
-  }
-  /* reallocate the exact number of buffers we have */
-  if( got > 0 ){
-    *xclasses = (char **)xrealloc(*xclasses, got * sizeof(char *));
-    *names    = (char **)xrealloc(*names, got * sizeof(char *));
-    *methods  = (char **)xrealloc(*methods, got * sizeof(char *));
-    *infos    = (char **)xrealloc(*infos, got * sizeof(char *));
-  }
-  else{
-    xfree(*xclasses);
-    xfree(*names);
-    xfree(*methods);
-    xfree(*infos);
-  }
-  FPRINTF((stderr, "%sXPANSLookup: found %d entries\n", _sp, got));
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPANSClose
- *
- * Purpose:	close connection to the name service
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int
-XPANSClose (XPA xpa, NS ns)
-#else
-int XPANSClose(xpa, ns)
-     XPA xpa;
-     NS ns;
-#endif
-{
-  NS cur;
-  XPAComm comm, tcomm;
-
-  if( !ns )
-    return(-1);
-
-  /* remove from xpa list */
-  if( xpa ){
-    if( xpa->nshead ){
-      if( xpa->nshead == ns ){
-	xpa->nshead = ns->next;
-      }
-      else{
-	for(cur=xpa->nshead; cur!=NULL; cur=cur->next){
-	  if( cur->next == ns ){
-	    cur->next = ns->next;
-	    break;
-	  }
-	}
-      }
-    }
-    /* close comms associated with this ns */
-    for(comm=xpa->commhead; comm!=NULL; ){
-      tcomm = comm->next;
-      if( comm->ns == ns ){
-	CommFree(xpa, comm, 0);
-      }
-      comm = tcomm;
-    }
-  }
-
-  /* close socket */
-  if( ns->fd >=0 ){
-    xclose(ns->fd);
-  }
-  /* free up space */
-  if( ns->method) xfree(ns->method);
-  if( ns->host )  xfree(ns->host);
-  if( ns->name )  xfree(ns->name);
-  if( ns )        xfree(ns);
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPANSKeepAlive
- *
- * Purpose:	send a 1-byte keep-alive packet to each name server
- *
- * Returns:	-1 on error, else 1
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int
-XPANSKeepAlive (XPA xpa, int type)
-#else
-  int XPANSKeepAlive(xpa, type)
-     XPA xpa;
-     int type;
-#endif
-{
-  NS ns;
-  int got=0;
-
-  /* sanity check */
-  if( !xpa )
-    return(-1);
-
-  /* use default type, if none specified */
-  if( !type )
-    type=DEF_KA_TYPE;
-
-  /* send keep-alive to deserving xpans instances */
-  for(ns=xpa->nshead; ns!=NULL; ns=ns->next){ 
-    if( ((type&1) && (ns->nxpa>0)) || ((type&2) && (ns->nproxy>0)) ){
-      FPRINTF((stderr, "%sXPANSKeepAlive: sending ka to %d\n", _sp, ns->fd));
-#if USE_KA_OOB
-      /* send as out of band data to avoid mixing with normal data stream */
-      got = send(ns->fd, "\n", 1, MSG_OOB);
-#else
-      /* cisco routers can clear the URG flag by default, so use in-band */
-      got = send(ns->fd, "\n", 1, 0);
-#endif
-    }
-  }
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPANew
- *
- * Purpose:	add a new xpa name to a process to allow external
- * 		process to read/write data associated with this name.
- *
- * If the send callback is defined, it can send to an external process.
- * If the receive callback is defined, it can receive from an external process.
- *
- * Returns: xpa handle associated with this class.name or NULL
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-XPA 
-XPANew (char *xclass, char *name, char *help,
-	SendCb send_callback, void *send_data, char *send_mode,
-	ReceiveCb rec_callback, void *rec_data, char *rec_mode)
-#else
-XPA XPANew(xclass, name, help,
-	   send_callback, send_data, send_mode,
-	   rec_callback, rec_data, rec_mode)
-     char *xclass;
-     char *name;
-     char *help;
-     SendCb send_callback;
-     void *send_data;
-     char *send_mode;
-     ReceiveCb rec_callback;
-     void *rec_data;
-     char *rec_mode;
-#endif
-{
-  unsigned short port;
-  unsigned int ip;
-  int got;
-  int oum;
-  int keep_alive=1;
-  int reuse_addr=1;
-  char tbuf[SZ_LINE];
-  char tbuf2[SZ_LINE];
-  char tfile[SZ_LINE];
-  char *tfptr;
-  XPA xpa;
-  socklen_t slen = sizeof(struct sockaddr_in);
-  struct sockaddr_in sock_in;
-#if HAVE_SYS_UN_H
-  struct sockaddr_un sock_un;
-#endif
-
-  /* do some initialization */
-  XPAInitEnv();
-  /* init the list of reserved commands */
-  XPAInitReserved();
-
-  /* we need a name, but no ":" allowed in the name */
-  if( (name == NULL) || (*name == '\0') || strchr(name, ':') )
-    return(NULL);
-  
-  /* limit the size of the xclass and name designation */
-  if( xclass && *xclass && (strlen(xclass) > XPA_NAMELEN) ){
-    if( verbosity )
-      fprintf(stderr, "XPA$ERROR: class designator too long\n");
-    return(NULL);
-  }
-  if( strlen(name) > XPA_NAMELEN ){
-    if( verbosity )
-      fprintf(stderr, "XPA$ERROR: name designator too long\n");
-    return(NULL);
-  }
-
-  /* we need either a send or a receive or both */
-  if( (send_callback == NULL) && (rec_callback == NULL ) ){
-    if( verbosity )
-      fprintf(stderr, "XPA$ERROR: requires send and/or receive callback\n");
-    return(NULL);
-  }
-
-  /* allocate xpa struct */
-  if( (xpa = (XPA)xcalloc(1, sizeof(XPARec))) == NULL )
-    return(NULL);
-
-  /* fill in the blanks */
-  xpa->version = xstrdup(XPA_VERSION);
-  xpa->type  = (char *)xcalloc(10, sizeof(char));
-  if( xclass && *xclass )
-    xpa->xclass = xstrdup(xclass);
-  else
-    xpa->xclass = xstrdup("*");
-  xpa->name  = xstrdup(name);
-  xpa->help  = xstrdup(help);
-  /* set the value of the server big-endian-ness */
-  xpa->sendian = XPAEndian() ? xstrdup("big") : xstrdup("little");
-
-  /* fill in send information */
-  if( send_callback != NULL ){
-    xpa->send_callback = send_callback;
-    xpa->send_data = send_data;
-    strcat(xpa->type, "g");
-    /* process the mode string */
-    xpa->send_mode = XPA_DEF_MODE_SEND;
-    XPAMode(send_mode, &(xpa->send_mode), "freebuf", XPA_MODE_FREEBUF,1);
-    XPAMode(send_mode, &(xpa->send_mode), "acl", XPA_MODE_ACL, 1);
-  }
-
-  /* fill in receive information */
-  if( rec_callback != NULL ){
-    xpa->receive_callback = rec_callback;
-    xpa->receive_data = rec_data;
-    strcat(xpa->type, "s");
-    /* process the mode string */
-    xpa->receive_mode = XPA_DEF_MODE_REC;
-    XPAMode(rec_mode, &(xpa->receive_mode), "buf", XPA_MODE_BUF, 1);
-    XPAMode(rec_mode, &(xpa->receive_mode), "fillbuf", XPA_MODE_FILLBUF, 1);
-    XPAMode(rec_mode, &(xpa->receive_mode), "freebuf", XPA_MODE_FREEBUF, 1);
-    XPAMode(rec_mode, &(xpa->receive_mode), "acl", XPA_MODE_ACL, 1);
-  }
-
-  /* set up communication method */
-  switch(mtype){
-  case XPA_INET:
-    /* open a socket and fill in socket information */
-    if( (xpa->fd = xsocket(AF_INET, SOCK_STREAM, 0)) < 0 )
-      goto error;
-    setsockopt(xpa->fd, SOL_SOCKET, SO_KEEPALIVE,
-	       (char *)&keep_alive, sizeof(keep_alive));
-    setsockopt(xpa->fd, SOL_SOCKET, SO_REUSEADDR,
-	       (char *)&reuse_addr, sizeof(reuse_addr));
-    memset((char *)&sock_in, 0, sizeof(sock_in));
-    sock_in.sin_family = AF_INET;
-    /* localhost only */
-    if( use_localhost )
-      sock_in.sin_addr.s_addr = htonl(gethostip("$localhost"));
-    /* any address will do */
-    else
-      sock_in.sin_addr.s_addr = htonl(INADDR_ANY);
-    /* handle special case of xpans port */
-    if( !strcmp(xpa->name, XPANS_NAME) ){
-      XPAParseIpPort(XPANSMethod(NULL, 1), &ip, &port);
-      sock_in.sin_port = htons(port);
-    }
-    else{
-      sock_in.sin_port = htons(XPAPort(xpa));
-    }
-    /* bind to the ip:port */
-    if( xbind(xpa->fd, (struct sockaddr *)&sock_in, sizeof(sock_in)) < 0 )
-      goto error;
-    /* we now can determine which port the system assigned */
-    if( getsockname(xpa->fd, (struct sockaddr *)&sock_in, &slen) < 0 )
-      goto error;
-    else{
-      /* ip:port is the method */
-      gethost(tbuf2, SZ_LINE);
-      snprintf(tbuf, SZ_LINE, "%x:%d",
-	       gethostip(tbuf2), ntohs(sock_in.sin_port));
-      xpa->method = xstrdup(tbuf);
-    }
-    break;
-#if HAVE_SYS_UN_H
-  case XPA_UNIX:
-    /* open a socket and fill in socket information */
-    if( (xpa->fd = xsocket(AF_UNIX, SOCK_STREAM, 0)) < 0 )
-      goto error;
-    setsockopt(xpa->fd, SOL_SOCKET, SO_KEEPALIVE,
-	       (char *)&keep_alive, sizeof(keep_alive));
-    setsockopt(xpa->fd, SOL_SOCKET, SO_REUSEADDR,
-	       (char *)&reuse_addr, sizeof(reuse_addr));
-    memset((char *)&sock_in, 0, sizeof(sock_in));
-    sock_un.sun_family = AF_UNIX;
-    /* handle special case of xpans */
-    if( !strcmp(xpa->name, XPANS_NAME) ){
-      strcpy(tbuf, XPANSMethod(NULL, 1));
-    }
-    else{
-      /* get filename part, composed of class and name and unique id */
-      snprintf(tfile, SZ_LINE, "%s_%s.%d",
-	       xpa->xclass, xpa->name, (int)getpid());
-      /* change "/" to "_" for filename */
-      for(tfptr = tfile; *tfptr != '\0'; tfptr++){
-	if( *tfptr == '/' )
-	  *tfptr = '_';
-      }
-      /* create full pathname */
-      snprintf(tbuf, SZ_LINE, "%s/%s", tmpdir, tfile);
-    }
-    /* delete old copy */
-    unlink (tbuf);
-    strcpy(sock_un.sun_path, tbuf);
-    /* unset umask so that everyone can read and write */
-    oum = umask(0);
-    /* bind to the file */
-    got = xbind(xpa->fd, (struct sockaddr *)&sock_un, sizeof(sock_un));
-    /* reset umask */
-    umask(oum);
-    /* now check for bind error */
-    if( got < 0 )
-      goto error;
-    /* path is the method */
-    xpa->method = xstrdup(tbuf);
-    break;
-#endif
-  default:
-    goto error;
-  }
-
-  /* listen for connections */
-  if( listen(xpa->fd, XPA_MAXLISTEN) < 0 )
-    goto error;
-
-  /* make sure we close on exec */
-  xfcntl(xpa->fd, F_SETFD, FD_CLOEXEC);
-
-  /* add this xpa to end of list of xpas */
-  XPAListAdd(&xpahead, xpa);
-
-  /* publish this entry to the world */
-  if( nsregister )
-    XPANSAdd(xpa, NULL, NULL);
-
-  /* make it active */
-  XPAActive(xpa, NULL, 1);
-
-#if NO_AUTOMATIC_HAVE_ATEXIT
-  /* register XPA atexit funtion */
-  if( !atexitinit ){
-    atexit(_XPAAtExit);
-    atexitinit = getpid();
-  }
-#endif
-
-  /* return good news */
-  return(xpa);
-
-error:
-  if( verbosity ){
-    perror("XPANew");
-  }
-  _XPAFree(xpa);
-  return(NULL);
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * Routine: 	XPAFree
- *
- * Purpose: 	free up alloc'ed memory in the XPA record structure
- *
- * Results:	0 on success, -1 for failure
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAFree (XPA xpa)
-#else
-int XPAFree(xpa)
-     XPA xpa;
-#endif
-{
-  /* if status is active, just flag eventual need to free and exit */
-  if( _XPAValid(xpahead, xpa, XPA_ACLS) ){
-    if( xpa_status(xpa) & XPA_STATUS_ACTIVE ){
-      xpa->status |= XPA_STATUS_FREE;
-      FPRINTF((stderr, "%sXPAFree: marking xpa struct for later free'ing\n",
-	       _sp));
-      return(0);
-    }
-    else{
-      /* call the primitive routine */
-      FPRINTF((stderr, "%sXPAFree: freeing xpa struct\n", _sp));
-      return(_XPAFree(xpa));
-    }
-  }
-  else{
-    return(-1);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAInfoNew
- *
- * Purpose:	add a new xpa name to a process to allow external
- * 		process to send info messages
- *
-
- * Returns: xpa handle associated with this class.name or NULL
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-XPA 
-XPAInfoNew (char *xclass, char *name,
-	    InfoCb info_callback, void *info_data, char *info_mode)
-#else
-XPA XPAInfoNew(xclass, name, info_callback, info_data, info_mode)
-     char *xclass;
-     char *name;
-     InfoCb info_callback;
-     void *info_data;
-     char *info_mode;
-#endif
-{
-  int got;
-  int oum;
-  int keep_alive=1;
-  int reuse_addr=1;
-  char tbuf[SZ_LINE];
-  char tbuf2[SZ_LINE];
-  char tfile[SZ_LINE];
-  char *tfptr;
-  XPA xpa;
-  socklen_t slen = sizeof(struct sockaddr_in);
-  struct sockaddr_in sock_in;
-#if HAVE_SYS_UN_H
-  struct sockaddr_un sock_un;
-#endif
-
-  /* do some initialization */
-  XPAInitEnv();
-  /* init the list of reserved commands */
-  XPAInitReserved();
-
-  /* we need a name, but no ":" allowed in the name */
-  if( (name == NULL) || (*name == '\0') || strchr(name, ':') )
-    return(NULL);
-  
-  /* we need an info callback */
-  if( info_callback == NULL ){
-    if( verbosity ){
-      fprintf(stderr, "XPA$ERROR: requires info callback\n");
-    }
-    return(NULL);
-  }
-
-  /* allocate xpa struct */
-  if( (xpa = (XPA)xcalloc(1, sizeof(XPARec))) == NULL )
-    return(NULL);
-
-  xpa->version = xstrdup(XPA_VERSION);
-  xpa->type  = (char *)xcalloc(10, sizeof(char));
-  /* fill in the blanks */
-  if( xclass != NULL )
-    xpa->xclass = xstrdup(xclass);
-  else
-    xpa->xclass = xstrdup("*");
-  xpa->name  = xstrdup(name);
-
-  /* fill in send information */
-  xpa->info_callback = info_callback;
-  xpa->info_data = info_data;
-  strcat(xpa->type, "i");
-  /* process the mode string */
-  xpa->info_mode = XPA_DEF_MODE_INFO;
-  XPAMode(info_mode, &(xpa->info_mode), "acl", XPA_MODE_ACL, 1);
-
-  /* set up communication method */
-  switch(mtype){
-  case XPA_INET:
-    /* open a socket and fill in socket information */
-    if( (xpa->fd = xsocket(AF_INET, SOCK_STREAM, 0)) < 0 )
-      goto error;
-    setsockopt(xpa->fd, SOL_SOCKET, SO_KEEPALIVE,
-	       (char *)&keep_alive, sizeof(keep_alive));
-    setsockopt(xpa->fd, SOL_SOCKET, SO_REUSEADDR,
-	       (char *)&reuse_addr, sizeof(reuse_addr));
-    memset((char *)&sock_in, 0, sizeof(sock_in));
-    sock_in.sin_family = AF_INET;
-    /* localhost only */
-    if( use_localhost )
-      sock_in.sin_addr.s_addr = htonl(gethostip("$localhost"));
-    /* any address will do */
-    else
-      sock_in.sin_addr.s_addr = htonl(INADDR_ANY);
-    sock_in.sin_port = htons(XPAPort(xpa));
-    /* bind to the ip:port */
-    if( xbind(xpa->fd, (struct sockaddr *)&sock_in, sizeof(sock_in)) < 0 )
-      goto error;
-    /* we now can determine which port the system assigned */
-    if( getsockname(xpa->fd, (struct sockaddr *)&sock_in, &slen) < 0 )
-      goto error;
-    else{
-      /* ip:port is the method */
-      gethost(tbuf2, SZ_LINE);
-      snprintf(tbuf, SZ_LINE, "%x:%d",
-	       gethostip(tbuf2), ntohs(sock_in.sin_port));
-      xpa->method = xstrdup(tbuf);
-    }
-    break;
-#if HAVE_SYS_UN_H
-  case XPA_UNIX:
-    /* get filename part, composed of class and name and unique id */
-    snprintf(tfile, SZ_LINE, "%s_%s.%d",
-	     xpa->xclass, xpa->name, (int)getpid());
-    /* change "/" to "_" for filename */
-    for(tfptr = tfile; *tfptr != '\0'; tfptr++){
-      if( *tfptr == '/' )
-	*tfptr = '_';
-    }
-    /* create full pathname */
-    snprintf(tbuf, SZ_LINE, "%s/%s", tmpdir, tfile);
-    /* delete old copy */
-    unlink (tbuf);
-    /* open a socket and fill in socket information */
-    if( (xpa->fd = xsocket(AF_UNIX, SOCK_STREAM, 0)) < 0 )
-      goto error;
-    setsockopt(xpa->fd, SOL_SOCKET, SO_KEEPALIVE,
-	       (char *)&keep_alive, sizeof(keep_alive));
-    memset((char *)&sock_in, 0, sizeof(sock_in));
-    sock_un.sun_family = AF_UNIX;
-    strcpy(sock_un.sun_path, tbuf);
-    /* unset umask so that everyone can read and write */
-    oum = umask(0);
-    /* bind to the file */
-    got = xbind(xpa->fd, (struct sockaddr *)&sock_un, sizeof(sock_un));
-    /* reset umask */
-    umask(oum);
-    /* now check for bind error */
-    if( got < 0 )
-      goto error;
-    /* path is the method */
-    xpa->method = xstrdup(tbuf);
-    break;
-#endif
-  default:
-    goto error;
-  }
-
-  /* listen for connections */
-  if( listen(xpa->fd, XPA_MAXLISTEN) < 0 )
-    goto error;
-
-  /* make sure we close on exec */
-  xfcntl(xpa->fd, F_SETFD, FD_CLOEXEC);
-
-  /* add this xpa to end of list of xpas */
-  XPAListAdd(&xpahead, xpa);
-
-  /* publish this entry to the world */
-  if( nsregister )
-    XPANSAdd(xpa, NULL, NULL);
-
-  /* make it active */
-  XPAActive(xpa, NULL, 1);
-
-#if NO_AUTOMATIC_HAVE_ATEXIT
-  /* register XPA atexit funtion */
-  if( !atexitinit ){
-    atexit(_XPAAtExit);
-    atexitinit = getpid();
-  }
-#endif
-
-  /* return good news */
-  return(xpa);
-
-error:
-  XPAFree(xpa);
-  return(NULL);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAPoll
- *
- * Purpose:	non-blocking handling of XPA access points
- *		timeout in millisecs, but if negative, no timeout is used
- *
- * Returns:	number of requests processed (if maxreq >=0)
- *		number of requests pending   (if maxreq <0)
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int
-XPAPoll (int msec, int maxreq)
-#else
-int XPAPoll(msec, maxreq)
-     int msec;
-     int maxreq;
-#endif
-{
-  int sgot;
-  int got=0;
-  fd_set readfds;
-  struct timeval tv;
-  struct timeval *tvp;
-
-again:
-  if( msec >= 0 ){
-    tv.tv_sec = msec / 1000;
-    tv.tv_usec = (msec % 1000) * 1000;
-    tvp = &tv;
-  }
-  /* negative value means just block and wait */
-  else{
-    tvp = NULL;
-  }
-  FD_ZERO(&readfds);
-  if( XPAAddSelect(NULL, &readfds) ){
-    sgot = xselect(swidth, &readfds, NULL, NULL, tvp);
-    /* error -- what should we do? */
-    if( sgot < 0 ){
-      if( xerrno == EINTR )
-	goto again;
-      if( verbosity ){
-	perror("XPAPoll() select");
-      }
-      exit(1);
-    }
-    /* timeout -- just return */
-    else if( sgot == 0 )
-      ;
-    /* finally ... something to do */
-    else{
-      /* if maxreq < 0, just return how many are ready */
-      if( maxreq < 0 )
-	return(sgot);
-      else
-	got = XPAProcessSelect(&readfds, maxreq);
-    }
-  }
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAMainLoop
- *
- * Purpose:	non-X programs event loop for handling XPA
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int
-XPAMainLoop (void)
-#else
-int XPAMainLoop()
-#endif
-{
-  int sgot;
-  int got=0;
-  fd_set readfds;
-
-
-  FD_ZERO(&readfds);
-  while( XPAAddSelect(NULL, &readfds) ){
-    FPRINTF((stderr, "%sXPAMainLoop: waiting for select() ...\n", _sp));
-    sgot = xselect(swidth, &readfds, NULL, NULL, NULL);
-    FPRINTF((stderr, "%sXPAMainLoop: select() returned: %d\n", _sp, sgot));
-    /* error -- what should we do? */
-    if( sgot < 0 ){
-      if( xerrno == EINTR ){
-	FD_ZERO(&readfds);
-	continue;
-      }
-      if( verbosity ){
-	perror("XPAMainLoop() select");
-      }
-      exit(1);
-    }
-    /* can't happen, since we have no timeout */
-    else if( sgot == 0 )
-      ;
-    /* finally ... something to do */
-    else
-      got += XPAProcessSelect(&readfds, 0);
-    FD_ZERO(&readfds);
-  }
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASleep
- *
- * Purpose:	sleep for specified milliseconds
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void 
-XPASleep (int msec)
-#else
-void XPASleep(msec)
-     int msec;
-#endif
-{
-  struct timeval tv;
-
-  if( msec > 0 ){
-    tv.tv_sec = msec / 1000;
-    tv.tv_usec = (msec % 1000) * 1000;
-    xselect(1, NULL, NULL, NULL, &tv);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAListHead
- *
- * Purpose:	semi-public routine to return the head of the xpa list
- *
- * Results:	XPA list pointer on success
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int
-XPAMtype (void)
-#else
-int XPAMtype()
-#endif
-{
-  return(mtype);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPATmpdir
- *
- * Purpose:	semi-public routine to return the tmpdir value
- *
- * Results:	tmpdir
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-char *
-XPATmpdir (void)
-#else
-char * XPATmpdir()
-#endif
-{
-  return(tmpdir);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASetBuf
- *
- * Purpose:	set the return buffer in a server send callback
- *		(use mainly by tcl to transfer tcl buffers to C)
- *
- * Returns:	0 on success, -1 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPASetBuf (XPA xpa, char *buf, size_t len, int xcopy)
-#else
-int XPASetBuf(xpa, buf, len, xcopy)
-     XPA xpa;
-     char *buf;
-     size_t len;
-     int xcopy;
-#endif
-{
-  /* sanity check */
-  if( !xpa || !xpa->comm )
-    return(-1);
-  /* xcopy >0 => make a copy of the data, else just assign */
-  if( xcopy ){
-    xpa->comm->len = len;
-    if( (xpa->comm->buf = (char *)xmalloc(len)) == NULL )
-      return(-1);
-    memcpy(xpa->comm->buf, buf, len);
-  }
-  else{
-    xpa->comm->len = len;
-    xpa->comm->buf = buf;
-  }
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASetBuf
- *
- * Purpose:	set the return buffer in a server send callback
- *		(use mainly by tcl to transfer tcl buffers to C)
- *
- * Returns:	0 on success, -1 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPASetFree (XPA xpa, MyFree myfree, void *myfree_ptr)
-#else
-  int XPASetFree(xpa, myfree, myfree_ptr)
-     XPA xpa;
-     MyFree myfree;
-     void *myfree_ptr;
-#endif
-{
-  /* sanity check */
-  if( !xpa || !xpa->comm ) return(-1);
-  /* set the free routine and data pointer */
-  xpa->comm->myfree = myfree;
-  xpa->comm->myfree_ptr = myfree_ptr;
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPACleanup
- *
- * Purpose:	make valgrind happy by freeing memory 
- *
- * Results:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void XPACleanup (void)
-#else
-void XPACleanup ()
-#endif
-{
-  XPAFreeReserved();
-  XPAAclFree();
-  if( tmpdir ){
-    xfree(tmpdir);
-    tmpdir = NULL;
-  }
-}
-
-#ifdef ANSI_FUNC
-void XPASaveJmp(void *env)
-#else
-void XPASaveJmp(env)
-     void *env;
-#endif
-{
-#if HAVE_SETJMP_H
-  xalloc_savejmp((jmp_buf *)env);
-#else
-  return;
-#endif
-}
diff --git a/xpa/xpa.h b/xpa/xpa.h
deleted file mode 100644
index d5e27ab..0000000
--- a/xpa/xpa.h
+++ /dev/null
@@ -1,556 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * xpa.h - include file for the X Public Access mechanism
- *
- */
-
-#ifndef	__xpa_h
-#define	__xpa_h
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <prsetup.h>
-#if HAVE_MINGW32
-#include <winsock2.h>
-#endif
-
-#define XPA_MAJOR_VERSION 2
-#define XPA_MINOR_VERSION 1
-#define XPA_PATCH_LEVEL 18
-#define XPA_VERSION "2.1.18"
-
-/* #define XPA_DEBUG 1 */
-#ifdef XPA_DEBUG
-#define FPRINTF(x) fprintf x
-#define PERROR(x)  perror x
-#else
-#define FPRINTF(x)
-#define PERROR(x)
-#endif
-
-/* types of xpa request */
-#define XPA_SET		1
-#define XPA_GET		2
-#define XPA_INFO	3
-#define XPA_ACCESS	4
-/* not actually commands but ... */
-#define XPA_DATA	5
-#define XPA_ACCEPT	6
-#define XPA_NAGLE	7
-
-/* this is the number of actual commands we have above */
-#define XPA_CMDS	4
-
-/* comm modes */
-#define COMM_RESERVED	1
-#define COMM_CONNECT	2
-
-/* the ever-present */
-#ifndef SZ_LINE
-#define SZ_LINE 4096
-#endif
-
-/* limit the length of the name and xclass strings */
-/* at least 2 of these should fit into SZ_LINE with lots of room to spare */
-#define XPA_NAMELEN	1024
-
-/* defines the types of callback procedure we use */
-typedef int (*SendCb)(
-#ifdef ANSI_FUNC
-    void *client_data,
-    void *call_data,
-    char *paramlist,
-    char **buf,
-    size_t *len
-#endif
-);
-
-typedef int (*ReceiveCb)(
-#ifdef ANSI_FUNC
-    void *client_data,
-    void *call_data,
-    char *paramlist,
-    char *buf,
-    size_t len
-#endif
-);
-
-typedef int (*InfoCb)(
-#ifdef ANSI_FUNC
-    void *client_data,
-    void *call_data,
-    char *paramlist
-#endif
-);
-
-typedef void *(*SelAdd)(
-#ifdef ANSI_FUNC
-    void *client_data,
-    int fd
-#endif
-);
-
-typedef void (*SelDel)(
-#ifdef ANSI_FUNC
-    void *client_data
-#endif
-);
-
-typedef void (*SelOn)(
-#ifdef ANSI_FUNC
-    void *client_data
-#endif
-);
-
-typedef void (*SelOff)(
-#ifdef ANSI_FUNC
-    void *client_data
-#endif
-);
-
-typedef void (*MyFree)(
-#ifdef ANSI_FUNC
-    void *buf
-#endif
-);
-
-typedef void Sigfunc(
-#ifdef ANSI_FUNC
-    int		     
-#endif
-);
-
-/*
- *
- *
- * xpa access control record structure
- *
- */
-typedef struct aclrec{
-  struct aclrec *next;
-  char *xclass;
-  char *name;
-  unsigned int ip;
-  char *acl;
-  int flag;
-} *XACL, XACLRec;
-
-/*
- *
- *
- * port management record structure
- *
- */
-typedef struct portrec{
-  struct portrec *next;
-  char *xclass;
-  char *name;
-  int port;
-} *PORT, PORTRec;
-
-/*
- *
- *
- * xpa name server management
- *
- */
-typedef struct nsrec{
-  struct nsrec *next;
-  char *method;
-  int nxpa;
-  int nproxy;
-  char *host;
-  int fd;
-  FILE *in;
-  FILE *out;
-  /* for AF_INET */
-  unsigned int ip;
-  int port;
-  /* for AF_UNIX */
-  char *name;
-} *NS, NSRec;
-
-/*
- *
- *
- * xpa communication structure for each connection
- *
- */
-typedef struct xpacommrec{
-  struct xpacommrec *next;
-  int status;
-  int message;
-  int n;
-  int cmd;
-  int mode;
-  int telnet;
-  int usebuf;
-  int useacl;
-  char *id;
-  char *info;
-  char *target;
-  char *paramlist;
-  int cmdfd;
-  int datafd;
-  char *cendian;
-  int ack;
-  /* buf and len passed to callbacks */
-  char *buf;
-  size_t len;
-  /* for AF_INET */
-  unsigned int cmdip;
-  int cmdport;
-  int dataport;
-  /* for AF_UNIX */
-  char *cmdname;
-  char *dataname;
-  int acl[XPA_CMDS+1];
-  /* for handling fd's in non-select event loops */
-  void *selcptr;	/* cmdfd struct for seldel */
-  void *seldptr;	/* datafd struct for seldel */
-  /* pointer to associated name server */
-  struct nsrec *ns;
-  /* myfree routine */
-  MyFree myfree;
-  void *myfree_ptr;
-} *XPAComm, XPACommRec;
-
-/*
- *
- *
- * clipboard record structure
- *
- */
-typedef struct cliprec{
-  struct cliprec *next;
-  unsigned int ip;
-  char *name;
-  char *value;
-} *XPAClip, XPAClipRec;
-
-/* 
- *
- * record struct for receiving data from stdin
- *
- */
-typedef struct xpainputrec{
-  struct xpainputrec *next;
-  size_t start;
-  size_t end;
-  size_t bytes;
-  char *buf;
-} *XPAInput, XPAInputRec;
-
-/*
- *
- *
- * xpa command record structure
- *
- */
-typedef struct xpacmdrec{
-  struct xpacmdrec *next;
-  struct xparec *xpa;
-  char *name;
-  char *help;
-  int ntokens;
-  /* send callback info */
-  SendCb send_callback;
-  void *send_data;
-  int send_mode;
-  /* receive callback info */
-  ReceiveCb receive_callback;
-  void *receive_data;
-  int receive_mode;
-} *XPACmd, XPACmdRec;
-
-/*
- *
- *
- * xpa client record structure
- *
- */
-typedef struct xpaclientrec{
-  struct xpaclientrec *next;
-  int status;
-  char *id;
-  char *xtemplate;
-  int type;
-  char *xclass;
-  char *name;
-  char *method;
-  char *info;
-  char *dataname;
-  unsigned int ip;
-  int cmdfd;
-  int datafd;
-  int mode;
-  int nsproxy;
-  /* xpaget parameters */
-  char **bufptr;
-  size_t  *lenptr;
-  size_t bufsize;
-  int fd;
-  /* xpaset parameters */
-  char *buf;
-  size_t len;
-  size_t bytes;
-  /* fork parameters */
-  pid_t pid;
-  /* common parameters */
-  char **nameptr;
-  char **errptr;
-} *XPAClient, XPAClientRec;
-
-/*
- *
- *
- * main xpa record structure
- *
- * explanation of send_mode and receive_mode flags:
- *
- * receive-specific callback modes:
- *
- *	r (raw) 	-- don't read data into buf (callback will read)
- *
- * general callback modes:
- *
- *	r (raw) 	-- write raw data without protocol info to client
- *	s (save)	-- 's' save passed buf (don't free it)
- *
- */
-typedef struct xparec{
-  /* xpa version */
-  char *version;
-  /* status of this xpa */
-  int status;
-  /* "g", "s", "i" are server types; "c" for client */
-  char *type;
-  /*
-   * THE SERVER SIDE
-   */
-  struct xparec *next;
-  char *xclass;
-  char *name;
-  char *help;
-  /* send callback info */
-  SendCb send_callback;
-  void *send_data;
-  int send_mode;
-  /* receive callback info */
-  ReceiveCb receive_callback;
-  void *receive_data;
-  int receive_mode;
-  /* info callback info */
-  InfoCb info_callback;
-  void *info_data;
-  int info_mode;
-  /* list of sub-commands for this access point */
-  XPACmd commands;
-  /* communication info */
-  int fd;		/* listening socket file descriptor */
-  char *method;		/* method string: host:ip or unix_filename */
-  NS nshead;		/* name servers associated with this access point */
-  XPAComm commhead;	/* linked list of communcation records */
-  XPAClip cliphead;	/* linked list of cliboard records */
-  char *filename;	/* file name (unix sockets) for listening */
-  char *sendian;	/* endian-ness of server */
-  /* request-specific info */
-  XPAComm comm;		/* current comm if we are processing a request */
-  /* select loop info */
-  SelDel seldel;	/* routine to remove xpa socket from select loop */
-  SelAdd seladd;	/* routine to add xpa command sockets to select loop */
-  SelOn selon;		/* routine to enable xpa command sockets */
-  SelOff seloff;	/* routine to disable xpa command sockets */
-  void *selptr;		/* additional info for seldelete() */
-  /*
-   * THE CLIENT SIDE
-   */
-  int persist;		/* flag whether this is a persistent client */
-  int nclient;		/* number of clients -- used in processing headers */
-  int client_mode;	/* global client mode */
-  XPAClient clienthead;	/* linked list of active clients */
-  int ifd;		/* input fd for XPASetFd() */
-  size_t inpbytes;	/* total number of bytes in input lists */
-  XPAInput inphead;	/* linked list of input structs */
-} *XPA, XPARec;
-
-/* macros to access the xpa struct */
-#define xpa_name(xpa)	 ((xpa)->name)
-#define xpa_class(xpa)	 ((xpa)->xclass)
-#define xpa_method(xpa)	 ((xpa)->method)
-#define xpa_sendian(xpa) ((xpa)->sendian)
-#define xpa_comm(xpa)	 (xpa&&(xpa)->comm?(xpa)->comm:NULL)
-#define xpa_cendian(xpa) (((xpa)->comm&&(xpa)->comm->cendian)?(xpa)->comm->cendian:"?")
-#define xpa_cmdfd(xpa)	 ((xpa)->comm?(xpa)->comm->cmdfd:-1)
-#define xpa_datafd(xpa)	 ((xpa)->comm?(xpa)->comm->datafd:-1)
-#define xpa_ack(xpa)	 ((xpa)->comm?(xpa)->comm->ack:1)
-#define xpa_status(xpa)	 ((xpa)->comm?(xpa)->comm->status:0)
-#define xpa_id(xpa)	 (((xpa)->comm&&(xpa)->comm->id)?(xpa)->comm->id:"?")
-
-extern char *xpaMessbuf[];
-
-_PRbeg
-
-XPA XPAListHead _PRx((void));
-void XPAListAdd _PRx((XPA *head, XPA xpa));
-void XPAListDel _PRx((XPA *head, XPA xpa));
-int XPAActive _PRx((XPA xpa, XPAComm comm, int flag));
-int XPAActiveFd _PRx((int fd));
-int XPAAddSelect _PRx((XPA xpa, fd_set *readfdsptr));
-int XPAProcessSelect _PRx((fd_set *readfdsptr, int maxreq));
-void XPACloseData _PRx((XPA xpa, XPAComm comm));
-int XPAHandler _PRx((XPA xpa, int fd));
-void XPAMode  _PRx((char *mode, int *flag, char *name, int mask, int def));
-int XPAEndian _PRx((void));
-char *XPATmpdir _PRx((void));
-void XPACleanup _PRx((void));
-int XPASetBuf  _PRx((XPA xpa, char *buf, size_t len, int xcopy));
-int XPASetFree _PRx((XPA xpa, MyFree myfree, void *myfree_ptr));
-int XPAShortTimeout _PRx((void));
-int XPALongTimeout _PRx((void));
-int XPASendLTimeout _PRx((void *client_data, void *call_data,
-			  char *paramlist, char **buf, size_t *len));
-int XPAReceiveLTimeout _PRx((void *client_data, void *call_data,
-			     char *paramlist, char *buf, size_t len));
-int XPASendSTimeout _PRx((void *client_data, void *call_data,
-			  char *paramlist, char **buf, size_t *len));
-int XPAReceiveSTimeout _PRx((void *client_data, void *call_data,
-			     char *paramlist, char *buf, size_t len));
-int XPADebug _PRx((void));
-int XPASigusr1 _PRx((void));
-int XPAVerbosity _PRx((void));
-void XPAInitEnv _PRx((void));
-void XPAParseName _PRx((char *xpaname, char *xclass, char *name, int len));
-int XPAParseIpPort _PRx((char *host, unsigned int *ip, unsigned short *port));
-int XPAParseUnixSocket _PRx((char *host));
-int _XPAValid _PRx((XPA head, XPA xpa, char *type));
-int XPAValid _PRx((XPA xpa));
-char *XPATimestamp _PRx((void));
-int XPAError _PRx((XPA xpa, char *s));
-int XPAOK _PRx((XPA xpa));
-int XPAMessage _PRx((XPA xpa, char *s));
-char *XPAArgvParamlist _PRx((int argc, char **argv, int start));
-int XPAMethod _PRx((char *method));
-int XPAAccess _PRx((XPA xpa, char *xtemplate, char *paramlist, char *mode,
-		    char **names, char **messages, int n));
-int XPANSLookup _PRx((XPA xpa, char *tname, char *ttype, 
-		      char ***xclasses, char ***names,
-		      char ***methods, char ***infs));
-int XPANSClose _PRx((XPA xpa, NS ns));
-int XPANSKeepAlive _PRx((XPA xpa, int type));
-int XPANSAdd _PRx((XPA xpa, char *host, char *mode));
-int XPANSDel _PRx((XPA xpa, char *host, char *mode));
-int XPAVersionCheck _PRx((char *serv, char *nsv));
-void XPAVersionWarn _PRx((char *myv, char *nsv));
-char *XPANSMethod _PRx((char *host, int flag));
-XPA XPANew _PRx((char *xclass, char *name, char *help,
-		 SendCb send_callback, void *send_data, char *send_mode,
-		 ReceiveCb rec_callback, void *rec_data, char *rec_mode));
-int XPAFree _PRx((XPA xpa));
-XPA XPAInfoNew _PRx((char *xclass, char *name,
-		     InfoCb info_callback, void *info_data, char *info_mode));
-int XPAPoll  _PRx((int msec, int maxreq));
-int XPAMainLoop _PRx((void));
-void XPASleep  _PRx((int msec));
-void XPAAtExit  _PRx((void));
-/* command.c */
-void XPAInitReserved _PRx((void));
-void XPAFreeReserved _PRx((void));
-XPACmd XPACmdLookupReserved _PRx((XPA xpa, char *lbuf, int *lp));
-XPACmd XPACmdLookup _PRx((XPA xpa, char *lbuf, int *lp));
-int XPAReceiveCommands _PRx((void *client_data, void *call_data,
-			     char *paramlist, char *buf, size_t len));
-int XPASendCommands _PRx((void *client_data, void *call_data,
-			  char *paramlist, char **buf, size_t *len));
-XPA XPACmdNew  _PRx((char *xclass, char *name));
-XPACmd XPACmdAdd _PRx((XPA xpa, char *name, char *help,
-		      SendCb send_callback, void *send_data, char *send_mode,
-		      ReceiveCb rec_callback, void *rec_data, char *rec_mode));
-int XPACmdDel _PRx((XPA xpa, XPACmd cmd));
-int XPACmdInternalReceive _PRx((void *client_data, void *call_data,
-				char *paramlist, char *buf, size_t len));
-int XPACmdInternalSend _PRx((void *client_data, void *call_data,
-			     char *paramlist, char **buf, size_t *len));
-XPA XPAGetReserved  _PRx((void));
-int XPAMtype _PRx((void));
-/* client.c */
-int XPAClientAddSelect _PRx((XPA xpa,
-			     fd_set *readfdsptr, fd_set *writefdsptr));
-int XPAClientProcessSelect _PRx((XPA xpa,
-				 fd_set *readfdsptr, fd_set *writefdsptr,
-				 int maxreq));
-XPA XPAOpen  _PRx((char *mode));
-void XPAClose _PRx((XPA xpa));
-int XPAGet _PRx((XPA xpa, char *xtemplate,
-		 char *paramlist, char *mode,
-		 char **bufs, size_t *lens, char **names, char **errs, int n));
-int XPAGetFd _PRx((XPA xpa, char *xtemplate,
-		   char *paramlist, char *mode,
-		   int *fds, char **names, char **errs, int n));
-int XPASet _PRx((XPA xpa, char *xtemplate,
-		 char *paramlist, char *mode,
-		 char *buf, size_t len, char **names, char **errs, int n));
-int XPASetFd _PRx((XPA xpa, char *xtemplate,
-		   char *paramlist, char *mode,
-		   int fd, char **names, char **errs, int n));
-int XPAInfo _PRx((XPA xpa, char *xtemplate,
-		  char *paramlist, char *mode,
-		  char **names, char **errs, int n));
-int XPAClientValid _PRx((XPA xpa));
-void XPASaveJmp _PRx((void *env));
-
-
-/* acl.c */
-int XPAReceiveAcl _PRx((void *client_data, void *call_data,
-			char *paramlist, char *buf, size_t len));
-int XPASendAcl _PRx((void *client_data, void *call_data,
-		     char *paramlist, char **buf, size_t *len));
-int XPAAclEdit _PRx((char *lbuf));
-int XPAAclAdd _PRx((char *lbuf));
-int XPAAclDel _PRx((XACL acl));
-void XPAAclFree _PRx((void));
-int XPAAclNew _PRx((char *aname, int flag));
-int XPAAclCheck _PRx((XPA xpa, unsigned int ip, char *acl));
-/* port.c */
-int XPAPortEdit _PRx((char *lbuf));
-int XPAPortAdd _PRx((char *lbuf));
-int XPAPortDel _PRx((PORT port));
-void XPAPortFree _PRx((void));
-int XPAPortNew _PRx((char *aname, int flag));
-int XPAPort _PRx((XPA xpa));
-/* remote.c */
-int XPAReceiveRemote _PRx((void *client_data, void *call_data,
-			   char *paramlist, char *buf, size_t len));
-int XPASendRemote _PRx((void *client_data, void *call_data,
-			char *paramlist, char **buf, size_t *len));
-int XPARemote _PRx((XPA xpa, char *host, char *acl, char *mode));
-/* clipboard.c */
-int XPAReceiveClipboard _PRx((void *client_data, void *call_data,
-			      char *paramlist, char *buf, size_t len));
-int XPASendClipboard _PRx((void *client_data, void *call_data,
-			   char *paramlist, char **buf, size_t *len));
-int ClipBoardFree _PRx((XPA xpa, XPAClip clip));
-/* xt.c */
-int XPAXtAddInput _PRx((void *app, XPA xpa));
-/* tcl.c */
-int XPATclAddInput _PRx((XPA xpa));
-int Tclxpa_Init _PRx((void *vinterp));
-/* gtkloop.c */
-int XPAGtkAddInput _PRx((XPA xpa));
-/* xpaio.c */
-int XPAGets _PRx((XPA xpa, int fd, char *buf, int len, int timeout));
-int XPAPuts _PRx((XPA xpa, int fd, char *buf, int timeout));
-int XPAGetBuf _PRx((XPA xpa, int fd, char **buf, size_t *len, int timeout));
-int XPAPutBuf _PRx((XPA xpa, int fd, char *buf, size_t len, int timeout));
-int XPAIOCallsXPA _PRx((int flag));
-char *XPALevelSpaces _PRx((void));
-void XPALevelSet _PRx((int lev));
-int XPALevelGet _PRx((void));
-
-_PRend
-
-#endif /* __xpa.h */
diff --git a/xpa/xpa.pc.in b/xpa/xpa.pc.in
deleted file mode 100644
index e2d8baf..0000000
--- a/xpa/xpa.pc.in
+++ /dev/null
@@ -1,10 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: @PACKAGE_NAME@
-Description: XPA messaging system for DS9 and other astro tools
-Version: @PACKAGE_VERSION@
-Libs: -L${libdir} -lxpa @EXTRA_LIBS@ -lm
-Cflags: -I${includedir}
diff --git a/xpa/xpaaccess.c b/xpa/xpaaccess.c
deleted file mode 100644
index 81643ac..0000000
--- a/xpa/xpaaccess.c
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-#include <xpap.h>
-
-#define MAX_XPAS 10000
-
-extern char *optarg;
-extern int optind;
-
-#ifdef ANSI_FUNC
-void
-usage (char *s)
-#else
-void usage(s)
-     char *s;
-#endif
-{
-    fprintf(stderr, "\n");
-    fprintf(stderr, "usage:\n");
-    fprintf(stderr, "  %s [-c] [-h] [-i nsinet] [-m method] [-n] [-t sval,lval] [-u users] [-v|-V] <template> [type]\n", s);
-    fprintf(stderr, "\n");
-    fprintf(stderr, "switches:\n");
-    fprintf(stderr, "\t-c\tcontact each access point individually to see if it is available\n");
-    fprintf(stderr, "\t-h\tprint this message\n");
-    fprintf(stderr, "\t-i\toverride XPA_NSINET environment variable\n");
-    fprintf(stderr, "\t-m\toverride XPA_METHOD environment variable\n");
-    fprintf(stderr, "\t-n\treturn number of matches instead of \"yes\" or \"no\"\n");
-    fprintf(stderr, "\t-t \toverride XPA_[SHORT,LONG]_TIMEOUT environment variables\n");
-    fprintf(stderr, "\t-u \toverride XPA_NSUSERS environment variable\n");
-    fprintf(stderr, "\t-v\tprint info about successful access points\n");
-    fprintf(stderr, "\t-V\tprint info and errors about all access points\n");
-    fprintf(stderr, "\t--version display version and exit\n");
-    fprintf(stderr, "\n");
-    fprintf(stderr, "xpaaccess returns \"yes\" if there are existing XPA access points that match\n");
-    fprintf(stderr, "the template (and optional access type: g,i,s), and returns \"no\" otherwise.\n");
-    fprintf(stderr, "If -n is specified, the number of matches is returned.\n");
-    fprintf(stderr, "Templates are of the form [class:]name. Wildcards *,?,[] are accepted.\n");
-    fprintf(stderr, "\n");
-    fprintf(stderr, "examples:\n");
-    fprintf(stderr, "\tcsh> if( `xpaaccess ds9` == \"yes\") then ...\n" );
-    fprintf(stderr, "\tcsh> set got=`xpaaccess -n ds9 g`\n");
-    fprintf(stderr, "\n(version: %s)\n", XPA_VERSION);
-    exit(0);
-}
-
-/* catch error from pre 2.1 server -- if we find this error, we know the
-   access point is available */
-#define OLD_SERVER(s) strstr(s, "XPA$ERROR invalid xpa command in initialization string")
-
-#ifdef ANSI_FUNC
-int 
-main (int argc, char **argv)
-#else
-int
-main(argc, argv)
-     int argc;
-     char **argv;
-#endif
-{
-  int i;
-  int c;
-  int got;
-  int n=0;
-  int donum=0;
-  int verbosity=0;
-  int contact=0;
-  char cmd[SZ_LINE];
-  char mode[SZ_LINE];
-  char *type=NULL;
-  char *xtmpl=NULL;
-  char **rclasses;
-  char **rnames;
-  char **rmethods;
-  char **rinfos;
-  char *names[MAX_XPAS];
-  char *errs[MAX_XPAS];
-  XPA xpa=NULL;
-
-  /* display version and exit, if necessary */
-  if( (argc == 2) && !strcmp(argv[1], "--version") ){
-    fprintf(stderr, "%s\n", XPA_VERSION);
-    exit(0);
-  }
-
-  /* start with no mode flag */
-  *mode = '\0';
-
-  /* we want the args in the same order in which they arrived, and
-     gnu getopt sometimes changes things without this */
-  putenv("POSIXLY_CORRECT=true");
-
-  /* process switch arguments */
-  while ((c = getopt(argc, argv, "chi:m:nt:u:vVwW")) != -1){
-    switch(c){
-    case 'c':
-      contact=1;
-      break;
-    case 'h':
-      usage(argv[0]);
-    case 'i':
-      snprintf(cmd, SZ_LINE, "XPA_NSINET=%s", optarg);
-      putenv(xstrdup(cmd));
-      break;
-    case 'm':
-      snprintf(cmd, SZ_LINE, "XPA_METHOD=%s", optarg);
-      putenv(xstrdup(cmd));
-      break;
-    case 'n':
-      donum=1;
-      break;
-    case 't':
-      {
-	int xip=0;
-	char xbuf[SZ_LINE];
-	newdtable(",;");
-	if( word(optarg, xbuf, &xip) && *xbuf && (*xbuf != '*') ){
-	  snprintf(cmd, SZ_LINE, "XPA_SHORT_TIMEOUT=%s", xbuf);
-	  putenv(xstrdup(cmd));
-	}
-	if( word(optarg, xbuf, &xip) && *xbuf && (*xbuf != '*') ){
-	  snprintf(cmd, SZ_LINE, "XPA_LONG_TIMEOUT=%s", xbuf);
-	  putenv(xstrdup(cmd));
-	}
-	freedtable();
-      }
-      break;
-    case 'u':
-      snprintf(cmd, SZ_LINE, "XPA_NSUSERS=%s", optarg);
-      putenv(xstrdup(cmd));
-      break;
-    case 'v':
-      verbosity=1;
-      break;
-    case 'V':
-      verbosity=2;
-      break;
-    /* for backward compatibility with 1.0 */
-    case 'w':
-    case 'W':
-      break;
-    }
-  }
-
-  /* we must have a template */
-  if( optind >= argc ){
-    usage(argv[0]);
-  }
-  else{
-    xtmpl = argv[optind];
-    optind++;
-    if( optind < argc ){
-      type = argv[optind];
-    }
-  }
-
-  /* if we need to contact each server ... */
-  if( contact ){
-    got = XPAAccess(xpa, xtmpl, type, mode, names, errs, MAX_XPAS);
-    for(i=0; i<got; i++){
-      if( !errs[i] || OLD_SERVER(errs[i]) ){
-	if( verbosity ) fprintf(stdout, "%s\n", names[i]);
-	n++;
-      }
-      else{
-	if( verbosity >= 2 ) fprintf(stdout, "%s", errs[i]);
-      }
-      if( errs[i] )  xfree(errs[i]);
-      if( names[i] ) xfree(names[i]);
-    }
-  }
-  /* only contact name server */
-  else{
-    n = XPANSLookup(xpa, xtmpl, type, &rclasses, &rnames, &rmethods, &rinfos);
-    /* free up the space */
-    for(i=0; i<n; i++){
-      if( verbosity ){
-	fprintf(stdout, "%s", rmethods[i]);
-	if( strcmp(rinfos[i], XPA_DEF_CLIENT_INFO) )
-	  fprintf(stdout, " %s", rinfos[i]);
-	fprintf(stdout, "\n");
-      }
-      /* done with these strings */
-      xfree(rclasses[i]);
-      xfree(rnames[i]);
-      xfree(rmethods[i]);
-      xfree(rinfos[i]);
-    }
-    /* free up arrays returned by name server */
-    if( n > 0 ){
-      xfree(rclasses);
-      xfree(rnames);
-      xfree(rmethods);
-      xfree(rinfos);
-    }
-  }
-
-  /* print out number */
-  if( !verbosity && donum ){
-    fprintf(stdout, "%d\n", n);
-  }
-  /* print out yes/no */
-  else if( !verbosity && !donum ){
-    if( n > 0 )
-      fprintf(stdout, "yes\n");
-    else
-      fprintf(stdout, "no\n");
-  }
-  fflush(stdout);
-  return(n);
-}
diff --git a/xpa/xpaget.c b/xpa/xpaget.c
deleted file mode 100644
index ea70121..0000000
--- a/xpa/xpaget.c
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-#include <xpap.h>
-
-extern char *optarg;
-extern int optind;
-
-#ifdef ANSI_FUNC
-void
-usage (char *s)
-#else
-void usage(s)
-     char *s;
-#endif
-{
-    fprintf(stderr, "\n");
-    fprintf(stderr, "usage:\n");
-    fprintf(stderr, "  %s [-h] [-i nsinet] [-m method] [-n] [-s] [-t sval,lval] [-u users] <tmpl|host:port> [paramlist]\n", s);
-    fprintf(stderr, "\n");
-    fprintf(stderr, "switches:\n");
-    fprintf(stderr, "\t-h\tprint this message\n");
-    fprintf(stderr, "\t-i\toverride XPA_NSINET environment variable\n");
-    fprintf(stderr, "\t-m\toverride XPA_METHOD environment variable\n");
-    fprintf(stderr, "\t-n\tdon't wait for message after server completes (kind of useless!)\n");
-    fprintf(stderr, "\t-s\tserver mode\n");
-    fprintf(stderr, "\t-t \toverride XPA_[SHORT,LONG]_TIMEOUT environment variables\n");
-    fprintf(stderr, "\t-u\toverride XPA_NSUSERS environment variable\n");
-    fprintf(stderr, "\t--version display version and exit\n");
-    fprintf(stderr, "\n");
-    fprintf(stderr, "Data will be retrieved from access points matching the template or host:port.\n");
-    fprintf(stderr, "Templates are of the form [class:]name. Wildcards *,?,[] are accepted.\n");
-    fprintf(stderr, "A set of qualifying parameters can be appended.\n");
-    fprintf(stderr, "\n");
-    fprintf(stderr, "examples:\n");
-    fprintf(stderr, "\tcsh> xpaget ds9 file\n");
-    fprintf(stderr, "\tcsh> xpaget bynars.harvard.edu:1147\n");
-    fprintf(stderr, "\n(version: %s)\n", XPA_VERSION);
-    exit(1);
-}
-
-#ifdef ANSI_FUNC
-int 
-main (int argc, char **argv)
-#else
-int
-main(argc, argv)
-     int argc;
-     char **argv;
-#endif
-{
-  int i;
-  int c;
-  int got;
-  int lp;
-  int errcode=0;
-  int server=0;
-  int maxhosts=XPA_MAXHOSTS;
-  char *paramlist=NULL;
-  char *xtemplate=NULL;
-  char lbuf[SZ_LINE];
-  char tbuf[SZ_LINE];
-  char mode[SZ_LINE];
-  char cmd[SZ_LINE];
-  char *s;
-  char **errs=NULL;
-  char **names=NULL;
-  int fds[1];
-  XPA xpa=NULL;
-
-  /* display version and exit, if necessary */
-  if( (argc == 2) && !strcmp(argv[1], "--version") ){
-    fprintf(stderr, "%s\n", XPA_VERSION);
-    exit(0);
-  }
-
-  /* make sure we have enough arguments */
-  if( argc < 2 )
-    usage(argv[0]);
-
-  /* start with no mode flag */
-  *mode = '\0';
-
-  /* we want the args in the same order in which they arrived, and
-     gnu getopt sometimes changes things without this */
-  putenv("POSIXLY_CORRECT=true");
-
-  /* process switch arguments */
-  while ((c = getopt(argc, argv, "hi:m:nst:u:wW")) != -1){
-    switch(c){
-    case 'h':
-      usage(argv[0]);
-    case 'i':
-      snprintf(cmd, SZ_LINE, "XPA_NSINET=%s", optarg);
-      putenv(xstrdup(cmd));
-      break;
-    case 'm':
-      snprintf(cmd, SZ_LINE, "XPA_METHOD=%s", optarg);
-      putenv(xstrdup(cmd));
-      break;
-    case 'n':
-      if( *mode != '\0' )
-	strcat(mode, ",");
-      strcat(mode, "ack=false");
-      break;
-    case 's':
-      server = 1;
-      xpa = XPAOpen(NULL);
-      break;
-    case 't':
-      {
-	int xip=0;
-	char xbuf[SZ_LINE];
-	newdtable(",;");
-	if( word(optarg, xbuf, &xip) && *xbuf && (*xbuf != '*') ){
-	  snprintf(cmd, SZ_LINE, "XPA_SHORT_TIMEOUT=%s", xbuf);
-	  putenv(xstrdup(cmd));
-	}
-	if( word(optarg, xbuf, &xip) && *xbuf && (*xbuf != '*') ){
-	  snprintf(cmd, SZ_LINE, "XPA_LONG_TIMEOUT=%s", xbuf);
-	  putenv(xstrdup(cmd));
-	}
-	freedtable();
-      }
-      break;
-    case 'u':
-      snprintf(cmd, SZ_LINE, "XPA_NSUSERS=%s", optarg);
-      putenv(xstrdup(cmd));
-      break;
-    /* for backward compatibility with 1.0 */
-    case 'w':
-    case 'W':
-      break;
-    }
-  }
-
-  /* no explicit host:port specified, so we should have a name */
-  if( optind >= argc ){
-    /* in server mode, we can skip the host on the command line */
-    if( !server )
-      usage(argv[0]);
-  }
-  else{
-    xtemplate = xstrdup(argv[optind]);
-    optind++;
-  }
-
-  /* make the paramlist */
-  paramlist = XPAArgvParamlist(argc, argv, optind);
-
-  /* init variables for names and ports */
-  if( (s=(char *)getenv("XPA_MAXHOSTS")) != NULL )
-    maxhosts = atoi(s);
-  names = (char **)xcalloc(maxhosts, sizeof(char *));
-  errs  = (char **)xcalloc(maxhosts, sizeof(char *));
-
-  /* we only send to stdout */
-  fds[0] = fileno(stdout);
-
-again:
-  /* if we are in server mode, we might have to read a line from stdin
-     to grab the template and paramlist */
-  if( server && (xtemplate==NULL) ){
-    /* read description of template and paramlist */
-    if( fgets(lbuf, SZ_LINE, stdin) == NULL )
-      exit(errcode);
-    if( (*lbuf == '#') || (*lbuf == '\n') )
-      goto again;
-    lp = 0;
-    if( word(lbuf, tbuf, &lp) && !strcmp(tbuf, "xpaget") &&
-	word(lbuf, tbuf, &lp) ){
-      xtemplate = xstrdup(tbuf);
-      paramlist = xstrdup(&(lbuf[lp]));
-      nowhite(paramlist, paramlist);
-    }
-    else{
-      fprintf(stderr, "XPA$ERROR invalid command: %s", lbuf);
-      exit(++errcode);
-    }
-  }
-
-  /* process xpa requests */
-  got = XPAGetFd(xpa, xtemplate, paramlist, mode, fds, names, errs, -maxhosts);
-  if( got == 0 ){
-    fprintf(stderr, "XPA$ERROR no 'xpaget' access points match template: %s\n",
-	    xtemplate);
-    errcode++;
-  }
-  else{
-    /* display errors and free up strings */
-    for(i=0; i<got; i++){
-      if( errs[i] != NULL ){
-	fprintf(stderr, "%s", errs[i]);
-	xfree(errs[i]);
-	errcode++;
-      }
-      if( names[i] != NULL )
-	xfree(names[i]);
-    }
-  }
-
-  /* free the paramlist */
-  if( paramlist!= NULL ){
-    xfree(paramlist);
-    paramlist = NULL;
-  }
-  /* and the template */
-  if( xtemplate != NULL ){
-    xfree(xtemplate);
-    xtemplate = NULL;
-  }
-
-  /* if we are in server mode, go back for more */
-  if( server )
-    goto again;
-  else{
-    /* clean up */
-    if( errs )  xfree(errs);
-    if( names ) xfree(names);
-    XPACleanup();
-    exit(errcode);
-  }
-  return(0);
-}
diff --git a/xpa/xpainfo.c b/xpa/xpainfo.c
deleted file mode 100644
index 6436703..0000000
--- a/xpa/xpainfo.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-#include <xpap.h>
-
-extern char *optarg;
-extern int optind;
-
-#ifdef ANSI_FUNC
-void
-usage (char *s)
-#else
-void usage(s)
-     char *s;
-#endif
-{
-    fprintf(stderr, "\n");
-    fprintf(stderr, "usage:\n");
-    fprintf(stderr, "  %s [-h] [-i nsinet] [-m method] [-n] [-s] [-t sval,lval] [-u users] <tmpl|host:port> [paramlist]\n", s);
-    fprintf(stderr, "\n");
-    fprintf(stderr, "switches:\n");
-    fprintf(stderr, "\t-h\tprint this message\n");
-    fprintf(stderr, "\t-i \toverride XPA_NSINET environment variable\n");
-    fprintf(stderr, "\t-m\toverride XPA_METHOD environment variable\n");
-    fprintf(stderr, "\t-n\tdon't wait for ack from server\n");
-    fprintf(stderr, "\t-s\tserver mode\n");
-    fprintf(stderr, "\t-t \toverride XPA_[SHORT,LONG]_TIMEOUT environment variables\n");
-    fprintf(stderr, "\t-u \toverride XPA_NSUSERS environment variable\n");
-    fprintf(stderr, "\t--version display version and exit\n");
-    fprintf(stderr, "\n");
-    fprintf(stderr, "Info will be sent to access points matching the template or host:port.\n");
-    fprintf(stderr, "Templates are of the form [class:]name. Wildcards *,?,[] are accepted.\n");
-    fprintf(stderr, "A set of qualifying parameters can be appended.\n");
-    fprintf(stderr, "\n");
-    fprintf(stderr, "examples:\n");
-    fprintf(stderr, "\tcsh> xpainfo IMAGE ds9 image\n");
-    fprintf(stderr, "\n(version: %s)\n", XPA_VERSION);
-    exit(1);
-}
-
-#ifdef ANSI_FUNC
-int 
-main (int argc, char **argv)
-#else
-int
-main(argc, argv)
-     int argc;
-     char **argv;
-#endif
-{
-  int i;
-  int c;
-  int got;
-  int lp;
-  int errcode=0;
-  int server=0;
-  int maxhosts=XPA_MAXHOSTS;
-  char *paramlist=NULL;
-  char *xtemplate=NULL;
-  char lbuf[SZ_LINE];
-  char tbuf[SZ_LINE];
-  char mode[SZ_LINE];
-  char cmd[SZ_LINE];
-  char *s;
-  char **errs=NULL;
-  char **names=NULL;
-  XPA xpa=NULL;
-
-  /* display version and exit, if necessary */
-  if( (argc == 2) && !strcmp(argv[1], "--version") ){
-    fprintf(stderr, "%s\n", XPA_VERSION);
-    exit(0);
-  }
-
-  /* make sure we have enough arguments */
-  if( argc < 2 )
-    usage(argv[0]);
-
-  /* start with no mode flag */
-  *mode = '\0';
-
-  /* we want the args in the same order in which they arrived, and
-     gnu getopt sometimes changes things without this */
-  putenv("POSIXLY_CORRECT=true");
-
-  /* process switch arguments */
-  while ((c = getopt(argc, argv, "hi:m:nst:u:wW")) != -1){
-    switch(c){
-    case 'h':
-      usage(argv[0]);
-    case 'i':
-      snprintf(cmd, SZ_LINE, "XPA_NSINET=%s", optarg);
-      putenv(xstrdup(cmd));
-      break;
-    case 'm':
-      snprintf(cmd, SZ_LINE, "XPA_METHOD=%s", optarg);
-      putenv(xstrdup(cmd));
-      break;
-    case 'n':
-      if( *mode != '\0' )
-	strcat(mode, ",");
-      strcat(mode, "ack=false");
-      break;
-    case 's':
-      server = 1;
-      xpa = XPAOpen(NULL);
-      break;
-    case 't':
-      {
-	int xip=0;
-	char xbuf[SZ_LINE];
-	newdtable(",;");
-	if( word(optarg, xbuf, &xip) && *xbuf && (*xbuf != '*') ){
-	  snprintf(cmd, SZ_LINE, "XPA_SHORT_TIMEOUT=%s", xbuf);
-	  putenv(xstrdup(cmd));
-	}
-	if( word(optarg, xbuf, &xip) && *xbuf && (*xbuf != '*') ){
-	  snprintf(cmd, SZ_LINE, "XPA_LONG_TIMEOUT=%s", xbuf);
-	  putenv(xstrdup(cmd));
-	}
-	freedtable();
-      }
-      break;
-    case 'u':
-      snprintf(cmd, SZ_LINE, "XPA_NSUSERS=%s", optarg);
-      putenv(xstrdup(cmd));
-      break;
-    /* for backward compatibility with 1.0 */
-    case 'w':
-    case 'W':
-      break;
-    }
-  }
-
-  /* no explicit host:port specified, so we should have a name */
-  if( optind >= argc ){
-    /* in server mode, we can skip the host on the command line */
-    if( !server )
-      usage(argv[0]);
-  }
-  else{
-    xtemplate = xstrdup(argv[optind]);
-    optind++;
-  }
-
-  /* make the paramlist */
-  paramlist = XPAArgvParamlist(argc, argv, optind);
-
-  /* init variables for names and ports */
-  if( (s=(char *)getenv("XPA_MAXHOSTS")) != NULL )
-    maxhosts = atoi(s);
-  names = (char **)xcalloc(maxhosts, sizeof(char *));
-  errs  = (char **)xcalloc(maxhosts, sizeof(char *));
-
-again:
-  /* if we are in server mode, we might have to read a line from stdin
-     to grab the template and paramlist */
-  if( server && (xtemplate==NULL) ){
-    /* read description of template and paramlist */
-    if( fgets(lbuf, SZ_LINE, stdin) == NULL )
-      exit(errcode);
-    if( (*lbuf == '#') || (*lbuf == '\n') )
-      goto again;
-    lp = 0;
-    if( word(lbuf, tbuf, &lp) && !strcmp(tbuf, "xpaget") &&
-	word(lbuf, tbuf, &lp) ){
-      xtemplate = xstrdup(tbuf);
-      paramlist = xstrdup(&(lbuf[lp]));
-      nowhite(paramlist, paramlist);
-    }
-    else{
-      fprintf(stderr, "XPA$ERROR invalid command: %s", lbuf);
-      exit(++errcode);
-    }
-  }
-
-  /* process xpa requests */
-  got = XPAInfo(xpa, xtemplate, paramlist, mode, names, errs, -maxhosts);
-  if( got == 0 ){
-   fprintf(stderr, "XPA$ERROR no 'xpainfo' access points match template: %s\n",
-	   xtemplate);
-   errcode++;
-  }
-  else{
-    /* display errors and free up strings */
-    for(i=0; i<got; i++){
-      if( errs[i] != NULL ){
-	fprintf(stderr, "%s", errs[i]);
-	xfree(errs[i]);
-	errcode++;
-      }
-      if( names[i] != NULL )
-	xfree(names[i]);
-    }
-  }
-
-  /* free the paramlist */
-  if( paramlist!= NULL ){
-    xfree(paramlist);
-    paramlist = NULL;
-  }
-  /* and the template */
-  if( xtemplate != NULL ){
-    xfree(xtemplate);
-    xtemplate = NULL;
-  }
-
-  /* if we are in server mode, go back for more */
-  if( server )
-    goto again;
-  else{
-    /* clean up */
-    if( errs )  xfree(errs);
-    if( names ) xfree(names);
-    exit(errcode);
-  }
-  return(0);
-}
diff --git a/xpa/xpaio.c b/xpa/xpaio.c
deleted file mode 100644
index a5e7473..0000000
--- a/xpa/xpaio.c
+++ /dev/null
@@ -1,989 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-#include <xpap.h>
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- * 			Private Routines and Data
- *
- *
- *----------------------------------------------------------------------------
- */
-
-static int ioerr=0;
-static int doxpa=XPA_IOCALLSXPA;
-static int _doxpa=1;
-static int level=0;
-static char _xpalevelspaces[SZ_LINE];
-
-#if HAVE_MINGW32==0
-
-static struct sigaction act1, oact1;
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAInterruptFunc
- *
- * Purpose:	function to call when interrupted
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void
-XPAInterruptFunc (int signo)
-#else
-static void XPAInterruptFunc(signo)
-	int signo;
-#endif
-{
-  ioerr = 1;
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAInterruptSetup
- *
- * Purpose:	set up the InterruptSetup handler
- *
- * Returns:	0 for success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPAInterruptSetup (Sigfunc *func1)
-#else
-static int XPAInterruptSetup(func1)
-	Sigfunc *func1;
-#endif
-{
-  ioerr = 0;
-
-  if( XPASigusr1() ){
-    act1.sa_handler = func1;
-    sigemptyset(&act1.sa_mask);
-    act1.sa_flags = 0;
-#ifdef SA_INTERRUPT
-    act1.sa_flags |= SA_INTERRUPT;
-#endif
-    if( sigaction(SIGUSR1, &act1, &oact1) < 0 )
-      return(-1);
-  }
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAInterruptStart
- *
- * Purpose:	set up sigaction for interrupt
- *
- * Returns:	0 for success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void
-XPAInterruptStart (void)
-#else
-static void XPAInterruptStart()
-#endif
-{
-  /* Disable SIGPIPE so we do not die if the client dies.
-     Rather, we will get an EOF on reading or writing. */
-  xsignal_sigpipe();
-
-  /* set up the signal callbacks */
-  XPAInterruptSetup(XPAInterruptFunc);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAInterruptEnd
- *
- * Purpose:	stop the interrupt handling
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void
-XPAInterruptEnd (void)
-#else
-static void XPAInterruptEnd()
-#endif
-{
-  /* restore old sigaction, if necessary */
-  if( XPASigusr1() )
-    XPAInterruptSetup(oact1.sa_handler);
-}
-
-#else
-
-/* Windows does not support SIGUSR1 */
-#define XPAInterruptStart()	ioerr=0
-#define XPAInterruptEnd()
-
-#endif
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAIOErrorCheck
- *
- * Purpose:	check to see if there was an error
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-XPAIOErrorCheck (void)
-#else
-static int XPAIOErrorCheck()
-#endif
-{
-  return(ioerr);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- * 			Public Routines and Data
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAGets
- *
- * Purpose:	read characters up a new-line -- sockets only
- *
- * Returns:	number of characters read
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAGets (XPA xpa, int fd, char *buf, int len, int timeout)
-#else
-int XPAGets(xpa, fd, buf, len, timeout)
-     XPA xpa;
-     int fd;
-     char *buf;
-     int len;
-     int timeout;
-#endif
-{
-  int cur;
-  int got;
-  int flags;
-  int active;
-  int firsttime;
-  int done1, done2;
-  int swidth = FD_SETSIZE;
-  struct timeval tv;
-  struct timeval *tvp;
-  fd_set readfds;
-  fd_set writefds;
-
-  /* do we allow xpa processing within this routine? */
-  _doxpa = 1;
-
-  /* start out pessimistically */
-  *buf = '\0';
-
-  /* make sure we have a valid channel */
-  if( fd < 0 ) return(-1);
-
-  /* make sure we have a valid len */
-  if( len <= 0 ) return(-1);
-
-  FPRINTF((stderr, "%sXPAGets: %d entering to read %d bytes\n", _sp, fd, len));
-
-  /* start the interrupt handler */
-  XPAInterruptStart();
-
-  /* turn this xpa off */
-  active = XPAActive(xpa, xpa_comm(xpa), 0);
-
-  /* put socket into non-blocking mode */
-  xfcntl_nonblock(fd,flags);
-
-  /* grab characters up to a new-line or max len */
-  cur = 0;
-  done1 = (cur >= (len-1));
-  firsttime = 1;
-  while( !done1 ){
-    /* first time through we try the primary IO before selecting */
-    if( !firsttime ){
-      /* set up timer, if necessary */
-      if( timeout >= 0 ){
-	tv.tv_sec = timeout;
-	tv.tv_usec = 0;
-	tvp = &tv;
-      }
-      else{
-	tvp = NULL;
-      }
-      /* select this socket and all XPA server sockets */
-      FD_ZERO(&readfds);
-      FD_SET(fd, &readfds);
-      FD_ZERO(&writefds);
-      if( doxpa && _doxpa ){
-	XPAClientAddSelect(NULL, &readfds, &writefds);
-	XPAAddSelect(NULL, &readfds);
-      }
-      /* wait for the IO ready */
-      FPRINTF((stderr, "%sXPAGets: select on fd %d ...", _sp, fd));
-      got = xselect(swidth, &readfds, &writefds, NULL, tvp);
-      FPRINTF((stderr, " returned %d\n", got));
-      /* check for user interrupt or error or timeout */
-      if( XPAIOErrorCheck() || (got <=0) ){
-	cur = -1;
-	done1 = 1;
-	continue;
-      }
-      /* if socket is not ready, process XPA's and try again */
-      if( !FD_ISSET(fd, &readfds) ){
-	if( doxpa && _doxpa ){
-	  XPALevelSet(1);
-	  XPAClientProcessSelect(NULL, &readfds, &writefds, 0);
-	  XPAProcessSelect(&readfds, 0);
-	  XPALevelSet(-1);
-	}
-	continue;
-      }
-    }
-    else{
-      firsttime = 0;
-    }
-    done2 = 0;
-    while( !done1 && !done2 ){
-      /* get data */
-      got = recv(fd, &(buf[cur]), 1, 0);
-      /* check for user interrupt */
-      if( XPAIOErrorCheck() ){
-	cur = -1;
-	done1 = 1;
-	continue;
-      }
-      /* process result code */
-      switch(got){
-      case -1:
-	/* socket would block */
-	if((xerrno == EINPROGRESS) ||
-	   (xerrno == EWOULDBLOCK) || 
-	   (xerrno == EAGAIN) 	   ){
-	  FPRINTF((stderr, "%sXPAGets: recoverable recv fd=%d errno=%d\n",
-		   _sp, fd, xerrno));
-	  done2 = 1;
-	}
-	/* error of some sort */
-	else{
-	  FPRINTF((stderr, "%sXPAGets: error recv fd=%d errno=%d\n",
-		   _sp, fd, xerrno));
-	  PERROR(("XPAGets recv"));
-	  cur = -1;
-	  done1 = 1;
-	}
-	break;
-      case 0:
-	/* EOF */
-	done1 = 1;
-	break;
-      default:
-	/* got a valid byte -- check for EOL */
-	if( buf[cur++] == '\n' ){
-	  /* change \r\n to \n */
-	  if( (cur >= 2) && (buf[cur-2] == '\r') ){
-	    cur--;
-	    buf[cur-1] = '\n';
-	  }
-	  done1 = 1;
-	}
-	else{
-	  done1 = cur >= (len-1);
-	}
-	break;
-      }
-    }
-  }
-
-  /* restore socket mode */
-  xfcntl_restore(fd,flags);
-
-  /* restore active flag */
-  XPAActive(xpa, xpa_comm(xpa), active);
-
-  /* stop the interrupt handler */
-  XPAInterruptEnd();
-
-  if( cur >= 0 ){
-    buf[cur] = '\0';
-  }
-  else{
-    buf[0] = '\0';
-  }
-  FPRINTF((stderr, "%sXPAGets: %d read %d bytes:\n%.80s", _sp, fd, cur, buf));
-
-  /* return error code or length */
-  return(cur);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAPuts
- *
- * Purpose:	write a line of characters up to a newline -- sockets only
- *
- * Returns:	number of characters written
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAPuts (XPA xpa, int fd, char *buf, int timeout)
-#else
-int XPAPuts(xpa, fd, buf, timeout)
-     XPA xpa;
-     int fd;
-     char *buf;
-     int timeout;
-#endif
-{
-  int n;
-  int total;
-  int cur;
-  int got;
-  int flags;
-  int active;
-  int firsttime;
-  int done1, done2;
-  int swidth = FD_SETSIZE;
-  struct timeval tv;
-  struct timeval *tvp;
-  fd_set readfds, writefds;
-
-  /* do we allow xpa processing within this routine? */
-  _doxpa = 1;
-
-  /* make sure we have a valid channel */
-  if( fd < 0 ) return(-1);
-
-  /* determine how many characters to send */
-  got = strlen(buf);
-  for(total=0; total<got; total++){
-    if( buf[total] == '\n' ){
-      total++;
-      break;
-    }
-  }
-  FPRINTF((stderr, "%sXPAPuts: %d entering to write %d bytes\n",
-	   _sp, fd, total));
-
-  /* start the interrupt handler */
-  XPAInterruptStart();
-
-  /* turn this xpa off */
-  active = XPAActive(xpa, xpa_comm(xpa), 0);
-
-  /* put socket into non-blocking mode */
-  xfcntl_nonblock(fd,flags);
-
-  /* send characters up to a new-line */
-  cur = 0;
-  done1 = (cur >= total);
-  firsttime = 1;
-  while( !done1 ){
-    /* first time through we try the primary IO before selecting */
-    if( !firsttime ){
-      /* set up timer, if necessary */
-      if( timeout >= 0 ){
-	tv.tv_sec = timeout;
-	tv.tv_usec = 0;
-	tvp = &tv;
-      }
-      else{
-	tvp = NULL;
-      }
-      /* select this socket and all XPA server sockets */
-      FD_ZERO(&readfds);
-      FD_ZERO(&writefds);
-      FD_SET(fd, &writefds);
-      if( doxpa && _doxpa ){
-	XPAClientAddSelect(NULL, &readfds, &writefds);
-	XPAAddSelect(NULL, &readfds);
-      }
-      /* wait for the IO ready */
-      FPRINTF((stderr, "%sXPAPuts: select on fd %d ...", _sp, fd));
-      got = xselect(swidth, &readfds, &writefds, NULL, tvp);
-      FPRINTF((stderr, " returned %d\n", got));
-      /* check for user interrupt or error or timeout */
-      if( XPAIOErrorCheck() || (got <=0) ){
-	cur = -1;
-	done1 = 1;
-	continue;
-      }
-      /* if socket is not ready, process XPA's and try again */
-      if( !FD_ISSET(fd, &writefds) ){
-	FD_CLR(fd, &readfds);
-	if( doxpa && _doxpa ){
-	  XPALevelSet(1);
-	  XPAClientProcessSelect(NULL, &readfds, &writefds, 0);
-	  XPAProcessSelect(&readfds, 0);
-	  XPALevelSet(-1);
-	}
-	continue;
-      }
-    }
-    else{
-      firsttime = 0;
-    }
-    done2 = 0;
-    while( !done1 && !done2 ){
-      /* calculate size of next chunk */
-      if( (n = MIN(total-cur, XPA_IOSIZE)) <=0 ){
-	done1 = 1;
-	continue;
-      }
-      /* write the data */
-      FPRINTF((stderr, "%sXPAPuts: send %d on fd %d ...", _sp, n, fd));
-      got=send(fd, &buf[cur], n, 0);
-      FPRINTF((stderr, " returned %d\n", got));
-      /* check for user interrupt */
-      if( XPAIOErrorCheck() ){
-	cur = -1;
-	done1 = 1;
-	continue;
-      }
-      /* process return code */
-      switch(got){
-      case -1:
-	/* socket would block */
-	if((xerrno == EINPROGRESS) ||
-	   (xerrno == EWOULDBLOCK) || 
-	   (xerrno == EAGAIN) 	   ){
-	  done2 = 1;
-	}
-	/* error of some sort */
-	else{
-	  cur = -1;
-	  done1 = 1;
-	}
-	break;
-      case 0:
-	/* shouldn't happen */
-	done1 = (cur >= total);
-	break;
-      default:
-	/* sent some data */
-	cur += got;
-	done1 = (cur >= total);
-	break;
-      }
-    }
-  }
-
-  /* restore socket mode */
-  xfcntl_restore(fd,flags);
-
-  /* restore active flag */
-  XPAActive(xpa, xpa_comm(xpa), active);
-
-  /* stop the interrupt handler */
-  XPAInterruptEnd();
-  FPRINTF((stderr, "%sXPAPuts: %d wrote %d bytes: %.50s",
-	   _sp, fd, total, buf));
-  /* return error code or length */
-  return(cur);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAGetBuf
- *
- * Purpose:	read data from the xpa data socket until EOF -- sockets only
- *
- * Results:	0 on success, -1 on failure
- *		also allocates memory for buf and returns len
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAGetBuf (XPA xpa, int fd, char **buf, size_t *len, int timeout)
-#else
-int XPAGetBuf(xpa, fd, buf, len, timeout)
-     XPA xpa;
-     int fd;
-     char **buf;
-     size_t *len;
-     int timeout;
-#endif
-{
-  int n;
-  int cur;
-  int flags;
-  int active;
-  int firsttime;
-  int done1, done2;
-  int swidth = FD_SETSIZE;
-  int got;
-  size_t total;
-  size_t slen;
-  char *s=NULL;
-  struct timeval tv;
-  struct timeval *tvp;
-  fd_set readfds;
-  fd_set writefds;
-
-  /* do we allow xpa processing within this routine? */
-  _doxpa = 1;
-
-  /* make sure we have a valid data channel */
-  if( fd < 0 ) return(-1);
-
-  /* make sure we have a valid buf ptr and len ptr */
-  if( (len == NULL) || (buf == NULL) ) return(-1);
-
-  FPRINTF((stderr, "%sXPAGetBuf: entering fd %d\n", _sp, fd));
-
-  /* allocate the first buffer, if necessary */
-  if( (*len != 0) && (*buf != NULL) ){
-    slen = *len;
-    total = *len;
-    s = *buf;
-  }
-  else{
-    slen = XPA_IOSIZE;
-    total = 0;
-    if( (s=(char *)xmalloc(slen)) == NULL )
-      return(-1);
-  }
-  n = XPA_IOSIZE;
-
-  /* start the interrupt handler */
-  XPAInterruptStart();
-
-  /* turn this xpa off */
-  active = XPAActive(xpa, xpa_comm(xpa), 0);
-
-  /* put socket into non-blocking mode */
-  xfcntl_nonblock(fd,flags);
-
-  /* grab bytes to EOF */
-  done1 = 0;
-  firsttime = 1;
-  while( !done1 ){
-    /* first time through we try the primary IO before selecting */
-    if( !firsttime ){
-      /* set up timer, if necessary */
-      if( timeout >= 0 ){
-	tv.tv_sec = timeout;
-	tv.tv_usec = 0;
-	tvp = &tv;
-      }
-      else{
-	tvp = NULL;
-      }
-      /* select this socket and all XPA server sockets */
-      FD_ZERO(&readfds);
-      FD_SET(fd, &readfds);
-      FD_ZERO(&writefds);
-      if( doxpa && _doxpa ){
-	XPAClientAddSelect(NULL, &readfds, &writefds);
-	XPAAddSelect(NULL, &readfds);
-      }
-      /* wait for the IO ready */
-      FPRINTF((stderr, "%sXPAGetBuf: select on fd %d ...", _sp, fd));
-      got = xselect(swidth, &readfds, &writefds, NULL, tvp);
-      FPRINTF((stderr, " returned %lu\n", (unsigned long)got));
-      /* check for user interrupt or error or timeout */
-      if( XPAIOErrorCheck() || (got <=0) ){
-	cur = -1;
-	done1 = 1;
-	continue;
-      }
-      /* if socket is not ready, process XPA's and try again */
-      if( !FD_ISSET(fd, &readfds) ){
-	if( doxpa && _doxpa ){
-	  XPALevelSet(1);
-	  XPAClientProcessSelect(NULL, &readfds, &writefds, 0);
-	  XPAProcessSelect(&readfds, 0);
-	  XPALevelSet(-1);
-	}
-	continue;
-      }
-    }
-    else{
-      firsttime = 0;
-    }
-    done2 = 0;
-    while( !done1 && !done2 ){
-      /* make sure we have enough room */
-      while( (total + n) > slen ){
-	slen += (n*10);
-	if( (s = (char *)xrealloc(s, slen)) == NULL ){
-	  return(-1);
-	}
-      }
-      /* get data */
-      got = recv(fd, &(s[total]), n, 0);
-      FPRINTF((stderr, "%sXPAGetBuf: %d got %d bytes (tried %d at %lu)\n", 
-	       _sp, fd, got, n, (unsigned long)total));
-      /* check for user interrupt */
-      if( XPAIOErrorCheck() ){
-	cur = -1;
-	done1 = 1;
-	continue;
-      }
-      /* process return code */
-      switch(got){
-      case -1:
-	/* socket would block */
-	if((xerrno == EINPROGRESS) ||
-	   (xerrno == EWOULDBLOCK) || 
-	   (xerrno == EAGAIN) 	   ){
-	  done2 = 1;
-	}
-	/* error of some sort */
-	else{
-	  cur = -1;
-	  done1 = 1;
-	}
-	break;
-      case 0:
-	/* EOF */
-	cur = 0;
-	done1 = 1;
-	break;
-      default:
-	/* got data */
-	total += got;
-	break;
-      }
-    }
-  }
-
-  /* restore socket mode */
-  xfcntl_restore(fd,flags);
-
-  /* restore active flag */
-  XPAActive(xpa, xpa_comm(xpa), active);
-
-  /* stop the interrupt handler */
-  XPAInterruptEnd();
-
-  /* null terminate after last byte as a courtesy */
-  if( cur == 0 ){
-    s = (char *)xrealloc(s, total+1);
-    s[total] = '\0';
-    *buf = s;
-    *len = total;
-  }
-  else{
-    if( s ) xfree(s);
-    *buf = NULL;
-    *len = 0;
-  }
-
-  FPRINTF((stderr, "%sXPAGetBuf: leaving fd %d with %lu bytes\n", 
-	   _sp, fd, (unsigned long)*len));
-
-  /* return error code or length */
-  return(cur);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAPutBuf
- *
- * Purpose:	write data to the xpa data socket -- sockets only
- *
- * Results:	0 on success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAPutBuf (XPA xpa, int fd, char *buf, size_t len, int timeout)
-#else
-int XPAPutBuf(xpa, fd, buf, len, timeout)
-     XPA xpa;
-     int fd;
-     char *buf;
-     size_t len;
-     int timeout;
-#endif
-{
-  int n;
-  int cur;
-  int got;
-  int flags;
-  int active;
-  int firsttime;
-  int done1, done2;
-  int swidth = FD_SETSIZE;
-  size_t total;
-  struct timeval tv;
-  struct timeval *tvp;
-  fd_set readfds, writefds;
-
-  /* do we allow xpa processing within this routine? */
-  _doxpa = 1;
-
-  /* make sure we have a valid data channel */
-  if( fd < 0 ) return(-1);
-
-  /* make sure we have a valid buf ptr and len ptr */
-  if( (len == 0) || (buf == NULL) ) return(-1);
-
-  FPRINTF((stderr, "%sXPAPutBuf: writing %lu bytes to %d\n",
-	   _sp, (unsigned long)len, fd));
-
-  /* start the interrupt handler */
-  XPAInterruptStart();
-
-  /* turn this xpa off */
-  active = XPAActive(xpa, xpa_comm(xpa), 0);
-
-  /* put socket into non-blocking mode */
-  xfcntl_nonblock(fd,flags);
-
-  cur = 0;
-  total = len;
-  /* write in batches until done */
-  done1 = (cur >= total);
-  firsttime = 1;
-  while( !done1 ){
-    /* first time through we try the primary IO before selecting */
-    if( !firsttime ){
-      /* set up timer, if necessary */
-      if( timeout >= 0 ){
-	tv.tv_sec = timeout;
-	tv.tv_usec = 0;
-	tvp = &tv;
-      }
-      else{
-	tvp = NULL;
-      }
-      /* select this socket and all XPA server sockets */
-      FD_ZERO(&readfds);
-      FD_ZERO(&writefds);
-      FD_SET(fd, &writefds);
-      if( doxpa && _doxpa ){
-	XPAClientAddSelect(NULL, &readfds, &writefds);
-	XPAAddSelect(NULL, &readfds);
-      }
-      /* wait for the IO ready */
-      FPRINTF((stderr, "%sXPAPutBuf: select on fd %d ...", _sp, fd));
-      got = xselect(swidth, &readfds, &writefds, NULL, tvp);
-      FPRINTF((stderr, " returned %d\n", got));
-      /* check for user interrupt or error or timeout */
-      if( XPAIOErrorCheck() || (got <=0) ){
-	cur = -1;
-	done1 = 1;
-	continue;
-      }
-      /* if socket is not ready, process XPA's and try again */
-      if( !FD_ISSET(fd, &writefds) ){
-	if( doxpa && _doxpa ){
-	  XPALevelSet(1);
-	  XPAClientProcessSelect(NULL, &readfds, &writefds, 0);
-	  XPAProcessSelect(&readfds, 0);
-	  XPALevelSet(-1);
-	}
-	continue;
-      }
-    }
-    else{
-      firsttime = 0;
-    }
-    done2 = 0;
-    while( !done1 && !done2 ){
-      /* calculate size of next chunk */
-      if( (n = MIN(total-cur, XPA_IOSIZE)) <=0 ){
-	done1 = 1;
-	continue;
-      }
-      /* write the data */
-      got=send(fd, &buf[cur], n, 0);
-      FPRINTF((stderr, "%sXPAPutBuf: %d sent %lu bytes (tried %d at %d)\n", 
-	       _sp, fd, (unsigned long)got, n, cur));
-      /* check for user interrupt */
-      if( XPAIOErrorCheck() ){
-	cur = -1;
-	done1 = 1;
-	continue;
-      }
-      /* process result code */
-      switch(got){
-      case -1:
-	PERROR(("XPAPutBuf send"));
-	/* socket would block */
-	if((xerrno == EINPROGRESS) ||
-	   (xerrno == EWOULDBLOCK) || 
-	   (xerrno == EAGAIN) 	   ){
-	  done2 = 1;
-	}
-	/* error of some sort */
-	else{
-	  cur = -1;
-	  done1 = 1;
-	}
-	break;
-      case 0:
-	/* EOF */
-	done1 = 1;
-	break;
-      default:
-	/* got some data */
-	cur += got;
-	done1 = (cur >= total);
-	break;
-      }
-    }
-  }
-
-  /* restore socket mode */
-  xfcntl_restore(fd,flags);
-
-  /* restore active flag */
-  XPAActive(xpa, xpa_comm(xpa), active);
-
-  /* stop the interrupt handler */
-  XPAInterruptEnd();
-
-  /* return error code or length */
-  return(cur);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAIOCallsXPA
- *
- * Purpose:	function to flag whether IO calls also call XPA
- *
- * Returns:	old value
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int
-XPAIOCallsXPA (int flag)
-#else
-int XPAIOCallsXPA(flag)
-     int flag;
-#endif
-{
-  int old_doxpa;
-
-  old_doxpa=doxpa;
-  doxpa = flag;
-  return old_doxpa;
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPALevelSpaces
- *
- * Purpose:	return string containing spaces for debugging process level
- *
- * Returns:	string
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-char *XPALevelSpaces (void)
-#else
-char *XPALevelSpaces()
-#endif
-{
-  return(_xpalevelspaces);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPALevelSet
- *
- * Purpose:	set processing level and update level string for debugging
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void
-XPALevelSet (int lev)
-#else
-void XPALevelSet(lev)
-#endif
-{
-#ifdef XPA_DEBUG
-  int i;
-  int spaces;
-  int maxspaces;
-  char tbuf[SZ_LINE];
-#endif
-
-  level += lev;
-  _xpalevelspaces[0] = '\0';        
-#ifdef XPA_DEBUG
-  sprintf(tbuf, "#%d:", level);
-  maxspaces = SZ_LINE - strlen(tbuf);
-  if( level < maxspaces )
-    spaces = level;
-  else
-    spaces = maxspaces-1;
-  for(i=0; i<spaces; i++){
-    _xpalevelspaces[i] = ' ';
-    _xpalevelspaces[i+1] = '\0';        
-  }    
-  strncat(_xpalevelspaces, tbuf, SZ_LINE);
-#endif
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPALevelGet
- *
- * Purpose:	get processing level
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int
-XPALevelGet (void)
-#else
-int XPALevelGet()
-#endif
-{
-  return level;
-}
-
diff --git a/xpa/xpamb.c b/xpa/xpamb.c
deleted file mode 100644
index 4e58fb5..0000000
--- a/xpa/xpamb.c
+++ /dev/null
@@ -1,615 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-#include <time.h>
-#include <xpap.h>
-
-#define XPAMB_CLASS "XPAMB"
-#define XPAMB_NAME "xpamb"
-#define XPAMB_MODE NULL
-#define XPAMB_HELP "xpa message bus:\n"
-
-/* message bus structure */
-typedef struct mbrec{
-  struct mbrec *next;
-  char *name;
-  char *info;
-  char *buf;
-  size_t len;
-  time_t t;
-} *MB, MBRec;
-
-/* this is the head of the message bus list -- too lazy to do anything more */
-static MB mbhead=NULL;
-
-/* global error message buffer */
-static char errbuf[SZ_LINE];
-static int maxhosts=XPA_MAXHOSTS;
-static XPA xpa=NULL;
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAReceiveExit
- *
- * Purpose:	exit program
- *
- * Returns:	NONE
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPAReceiveExit (void *client_data, void *call_data, char *paramlist,
-		char *buf, size_t len)
-#else
-static int XPAReceiveExit(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     size_t len;
-#endif
-{
-  /* freeing the xpa handle will cause the xpa loop to terminate */
-  XPAFree(xpa);
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPASendExit
- *
- * Purpose:	exit program
- *
- * Returns:	NONE
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-XPASendExit (void *client_data, void *call_data, char *paramlist,
-	    char **buf, size_t *len)
-#else
-static int XPASendExit(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char **buf;
-     size_t *len;
-#endif
-{
-  /* freeing the xpa handle will cause the xpa loop to terminate */
-  XPAFree(xpa);
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	MBLookup
- *
- * Purpose:	lookup anentry by name
- *
- * Returns: 	mb struct on success, NULL on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static MB 
-MBLookup (char *name)
-#else
-static MB MBLookup(name)
-     char *name;
-#endif
-{
-  MB cur;
-
-  /*make sure we have something to work with */
-  if( (name == NULL) || (*name == '\0') )
-    return(NULL);
-
-  /*  look for exact match */
-  for(cur=mbhead; cur!=NULL; cur=cur->next){
-    if( !strcmp(name, cur->name) ){
-      return(cur);
-    }
-  }
-  return(NULL);
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * Routine: 	MBDel
- *
- * Purpose: 	free up and remove an MB
- *
- * Results:	0 on success, -1 for failure
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-MBDel (MB mb)
-#else
-static int MBDel(mb)
-     MB mb;
-#endif
-{
-  MB cur;
-
-  if( mb == NULL ){
-    snprintf(errbuf, SZ_LINE, "can't delete invalid xpamb entry");
-    return(-1);
-  }
-
-  /* remove from list of MB's */
-  if( mbhead ){
-    if( mbhead == mb ){
-      mbhead = mbhead->next;
-    }
-    else{
-      for(cur=mbhead; cur!=NULL; cur=cur->next){
-	if( cur->next == mb ){
-	  cur->next = (cur->next)->next;
-	  break;
-	}
-      }
-    }
-  }
-
-  /* free up alloc'ed space */
-  if( mb->name ) xfree(mb->name);
-  if( mb->info ) xfree(mb->info);
-  if( mb->buf )  xfree(mb->buf);
-
-  /* free up record struct */
-  xfree((char *)mb);
-  return(0);
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * Routine: 	MBRemove
- *
- * Purpose: 	free up and remove an MB by name
- *
- * Results:	0 on success, -1 for failure
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-MBRemove (char *name)
-#else
-static int MBRemove(name)
-     char *name;
-#endif
-{
-  MB mb;
-
-  if( (mb=MBLookup(name)) != NULL )
-    return(MBDel(mb));
-  else{
-    snprintf(errbuf, SZ_LINE, "can't delete unknown xpamb entry: %s", name);
-    return(-1);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	MBAdd
- *
- * Purpose:	add one MB to the xpa MB list
- *
- * Returns: 	0 on success, -1 on failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-MBAdd (char *name, char *info, char *buf, size_t len, int replace)
-#else
-static int MBAdd(name, info, buf, len, replace)
-     char *name;
-     char *info;
-     char *buf;
-     size_t len;
-     int replace;
-#endif
-{
-  MB xnew=NULL;
-  MB cur;
-
-  /* see if this entry already exists */
-  if( (cur = MBLookup(name)) != NULL ){
-    if( !replace ){
-      snprintf(errbuf, SZ_LINE, "xpamb entry already exists: %s", name);
-      goto error;
-    }
-    else
-      MBDel(cur);
-  }
-
-  /* allocate MB struct */
-  if( (xnew = (MB)xcalloc(1, sizeof(MBRec))) == NULL ){
-    snprintf(errbuf, SZ_LINE, "can't allocate memory for xpamb entry: %s",
-	     name);
-    goto error;
-  }
-
-  /* fill in the blanks */
-  xnew->name = xstrdup(name);
-  xnew->info = xstrdup(info);
-  if( !(xnew->buf = (char *)xmalloc(len)) ){
-    snprintf(errbuf, SZ_LINE, "can't allocate memory for xpamb buffer: %s",
-	     name);
-    goto error;
-  }
-  memcpy(xnew->buf, buf, len);
-  xnew->len = len;
-  xnew->t = time(NULL);
-
-  /* add this MB to end of list of MB's */
-  if( mbhead == NULL ){
-    mbhead = xnew;
-  }
-  else{
-    for(cur=mbhead; cur->next!=NULL; cur=cur->next)
-      ;
-    cur->next = xnew;
-  }
-  return(0);
-
-error:
-  if( xnew )
-    xfree(xnew);
-  return(-1);
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * Routine: 	MBInfo
- *
- * Purpose: 	send info string to specified fd
- *
- * Results:	0 on success, -1 for failure
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-MBInfo (int fd, MB mb)
-#else
-static int MBInfo(fd, mb)
-     int fd;
-     MB mb;
-#endif
-{
-  MB cur;
-  char *tbuf;
-
-  if( mb != NULL ){
-    tbuf = (char *)xmalloc(strlen(mb->name) + SZ_LINE);
-    snprintf(tbuf, SZ_LINE, "%s\tsize:\t\t%d\n\tcreated:\t%s",
-	     mb->name, (int)mb->len, ctime(&(mb->t)));
-    send(fd, tbuf, strlen(tbuf), 0);
-    xfree(tbuf);
-    if( mb->info && *(mb->info) ){
-      tbuf = (char *)xmalloc(strlen(mb->info) + SZ_LINE);
-      snprintf(tbuf, SZ_LINE, "\tinfo:\t\t%s\n", mb->info);
-      send(fd, tbuf, strlen(tbuf), 0);
-      xfree(tbuf);
-    }
-  }
-  else{
-    /*  send info for all entries */
-    for(cur=mbhead; cur!=NULL; cur=cur->next){
-      MBInfo(fd, cur);
-    }
-  }
-  return(0);
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * Routine: 	MBData
- *
- * Purpose: 	send data to specified fd
- *
- * Results:	0 on success, -1 for failure
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-MBData (int fd, MB mb)
-#else
-static int MBData(fd, mb)
-     int fd;
-     MB mb;
-#endif
-{
-  if( mb != NULL ){
-    if( mb->buf && mb->len ){
-      if( send(fd, mb->buf, mb->len, 0) == mb->len ){
-	return(0);
-      }
-      else{
-	snprintf(errbuf, SZ_LINE, "writing data for xpamb entry: %s",
-		 mb->name);
-	return(-1);
-      }
-    }
-    else{
-      return(0);
-    }
-  }
-  return(0);
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * Routine: 	MBSendCB
- *
- * Purpose: 	callback when we need to send data to a client
- *
- * Results:	0 on success, -1 for failure
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-MBSendCB (void *client_data, void *call_data, char *paramlist,
-	 char **buf, size_t *len)
-#else
-static int MBSendCB(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char **buf;
-     size_t *len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  MB mb;
-  int i;
-  int got=0;
-  int tp=0;
-  int doinfo=0;
-  int dodata=0;
-  int status=0;
-  int fds[1];
-  char tbuf[SZ_LINE];
-  char *errs[XPA_MAXHOSTS];
-  char *names[XPA_MAXHOSTS];
-
-  /* reset error buffer */
-  *errbuf = '\0';
-
-  /* no paramlist means return info on all stored entries */
-  if( !paramlist || !*paramlist ){
-    return(MBInfo(xpa_datafd(xpa), NULL));
-  }
-
-  /* process switches */
-  while( word(paramlist, tbuf, &tp) ){
-    if( *tbuf != '-' )
-      break;
-    else if( !strcmp(tbuf, "-data") ){
-      dodata++;
-    }
-    else if( !strcmp(tbuf, "-info") ){
-      doinfo++;
-    }
-    else{
-      break;
-    }
-  }
-
-  if( doinfo || dodata ){
-    if( !*tbuf ){
-      snprintf(errbuf, SZ_LINE, "missing xpamb entry name");
-      status = -1;
-    }
-    if( (mb=MBLookup(tbuf)) != NULL ){
-      if( doinfo ){
-	status = MBInfo(xpa_datafd(xpa), mb);
-      }
-      if( dodata ){
-	status = MBData(xpa_datafd(xpa), mb);
-      }
-    }
-    else{
-      snprintf(errbuf, SZ_LINE, "unknown xpamb entry: %s", tbuf);
-      status = -1;
-    }
-  }
-  else{
-    fds[0] = xpa_datafd(xpa);
-    got = XPAGetFd(NULL, tbuf, &paramlist[tp], NULL, fds, names, errs,
-		   -maxhosts);
-    for(i=0; i<got; i++){
-      if( errs[i] ){
-	if( !*errbuf )
-	  strcpy(errbuf, errs[i]);
-	status = -1;
-	xfree(errs[i]);
-      }
-      if( names[i] ) xfree(names[i]);
-    }
-  }
-
-  /* send error message and return status */
-  if( *errbuf )
-    XPAError(xpa, errbuf);
-  return(status);
-}
-
-/*
- *---------------------------------------------------------------------------
- *
- * Routine: 	MBRecCB
- *
- * Purpose: 	callback when we receive data/command from a client
- *
- * Results:	0 on success, -1 for failure
- *
- *---------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-MBRecCB (void *client_data, void *call_data, char *paramlist,
-	    char *buf, size_t len)
-#else
-static int MBRecCB(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     size_t len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  MB mb;
-  int i;
-  int got=0;
-  int tp=0;
-  int rflag=0;
-  int status=0;
-  char tbuf[SZ_LINE];
-  char xsend[SZ_LINE];
-  char xadd[SZ_LINE];
-  char xinfo[SZ_LINE];
-  char xremove[SZ_LINE];
-  char xtemplate[SZ_LINE];
-  char *errs[XPA_MAXHOSTS];
-  char *names[XPA_MAXHOSTS];
-
-  /* init flags */
-  *xsend = '\0';
-  *xadd = '\0';
-  *xinfo = '\0';
-  *xremove = '\0';
-  /* reset error buffer */
-  *errbuf = '\0';
-
-  /* process switches */
-  while( word(paramlist, tbuf, &tp) ){
-    if( *tbuf != '-' )
-      break;
-    else if( !strcmp(tbuf, "-data") ){
-      word(paramlist, xadd, &tp);
-    }
-    else if( !strcmp(tbuf, "-add") ){
-      word(paramlist, xadd, &tp);
-    }
-    else if( !strcmp(tbuf, "-replace") ){
-      word(paramlist, xadd, &tp);
-      rflag = 1;
-    }
-    else if( !strcmp(tbuf, "-info") ){
-      word(paramlist, xinfo, &tp);
-    }
-    else if( !strncmp(tbuf, "-del", 4) ){
-      word(paramlist, xremove, &tp);
-    }
-    else if( !strcmp(tbuf, "-send") ){
-      word(paramlist, xsend, &tp);
-    }
-    else
-      break;
-  }
-
-  /* broadcast data, if we have a target
-     the first non-switch word we found previously is the target */
-  if( *tbuf ){
-    strcpy(xtemplate, tbuf);
-    /* the rest of the input string is the paramlist */
-    paramlist = &(paramlist[tp]);
-    /* send named data, if necessary */
-    if( *xsend != '\0' ){
-      if( (mb=MBLookup(xsend)) != NULL ){
-	got = XPASet(NULL, xtemplate, paramlist, NULL, mb->buf, mb->len,
-		     names, errs, maxhosts);
-      }
-      if( (buf != NULL) && (len>0) ){
-	got = XPASet(NULL, xtemplate, paramlist, NULL, buf, len,
-		     names, errs, maxhosts);
-      }
-    }
-    else{
-      got = XPASet(NULL, xtemplate, paramlist, NULL, buf, len,
-		   names, errs, maxhosts);
-    }
-    for(i=0; i<got; i++){
-      if( errs[i] ){
-	if( !*errbuf )
-	  strcpy(errbuf, errs[i]);
-	status = -1;
-	xfree(errs[i]);
-      }
-      if( names[i] ) xfree(names[i]);
-    }
-  }
-
-  /* save named data, if necessary */
-  if( *xadd !='\0' ){
-    status = MBAdd(xadd, xinfo, buf, len, rflag);
-  }
-
-  /* remove named data, if necessary */
-  if( *xremove !='\0' ){
-    status = MBRemove(xremove);
-  }
-
-  /* send error message and return status */
-  if( *errbuf )
-    XPAError(xpa, errbuf);
-  return(status);
-}
-
-#ifdef ANSI_FUNC
-int 
-main (int argc, char **argv)
-#else
-int main(argc, argv)
-     int argc;
-     char **argv;
-#endif
-{
-  char *s;
-
-  /* display version and exit, if necessary */
-  if( (argc == 2) && !strcmp(argv[1], "--version") ){
-    fprintf(stderr, "%s\n", XPA_VERSION);
-    exit(0);
-  }
-
-  /* set global value for max hosts */
-  maxhosts=XPA_MAXHOSTS;
-  if( (s=(char *)getenv("XPA_MAXHOSTS")) != NULL )
-    maxhosts = atoi(s);
-
-  /* start up the xpa access point */
-  if( !(xpa=XPANew(XPAMB_CLASS, XPAMB_NAME, XPAMB_HELP,
-		   MBSendCB, NULL, XPAMB_MODE, MBRecCB, NULL, XPAMB_MODE)) ){
-    fprintf(stderr, "XPA$ERROR: could not create xpamb access point\n");
-    exit(1);
-  }
-  /* allow for a graceful exit */
-  XPACmdAdd(XPAGetReserved (), "-exit", "\texit program",
-	  XPASendExit, NULL, NULL, XPAReceiveExit, NULL, "fillbuf=false");
-
-  /* process events */
-  XPAMainLoop();
-  return(0);
-}
diff --git a/xpa/xpans.c b/xpa/xpans.c
deleted file mode 100644
index af727aa..0000000
--- a/xpa/xpans.c
+++ /dev/null
@@ -1,1935 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-#include <xpap.h>
-
-#if HAVE_LIBPTHREAD
-#include <pthread.h>
-static pthread_mutex_t xpans_mutex = PTHREAD_MUTEX_INITIALIZER;
-#endif
-
-#define MAX_ERRORS 5
-
-static int doproxy=0;
-static unsigned int localhost_ip=0;
-
-extern char *optarg;
-extern int optind;
-
-typedef struct entrec{
-  struct entrec *next;
-  char *method;
-  char *xclass;
-  char *name;
-  char *type;
-  char *user;
-  char *info;
-} *Entry, EntryRec;
-
-typedef struct reqrec{
-  struct reqrec *next;
-  int sock;
-  unsigned int ip;
-  int port;
-  Entry entry;
-} *Req, ReqRec;
-
-static char *helpbuf = "xpans commands:\nhelp\t\t\t\t# print this help message\nlist\t\t\t\t# list all entries\nlookup class:name type user\t# lookup entries of this type and user\n";
-
-static int keepalive=0;
-static int ksec=0;
-static int mtype = 0;
-static int nentry = 0;
-static int exconn=0;
-static int sock=-1;
-static char *logfile=NULL;
-static time_t lastt=(time_t)0;
-static time_t curt=(time_t)0;
-static FILE *securefp=NULL;
-static Req reqhead=NULL;
-
-static int LookupReq _PRx((Req xreq, char *lbuf, int flag));
-static int ListReq   _PRx((Req xreq, int flag));
-static void HelpReq   _PRx((Req xreq, int flag));
-#ifdef __STDC__
-static void SecureLog(char *format, ...);
-#else
-static void SecureLog();
-#endif
-
-#if HAVE_LIBPTHREAD
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	doxpaloop
- *
- * Purpose:	start up XPAMainLoop in another thread
- *
- * Returns:	NONE
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-void *doxpaloop(void *arg)
-#else
-void *doxpaloop(arg)
-     void *arg;
-#endif
-{
-  XPAMainLoop();
-  return (void *)NULL;
-}
-#endif
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	receive_proxy
- *
- * Purpose:	receive callback for a proxy request
- *
- * Returns:	0 for success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-receive_proxy (void *client_data, void *call_data, char *paramlist,
-	       char *buf, int len)
-#else
-int receive_proxy(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     int len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  char *xtemplate;
-  char *mode;
-  char *err;
-  char *s;
-  char xmode[SZ_LINE];
-  char tbuf[SZ_LINE];
-  int fd=0;
-  int pfd=-1;
-  int got=0;
-  Req req=NULL;
-
-  xtemplate = xpa->comm->target;
-  mode = xpa->comm->info;
-  fd = xpa->comm->datafd;
-
-  /* get proxy fd and associated xpans request struct */
-  if( mode ){
-    strcpy(xmode, mode);
-    if( keyword(xmode, "nsproxy", tbuf, SZ_LINE) ){
-      pfd = strtol(tbuf, &s, 0);
-      if( s != tbuf ){
-	for(req=reqhead; req!=NULL; req=req->next){
-	  if( req->sock == pfd ){
-	    break;
-	  }
-	}
-      }
-    }
-  }
-  if( pfd < 0 ){
-    snprintf(tbuf, SZ_LINE, "invalid or missing proxy fd");
-    XPAError(xpa, tbuf);
-    return(-1);
-  }
-  else if( req == NULL ){
-    snprintf(tbuf, SZ_LINE, "could not find xpans fd for proxy fd %d", pfd);
-    XPAError(xpa, tbuf);
-    return(-1);
-  }
-
-  FPRINTF((stderr, "%sreceive_proxy: fd=%d xtmpl=%s mode=%s paramlist=%s\n",
-	   _sp, xpa->comm->cmdfd, xtemplate, mode,
-	   paramlist?paramlist:"NONE"));
-
-  if( XPASetFd(xpa, xtemplate, paramlist, mode, fd, NULL, &err, 1) ){
-    /* display errors and free up strings */
-    if( err != NULL ){
-      XPAError(xpa, err);
-      xfree(err);
-      got = -1;
-    }
-  }
-  else{
-    got = -1;
-  }
-
-  FPRINTF((stderr, "%sreceive_proxy done\n", _sp));
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	send_proxy
- *
- * Purpose:	send callback for a proxy request
- *
- * Returns:	0 for success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-send_proxy (void *client_data, void *call_data, char *paramlist,
-	    char **buf, size_t *len)
-#else
-static int send_proxy(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char **buf;
-     size_t *len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  char *xtemplate;
-  char *mode;
-  char *err;
-  char *s;
-  char xmode[SZ_LINE];
-  char tbuf[SZ_LINE];
-  int fd=0;
-  int pfd=-1;
-  int got=0;
-  Req req=NULL;
-
-  xtemplate = xpa->comm->target;
-  mode = xpa->comm->info;
-  fd = xpa->comm->datafd;
-
-  /* get proxy fd and associated xpans request struct */
-  if( mode ){
-    strcpy(xmode, mode);
-    if( keyword(xmode, "nsproxy", tbuf, SZ_LINE) ){
-      pfd = strtol(tbuf, &s, 0);
-      if( s != tbuf ){
-	for(req=reqhead; req!=NULL; req=req->next){
-	  if( req->sock == pfd ){
-	    break;
-	  }
-	}
-      }
-    }
-  }
-  if( pfd < 0 ){
-    snprintf(tbuf, SZ_LINE, "invalid or missing proxy fd");
-    XPAError(xpa, tbuf);
-    return(-1);
-  }
-  else if( req == NULL ){
-    snprintf(tbuf, SZ_LINE, "could not find xpans fd for proxy fd %d", pfd);
-    XPAError(xpa, tbuf);
-    return(-1);
-  }
-
-  FPRINTF((stderr, "%ssend_proxy: fd=%d xtemplate=%s mode=%s paramlist=%s\n",
-	  _sp, xpa->comm->cmdfd, xtemplate, mode, paramlist?paramlist:"NONE"));
-
-  if( XPAGetFd(xpa, xtemplate, paramlist, mode, &fd, NULL, &err, 1) ){
-    /* display errors and free up strings */
-    if( err != NULL ){
-      XPAError(xpa, err);
-      xfree(err);
-      got = -1;
-    }
-  }
-  else{
-    got = -1;
-  }
-
-  FPRINTF((stderr, "%ssend_proxy done\n", _sp));
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	receive_cb
- *
- * Purpose:	receive callback for XPA access point
- *
- * Returns:	0 for success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-receive_cb (void *client_data, void *call_data, char *paramlist,
-	    char *buf, size_t len)
-#else
-int receive_cb(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char *buf;
-     size_t len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  char tbuf[SZ_LINE];
-
-  /* if target is not xpans, we have a proxy request */
-  snprintf(tbuf, SZ_LINE, "%s:%s", XPANS_CLASS, XPANS_NAME);
-  if( strcmp(xpa->comm->target, tbuf) ){
-    if( doproxy )
-      return(receive_proxy(client_data, call_data, paramlist, buf, len));
-    else{
-      XPAError(xpa, "proxy requests not enabled in this xpans");
-      return(-1);
-    }
-  }
-
-  /* nothing to do for normal receive callback */
-  XPAError(xpa, "no receive function defined for xpans");
-  return(-1);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	send_cb
- *
- * Purpose:	send callback for XPA access point
- *
- * Returns:	0 for success, -1 for failure
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-send_cb (void *client_data, void *call_data, char *paramlist,
-	 char **buf, size_t *len)
-#else
-static int send_cb(client_data, call_data, paramlist, buf, len)
-     void *client_data;
-     void *call_data;
-     char *paramlist;
-     char **buf;
-     size_t *len;
-#endif
-{
-  XPA xpa = (XPA)call_data;
-  Req req;
-  char tbuf[SZ_LINE];
-  char ebuf[SZ_LINE];
-  char tmpl[SZ_LINE];
-  char type[SZ_LINE];
-  char users[SZ_LINE];
-  int got=0;
-  int wp=0;
-
-  /* if target is not xpans, we have a proxy request */
-  snprintf(tbuf, SZ_LINE, "%s:%s", XPANS_CLASS, XPANS_NAME);
-  if( strcmp(xpa->comm->target, tbuf) ){
-    if( doproxy )
-      return(send_proxy(client_data, call_data, paramlist, buf, len));
-    else{
-      XPAError(xpa, "proxy requests not enabled in this xpans");
-      return(-1);
-    }
-  }
-
-  if( paramlist && *paramlist )
-    SecureLog("xpaget from host %x:%d (%s): %s", 
-	      xpa->comm->cmdip, xpa->comm->cmdport,
-	      getiphost(xpa->comm->cmdip),
-	      (paramlist && *paramlist)?paramlist:"<no params>");
-  else
-    SecureLog("xpaget from host %x:%d (%s)", 
-	      xpa->comm->cmdip, xpa->comm->cmdport,
-	      getiphost(xpa->comm->cmdip));
-  if( (req = (Req)xcalloc(1, sizeof(ReqRec))) == NULL )
-    return(-1);
-  if( xpa_datafd(xpa) >= 0 ){
-    req->sock = xpa_datafd(xpa);
-  }
-
-#if HAVE_LIBPTHREAD
-  /* lock the mutex before processing a request */
-  if( doproxy >= 2 ) pthread_mutex_lock(&xpans_mutex);
-#endif
-
-  /* execute the appropriate routine */
-  if( paramlist && *paramlist && word(paramlist, tbuf, &wp) ){
-    if( !strcmp(tbuf, "list") ){
-      ListReq(req, 0);
-    }
-    else if( !strcmp(tbuf, "help") ){
-      HelpReq(req, 0);
-    }
-    else if( !strcmp(tbuf, "lookup") ){
-      if( word(paramlist, tmpl, &wp ) ){
-	/* look for type */
-	if( !word(paramlist, type, &wp ) )
-	  strcpy(type, XPA_ACLS);
-	/* look for users */
-	if( !word(paramlist, users, &wp ) )
-	  strcpy(users, "*");
-	snprintf(tbuf, SZ_LINE, "%s %s %s", tmpl, type, users);
-	LookupReq(req, tbuf, 0);
-      }
-      else{
-	strcpy(ebuf,
-	       "XPA$ERROR 'lookup' requires class:name [type] [user]\n");
-	XPAPuts(NULL, req->sock, ebuf, XPALongTimeout());
-	got = -1;
-      }
-    }
-    else{
-      snprintf(ebuf, SZ_LINE, "XPA$ERROR unknown command '%s'\n", tbuf);
-      XPAPuts(NULL, req->sock, ebuf, XPALongTimeout());
-      got = -1;
-    }
-  }
-  else {
-    ListReq(req, 0);
-  }
-
-#if HAVE_LIBPTHREAD
-  /* unlock the mutex */
-  if( doproxy >= 2 ) pthread_mutex_unlock(&xpans_mutex);
-#endif
-
-  /* clean up */
-  if( req ) xfree(req);
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	Log
- *
- * Purpose:	write all names to a backup log
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-Log (void)
-#else
-static void Log()
-#endif
-{
-  FILE *fp;
-  Req req;
-  Entry entry;
-
-  if( !logfile )
-    return;
-  if( !strcasecmp(logfile, "stdout") )
-    fp = stdout;
-  else if( (fp=fopen(logfile, "w")) == NULL )
-    return;
-  for(req=reqhead; req!=NULL; req=req->next){
-    for(entry=req->entry; entry!=NULL; entry=entry->next){
-      fprintf(fp, "# add %s %s %s %s %s\n",
-	      entry->method, entry->xclass,
-	      entry->name, entry->type, entry->user);
-      /* last one */
-      if( entry->next == NULL )
-	fprintf(fp, "xpaset -p %s -nsconnect\n", entry->method);
-    }
-  }
-  if( fp != stdout )
-    fclose(fp);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	SecureLog
- *
- * Purpose:	write security info to a backup log
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef __STDC__
-void SecureLog(char *format, ...) 
-{
-    char sbuf[SZ_LINE];
-    time_t t;
-    va_list args;
-    va_start(args, format);
-#else
-void SecureLog(va_alist) va_dcl
-{
-    char *format;
-    char sbuf[SZ_LINE];
-    time_t t;
-    va_list args;
-
-    va_start(args);
-    format = va_arg(args, char *);
-#endif
-    if( securefp == NULL )
-      return;
-    t = time(NULL);
-    vsnprintf(sbuf, SZ_LINE, format, args);
-    fprintf(securefp, "%s", sbuf);
-    fprintf(securefp, "\t%s", ctime(&t));
-    fflush(securefp);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	SplitArg
- *
- * Purpose:	split the specified argument by changing a ":" to a space
- *		splitting is done in place
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void
-SplitArg (char *buf, int arg)
-#else
-static void SplitArg(buf, arg)
-     char *buf;
-     int arg;
-#endif
-{
-  int i;
-  char *s;
-
-  /* point to beginning of buffer */
-  s = buf;
-  /* skip over previous args */
-  for(i=0; i<arg; i++){
-    /* skip up to white space */
-    while( *s && !isspace((int)*s) )
-      s++;
-    /* skip over white space to next arg */
-    while( *s && isspace((int)*s) )
-      s++;
-  }
-  /* we now are pointing at the arg in question.
-     look for a ':' (up to next white space) and change to space */
-  while( *s && !isspace((int)*s) ){
-    if( *s == ':' ){
-      *s = ' ';
-      break;
-    }
-    else
-      s++;
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	NewEntry
- *
- * Purpose:	allocate a new XPA entry
- *
- * Returns:	entry struct
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-NewEntry (Req req,
-	  char *method, char *xclass, char *name, 
-	  char *type, char *user, char *info)
-#else
-static int NewEntry(req, method, xclass, name, type, user, info)
-     Req req;
-     char *method;
-     char *xclass;
-     char *name;
-     char *type;
-     char *user;
-     char *info;
-#endif
-{
-  Entry entry, cur;
-  Req xreq;
-
-  /* don't duplicate with any other entry */
-  for(xreq=reqhead; xreq!=NULL; xreq=xreq->next){
-    for(entry=xreq->entry; entry!=NULL; entry=entry->next){
-      if( !strcmp(entry->method, method) &&
-	  !strcmp(entry->xclass, xclass) &&
-	  !strcmp(entry->name, name)     &&
-	  !strcmp(entry->type, type)     &&
-	  !strcmp(entry->user, user)     &&
-	  !strcmp(entry->info, info)     )
-	return(1);
-    }
-  }
-
-  /* allocate new entry */
-  if( (entry = (Entry)xcalloc(1, sizeof(EntryRec))) == NULL )
-    return(-1);
-
-  /* fill in the blanks */
-  entry->xclass = xstrdup(xclass);
-  entry->name = xstrdup(name);
-  entry->method = xstrdup(method);
-  entry->type = xstrdup(type);
-  entry->user = xstrdup(user);
-  entry->info = xstrdup(info);
-
-  FPRINTF((stderr, "%sNewEntry: %s %s %s %s %s %s\n", _sp,
-	  xclass, name, method, type, user, info));
-
-  /* add this to end of the list */
-  if( req->entry == NULL ){
-    req->entry = entry;
-  }
-  else{
-    for(cur=req->entry; cur->next!=NULL; cur=cur->next)
-      ;
-    cur->next = entry;
-  }
-
-  /* inc the total number of entries */
-  nentry++;
-
-  /* return the news */
-  return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	FreeEntry
- *
- * Purpose:	free up an XPA entry
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-FreeEntry (Req req, Entry entry)
-#else
-static void FreeEntry(req, entry)
-     Req req;
-     Entry entry;
-#endif
-{
-  Entry cur;
-
-  /* remove this entry from the list so it can't be found */
-  if( entry == req->entry ){
-    req->entry = req->entry->next;
-  }
-  else{
-    for(cur=req->entry; cur!=NULL; cur=cur->next){
-      if( entry == cur->next ){
-	cur->next = entry->next;
-	break;
-      }
-    }
-  }
-
-  FPRINTF((stderr, "%sFreeEntry: %s %s\n", _sp, entry->xclass, entry->name));
-
-  /* now free this struct */
-  if( entry->method )
-    xfree(entry->method);
-  if( entry->xclass )
-    xfree(entry->xclass);
-  if( entry->name )
-    xfree(entry->name);
-  if( entry->type )
-    xfree(entry->type);
-  if( entry->user )
-    xfree(entry->user);
-  if( entry->info )
-    xfree(entry->info);
-  xfree(entry);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	DelEntry
- *
- * Purpose:	Delete an XPA entry
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int
-DelEntry (Req req, char *method)
-#else
-static int DelEntry(req, method)
-     Req req;
-     char *method;
-#endif
-{
-  Entry cur, tcur;
-  int got=-1;
-
-  for(cur=req->entry; cur!=NULL; ){
-    tcur = cur->next;
-    if( ((method == NULL) || (*method == '\0'))         ||
-	(!strcmp(method, "@") && (*cur->method == '@')) ||
-	!strcmp(cur->method, method)		        ){
-      FreeEntry(req, cur);
-      got = 0;
-    }
-    cur = tcur;
-  }
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	FirewallEntry
- *
- * Purpose:	Correct the method to take a firewall into account
- *              we do this by taking the ip from the socket packet instead
- *              of the specified ip, if they differ
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-FirewallEntry (Req req, char *method)
-#else
-static void FirewallEntry(req, method)
-     Req req;
-     char *method;
-#endif
-{
-  unsigned int ip;
-  unsigned short port;
-
-  if( mtype != XPA_INET )
-    return;
-  if( XPAParseIpPort(method, &ip, &port) ){
-    if( (ip != req->ip) && (req->ip != localhost_ip) ){
-      SecureLog("firewall %d: changing ip from %x to %x",
-		req->sock, ip, req->ip);
-      snprintf(method, SZ_LINE, "%x:%d", req->ip, port);
-    }
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	NewReq
- *
- * Purpose:	allocate a new XPA request struct
- *
- * Returns:	Req struct
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static Req 
-NewReq (int sock, unsigned int ip, int port)
-#else
-static Req NewReq(sock, ip, port)
-     int sock;
-     unsigned int ip;
-     int port;
-#endif
-{
-  Req req;
-  Req cur;
-
-  if( (req = (Req)xcalloc(1, sizeof(ReqRec))) == NULL )
-    return(NULL);
-
-  /* fill in the blanks */
-  req->sock = sock;
-  req->ip = ip;
-  req->port = port;
-
-  /* add this to end of the list */
-  if( reqhead == NULL ){
-    reqhead = req;
-  }
-  else{
-    for(cur=reqhead; cur->next!=NULL; cur=cur->next)
-      ;
-    cur->next = req;
-  }
-  /* return the news */
-  return(req);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	FreeReq
- *
- * Purpose:	free up an XPA request entry
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-FreeReq (Req req)
-#else
-static void FreeReq(req)
-     Req req;
-#endif
-{
-  Req cur;
-  /* remove this entry from the list so it can't be found */
-  if( req == reqhead ){
-    reqhead = req->next;
-  }
-  else{
-    for(cur=reqhead; cur!=NULL; cur=cur->next){
-      if( req == cur->next ){
-	cur->next = req->next;
-	break;
-      }
-    }
-  }
-  /* close the communication channel */
-  close(req->sock);
-  /* now free this struct */
-  xfree(req);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	AddReq
- *
- * Purpose:	add an XPA entry to the list
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-AddReq (Req req, char *lbuf, int flag)
-#else
-static void AddReq(req, lbuf, flag)
-     Req req;
-     char *lbuf;
-     int flag;
-#endif
-{
-  int got;
-  char xclass[SZ_LINE];
-  char name[SZ_LINE];
-  char method[SZ_LINE];
-  char omethod[SZ_LINE];
-  char type[SZ_LINE];
-  char user[SZ_LINE];
-  char tbuf[SZ_LINE];
-
-  SplitArg(lbuf, 1);
-  got = sscanf(lbuf, "%s %s %s %s %s", method, xclass, name, type, user);
-  if( got == 5 ){
-    /* fix method if we can determine its been through a firewall */
-    strcpy(omethod, method);
-    FirewallEntry(req, method);
-    if( !strcmp(omethod, method) )
-      strcpy(tbuf, method);
-    else
-      snprintf(tbuf, SZ_LINE, "%s,%s", method, omethod);
-    /* add the new entry */
-    got = NewEntry(req, tbuf, xclass, name, type, user, XPA_DEF_CLIENT_INFO);
-    Log();
-    if( flag ){
-      switch(got){
-      case -1:
-	XPAPuts(NULL, req->sock, "XPA$ERROR could not add entry\n",
-		XPALongTimeout());
-	break;
-      case 0:
-	XPAPuts(NULL, req->sock, "XPA$OK\n", XPALongTimeout());
-	break;
-      case 1:
-	XPAPuts(NULL, req->sock, "XPA$EXISTS entry already exists\n",
-		XPALongTimeout());
-	break;
-      default:
-	XPAPuts(NULL, req->sock, "XPA$ERROR could not add entry\n",
-		XPALongTimeout());
-	break;
-      }
-    }
-  }
-  else{
-    strcpy(tbuf, 
-    "XPA$ERROR 'add' requires 4 args: ip:port class:name type user\n");
-    XPAPuts(NULL, req->sock, tbuf, XPALongTimeout());
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	AddProxyReq
- *
- * Purpose:	add an XPA proxy entry to the list
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-AddProxyReq (Req req, char *lbuf, int flag)
-#else
-static void AddProxyReq(req, lbuf, flag)
-     Req req;
-     char *lbuf;
-     int flag;
-#endif
-{
-  int got=0;
-  char xclass[SZ_LINE];
-  char name[SZ_LINE];
-  char method[SZ_LINE];
-  char omethod[SZ_LINE];
-  char type[SZ_LINE];
-  char user[SZ_LINE];
-  char info[SZ_LINE];
-  char tbuf[SZ_LINE];
-
-  /* make sure we are accepting proxy requests */
-  if( !doproxy ){
-    strcpy(tbuf, 
-	   "XPA$ERROR: proxy requests not enabled in this xpans\n");
-    XPAPuts(NULL, req->sock, tbuf, XPALongTimeout());
-    return;
-  }
-
-  SplitArg(lbuf, 1);
-  got = sscanf(lbuf, "%s %s %s %s %s", method, xclass, name, type, user);
-  if( got == 5 ){
-    if(  XPAMethod(method) == XPA_INET ){
-      /* fix method if we can determine its been through a firewall */
-      strcpy(omethod, method);
-      FirewallEntry(req, method);
-      if( !strcmp(omethod, method) )
-	snprintf(tbuf, SZ_LINE, "@%s", method);
-      else
-	snprintf(tbuf, SZ_LINE, "@%s,%s", method, omethod);
-    }
-    else{
-      strcpy(tbuf, 
-	     "XPA$ERROR 'proxy' requires INET method\n");
-      XPAPuts(NULL, req->sock, tbuf, XPALongTimeout());
-      return;
-    }
-    /* save info */
-    snprintf(info, SZ_LINE, "nsproxy=%d,ns=(%s,%s,%s,%s),dofork=true", 
-	    req->sock, xclass, name, method, omethod);
-    /* add the new entry */
-    got = NewEntry(req, tbuf, xclass, name, type, user, info);
-    Log();
-    if( flag ){
-      switch(got){
-      case -1:
-	XPAPuts(NULL, req->sock, "XPA$ERROR could not add entry\n",
-		XPALongTimeout());
-	break;
-      case 0:
-	XPAPuts(NULL, req->sock, "XPA$OK\n", XPALongTimeout());
-	break;
-      case 1:
-	XPAPuts(NULL, req->sock, "XPA$EXISTS entry already exists\n",
-		XPALongTimeout());
-	break;
-      default:
-	XPAPuts(NULL, req->sock, "XPA$ERROR could not add entry\n",
-		XPALongTimeout());
-	break;
-      }
-    }
-  }
-  else{
-    strcpy(tbuf, 
-    "XPA$ERROR 'proxy' requires 4 args: ip:port class:name type user\n");
-    XPAPuts(NULL, req->sock, tbuf, XPALongTimeout());
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	DelReq
- *
- * Purpose:	delete an XPA entry from the list
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-DelReq (Req req, char *lbuf, int flag)
-#else
-static void DelReq(req, lbuf, flag)
-     Req req;
-     char *lbuf;
-     int flag;
-#endif
-{
-  int got=0;
-  char method[SZ_LINE];
-  char omethod[SZ_LINE];
-  char tbuf[SZ_LINE];
-
-  if( lbuf != NULL ){
-    if( sscanf(lbuf, "%s", method) == 1 ){
-      /* fix method if we can determine its been through a firewall */
-      strcpy(omethod, method);
-      FirewallEntry(req, method);
-      if( !strcmp(omethod, method) )
-	strcpy(tbuf, method);
-      else
-	snprintf(tbuf, SZ_LINE, "%s,%s", method, omethod);
-      got = DelEntry(req, tbuf);
-      Log();
-      if( flag ){
-	if( got == 0 )
-	  XPAPuts(NULL, req->sock, "XPA$OK\n", XPALongTimeout());
-	else
-	  XPAPuts(NULL, req->sock, "XPA$ERROR entry does not exist\n",
-		  XPALongTimeout());
-      }
-    }
-    else{
-      strcpy(tbuf, "XPA$ERROR 'del' requires 1 arg: ip:port\n");
-      XPAPuts(NULL, req->sock, tbuf, XPALongTimeout());
-    }
-  }
-  else{
-    /* connection is closed -- free all entries for req, and delete req */
-    FPRINTF((stderr, "%sxpans request really died: %d\n", _sp, req->sock));
-    DelEntry(req, NULL);
-    FreeReq(req);
-    Log();
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	DelProxyReq
- *
- * Purpose:	delete an XPA entry from the list
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-DelProxyReq (Req req, char *lbuf, int flag)
-#else
-static void DelProxyReq(req, lbuf, flag)
-     Req req;
-     char *lbuf;
-     int flag;
-#endif
-{
-  int got=0;
-  char method[SZ_LINE];
-  char omethod[SZ_LINE];
-  char tbuf[SZ_LINE];
-
-  /* make sure we are accepting proxy requests */
-  if( !doproxy ){
-    strcpy(tbuf, 
-	   "XPA$ERROR: proxy requests not enabled in this xpans\n");
-    XPAPuts(NULL, req->sock, tbuf, XPALongTimeout());
-    return;
-  }
-
-  if( lbuf != NULL ){
-    if( sscanf(lbuf, "%s", method) == 1 ){
-      /* fix method if we can determine its been through a firewall */
-      strcpy(omethod, method);
-      FirewallEntry(req, method);
-      if( !strcmp(omethod, method) )
-	strcpy(tbuf, method);
-      else
-	snprintf(tbuf, SZ_LINE, "@%s,%s", method, omethod);
-      /* free the specified entry */
-      got = DelEntry(req, tbuf);
-      Log();
-      if( flag ){
-	if( got == 0 )
-	  XPAPuts(NULL, req->sock, "XPA$OK\n", XPALongTimeout());
-	else
-	  XPAPuts(NULL, req->sock, "XPA$ERROR entry does not exist\n",
-		  XPALongTimeout());
-      }
-    }
-    else{
-      strcpy(tbuf, "XPA$ERROR 'del' requires 1 arg: ip:port\n");
-      XPAPuts(NULL, req->sock, tbuf, XPALongTimeout());
-    }
-  }
-  else{
-    /* connection is closed -- free all entries for req, and delete req */
-    DelEntry(req, "@");
-    /* if this is the last entry, delete the request struct as well */
-    if( req->entry == NULL ){
-      FreeReq(req);
-    }
-    Log();
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	LookupReq
- *
- * Purpose:	lookup a template in the XPA list
- *
- * Returns:	number of matched lookups
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-LookupReq (Req xreq, char *lbuf, int flag)
-#else
-static int LookupReq(xreq, lbuf, flag)
-     Req xreq;
-     char *lbuf;
-     int flag;
-#endif
-{
-  int i;
-  int nrec;
-  int got=0;
-  int domethod=0;
-  int slen=1024;
-  int *lens;
-  char args[4][SZ_LINE];
-  char ctmpl[SZ_LINE];
-  char ntmpl[SZ_LINE];
-  char tbuf[SZ_LINE];
-  char type[SZ_LINE];
-  char users[SZ_LINE];
-  char method[SZ_LINE];
-  char *user;
-  char *usercopy;
-  char **strings;
-  char *tstring;
-  Req req;
-  Entry entry;
-
-  SplitArg(lbuf, 0);
-  nrec = sscanf(lbuf, "%s %s %s %s", args[0], args[1], args[2], args[3]);
-  switch(nrec){
-  case 0:
-    goto error;
-  case 1:
-    strcpy(ctmpl, "*");
-    strcpy(ntmpl, args[0]);
-    strcpy(type,  "*");
-    strcpy(users, "*");
-    if( *args[0] == '@' ){
-      strcpy(method, args[0]);
-      domethod = 1;
-    }
-    break;
-  case 2:
-    strcpy(ctmpl, "*");
-    strcpy(ntmpl, args[0]);
-    strcpy(type,  args[1]);
-    strcpy(users, "*");
-    if( *args[0] == '@' ){
-      snprintf(method, SZ_LINE, "%s:%s", args[0], args[1]);
-      domethod = 1;
-    }
-    break;
-  case 3:
-    strcpy(ctmpl, "*");
-    strcpy(ntmpl, args[0]);
-    strcpy(type,  args[1]);
-    strcpy(users, args[2]);
-    if( *args[0] == '@' ){
-      strcpy(method, args[0]);
-      domethod = 1;
-    }
-    break;
-  case 4:
-    strcpy(ctmpl, args[0]);
-    strcpy(ntmpl, args[1]);
-    strcpy(type,  args[2]);
-    strcpy(users, args[3]);
-    if( *args[0] == '@' ){
-      snprintf(method, SZ_LINE, "%s:%s", args[0], args[1]);
-      domethod = 1;
-    }
-    break;
-  case 5:
-    goto error;
-  }
-  strings = (char **)xmalloc(slen * sizeof(char *));
-  lens = (int *)xmalloc(slen * sizeof(int));
-  lens[0] = 0;
-  for(req=reqhead; req!=NULL; req=req->next){
-    for(entry=req->entry; entry!=NULL; entry=entry->next){
-      /* check method or class:name */
-      if( domethod ){
-	if( strcmp(entry->method, method) )
-	  continue;
-      }
-      else{
-	if( !tmatch(entry->xclass, ctmpl) || !tmatch(entry->name, ntmpl) )
-	  continue;
-      }
-      /* check type */
-      if( strcmp(type, "*") && !strpbrk(entry->type, type) )
-	continue;
-      /* check user */
-      if( !strcmp(users, "*") || !strcmp(users, entry->user) ){
-	user = entry->user;
-      }
-      else{
-	user = NULL;
-	usercopy = (char *)xstrdup(users);
-	for(user=(char *)strtok(usercopy, " :;,");
-	    user!=NULL;
-	    user=(char *)strtok(NULL," :;,")){
-	  if ( !strcasecmp(user, entry->user) ){
-	    break;
-	  }
-	}
-	if( usercopy )
-	  xfree(usercopy);
-      }
-      if( !user )
-	continue;
-      /* made it through all checks! */
-      if( domethod || (*entry->method == '@') ){
-	snprintf(tbuf, SZ_LINE, "%s %s %s %s %s %s\n",
-		 entry->xclass, entry->name, 
-		 entry->type, XPANSMethod(NULL,1), entry->user, entry->info);
-	FPRINTF((stderr, "%sLookupReq: method lookup found:\n%s", _sp, tbuf));
-      }
-      else{
-	snprintf(tbuf, SZ_LINE, "%s %s %s %s %s %s\n",
-		 entry->xclass, entry->name, 
-		 entry->type, entry->method, entry->user, entry->info);
-	FPRINTF((stderr, "%sLookupReq: class/name lookup got:\n%s",
-		 _sp, tbuf));
-      }
-      if( got >= (slen-2) ){
-	slen *= 2;
-	strings = (char **)xrealloc(strings, slen * sizeof(char *));
-	lens = (int *)xrealloc(lens, slen * sizeof(int));
-      }
-      strings[got] = xstrdup(tbuf);
-      lens[got+1] = lens[got] + strlen(strings[got]);
-      got++;
-    }
-  }
-  if( flag ){
-    strings[got] = xstrdup("XPA$OK\n");
-    lens[got+1] = lens[got] + strlen(strings[got]);
-    got++;
-  }
-  /* write one buffer load: we have to avoid multiple writes in a row
-     because tcp_delay buffers these (i.e., the Nagle algorithm) and kills
-     the performance */
-  if( got > 0 ){
-    tstring = (char *)xcalloc(lens[got]+1, sizeof(char));
-    for(i=0; i<got; i++){
-      if( strings[i] ){
-	strcpy(&(tstring[lens[i]]), strings[i]);
-      }
-    }
-    XPAPutBuf(NULL, xreq->sock, tstring, lens[got], XPALongTimeout());
-    for(i=0; i<got; i++){
-      if( strings[i] )
-	xfree(strings[i]);
-    }
-    if( tstring )
-      xfree(tstring);
-  }
-  if( strings )
-    xfree(strings);
-  if( lens )
-    xfree(lens);
-  return(got);
-
-error:
-    strcpy(tbuf,
-   "XPA$ERROR xpans 'lookup' requires: class:name [type] [user]\n");
-    XPAPuts(NULL, xreq->sock, tbuf, XPALongTimeout());
-    return(0);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	HelpReq
- *
- * Purpose:	send help message
- *
- * Returns:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void
-HelpReq (Req xreq, int flag)
-#else
-static void HelpReq(xreq, flag)
-     Req xreq;
-     int flag;
-#endif
-{
-  /* XPAPuts(NULL, xreq->sock, helpbuf, XPALongTimeout()); */
-  XPAPutBuf(NULL, xreq->sock, helpbuf, strlen(helpbuf), XPALongTimeout());
-  if( flag )
-    XPAPuts(NULL, xreq->sock, "XPA$OK\n", XPALongTimeout());
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	ListReq
- *
- * Purpose:	list all entries in the XPA list
- *
- * Returns:	number of entries listed
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-ListReq (Req xreq, int flag)
-#else
-static int ListReq(xreq, flag)
-     Req xreq;
-     int flag;
-#endif
-{
-  int got=0;
-  char tbuf[SZ_LINE];
-  Req req;
-  Entry entry;
-
-  for(req=reqhead; req!=NULL; req=req->next){
-    for(entry=req->entry; entry!=NULL; entry=entry->next){
-      snprintf(tbuf, SZ_LINE, "%s %s %s %s %s\n",
-	       entry->xclass, entry->name,
-	       entry->type, entry->method, entry->user);
-      XPAPuts(NULL, xreq->sock, tbuf, XPALongTimeout());
-      got++;
-    }
-  }
-  if( flag )
-    XPAPuts(NULL, xreq->sock, "XPA$OK\n", XPALongTimeout());
-  return(got);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	StatusReq
- *
- * Purpose:	send short "alive" message to inquiring server
- *
- * Returns:	NONE
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void
-StatusReq (Req xreq)
-#else
-static void StatusReq(xreq)
-     Req xreq;
-#endif
-{
-  XPAPuts(NULL, xreq->sock, "XPA$OK\n", XPALongTimeout());
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	VersionReq
- *
- * Purpose:	send version info to inquiring server
- *
- * Returns:	NONE
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void
-VersionReq (Req xreq, char *vstr)
-#else
-static void VersionReq(xreq, vstr)
-     Req xreq;
-     char *vstr;
-#endif
-{
-  int ip=0;
-  int dowarn=0;
-  char tbuf[SZ_LINE];
-
-  /* version check: server version should be <= our version */
-  if( word(vstr, tbuf, &ip) ){
-    dowarn = (XPAVersionCheck(XPA_VERSION, tbuf)>0);
-  }
-  else{
-    strcpy(tbuf, "unknown/pre-2.1");
-    dowarn = 1;
-  }
-  if( dowarn )
-    XPAVersionWarn(tbuf, XPA_VERSION);
-  snprintf(tbuf, SZ_LINE, "XPA$VERSION %s\n", XPA_VERSION);
-  XPAPuts(NULL, xreq->sock, tbuf, XPALongTimeout());
-}
-
-#ifdef ANSI_FUNC
-void
-usage (char *s)
-#else
-void usage(s)
-     char *s;
-#endif
-{
-    fprintf(stderr, "\n");
-    fprintf(stderr, "usage: xpans [-h] [-e] [-k msec] [-l log] [-p port] [-s slog] [-P n]  \n");
-    fprintf(stderr, "switches:\n");
-    fprintf(stderr, "\t-h\tprint this message\n");
-    fprintf(stderr, "\t-e\texit when there are no more XPA connections\n");
-    fprintf(stderr, "\t-k msec\tsend keepalive messages every n sec\n");
-    fprintf(stderr, "\t-l file\tlog data base entries to specified file\n");
-    fprintf(stderr, "\t-p port\tlisten for connections on specified port\n");
-    fprintf(stderr, "\t-s file\tlog security info to specified file\n");
-    fprintf(stderr, "\t-P 1|2\taccept proxy requests (1) using separate thread (2) \n");
-    fprintf(stderr, "\t--version display version and exit\n");
-    fprintf(stderr, "\n(version: %s)\n", XPA_VERSION);
-    exit(1);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	KeepAliveReq
- *
- * Purpose:	send keep alive to all open connections
- *
- * Returns:	number of entries processed
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static int 
-KeepAliveReq (void)
-#else
-static int KeepAliveReq()
-#endif
-{
-  int got=0;
-  Req req;
-
-  /* return if keepalive is turned off */
-  if( !keepalive )
-    return(0);
-  /* get current time */
-  curt = time(NULL);
-  /* if keep alive time has passed, send keep alive messages */
-  if( (curt - lastt) > ksec ){
-    for(req=reqhead; req!=NULL; req=req->next){
-      send(req->sock, " ", 1, MSG_OOB);
-      got++;
-    }
-    lastt = curt;
-  }
-  return(got);
-}
-
-#ifdef ANSI_FUNC
-int 
-main (int argc, char **argv)
-#else
-int
-main(argc, argv)
-     int argc;
-     char **argv;
-#endif
-{
-  char lbuf[SZ_LINE];
-  char tbuf[SZ_LINE];
-  char cmd[SZ_LINE];
-  char method[SZ_LINE];
-  int c;
-  int sock2;
-  int width;
-  int got;
-  int wp;
-  int cmdport;
-  int sval;
-  int nerr=0;
-  int oum;
-  int llen;
-  int reuse_addr=1;
-  int keep_alive=1;
-  unsigned int ip;
-  unsigned int cmdip;
-  unsigned short port=0;
-  socklen_t slen=sizeof(struct sockaddr_in);
-  struct sockaddr_in sock_in;
-  struct sockaddr_in sock_in2;
-#if HAVE_LIBPTHREAD
-  pthread_t tid;
-#endif
-#if HAVE_SYS_UN_H
-  struct sockaddr_un sock_un;
-  struct sockaddr_un sock_un2;
-  char lockfile[SZ_LINE];
-  int lockfd=-1;
-  struct flock lock;
-#endif
-  fd_set readfds;
-  struct timeval tv;
-  struct timeval *tvp;
-  Req req, treq;
-  XPA xpa;
-
-  /* display version and exit, if necessary */
-  if( (argc == 2) && !strcmp(argv[1], "--version") ){
-    fprintf(stderr, "%s\n", XPA_VERSION);
-    exit(0);
-  }
-
-  /* init the XPA environment */
-  XPAInitEnv();
-
-  /* Disable SIGPIPE so we do not die if the client dies.
-   * Rather, we will get an EOF on reading or writing.
-   */
-  xsignal_sigpipe();
-
-  /* we want the args in the same order in which they arrived, and
-     gnu getopt sometimes changes things without this */
-  putenv("POSIXLY_CORRECT=true");
-
-  /* process command line args */
-  while ((c = getopt(argc, argv, "ef:hk:l:p:P:s:")) != -1){
-    switch(c){
-    case 'h':
-      usage(argv[0]);
-      exit(0);
-    case 'e':
-      exconn = 1;
-      break;
-    case 'f':
-#if HAVE_SYS_UN_H
-      /* method is unix with specified file */
-      putenv(xstrdup("XPA_METHOD=unix"));
-      snprintf(tbuf, SZ_LINE, "XPA_NSUNIX=%s", optarg);
-      putenv(xstrdup(tbuf));
-      break;
-#else
-      fprintf(stderr, "XPA$ERROR: UNIX sockets not supported on this host\n");
-      exit(1);
-      break;
-#endif
-    case 'k':
-      fprintf(stderr,
-      "XPA$KEEPALIVE: URG TCP data is changed by some Cisco routers into in-band data.\n");
-      fprintf(stderr, 
-      "Encountering such a router will break the keep-alive function and may break your\n");
-      fprintf(stderr, "XPA server as well. Proceed with caution!\n");
-      keepalive = 1;
-      ksec = atoi(optarg);
-      if( ksec <= 0 )
-	ksec = 1;
-      break;
-    case 'l':
-      logfile = optarg;
-      break;
-    case 'p':
-      /* method is inet with specified port */
-      putenv(xstrdup("XPA_METHOD=inet"));
-      snprintf(tbuf, SZ_LINE, "XPA_NSINET=$host:%d", atoi(optarg));
-      putenv(xstrdup(tbuf));
-      break;
-    case 'P':
-      if( istrue(optarg) )
-	doproxy = 1;
-      else if( isfalse(optarg) )
-	doproxy = 0;
-      else
-	doproxy = atoi(optarg);
-      if( doproxy < 0 )
-	doproxy = 0;
-#if HAVE_LIBPTHREAD==0
-      if( doproxy >= 2 ){
-	fprintf(stderr,
-	"XPA$ERROR: xpans not built with thread support on this host\n");
-	exit(1);
-      }
-#endif
-      break;
-    case 's':
-      if( !strcasecmp(optarg, "stdout") ){
-	securefp = stdout;
-      }
-      else if( (securefp=fopen(optarg, "w")) == NULL ){
-	perror("securefp");
-	exit(1);
-      }
-      break;
-    }
-  }
-
-  /* get default ip and port */
-  strcpy(method, XPANSMethod(NULL, 0));
-  mtype = XPAMethod(method);
-  localhost_ip = gethostip("$localhost");
-
-  /* start secure logging, if necessary */
-  SecureLog("Starting xpans: %s", method);
-  /* set up communication method */
-  switch(mtype){
-  case XPA_INET:
-    XPAParseIpPort(method, &ip, &port);
-    if( (sock = xsocket(AF_INET, SOCK_STREAM, 0)) < 0 ){
-      if( XPAVerbosity() > 1 )
-	perror("xpans socket()");
-      exit(1);
-    }
-    setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE,
-	       (char *)&keep_alive, sizeof(keep_alive));
-    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
-	       (char *)&reuse_addr, sizeof(reuse_addr));
-    memset((char *)&sock_in, 0, sizeof(sock_in));
-    sock_in.sin_family = AF_INET;
-    /* localhost only */
-    if( ip == localhost_ip )
-      sock_in.sin_addr.s_addr = htonl(ip);
-    /* any address will do */
-    else
-      sock_in.sin_addr.s_addr = htonl(INADDR_ANY);
-    sock_in.sin_port = htons(port);
-    /* bind to a port -- an error indicates that another xpans is running */
-    if( xbind(sock, (struct sockaddr *)&sock_in, sizeof(sock_in)) < 0 ){
-      if( XPAVerbosity() > 1 )
-	perror("xpans bind()");
-      exit(1);
-    }
-    SecureLog("Opening INET socket: %d", sock);
-    break;
-#if HAVE_SYS_UN_H
-  case XPA_UNIX:
-    /* with unix sockets, we lock a special file to signal any new xpans
-       process that it is not needed. This behavior mimicks the bind()
-       error with inet sockets */
-    snprintf(lockfile, SZ_LINE, "%s-lock", method);
-    if( (lockfd=open(lockfile, O_CREAT|O_RDWR, 0666)) >=0 ){
-      lock.l_type = F_WRLCK;	/* F_RDLCK, F_WRLCK, F_UNLCK */
-      lock.l_start = 0;		/* byte offset, relative to l_whence */
-      lock.l_whence = SEEK_SET;	/* SEEK_SET, SEE_CUR, SEEK_END */
-      lock.l_len = 1;		/* #bytes (0 means to EOF) */
-      /* if we can't get the lock, there is an xpans already running */
-      if( xfcntl(lockfd, F_SETLK, &lock) < 0 ){
-	close(lockfd);
-	if( XPAVerbosity() > 1 )
-	  fprintf(stderr, "XPA$ERROR: xpans already running\n");
-	exit(1);
-      }
-    }
-    unlink(method);
-    if( (sock = xsocket(AF_UNIX, SOCK_STREAM, 0)) < 0 ){
-      if( XPAVerbosity() > 1 )
-	perror("xpans socket()");
-      exit(1);
-    }
-    setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE,
-	       (char *)&keep_alive, sizeof(keep_alive));
-    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
-	       (char *)&reuse_addr, sizeof(reuse_addr));
-    memset((char *)&sock_un, 0, sizeof(sock_un));
-    sock_un.sun_family = AF_UNIX;
-    strcpy(sock_un.sun_path, method);
-    /* unset umask so that everyone can read and write */
-    oum = umask(0);
-    /* bind to a port */
-    if( xbind(sock, (struct sockaddr *)&sock_un, sizeof(sock_un)) < 0 ){
-      if( XPAVerbosity() > 1 )
-	perror("xpans bind()");
-      exit(1);
-    }
-    /* reset umask */
-    umask(oum);
-    SecureLog("opened UNIX socket: %d", sock);
-    break;
-#endif
-  default:
-    break;
-  }
-
-  /* listen for connections */
-  if( listen(sock, XPA_MAXLISTEN) < 0 ){
-    if( XPAVerbosity() > 1 )
-      perror("xpans listen()");
-    exit(1);
-  }
-  /* make sure we close on exec */
-  xfcntl(sock, F_SETFD, FD_CLOEXEC);
-
-  /* add an XPA access point for external processing */
-  if( !(xpa=XPANew(XPANS_CLASS, XPANS_NAME, helpbuf,
-		   send_cb,    NULL, "fillbuf=false",
-		   receive_cb, NULL, "fillbuf=false")) ){
-    if( XPAVerbosity() > 1 )
-      fprintf(stderr, "XPA$ERROR: failed to create access point for xpans\n");
-    exit(1);
-  }
-  SecureLog("XPA access point: %s", xpa->name);
-
-  /* init select parameters */
-  width = FD_SETSIZE;
-
-#if HAVE_LIBPTHREAD
-  /* start up new thread for XPA main loop, if necessary */
-  if( doproxy >= 2 ){
-    if( pthread_create(&tid, NULL, doxpaloop, NULL) != 0 ){
-      fprintf(stderr,
-	      "XPA$ERROR: can't create new thread for XPA handler in xpans\n");
-      exit(1);
-    }
-  }
-#endif
-
-  /* enter processing loop */
-  while( 1 ){
-    /* reset flag */
-    FD_ZERO(&readfds);
-    /* add main listening socket */
-    FD_SET(sock, &readfds);
-    /* add request lines */
-    for(got=0, req=reqhead; req!=NULL; req=req->next){
-      FD_SET(req->sock, &readfds);
-      got++;
-    }
-    /* add XPA selections */
-    if( doproxy < 2 ) XPAAddSelect(NULL, &readfds);
-    /* if we once had entries but do not have them now, we might be done */
-    if( exconn && nentry && !got ){
-      goto done;
-    }
-    if( keepalive ){
-      tv.tv_sec = ksec;
-      tv.tv_usec = 0;
-      tvp = &tv;
-    }
-    else{
-      tvp = NULL;
-    }
-    /* wait for next request */
-    sval = xselect(width, &readfds, NULL, NULL, tvp);
-    if( sval > 0 ){
-#if HAVE_LIBPTHREAD
-      /* lock the mutex before processing a reqest */
-      if( doproxy >= 2 ) pthread_mutex_lock(&xpans_mutex);
-#endif
-      /* process a new major request */
-      if( FD_ISSET(sock, &readfds) ){
-	/* new request */
-	switch(mtype){
-	case XPA_INET:
-	  while( 1 ){
-	    slen = sizeof(struct sockaddr_in);
-	    if((sock2=xaccept(sock, (struct sockaddr *)&sock_in2, &slen))>=0){
-	      cmdip = ntohl(sock_in2.sin_addr.s_addr);
-	      cmdport = ntohs(sock_in2.sin_port);
-	      /* make sure we close on exec */
-	      xfcntl(sock2, F_SETFD, FD_CLOEXEC);
-	      NewReq(sock2, cmdip, cmdport);
-	      SecureLog("accept %d: %x:%d (%s)",
-			sock2, cmdip, cmdport, getiphost(cmdip));
-	      break;
-	    }
-	    else{
-	      if( errno == EINTR )
-		continue;
-	      else
-		break;
-	    }
-	  }
-	  break;
-#if HAVE_SYS_UN_H
-	case XPA_UNIX:
-	  while( 1 ){
-	    slen = sizeof(struct sockaddr_un);
-	    if( (sock2=xaccept(sock, (struct sockaddr *)&sock_un2, &slen))>=0){
-	      /* make sure we close on exec */
-	      xfcntl(sock2, F_SETFD, FD_CLOEXEC);
-	      NewReq(sock2, 0, 0);
-	      SecureLog("accept from local socket");
-	      break;
-	    }
-	    else{
-	      if( errno == EINTR )
-		continue;
-	      else
-		break;
-	    }
-	  }
-	  break;
-#endif
-	default:
-	  break;
-	}
-      }
-      /* process an existing request line */
-      for(got=0, req=reqhead; req!=NULL; ){
-	treq = req->next;
-	if( FD_ISSET(req->sock, &readfds) ){
-	  FPRINTF((stderr, "%sxpans existing request: %d\n", _sp, req->sock));
-	  if( XPAGets(NULL, req->sock, lbuf, SZ_LINE, XPAShortTimeout()) >0 ){
-	    llen = strlen(lbuf) - 1;
-	    if( (lbuf[llen]) == '\n' ){
-	      /* ignore a single new-line, its a keep-alive message */
-	      if( llen == 0){
-		FPRINTF((stderr, "%sxpans ignoring keep-alive\n", _sp));
-		req = treq;
-		continue;
-	      }
-	      /* else remove new-line */
-	      else{
-		lbuf[llen] = '\0';
-	      }
-	    }
-	    FPRINTF((stderr, "%sxpans request: %s\n", _sp, lbuf));
-	    SecureLog("cmd %d: %s", req->sock, lbuf);
-	    /* process another request from this process */
-	    wp = 0;
-	    /* get first token: command */
-	    if( !word(lbuf, cmd, &wp) ){
-	      strcpy(tbuf, "XPA$ERROR no xpans command specified\n");
-	      XPAPuts(NULL, req->sock, tbuf, XPALongTimeout());
-	    }
-	    else{
-	      /* skip white space */
-	      while( isspace((int)lbuf[wp]) )
-		wp++;
-	      /* lookup the command */
-	      if( !strcmp(cmd, "status") ){
-		StatusReq(req);
-	      }
-	      else if( !strcmp(cmd, "version") ){
-		VersionReq(req, &(lbuf[wp]));
-	      }
-	      else if( !strcmp(cmd, "add") ){
-		AddReq(req, &(lbuf[wp]), 1);
-	      }
-	      else if( !strcmp(cmd, "addproxy") ){
-		AddProxyReq(req, &(lbuf[wp]), 1);
-	      }
-	      else if( !strcmp(cmd, "del") ){
-		DelReq(req, &(lbuf[wp]), 1);
-	      }
-	      else if( !strcmp(cmd, "delproxy") ){
-		DelProxyReq(req, &(lbuf[wp]), 1);
-	      }
-	      else if( !strcmp(cmd, "help") ){
-		HelpReq(req, 1);
-	      }
-	      else if( !strcmp(cmd, "list") ){
-		ListReq(req, 1);
-	      }
-	      else if( !strcmp(cmd, "lookup") ){
-		LookupReq(req, &(lbuf[wp]), 1);
-	      }
-	      else{
-		SecureLog("ignoring unknown command");
-		snprintf(tbuf, SZ_LINE,
-			 "XPA$ERROR unknown xpans request: %s\n", lbuf);
-		XPAPuts(NULL, req->sock, tbuf, XPALongTimeout());
-	      }
-	    }
-	  }
-	  else{
-	    /* process dies: delete all entries associated with this sock */
-	    FPRINTF((stderr, "%sxpans request died: %d\n", _sp, req->sock));
-	    DelReq(req, NULL, 1);
-	  }
-	}
-	req = treq;
-      }
-
-      /* process xpa requests */
-      if( doproxy < 2 ) XPAProcessSelect(&readfds, 0);
-#if HAVE_LIBPTHREAD
-      /* unlock the mutex */
-      if( doproxy >= 2 ) pthread_mutex_unlock(&xpans_mutex);
-#endif
-    }
-    /* keep alive timer went off */
-    else if( sval == 0 ){
-      ;
-    }
-    /* error on select() */
-    else{
-      /* restart system call if interrupted */
-      if( errno != EINTR ){
-	/* all others are problematic */
-	if( XPAVerbosity() > 1 )
-	  perror("xpans select()");
-	if( ++nerr >= MAX_ERRORS ){
-	  if( XPAVerbosity() > 1 )
-	    fprintf(stderr,
-		    "XPA$ERROR: too many select() errors in xpans\n");
-	  goto done;
-	}
-      }
-    }
-    /* see if its time to send keepalive probe */
-    if( keepalive )
-      KeepAliveReq();
-  }
-
-done:
-  if( sock >=0 ) close(sock);
-  if( securefp && (securefp != stdout) ) fclose(securefp);
-#if HAVE_SYS_UN_H
-  if( mtype == XPA_UNIX ){
-    unlink(method);
-    if( lockfd >= 0 ){
-      close(lockfd);
-      unlink(lockfile);
-    }
-  }
-#endif
-  XPAFree(xpa);
-  return(0);
-}
diff --git a/xpa/xpap.h b/xpa/xpap.h
deleted file mode 100644
index ccf5fd8..0000000
--- a/xpa/xpap.h
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * xpa.h - include file for the X Public Access mechanism
- *
- */
-#ifndef	__xpap_h
-#define	__xpap_h
-
-#if HAVE_CONFIG_H
-#include <conf.h>
-#endif
-
-/* avoid use of system -- its not secure */
-#if USE_SPAWN == 0
-#define USE_LAUNCH 1
-#endif
-
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#if HAVE_STRING_H
-#include <string.h>
-#endif
-#if HAVE_STRINGS_H
-#include <strings.h>
-#endif
-#if HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#if HAVE_MALLOC_H
-#include <malloc.h>
-#endif
-#if HAVE_GETOPT_H
-#include <getopt.h>
-#endif
-#if HAVE_SETJMP_H
-#include <setjmp.h>
-#endif
-#if HAVE_PWD_H
-#include <pwd.h>
-#endif
-#include <ctype.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <signal.h>
-#include <time.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-#if HAVE_SYS_SELECT_H
-#include <sys/select.h>
-#endif
-#ifdef __STDC__
-#include <stdarg.h>
-#else
-#include <varargs.h>
-#endif
-#include <xport.h>
-#include <tcp.h>
-#include <word.h>
-#include <xalloc.h>
-#include <find.h>
-#if USE_LAUNCH
-#include <xlaunch.h>
-#endif
-#include <timedconn.h>
-
-/* B.Schoenhammer@bit-field.de 2009-09-21 */
-#if HAVE_MINGW32
-#ifdef HAVE_ATEXIT
-#undef HAVE_ATEXIT
-#endif
-#endif
-
-/* make sure socklen_t is available, since some systems don't use it */
-#ifndef HAVE_SOCKLEN_T
-#define socklen_t int
-#endif
-
-/* the flag for setting non-blocking I/O varies a bit from Unix to Unix  */
-#ifndef O_NONBLOCK 
-#ifdef O_NDELAY
-#define O_NONBLOCK O_NDELAY
-#endif
-#endif
-
-#if HAVE_MINGW32==0
-/* we always want to know about errors when a read/write would block */
-#ifndef EWOULDBLOCK
-#ifdef EAGAIN
-#define EWOULDBLOCK EAGAIN
-#endif
-#else
-#ifndef EAGAIN
-#ifdef EWOULDBLOCK
-#define EAGAIN EWOULDBLOCK
-#endif
-#endif
-#endif
-#endif
-
-/* not all systems define shutdown() params */
-#ifndef SHUT_RDWR
-#define SHUT_RDWR 2
-#endif
-
-/* cisco routers can clear the URG flag by default, so use in-band */
-#define USE_KA_OOB	0
-/* KA_TYPE: 1->only access points, 2->only proxies 3->both */
-#define DEF_KA_TYPE	2
-
-/* for listen() routine */
-#define XPA_MAXLISTEN 1000
-
-/* status flags for xpa server */
-#define XPA_STATUS_ACTIVE 	1
-#define XPA_STATUS_FREE 	2
-#define XPA_STATUS_READBUF	4
-#define XPA_STATUS_ENDBUF	8
-
-/* status flags for xpa clients */
-#define XPA_CLIENT_IDLE		0
-#define XPA_CLIENT_ACTIVE	1
-#define XPA_CLIENT_PROCESSING	2
-#define XPA_CLIENT_WAITING	3
-
-/* server mode flags for receive, send, info */
-/* crafted so that they are turned on by default */
-#define XPA_MODE_BUF		1
-#define XPA_MODE_FILLBUF	2
-#define XPA_MODE_FREEBUF	4
-#define XPA_MODE_ACL		8
-
-/* default modes for receive, send, info */
-#define XPA_DEF_MODE_REC  (XPA_MODE_BUF|XPA_MODE_FILLBUF|XPA_MODE_FREEBUF|XPA_MODE_ACL)
-#define XPA_DEF_MODE_SEND (XPA_MODE_BUF|XPA_MODE_FREEBUF|XPA_MODE_ACL)
-#define XPA_DEF_MODE_INFO (XPA_MODE_ACL)
-
-/* default client info string */
-#define XPA_DEF_CLIENT_INFO	"NONE"
-
-/* client mode flags */
-#define XPA_CLIENT_BUF		1
-#define XPA_CLIENT_FD		2
-#define XPA_CLIENT_ACK		4
-#define XPA_CLIENT_VERIFY	8
-
-/* client select mode flags */
-#define XPA_CLIENT_SEL_XPA	1
-#define XPA_CLIENT_SEL_FORK	2
-
-/* error codes -- these must match the strings in xpaMessbuf in xpa.c */
-/* always make 0 an OK return */
-#define XPA_RTN_OK	0
-#define XPA_RTN_NOAUTH	1
-#define XPA_RTN_NOCONN	2
-#define XPA_RTN_NOHOST	3
-#define XPA_RTN_NOBUF	4
-#define XPA_RTN_NOCMD	5
-#define XPA_RTN_NOREC	6
-#define XPA_RTN_NOSEND	7
-#define XPA_RTN_NOINFO	8
-#define XPA_RTN_UNCMD	9
-#define XPA_RTN_NOCMD2	10
-#define XPA_RTN_NOTARG	11
-#define XPA_RTN_NOCMD3	12
-#define XPA_RTN_NODATA	13
-#define XPA_RTN_ILLCMD	14
-
-/* connection methods */
-#define XPA_INET	1
-#define XPA_UNIX	2
-
-/* select loop types */
-#define XPA_XPA_LOOP	1
-#define XPA_XT_LOOP	2
-#define XPA_TCL_LOOP	3
-
-/* name server management */
-#define XPA_NSINET	"$host:$port"
-#define XPA_NSPORT	14285
-#define XPA_NSUNIX	"xpans_unix"
-#define XPA_RETRIES	10
-#define XPA_NSDELAY	150
-
-/* access control */
-#define XPA_ACLS	"gisa"
-#define XPA_ACLFILE	"$HOME/acls.xpa"
-#define XPA_DEFACL	"*:* $host +; *:* $localhost +"
-
-/* port management */
-#define XPA_DEFPORT	28571
-#define XPA_PORTFILE	"$HOME/ports.xpa"
-
-/* misc */
-#define XPA_IOSIZE     		4096
-#define XPA_BIOSIZE    		204800
-
-#ifndef HAVE_CYGWIN
-#define XPA_CONNECT_TIMEOUT_MODE 1
-#else
-/* cygwin does not support interruptible connect(), so we have
-   to use non-blocking connect, which is less portable in general */
-#define XPA_CONNECT_TIMEOUT_MODE 2
-#endif
-
-/* these can be changed by user environment variable */
-#define XPA_MAXHOSTS		100
-#define XPA_SHORT_TIMEOUT	15
-#define XPA_LONG_TIMEOUT	180
-#define XPA_CONNECT_TIMEOUT	10
-#define XPA_TMPDIR		"/tmp/.xpa"
-#define XPA_VERBOSITY		1
-#define XPA_IOCALLSXPA		0
-
-#define LOCALIP(ip)   ((ip==gethostip("$localhost"))||(ip==gethostip("$host")))
-
-#if HAVE_CYGWIN||HAVE_MINGW32
-#define XPANSNAME "xpans.exe"
-#else
-#define XPANSNAME "xpans"
-#endif
-
-#define XPANS_CLASS "XPANS"
-#define XPANS_NAME  "xpans"
-
-/* for debugging */
-#define _sp	XPALevelSpaces()
-
-#include <xpa.h>
-
-#endif /* __xpap.h */
diff --git a/xpa/xpaset.c b/xpa/xpaset.c
deleted file mode 100644
index 4e4d8c2..0000000
--- a/xpa/xpaset.c
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-#include <xpap.h>
-
-extern char *optarg;
-extern int optind;
-
-#ifdef ANSI_FUNC
-void 
-usage (char *s)
-#else
-void usage(s)
-     char *s;
-#endif
-{
-    fprintf(stderr, "\n");
-    fprintf(stderr, "usage:\n");
-    fprintf(stderr, "  <data> | %s [-h] [-i nsinet] [-m method] [-n] [-p] [-s] [-t sval,lval] [-u users] <tmpl|host:port> [paramlist]\n", s);
-    fprintf(stderr, "\n");
-    fprintf(stderr, "switches:\n");
-    fprintf(stderr, "\t-h\tprint this message\n");
-    fprintf(stderr, "\t-i\toverride XPA_NSINET environment variable\n");
-    fprintf(stderr, "\t-m\toverride XPA_METHOD environment variable\n");
-    fprintf(stderr, "\t-n\tdon't wait for message after server completes\n");
-    fprintf(stderr, "\t-p\tdon't read (or send) buf data from stdin\n");
-    fprintf(stderr, "\t-s\tserver mode\n");
-    fprintf(stderr, "\t-t \toverride XPA_[SHORT,LONG]_TIMEOUT environment variables\n");
-    fprintf(stderr, "\t-u\toverride XPA_NSUSERS environment variable\n");
-    fprintf(stderr, "\t-v\tverify message to stdout\n");
-    fprintf(stderr, "\t--version display version and exit\n");
-    fprintf(stderr, "\n");
-    fprintf(stderr, "Data will be sent to access points matching the template or host:port.\n");
-    fprintf(stderr, "Templates are of the form [class:]name. Wildcards *,?,[] are accepted.\n");
-    fprintf(stderr, "A set of qualifying parameters can be appended.\n");
-    fprintf(stderr, "\n");
-    fprintf(stderr, "examples:\n");
-    fprintf(stderr, "\tcsh> xpaset ds9 fits foo.fits < foo.fits\n");
-    fprintf(stderr, "\tcsh> echo \"stop\" | xpaset bynars:28571\n");
-    fprintf(stderr, "\n(version: %s)\n", XPA_VERSION);
-    exit(1);
-}
-
-#ifdef ANSI_FUNC
-int 
-main (int argc, char **argv)
-#else
-int
-main(argc, argv)
-     int argc;
-     char **argv;
-#endif
-{
-  int i;
-  int c;
-  int got;
-  int lp;
-  int errcode=0;
-  int server=0;
-  int hmax=XPA_MAXHOSTS;
-  char *paramlist=NULL;
-  char *xtemplate=NULL;
-  char lbuf[SZ_LINE];
-  char tbuf[SZ_LINE];
-  char mode[SZ_LINE];
-  char cmd[SZ_LINE];
-  char *s;
-  char **errs=NULL;
-  char **names=NULL;
-  int fd;
-  XPA xpa=NULL;
-
-  /* display version and exit, if necessary */
-  if( (argc == 2) && !strcmp(argv[1], "--version") ){
-    fprintf(stderr, "%s\n", XPA_VERSION);
-    exit(0);
-  }
-
-  /* make sure we have enough arguments */
-  if( argc < 2 )
-    usage(argv[0]);
-
-  /* start with no mode flag */
-  *mode = '\0';
-
-  /* read from stdin */
-  fd = fileno(stdin);
-
-  /* we want the args in the same order in which they arrived, and
-     gnu getopt sometimes changes things without this */
-  putenv("POSIXLY_CORRECT=true");
-
-  /* process switch arguments */
-  while ((c = getopt(argc, argv, "hi:m:npst:u:vwW")) != -1){
-    switch(c){
-    case 'h':
-      usage(argv[0]);
-    case 'i':
-      snprintf(cmd, SZ_LINE, "XPA_NSINET=%s", optarg);
-      putenv(xstrdup(cmd));
-      break;
-    case 'm':
-      snprintf(cmd, SZ_LINE, "XPA_METHOD=%s", optarg);
-      putenv(xstrdup(cmd));
-      break;
-    case 'n':
-      if( *mode != '\0' )
-	strcat(mode, ",");
-      strcat(mode, "ack=false");
-      break;
-    case 'p':
-      fd = -1;
-      break;
-    case 's':
-      server = 1;
-      if( xpa == NULL )
-	xpa = XPAOpen(NULL);
-      break;
-    case 't':
-      {
-	int xip=0;
-	char xbuf[SZ_LINE];
-	newdtable(",;");
-	if( word(optarg, xbuf, &xip) && *xbuf && (*xbuf != '*') ){
-	  snprintf(cmd, SZ_LINE, "XPA_SHORT_TIMEOUT=%s", xbuf);
-	  putenv(xstrdup(cmd));
-	}
-	if( word(optarg, xbuf, &xip) && *xbuf && (*xbuf != '*') ){
-	  snprintf(cmd, SZ_LINE, "XPA_LONG_TIMEOUT=%s", xbuf);
-	  putenv(xstrdup(cmd));
-	}
-	freedtable();
-      }
-      break;
-    case 'u':
-      snprintf(cmd, SZ_LINE, "XPA_NSUSERS=%s", optarg);
-      putenv(xstrdup(cmd));
-      break;
-    case 'v':
-      if( *mode != '\0' )
-	strcat(mode, ",");
-      strcat(mode, "verify=true");
-      break;
-    /* for backward compatibility with 1.0 */
-    case 'w':
-    case 'W':
-      break;
-    }
-  }
-
-  /* no explicit host:port specified, so we should have a name */
-  if( optind >= argc ){
-    /* in server mode, we can skip the host on the command line */
-    if( !server )
-      usage(argv[0]);
-  }
-  else{
-    xtemplate = xstrdup(argv[optind]);
-    optind++;
-  }
-
-  /* make the paramlist */
-  paramlist = XPAArgvParamlist(argc, argv, optind);
-
-  /* init variables for names and ports */
-  if( (s=(char *)getenv("XPA_MAXHOSTS")) != NULL )
-    hmax = atoi(s);
-  names = (char **)xcalloc(hmax, sizeof(char *));
-  errs  = (char **)xcalloc(hmax, sizeof(char *));
-
-again:
-  /* if we are in server mode, we might have to read a line from stdin
-     to grab the template and paramlist */
-  if( server && (xtemplate==NULL) ){
-    /* read description of template and paramlist */
-    if( fgets(lbuf, SZ_LINE, stdin) == NULL )
-      exit(errcode);
-    if( (*lbuf == '#') || (*lbuf == '\n') )
-      goto again;
-    lp = 0;
-    if( word(lbuf, tbuf, &lp) && !strcmp(tbuf, "xpaset") &&
-	word(lbuf, tbuf, &lp) ){
-      xtemplate = xstrdup(tbuf);
-      paramlist = xstrdup(&(lbuf[lp]));
-      nowhite(paramlist, paramlist);
-    }
-    else{
-      fprintf(stderr, "XPA$ERROR invalid command: %s", lbuf);
-      exit(++errcode);
-    }
-  }
-
-  /* process xpa requests */
-  got = XPASetFd(xpa, xtemplate, paramlist, mode, fd, names, errs, hmax);
-
-  /*  process errors */
-  if( got == 0 ){
-    fprintf(stderr, "XPA$ERROR no 'xpaset' access points match template: %s\n",
-	    xtemplate);
-    errcode++;
-  }
-  else{
-    /* display errors and free up strings */
-    for(i=0; i<got; i++){
-      if( errs[i] != NULL ){
-	fprintf(stderr, "%s", errs[i]);
-	xfree(errs[i]);
-	errcode++;
-      }
-      if( names[i] != NULL )
-	xfree(names[i]);
-    }
-  }
-
-  /* free the paramlist */
-  if( paramlist!= NULL ){
-    xfree(paramlist);
-    paramlist = NULL;
-  }
-  /* and the template */
-  if( xtemplate != NULL ){
-    xfree(xtemplate);
-    xtemplate = NULL;
-  }
-
-  /* if we are in server mode, go back for more */
-  if( server )
-    goto again;
-  /* else exit */
-  else{
-    /* clean up */
-    if( errs )  xfree(errs);
-    if( names ) xfree(names);
-    XPACleanup();
-    exit(errcode);
-  }
-  return(0);
-}
diff --git a/xpa/xpatests b/xpa/xpatests
deleted file mode 100755
index 8362ea8..0000000
--- a/xpa/xpatests
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/sh
-
-if [ x"`xpaaccess i_xpa`" != xyes ]; then
-  echo "please start stest before running xpatests ..."
-  exit 1
-fi
-
-LOOPS=100
-TARGET="xpa*"
-ITARGET="i_xpa"
-
-while [ x"$1" != x ]; do
-    case $1 in
-	-a) FLAGS="$FLAGS -m ack=false"
-	    shift
-	    continue;;
-
-	-d) shift
-	    FLAGS="$FLAGS -d $1"
-	    shift
-	    continue;;
-
-	-f) shift
-	    FLAGS="$FLAGS $1"
-	    shift
-	    continue;;
-
-	-l) shift
-	    LOOPS=$1
-	    shift
-	    continue;;
-
-	-q) FLAGS="$FLAGS -q"
-	    shift
-	    continue;;
-
-	-s) shift
-	    SUFFIX=.$1
-	    shift
-	    continue;;
-
-	-t) shift
-	    TARGET=$1
-	    shift
-	    continue;;
-    esac
-done
-FLAGS="-l $LOOPS $FLAGS"
-
-echo " "
-echo "starting xpaget test with flags: $FLAGS"
-./ctest${SUFFIX} ${FLAGS} -g "$TARGET"
-
-echo " "
-echo "starting xpaset test with flags: $FLAGS"
-./ctest${SUFFIX} ${FLAGS} -s "$TARGET"
-
-echo " "
-echo "starting xpaget and xpaset test with flags: $FLAGS"
-./ctest${SUFFIX} ${FLAGS} -b "$TARGET"
-
-echo " "
-echo "starting xpainfo test with flags: $FLAGS"
-./ctest${SUFFIX} ${FLAGS} -i "$ITARGET"
-
-echo " "
-echo 'All done!'
diff --git a/xpa/xport.h b/xpa/xport.h
deleted file mode 100644
index 731abe5..0000000
--- a/xpa/xport.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *	Copyright (c) 1999-2004 Smithsonian Astrophysical Observatory
- */
-
-/*
- *
- * xport.h - include file for platform-dependent system calls
- *
- */
-#ifndef	__xport_h
-#define	__xport_h
-
-#if HAVE_CONFIG_H
-#include <conf.h>
-#endif
-
-#if HAVE_MINGW32
-
-#define FD_SETSIZE 8192
-#include <winsock2.h>
-#include <process.h>
-#include <io.h>
-
-#ifdef	EINPROGRESS
-#undef  EINPROGRESS
-#endif
-#define EINPROGRESS	WSAEINPROGRESS
-#ifdef	EINTR
-#undef  EINTR	
-#endif
-#define EINTR		WSAEINTR
-#ifdef ETIMEDOUT
-#undef  ETIMEDOUT
-#endif
-#define ETIMEDOUT	WSAETIMEDOUT
-#ifdef ECONNREFUSED
-#undef  ECONNREFUSED
-#endif
-#define ECONNREFUSED	WSAECONNREFUSED
-#ifdef EWOULDBLOCK
-#undef  EWOULDBLOCK
-#endif
-#define EWOULDBLOCK	WSAEWOULDBLOCK
-#ifdef EAGAIN
-#undef  EAGAIN	
-#endif
-#define EAGAIN		WSAEWOULDBLOCK
-
-#else
-
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/socket.h>                                                  
-#include <netinet/in.h>         /* struct in_addr, struct sockaddr_in */
-#include <netdb.h>              /* gethostbyname() */
-#include <arpa/inet.h>		/* inet_addr() */
-#if HAVE_SYS_UN_H
-#include <sys/un.h>
-#endif
-#if HAVE_CYGWIN
-#include <process.h>
-#endif
-
-#endif
-
-/* common definitions (i.e. not yet requiring platform differentiation) */
-
-#define xsocket(a,b,c)		socket(a,b,c)
-#define xbind(a,b,c)		bind(a,b,c)
-#define xaccept(a,b,c)		accept(a,b,c)
-#define xselect(a,b,c,d,e)	select(a,b,c,d,e)
-
-/* UNIX */
-#if HAVE_MINGW32==0
-
-#define xclose(a)		close(a)
-
-#define xfcntl(a,b,c)		fcntl(a,b,c)
-
-#define xfcntl_nonblock(a,b)				  \
-				b = fcntl(a, F_GETFL, 0); \
-				fcntl(a, F_SETFL, b|O_NONBLOCK)
-
-#define xfcntl_restore(a,b)	fcntl(a, F_SETFL, b)
-
-#define xsocketstartup()
-
-#define xsocketcleanup()
-
-#define xfd_set_stdin(a,b)	FD_SET(a,b)	
-#define xfd_isset_stdin(a,b)	(a >= 0) && FD_ISSET(a,b)	
-#define xfd_clr_stdin(a,b)	FD_CLR(a,b)	
-
-#define xsignal_sigpipe()	signal(SIGPIPE, SIG_IGN)
-
-#define xerrno			errno
-
-#define xmkdir(a,b)		mkdir(a,b)
-#define xchmod(a,b)		chmod(a,b)
-
-/* WINDOWS */
-#else
-
-#define xclose(a)		closesocket(a)
-
-#define xfcntl(a,b,c)
-
-#define xfcntl_nonblock(a,b)						\
-	{								\
-		int iomode=1;						\
-		ioctlsocket(a, FIONBIO, (u_long FAR *) &iomode);	\
-	}
-
-#define xfcntl_restore(a,b)						\
-	{								\
-		int iomode=0;						\
-		ioctlsocket(a, FIONBIO, (u_long FAR *) &iomode);	\
-	}
-
-#define xsocketstartup()					\
-	{							\
-		WSADATA wsaData;				\
-		WSAStartup(MAKEWORD(2,0), &wsaData);		\
-	}
-
-#define xsocketcleanup()	WSACleanup()
-
-#define xfd_set_stdin(a,b)	setmode(a, O_BINARY)
-
-#define xfd_isset_stdin(a,b)	(a >= 0)
-#define xfd_clr_stdin(a,b)
-
-#define xsignal_sigpipe()
-
-#define xerrno			WSAGetLastError()
-
-#define xmkdir(a,b)		mkdir(a)
-#define xchmod(a,b)		chmod(a,b)
-
-#endif
-
-#endif /* __xport.h */
diff --git a/xpa/xtloop.c b/xpa/xtloop.c
deleted file mode 100644
index f712a9e..0000000
--- a/xpa/xtloop.c
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- *	Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-#include <xpap.h>
-
-#if HAVE_XT
-
-#include <X11/Intrinsic.h>
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- * 			Private Routines and Data
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/* 
- *
- * record struct for maintining Xt info in Xt select loop
- *
- */
-typedef struct xpaxtrec{
-  int fd;
-  void *client_data;
-  XtInputId id;
-} *XPAXt, XPAXtRec;
-
-/* its such a pain to maintain this, so make it global! */
-static XtAppContext xpa_app=NULL;
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAXtHandler
- *
- * Purpose:	handle one request for an xpaset or xpaget
- *
- * Return:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-XPAXtHandler (XtPointer client_data, int *fd, XtInputId *id)
-#else
-static void XPAXtHandler(client_data, fd, id)
-     XtPointer client_data;
-     int *fd;
-     XtInputId *id;
-#endif
-{
-  XPAXt xptr = (XPAXt)client_data;
-  if( (xptr == NULL) || (xptr->client_data == NULL) )
-    return;
-  XPAHandler((XPA)xptr->client_data, xptr->fd);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAXtEnableOneInput
- *
- * Purpose:	Enable 1 XPA entry from the Xt event loop
- *
- * Results:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-XPAXtEnableOneInput (void *client_data)
-#else
-static void XPAXtEnableOneInput(client_data)
-     void *client_data;
-#endif
-{
-  XPAXt xptr = (XPAXt)client_data;
-  if( xptr == NULL )
-    return;
-  if( xptr->id != (XtInputId)NULL )
-    return;
-  if( xpa_app == NULL ){
-    xptr->id = XtAddInput(xptr->fd,
-			  (XtPointer)XtInputReadMask,
-			  (XtInputCallbackProc)XPAXtHandler,
-			  (XtPointer)xptr);
-  }
-  else{
-    xptr->id = XtAppAddInput(xpa_app, xptr->fd,
-			     (XtPointer)XtInputReadMask,
-			     (XtInputCallbackProc)XPAXtHandler,
-			     (XtPointer)xptr);
-  }
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAXtDisableOneInput
- *
- * Purpose:	Disable 1 XPA entry from the Xt event loop
- *
- * Results:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-XPAXtDisableOneInput (void *client_data)
-#else
-static void XPAXtDisableOneInput(client_data)
-     void *client_data;
-#endif
-{
-  XPAXt xptr = (XPAXt)client_data;
-  if( xptr == NULL )
-    return;
-  if( xptr->id == (XtInputId)NULL )
-    return;
-  XtRemoveInput(xptr->id);
-  xptr->id = (XtInputId)NULL;
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAXtAddOneInput
- *
- * Purpose:	Add 1 XPA entry to the Xt event loop
- *
- * Results:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void *
-XPAXtAddOneInput (void *client_data, int fd)
-#else
-static void *XPAXtAddOneInput(client_data, fd)
-     void *client_data;
-     int fd;
-#endif
-{
-  XPAXt xptr;
-  if( fd < 0 )
-    return(NULL);
-  xptr = (XPAXt)xcalloc(1, sizeof(XPAXtRec));
-  xptr->fd = fd;
-  xptr->client_data = client_data;
-  XPAXtEnableOneInput(xptr);
-  return(xptr);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAXtDelOneInput
- *
- * Purpose:	Delete 1 XPA entry from the Xt event loop (called by XPAFree)
- *
- * Results:	none
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-static void 
-XPAXtDelOneInput (void *client_data)
-#else
-static void XPAXtDelOneInput(client_data)
-     void *client_data;
-#endif
-{
-  XPAXt xptr = (XPAXt)client_data;
-  if( xptr == NULL)
-    return;
-  XPAXtDisableOneInput(xptr);
-  xfree(xptr);
-}
-
-/*
- *----------------------------------------------------------------------------
- *
- *
- * 			Public Routines and Data
- *
- *
- *----------------------------------------------------------------------------
- */
-
-/*
- *----------------------------------------------------------------------------
- *
- * Routine:	XPAXtAddInput
- *
- * Purpose:	Add XPA entries to the Xt event loop
- *
- * Results:	number of xpa entried added
- *
- *----------------------------------------------------------------------------
- */
-#ifdef ANSI_FUNC
-int 
-XPAXtAddInput (void *app, XPA xpa)
-#else
-int XPAXtAddInput(app, xpa)
-     void *app;
-     XPA xpa;
-#endif
-{
-  XPA cur;
-  int got=0;
-
-  /* save the app context */
-  if( xpa_app == NULL ){
-    xpa_app = (XtAppContext)app;
-  }
-
-  /* if a specific xpa was specified, just add it */
-  if( xpa != NULL ){
-    /* remove old one */
-    if( xpa->seldel && xpa->selptr ){
-      (xpa->seldel)(xpa->selptr);
-    }
-    /* add new one */
-    xpa->seldel = XPAXtDelOneInput;
-    xpa->seladd = XPAXtAddOneInput;
-    xpa->selon =  XPAXtEnableOneInput;
-    xpa->seloff = XPAXtDisableOneInput;
-    xpa->selptr = XPAXtAddOneInput((void *)xpa, xpa->fd);
-    got = 1;
-  }
-  /* otherwise set up all xpa's */
-  else{
-    for(cur=(XPA)XPAListHead(); cur!=NULL; cur=cur->next){
-      /* remove old one */
-      if( cur->seldel && cur->selptr ){
-	(cur->seldel)(cur->selptr);
-      }
-      /* add new one */
-      cur->seldel = XPAXtDelOneInput;
-      cur->seladd = XPAXtAddOneInput;
-      cur->selon =  XPAXtEnableOneInput;
-      cur->seloff = XPAXtDisableOneInput;
-      cur->selptr = XPAXtAddOneInput((void *)cur, cur->fd);
-      got++;
-    }
-  }
-  return(got);
-}
-
-int xpa_xt = 1;
-
-#else
-
-int xpa_xt = 0;
-
-#endif
-- 
cgit v0.12