summaryrefslogtreecommitdiff
path: root/xc/lib
diff options
context:
space:
mode:
Diffstat (limited to 'xc/lib')
-rw-r--r--xc/lib/GL/dri/dri_glx.c2
-rw-r--r--xc/lib/GL/mesa/src/OSmesa/Imakefile4
-rw-r--r--xc/lib/GL/mesa/src/drv/common/hwlog.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/common/mm.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/ffb/ffb_xmesa.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/gamma/gamma_gl.c20
-rw-r--r--xc/lib/GL/mesa/src/drv/i810/i810_xmesa.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/mga/mgadd.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/mga/mgaregs.h1
-rw-r--r--xc/lib/GL/mesa/src/drv/mga/mgastate.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/mga/mgatex.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/r128/r128_tex.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/r128/r128_xmesa.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/radeon/radeon_tex.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/sis/sis_xmesa.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/Imakefile4
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/Imakefile.inc2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.h2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_dd.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_fastpath.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.h2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_pixels.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_render.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_screen.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_span.c6
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_state.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_tex.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_texman.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_tris.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_tris.h2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_tritmp.h2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_wrapper.c2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_wrapper.h2
-rw-r--r--xc/lib/GL/mesa/src/drv/tdfx/tdfx_xmesa.c2
-rw-r--r--xc/lib/Imakefile18
-rw-r--r--xc/lib/X11/Imakefile14
-rw-r--r--xc/lib/X11/Xvarargs.h66
-rw-r--r--xc/lib/Xft/xftint.h8
-rw-r--r--xc/lib/Xft/xftrender.c154
-rw-r--r--xc/lib/xtrans/Xtransam.c2002
-rw-r--r--xc/lib/xtrans/Xtransmnx.c1639
43 files changed, 175 insertions, 3823 deletions
diff --git a/xc/lib/GL/dri/dri_glx.c b/xc/lib/GL/dri/dri_glx.c
index fac386f20..6bbfd619d 100644
--- a/xc/lib/GL/dri/dri_glx.c
+++ b/xc/lib/GL/dri/dri_glx.c
@@ -24,7 +24,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
**************************************************************************/
-/* $XFree86: xc/lib/GL/dri/dri_glx.c,v 1.8 2001/04/10 16:07:49 dawes Exp $ */
+/* $XFree86: xc/lib/GL/dri/dri_glx.c,v 1.9 2001/08/18 02:51:03 dawes Exp $ */
/*
* Authors:
diff --git a/xc/lib/GL/mesa/src/OSmesa/Imakefile b/xc/lib/GL/mesa/src/OSmesa/Imakefile
index c15de3f30..be2c790d4 100644
--- a/xc/lib/GL/mesa/src/OSmesa/Imakefile
+++ b/xc/lib/GL/mesa/src/OSmesa/Imakefile
@@ -1,4 +1,4 @@
-XCOMM $XFree86: xc/lib/GL/mesa/src/OSmesa/Imakefile,v 1.10 2001/04/03 02:29:33 dawes Exp $
+XCOMM $XFree86: xc/lib/GL/mesa/src/OSmesa/Imakefile,v 1.11 2001/06/04 20:43:30 dawes Exp $
#include <Threads.tmpl>
@@ -64,7 +64,7 @@ NormalLibraryTarget($(LIBNAME), $(UOBJS))
InstallLibrary($(LIBNAME),$(USRLIBDIR))
#endif
-#if DoSharedLib
+#if SharedLibGlx
SharedLibraryTarget($(LIBNAME),$(SOREV), $(OBJS), ., .)
InstallSharedLibrary($(LIBNAME),$(SOREV),$(SHLIBDIR))
#endif
diff --git a/xc/lib/GL/mesa/src/drv/common/hwlog.c b/xc/lib/GL/mesa/src/drv/common/hwlog.c
index 0285a295f..ff6e7d921 100644
--- a/xc/lib/GL/mesa/src/drv/common/hwlog.c
+++ b/xc/lib/GL/mesa/src/drv/common/hwlog.c
@@ -24,7 +24,7 @@
*
* Wittawat Yamwong <Wittawat.Yamwong@stud.uni-hannover.de>
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/common/hwlog.c,v 1.2 2000/06/22 16:59:23 tsi Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/common/hwlog.c,v 1.3 2001/08/18 02:51:03 dawes Exp $ */
#include "hwlog.h"
hwlog_t hwlog = { 0,0,0, "[???] "};
diff --git a/xc/lib/GL/mesa/src/drv/common/mm.c b/xc/lib/GL/mesa/src/drv/common/mm.c
index 2ec5a101a..89a204952 100644
--- a/xc/lib/GL/mesa/src/drv/common/mm.c
+++ b/xc/lib/GL/mesa/src/drv/common/mm.c
@@ -21,7 +21,7 @@
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/common/mm.c,v 1.2 2000/06/22 16:59:23 tsi Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/common/mm.c,v 1.3 2001/08/18 02:51:03 dawes Exp $ */
#include <stdlib.h>
#include <stdio.h>
diff --git a/xc/lib/GL/mesa/src/drv/ffb/ffb_xmesa.c b/xc/lib/GL/mesa/src/drv/ffb/ffb_xmesa.c
index f93a837b6..9412038bc 100644
--- a/xc/lib/GL/mesa/src/drv/ffb/ffb_xmesa.c
+++ b/xc/lib/GL/mesa/src/drv/ffb/ffb_xmesa.c
@@ -1,4 +1,4 @@
-/* $XFree86: xc/lib/GL/mesa/src/drv/ffb/ffb_xmesa.c,v 1.2.4.1 2001/05/29 22:28:17 dawes Exp $
+/* $XFree86: xc/lib/GL/mesa/src/drv/ffb/ffb_xmesa.c,v 1.3 2001/05/29 22:24:01 dawes Exp $
*
* GLX Hardware Device Driver for Sun Creator/Creator3D
* Copyright (C) 2000 David S. Miller
diff --git a/xc/lib/GL/mesa/src/drv/gamma/gamma_gl.c b/xc/lib/GL/mesa/src/drv/gamma/gamma_gl.c
index d859e5d50..84bdd56ab 100644
--- a/xc/lib/GL/mesa/src/drv/gamma/gamma_gl.c
+++ b/xc/lib/GL/mesa/src/drv/gamma/gamma_gl.c
@@ -1,4 +1,4 @@
-/* $XFree86: xc/lib/GL/mesa/src/drv/gamma/gamma_gl.c,v 1.9 2001/02/07 13:26:16 alanh Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/gamma/gamma_gl.c,v 1.10 2001/08/18 02:51:04 dawes Exp $ */
/**************************************************************************
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
@@ -64,32 +64,32 @@ void gamma_error( GLenum error, const char *s )
#endif
if (debug) {
- char errstr[1000];
+ const char *errstr;
switch (error) {
case GL_NO_ERROR:
- strcpy( errstr, "GL_NO_ERROR" );
+ errstr = "GL_NO_ERROR";
break;
case GL_INVALID_VALUE:
- strcpy( errstr, "GL_INVALID_VALUE" );
+ errstr = "GL_INVALID_VALUE";
break;
case GL_INVALID_ENUM:
- strcpy( errstr, "GL_INVALID_ENUM" );
+ errstr = "GL_INVALID_ENUM";
break;
case GL_INVALID_OPERATION:
- strcpy( errstr, "GL_INVALID_OPERATION" );
+ errstr = "GL_INVALID_OPERATION";
break;
case GL_STACK_OVERFLOW:
- strcpy( errstr, "GL_STACK_OVERFLOW" );
+ errstr = "GL_STACK_OVERFLOW";
break;
case GL_STACK_UNDERFLOW:
- strcpy( errstr, "GL_STACK_UNDERFLOW" );
+ errstr = "GL_STACK_UNDERFLOW";
break;
case GL_OUT_OF_MEMORY:
- strcpy( errstr, "GL_OUT_OF_MEMORY" );
+ errstr = "GL_OUT_OF_MEMORY";
break;
default:
- strcpy( errstr, "unknown" );
+ errstr = "unknown";
break;
}
fprintf( stderr, "Mesa user error: %s in %s\n", errstr, s );
diff --git a/xc/lib/GL/mesa/src/drv/i810/i810_xmesa.c b/xc/lib/GL/mesa/src/drv/i810/i810_xmesa.c
index 324e9c2ff..6d0428fb2 100644
--- a/xc/lib/GL/mesa/src/drv/i810/i810_xmesa.c
+++ b/xc/lib/GL/mesa/src/drv/i810/i810_xmesa.c
@@ -24,7 +24,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
**************************************************************************/
-/* $XFree86: xc/lib/GL/mesa/src/drv/i810/i810_xmesa.c,v 1.12 2001/03/21 16:14:21 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/i810/i810_xmesa.c,v 1.13 2001/08/18 02:51:04 dawes Exp $ */
/*
* Authors:
diff --git a/xc/lib/GL/mesa/src/drv/mga/mgadd.c b/xc/lib/GL/mesa/src/drv/mga/mgadd.c
index c99e1c98a..34c9750f4 100644
--- a/xc/lib/GL/mesa/src/drv/mga/mgadd.c
+++ b/xc/lib/GL/mesa/src/drv/mga/mgadd.c
@@ -24,7 +24,7 @@
* Authors:
* Keith Whitwell <keithw@valinux.com>
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgadd.c,v 1.10 2001/04/10 16:07:50 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgadd.c,v 1.11 2001/08/18 02:51:05 dawes Exp $ */
#include "types.h"
diff --git a/xc/lib/GL/mesa/src/drv/mga/mgaregs.h b/xc/lib/GL/mesa/src/drv/mga/mgaregs.h
index fb667c537..91aacba44 100644
--- a/xc/lib/GL/mesa/src/drv/mga/mgaregs.h
+++ b/xc/lib/GL/mesa/src/drv/mga/mgaregs.h
@@ -19,6 +19,7 @@
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
+/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgaregs.h,v 1.4 2001/08/18 11:55:47 tsi Exp $ */
#ifndef _MGAREGS_H_
#define _MGAREGS_H_
diff --git a/xc/lib/GL/mesa/src/drv/mga/mgastate.c b/xc/lib/GL/mesa/src/drv/mga/mgastate.c
index 926548a7d..b954be44b 100644
--- a/xc/lib/GL/mesa/src/drv/mga/mgastate.c
+++ b/xc/lib/GL/mesa/src/drv/mga/mgastate.c
@@ -24,7 +24,7 @@
* Authors:
* Keith Whitwell <keithw@valinux.com>
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgastate.c,v 1.10.2.1 2001/05/31 08:31:23 alanh Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgastate.c,v 1.11 2001/05/31 08:29:42 alanh Exp $ */
#include <stdio.h>
diff --git a/xc/lib/GL/mesa/src/drv/mga/mgatex.c b/xc/lib/GL/mesa/src/drv/mga/mgatex.c
index 6c925bc0c..9baf7875f 100644
--- a/xc/lib/GL/mesa/src/drv/mga/mgatex.c
+++ b/xc/lib/GL/mesa/src/drv/mga/mgatex.c
@@ -24,7 +24,7 @@
* Authors:
* Keith Whitwell <keithw@valinux.com>
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgatex.c,v 1.10.2.1 2001/05/31 08:31:23 alanh Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgatex.c,v 1.12 2001/08/18 02:51:05 dawes Exp $ */
#include <stdlib.h>
#include <stdio.h>
diff --git a/xc/lib/GL/mesa/src/drv/r128/r128_tex.c b/xc/lib/GL/mesa/src/drv/r128/r128_tex.c
index 1694f8d36..d6d42c5cc 100644
--- a/xc/lib/GL/mesa/src/drv/r128/r128_tex.c
+++ b/xc/lib/GL/mesa/src/drv/r128/r128_tex.c
@@ -1,4 +1,4 @@
-/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_tex.c,v 1.9 2001/04/10 16:07:52 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_tex.c,v 1.10 2001/08/18 02:51:05 dawes Exp $ */
/**************************************************************************
Copyright 1999, 2000 ATI Technologies Inc. and Precision Insight, Inc.,
diff --git a/xc/lib/GL/mesa/src/drv/r128/r128_xmesa.c b/xc/lib/GL/mesa/src/drv/r128/r128_xmesa.c
index 065b65999..d7900ea45 100644
--- a/xc/lib/GL/mesa/src/drv/r128/r128_xmesa.c
+++ b/xc/lib/GL/mesa/src/drv/r128/r128_xmesa.c
@@ -1,4 +1,4 @@
-/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_xmesa.c,v 1.8 2001/03/21 16:14:24 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/r128/r128_xmesa.c,v 1.9 2001/08/18 02:51:05 dawes Exp $ */
/**************************************************************************
Copyright 1999, 2000 ATI Technologies Inc. and Precision Insight, Inc.,
diff --git a/xc/lib/GL/mesa/src/drv/radeon/radeon_tex.c b/xc/lib/GL/mesa/src/drv/radeon/radeon_tex.c
index 8985361b7..83c22f878 100644
--- a/xc/lib/GL/mesa/src/drv/radeon/radeon_tex.c
+++ b/xc/lib/GL/mesa/src/drv/radeon/radeon_tex.c
@@ -1,4 +1,4 @@
-/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_tex.c,v 1.3.2.1 2001/05/22 21:25:41 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/radeon/radeon_tex.c,v 1.4 2001/05/21 21:43:52 dawes Exp $ */
/**************************************************************************
Copyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and
diff --git a/xc/lib/GL/mesa/src/drv/sis/sis_xmesa.c b/xc/lib/GL/mesa/src/drv/sis/sis_xmesa.c
index b1d87f599..fe0780804 100644
--- a/xc/lib/GL/mesa/src/drv/sis/sis_xmesa.c
+++ b/xc/lib/GL/mesa/src/drv/sis/sis_xmesa.c
@@ -24,7 +24,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
**************************************************************************/
-/* $XFree86: xc/lib/GL/mesa/src/drv/sis/sis_xmesa.c,v 1.9.2.1 2001/05/22 21:25:41 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/sis/sis_xmesa.c,v 1.10 2001/05/19 18:29:18 dawes Exp $ */
/*
* Authors:
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/Imakefile b/xc/lib/GL/mesa/src/drv/tdfx/Imakefile
index b7f4346e4..abb22e61a 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/Imakefile
+++ b/xc/lib/GL/mesa/src/drv/tdfx/Imakefile
@@ -1,4 +1,4 @@
-XCOMM $XFree86: xc/lib/GL/mesa/src/drv/tdfx/Imakefile,v 1.25.2.1 2001/06/01 07:42:23 alanh Exp $
+XCOMM $XFree86: xc/lib/GL/mesa/src/drv/tdfx/Imakefile,v 1.28 2001/08/18 02:51:06 dawes Exp $
#include <Threads.tmpl>
@@ -23,8 +23,6 @@ XCOMM $XFree86: xc/lib/GL/mesa/src/drv/tdfx/Imakefile,v 1.25.2.1 2001/06/01 07:4
#include "../../X86/Imakefile.inc"
#endif
- DEPEND_DEFINES = -D__linux__
-
DEFINES = $(ALLOC_DEFINES) $(DRI_DEFINES) $(MESA_ASM_DEFINES)
INCLUDES = $(X_INCLUDES) $(MESA_INCLUDES) $(DRI_INCLUDES) \
-I$(GLIDE3INCDIR)
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/Imakefile.inc b/xc/lib/GL/mesa/src/drv/tdfx/Imakefile.inc
index 88ad0d988..0b7080a49 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/Imakefile.inc
+++ b/xc/lib/GL/mesa/src/drv/tdfx/Imakefile.inc
@@ -1,4 +1,4 @@
-XCOMM $XFree86: xc/lib/GL/mesa/src/drv/tdfx/Imakefile.inc,v 1.2 2001/05/02 15:06:04 dawes Exp $
+XCOMM $XFree86: xc/lib/GL/mesa/src/drv/tdfx/Imakefile.inc,v 1.3 2001/08/18 02:51:06 dawes Exp $
#ifndef MesaDrvSrcDir
#define MesaDrvSrcDir $(GLXLIBSRC)/mesa/src/drv
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.c b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.c
index 1669e7865..568da0563 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.c
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.c
@@ -23,7 +23,7 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.c,v 1.1.2.1 2001/05/22 21:25:41 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.c,v 1.3 2001/08/18 02:51:06 dawes Exp $ */
/*
* Original rewrite:
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.h b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.h
index 07f7703b2..3ab973604 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.h
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.h
@@ -23,7 +23,7 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.h,v 1.1 2001/03/21 16:14:27 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_context.h,v 1.2 2001/08/18 02:51:06 dawes Exp $ */
/*
* Original rewrite:
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_dd.c b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_dd.c
index 797ec88d6..132bea2ad 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_dd.c
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_dd.c
@@ -23,7 +23,7 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_dd.c,v 1.4 2001/05/02 15:06:04 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_dd.c,v 1.5 2001/08/18 02:51:06 dawes Exp $ */
/*
* Original rewrite:
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_fastpath.c b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_fastpath.c
index d6a44dc0f..d448ad581 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_fastpath.c
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_fastpath.c
@@ -23,7 +23,7 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_fastpath.c,v 1.1 2001/03/21 16:14:28 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_fastpath.c,v 1.2 2001/08/18 02:51:06 dawes Exp $ */
/*
* Original rewrite:
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.c b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.c
index 94119f7c3..ae2aca898 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.c
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.c
@@ -23,7 +23,7 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.c,v 1.1 2001/03/21 16:14:28 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.c,v 1.2 2001/08/18 02:51:06 dawes Exp $ */
/*
* Original rewrite:
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.h b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.h
index 249384f81..8f258f57b 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.h
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.h
@@ -23,7 +23,7 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.h,v 1.1 2001/03/21 16:14:28 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_lock.h,v 1.2 2001/08/18 02:51:06 dawes Exp $ */
/*
* Original rewrite:
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_pixels.c b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_pixels.c
index 6c3efa501..9be3edf44 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_pixels.c
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_pixels.c
@@ -23,7 +23,7 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_pixels.c,v 1.2 2001/04/02 20:07:48 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_pixels.c,v 1.3 2001/08/18 02:51:06 dawes Exp $ */
/*
* Original rewrite:
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_render.c b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_render.c
index 64dcadb78..42acda0c7 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_render.c
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_render.c
@@ -23,7 +23,7 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_render.c,v 1.1 2001/03/21 16:14:28 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_render.c,v 1.2 2001/08/18 02:51:07 dawes Exp $ */
/*
* Original rewrite:
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_screen.c b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_screen.c
index 600ba1432..5d47e948a 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_screen.c
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_screen.c
@@ -23,7 +23,7 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_screen.c,v 1.1 2001/03/21 16:14:28 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_screen.c,v 1.2 2001/08/18 02:51:07 dawes Exp $ */
/*
* Original rewrite:
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_span.c b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_span.c
index 18c75965e..06bd0022f 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_span.c
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_span.c
@@ -23,7 +23,7 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_span.c,v 1.1 2001/03/21 16:14:28 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_span.c,v 1.3 2001/08/18 02:51:07 dawes Exp $ */
/*
* Original rewrite:
@@ -557,6 +557,10 @@ GetFbParams(tdfxContextPtr fxMesa,
* it's better in the macro or in the call.
*
* Recall that x and y are screen coordinates.
+ *
+ * Note: ANSI C doesn't allow conditional expressions or cast expressions
+ * as lvalues. Some of these macros violate that.
+ *
*/
#define GET_FB_DATA(ReadParamsp, type, x, y) \
(((x) < (ReadParamsp)->firstWrappedX) \
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_state.c b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_state.c
index 10316454b..4738fe809 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_state.c
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_state.c
@@ -23,7 +23,7 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_state.c,v 1.2 2001/05/02 15:06:04 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_state.c,v 1.3 2001/08/18 02:51:07 dawes Exp $ */
/*
* Original rewrite:
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_tex.c b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_tex.c
index b54e6b387..3b9a40d3f 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_tex.c
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_tex.c
@@ -23,7 +23,7 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_tex.c,v 1.1.2.1 2001/05/22 21:25:41 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_tex.c,v 1.3 2001/08/18 02:51:07 dawes Exp $ */
/*
* Original rewrite:
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_texman.c b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_texman.c
index d3d2275af..273fd3169 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_texman.c
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_texman.c
@@ -23,7 +23,7 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_texman.c,v 1.2.2.1 2001/05/22 21:25:41 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_texman.c,v 1.4 2001/08/18 02:51:07 dawes Exp $ */
/*
* Original rewrite:
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_tris.c b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_tris.c
index e75866529..2afe815b2 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_tris.c
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_tris.c
@@ -23,7 +23,7 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_tris.c,v 1.1 2001/03/21 16:14:28 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_tris.c,v 1.2 2001/08/18 02:51:07 dawes Exp $ */
/*
* Original rewrite:
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_tris.h b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_tris.h
index da7f9fc81..4ef310b3a 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_tris.h
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_tris.h
@@ -23,7 +23,7 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_tris.h,v 1.1 2001/03/21 16:14:28 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_tris.h,v 1.2 2001/08/18 02:51:07 dawes Exp $ */
/*
* Original rewrite:
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_tritmp.h b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_tritmp.h
index 0fbf52ef6..04d01e7f2 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_tritmp.h
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_tritmp.h
@@ -23,7 +23,7 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_tritmp.h,v 1.1 2001/03/21 16:14:28 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_tritmp.h,v 1.2 2001/08/18 02:51:07 dawes Exp $ */
/*
* Original rewrite:
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_wrapper.c b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_wrapper.c
index 96d1e06c3..70641eb9a 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_wrapper.c
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_wrapper.c
@@ -23,7 +23,7 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_wrapper.c,v 1.1 2001/03/21 16:14:28 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_wrapper.c,v 1.2 2001/08/18 02:51:07 dawes Exp $ */
/*
* Original rewrite:
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_wrapper.h b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_wrapper.h
index 23a9b5bc7..9bb819c96 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_wrapper.h
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_wrapper.h
@@ -39,7 +39,7 @@
*
* See fxapi.h for more revision/author details.
*/
-
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_wrapper.h,v 1.3 2001/08/18 11:55:48 tsi Exp $ */
#ifndef __FX_GLIDE_WARPER__
#define __FX_GLIDE_WARPER__
diff --git a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_xmesa.c b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_xmesa.c
index c32e4dc04..9fb4a8321 100644
--- a/xc/lib/GL/mesa/src/drv/tdfx/tdfx_xmesa.c
+++ b/xc/lib/GL/mesa/src/drv/tdfx/tdfx_xmesa.c
@@ -23,7 +23,7 @@
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_xmesa.c,v 1.12 2001/03/21 16:14:28 dawes Exp $ */
+/* $XFree86: xc/lib/GL/mesa/src/drv/tdfx/tdfx_xmesa.c,v 1.13 2001/08/18 02:51:07 dawes Exp $ */
/*
* Original rewrite:
diff --git a/xc/lib/Imakefile b/xc/lib/Imakefile
index a6e7a2a93..4d600393a 100644
--- a/xc/lib/Imakefile
+++ b/xc/lib/Imakefile
@@ -3,7 +3,7 @@ XCOMM $Xorg: Imakefile,v 1.3 2000/08/17 19:44:00 cpqbld Exp $
-XCOMM $XFree86: xc/lib/Imakefile,v 3.52 2001/04/03 17:36:28 dawes Exp $
+XCOMM $XFree86: xc/lib/Imakefile,v 3.56 2001/08/13 21:46:46 dawes Exp $
#define IHaveSubdirs
#define PassCDebugFlags
@@ -75,6 +75,9 @@ XINERAMADIR=Xinerama
#if BuildGLXLibrary
GLXLIBDIR = GL
+#endif
+
+#if BuildGLwLibrary
GLWLIBDIR = GLw
#endif
@@ -106,6 +109,10 @@ XFTLIBDIR = Xft
FREETYPE2BUILDDIR = freetype2
#endif
+#if BuildRandRLibrary
+RANDRLIBDIR = Xrandr
+#endif
+
XF86EXTLIBS = $(XF86MISCLIBDIR) $(XF86VMLIBDIR) \
$(XF86DGALIBDIR) $(XF86RUSHLIBDIR)
@@ -135,6 +142,10 @@ FONTCACHELIBDIR = Xfontcache
FONTSUBDIR = font
+#if BuildFontEncLib
+FONTENCSUBDIR = fontenc
+#endif
+
XAULIBDIR = Xau
XDMCPLIBDIR = Xdmcp
X11LIBDIR = X11
@@ -167,9 +178,10 @@ LINTSUBDIRS = $(XAULIBDIR) $(XDMCPLIBDIR) $(THRSTUBLIBDIR) $(X11LIBDIR) \
$(XVLIBDIR) $(GLXLIBDIR) $(GLULIBDIR) $(GLWLIBDIR) \
$(DPSLIBDIR) $(DPSTKLIBDIR) $(PSRESLIBDIR) $(XINERAMADIR) \
$(ZLIBDIR) $(REGEXDIR) $(RENDERLIBDIR) $(FREETYPE2BUILDDIR) \
- $(XFTLIBDIR) $(XVMCLIBDIR)
+ $(XFTLIBDIR) $(XVMCLIBDIR) $(RANDRLIBDIR)
-SUBDIRS = $(BERKDIR) xtrans $(LINTSUBDIRS) $(FONTSUBDIR) $(FONTCACHELIBDIR)
+SUBDIRS = $(BERKDIR) xtrans $(LINTSUBDIRS) $(FONTSUBDIR) $(FONTENCSUBDIR) \
+ $(FONTCACHELIBDIR)
MakeSubdirs($(SUBDIRS))
DependSubdirs($(SUBDIRS))
diff --git a/xc/lib/X11/Imakefile b/xc/lib/X11/Imakefile
index 75b2da1f5..1e56341a7 100644
--- a/xc/lib/X11/Imakefile
+++ b/xc/lib/X11/Imakefile
@@ -3,7 +3,7 @@ XCOMM $Xorg: Imakefile,v 1.3 2000/08/17 19:44:38 cpqbld Exp $
-XCOMM $XFree86: xc/lib/X11/Imakefile,v 3.38 2001/05/01 10:35:05 alanh Exp $
+XCOMM $XFree86: xc/lib/X11/Imakefile,v 3.40 2001/07/23 13:15:41 dawes Exp $
#define DoNormalLib NormalLibX11
#define DoSharedLib SharedLibX11
@@ -936,10 +936,6 @@ SpecialCLibObjectRule(imConv,$(ICONFIGFILES),$(XKB_DEFINES))
#if HasKrb5
SpecialCLibObjectRule(k5encode,$(_NOOP_),$(K5INCL))
#endif
-#ifdef MinixArchitecture
-SpecialCLibObjectRule(IMWrap,$(ICONFIGFILES),-DX11_TINY_IM)
-SpecialCLibObjectRule(lcInit,$(ICONFIGFILES),-DX11_TINY_LC)
-#endif
#if InstallXcmsTxt
InstallNonExecFile(Xcms.txt,$(LIBDIR))
@@ -969,18 +965,18 @@ LOCAL_LDFLAGS=-F
MAKEKEYS = ./makekeys
ks_tables.h: $(XINCLUDESRC)/keysymdef.h util/makekeys.c
- RemoveFiles($@ ProgramTargetName(makekeys) makekeys.Osuf)
- -HostLinkRule(ProgramTargetName(makekeys),$(CFLAGS) $(LOCAL_LDFLAGS),util/makekeys.c,$(LDLIBS))
+ RemoveFiles($@ HostProgramTargetName(makekeys) makekeys.Osuf)
+ -HostLinkRule(HostProgramTargetName(makekeys),$(CFLAGS) $(LOCAL_LDFLAGS),util/makekeys.c,$(LDLIBS))
RunProgram(MAKEKEYS,< $(XINCLUDESRC)/keysymdef.h > ks_tables_h)
$(MV) ks_tables_h $@
- RemoveFiles(ProgramTargetName(makekeys) makekeys.Osuf ks_tables_h)
+ RemoveFiles(HostProgramTargetName(makekeys) makekeys.Osuf ks_tables_h)
includes:: ks_tables.h
depend:: ks_tables.h
clean::
- RemoveFiles(ks_tables_h ks_tables.h ProgramTargetName(makekeys))
+ RemoveFiles(ks_tables_h ks_tables.h HostProgramTargetName(makekeys))
DependTarget3($(SRCS1),$(SRCS2),$(SRCS3))
#else
diff --git a/xc/lib/X11/Xvarargs.h b/xc/lib/X11/Xvarargs.h
deleted file mode 100644
index 8d166a72a..000000000
--- a/xc/lib/X11/Xvarargs.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* $TOG: Xvarargs.h /main/5 1998/02/06 18:03:41 kaleb $ */
-/*
-
-Copyright 1985, 1986, 1987, 1988, 1989, 1998 The Open Group
-
-All Rights Reserved.
-
-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 OPEN GROUP 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.
-
-Except as contained in this notice, the name of The Open Group shall
-not be used in advertising or otherwise to promote the sale, use or
-other dealings in this Software without prior written authorization
-from The Open Group.
-
-*/
-
-#ifndef _XVARARGS_H_
-#define _XVARARGS_H_
-
-#ifdef __HIGHC__
-#ifndef _STDARG_H
-#define _STDARG_H
-
-typedef char *va_list;
-
-/* Amount of space required in an argument list for an arg of type TYPE.
- TYPE may alternatively be an expression whose type is used. */
-
-#define __va_rounded_size(TYPE) \
- (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
-
-#define va_start(AP, LASTARG) \
- (AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))
-
-#define va_end(AP)
-
-#define va_arg(AP, TYPE) \
- (AP += __va_rounded_size (TYPE), \
- *((TYPE *) (AP - __va_rounded_size (TYPE))))
-
-#endif /* _STDARG_H */
-
-#define Va_start(a,b) va_start(a,b)
-
-#else /* !__HIGHC__ */
-
-#if NeedVarargsPrototypes
-# include <stdarg.h>
-# define Va_start(a,b) va_start(a,b)
-#else
-# include <varargs.h>
-# define Va_start(a,b) va_start(a)
-#endif
-
-#endif /* __HIGHC__ */
-
-#endif /* _XVARARGS_H_ */
diff --git a/xc/lib/Xft/xftint.h b/xc/lib/Xft/xftint.h
index f92dd4876..46e0c0997 100644
--- a/xc/lib/Xft/xftint.h
+++ b/xc/lib/Xft/xftint.h
@@ -1,5 +1,5 @@
/*
- * $XFree86: xc/lib/Xft/xftint.h,v 1.25 2001/05/18 16:03:06 tsi Exp $
+ * $XFree86: xc/lib/Xft/xftint.h,v 1.26 2001/07/13 18:16:10 keithp Exp $
*
* Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
*
@@ -264,7 +264,7 @@ XftCoreConvert16 (XftChar16 *string,
XChar2b xcloc[XFT_CORE_N16LOCAL]);
XChar2b *
-XftCoreConvert32 (unsigned int *string,
+XftCoreConvert32 (XftChar32 *string,
int len,
XChar2b xcloc[XFT_CORE_N16LOCAL]);
@@ -291,7 +291,7 @@ XftCoreExtents16 (Display *dpy,
void
XftCoreExtents32 (Display *dpy,
XFontStruct *fs,
- unsigned int *string,
+ XftChar32 *string,
int len,
XGlyphInfo *extents);
@@ -305,7 +305,7 @@ XftCoreExtentsUtf8 (Display *dpy,
Bool
XftCoreGlyphExists (Display *dpy,
XFontStruct *fs,
- unsigned int glyph);
+ XftChar32 glyph);
/* xftdbg.c */
void
diff --git a/xc/lib/Xft/xftrender.c b/xc/lib/Xft/xftrender.c
index 1be21a65a..02dd97b95 100644
--- a/xc/lib/Xft/xftrender.c
+++ b/xc/lib/Xft/xftrender.c
@@ -1,5 +1,5 @@
/*
- * $XFree86: xc/lib/Xft/xftrender.c,v 1.7 2001/04/21 16:58:02 keithp Exp $
+ * $XFree86: xc/lib/Xft/xftrender.c,v 1.8 2001/07/13 18:16:10 keithp Exp $
*
* Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
*
@@ -32,7 +32,7 @@ XftRenderString8 (Display *dpy, Picture src,
int x, int y,
XftChar8 *string, int len)
{
- unsigned int missing[XFT_NMISSING];
+ XftChar32 missing[XFT_NMISSING];
int nmissing;
XftChar8 *s;
int l;
@@ -41,7 +41,7 @@ XftRenderString8 (Display *dpy, Picture src,
l = len;
nmissing = 0;
while (l--)
- XftGlyphCheck (dpy, font, (unsigned int) *s++, missing, &nmissing);
+ XftGlyphCheck (dpy, font, (XftChar32) *s++, missing, &nmissing);
if (nmissing)
XftGlyphLoad (dpy, font, missing, nmissing);
XRenderCompositeString8 (dpy, PictOpOver, src, dst,
@@ -56,7 +56,7 @@ XftRenderString16 (Display *dpy, Picture src,
int x, int y,
XftChar16 *string, int len)
{
- unsigned int missing[XFT_NMISSING];
+ XftChar32 missing[XFT_NMISSING];
int nmissing;
XftChar16 *s;
int l;
@@ -65,7 +65,7 @@ XftRenderString16 (Display *dpy, Picture src,
l = len;
nmissing = 0;
while (l--)
- XftGlyphCheck (dpy, font, (unsigned int) *s++, missing, &nmissing);
+ XftGlyphCheck (dpy, font, (XftChar32) *s++, missing, &nmissing);
if (nmissing)
XftGlyphLoad (dpy, font, missing, nmissing);
XRenderCompositeString16 (dpy, PictOpOver, src, dst,
@@ -78,18 +78,18 @@ XftRenderString32 (Display *dpy, Picture src,
XftFontStruct *font, Picture dst,
int srcx, int srcy,
int x, int y,
- unsigned int *string, int len)
+ XftChar32 *string, int len)
{
- unsigned int missing[XFT_NMISSING];
+ XftChar32 missing[XFT_NMISSING];
int nmissing;
- unsigned int *s;
+ XftChar32 *s;
int l;
s = string;
l = len;
nmissing = 0;
while (l--)
- XftGlyphCheck (dpy, font, (unsigned int) *s++, missing, &nmissing);
+ XftGlyphCheck (dpy, font, (XftChar32) *s++, missing, &nmissing);
if (nmissing)
XftGlyphLoad (dpy, font, missing, nmissing);
XRenderCompositeString32 (dpy, PictOpOver, src, dst,
@@ -191,7 +191,7 @@ XftRenderExtents8 (Display *dpy,
int len,
XGlyphInfo *extents)
{
- unsigned int missing[XFT_NMISSING];
+ XftChar32 missing[XFT_NMISSING];
int nmissing;
XftChar8 *s, c;
int l;
@@ -205,7 +205,7 @@ XftRenderExtents8 (Display *dpy,
l = len;
nmissing = 0;
while (l--)
- XftGlyphCheck (dpy, font, (unsigned int) *s++, missing, &nmissing);
+ XftGlyphCheck (dpy, font, (XftChar32) *s++, missing, &nmissing);
if (nmissing)
XftGlyphLoad (dpy, font, missing, nmissing);
@@ -268,22 +268,25 @@ XftRenderExtents8 (Display *dpy,
void
XftRenderExtents16 (Display *dpy,
XftFontStruct *font,
- XftChar16 *string,
+ XftChar16 *string,
int len,
XGlyphInfo *extents)
{
- unsigned int missing[XFT_NMISSING];
+ XftChar32 missing[XFT_NMISSING];
int nmissing;
XftChar16 *s, c;
int l;
XGlyphInfo *gi;
int x, y;
+ int left, right, top, bottom;
+ int overall_left, overall_right;
+ int overall_top, overall_bottom;
s = string;
l = len;
nmissing = 0;
while (l--)
- XftGlyphCheck (dpy, font, (unsigned int) *s++, missing, &nmissing);
+ XftGlyphCheck (dpy, font, (XftChar32) *s++, missing, &nmissing);
if (nmissing)
XftGlyphLoad (dpy, font, missing, nmissing);
@@ -306,26 +309,39 @@ XftRenderExtents16 (Display *dpy,
extents->xOff = 0;
return;
}
- *extents = *gi;
- x = gi->xOff;
- y = gi->yOff;
+ x = 0;
+ y = 0;
+ overall_left = x - gi->x;
+ overall_top = y - gi->y;
+ overall_right = overall_left + (int) gi->width;
+ overall_bottom = overall_top + (int) gi->height;
+ x += gi->xOff;
+ y += gi->yOff;
while (len--)
{
c = *string++;
gi = c < font->nrealized ? font->realized[c] : 0;
if (!gi)
continue;
- if (gi->x + x < extents->x)
- extents->x = gi->x + x;
- if (gi->y + y < extents->y)
- extents->y = gi->y + y;
- if (gi->width + x > extents->width)
- extents->width = gi->width + x;
- if (gi->height + y > extents->height)
- extents->height = gi->height + y;
+ left = x - gi->x;
+ top = y - gi->y;
+ right = left + (int) gi->width;
+ bottom = top + (int) gi->height;
+ if (left < overall_left)
+ overall_left = left;
+ if (top < overall_top)
+ overall_top = top;
+ if (right > overall_right)
+ overall_right = right;
+ if (bottom > overall_bottom)
+ overall_bottom = bottom;
x += gi->xOff;
y += gi->yOff;
}
+ extents->x = -overall_left;
+ extents->y = -overall_top;
+ extents->width = overall_right - overall_left;
+ extents->height = overall_bottom - overall_top;
extents->xOff = x;
extents->yOff = y;
}
@@ -333,22 +349,25 @@ XftRenderExtents16 (Display *dpy,
void
XftRenderExtents32 (Display *dpy,
XftFontStruct *font,
- unsigned int *string,
+ XftChar32 *string,
int len,
XGlyphInfo *extents)
{
- unsigned int missing[XFT_NMISSING];
+ XftChar32 missing[XFT_NMISSING];
int nmissing;
- unsigned int *s, c;
+ XftChar32 *s, c;
int l;
XGlyphInfo *gi;
int x, y;
+ int left, right, top, bottom;
+ int overall_left, overall_right;
+ int overall_top, overall_bottom;
s = string;
l = len;
nmissing = 0;
while (l--)
- XftGlyphCheck (dpy, font, (unsigned int) *s++, missing, &nmissing);
+ XftGlyphCheck (dpy, font, (XftChar32) *s++, missing, &nmissing);
if (nmissing)
XftGlyphLoad (dpy, font, missing, nmissing);
@@ -371,26 +390,39 @@ XftRenderExtents32 (Display *dpy,
extents->xOff = 0;
return;
}
- *extents = *gi;
- x = gi->xOff;
- y = gi->yOff;
+ x = 0;
+ y = 0;
+ overall_left = x - gi->x;
+ overall_top = y - gi->y;
+ overall_right = overall_left + (int) gi->width;
+ overall_bottom = overall_top + (int) gi->height;
+ x += gi->xOff;
+ y += gi->yOff;
while (len--)
{
c = *string++;
gi = c < font->nrealized ? font->realized[c] : 0;
if (!gi)
continue;
- if (gi->x + x < extents->x)
- extents->x = gi->x + x;
- if (gi->y + y < extents->y)
- extents->y = gi->y + y;
- if (gi->width + x > extents->width)
- extents->width = gi->width + x;
- if (gi->height + y > extents->height)
- extents->height = gi->height + y;
+ left = x - gi->x;
+ top = y - gi->y;
+ right = left + (int) gi->width;
+ bottom = top + (int) gi->height;
+ if (left < overall_left)
+ overall_left = left;
+ if (top < overall_top)
+ overall_top = top;
+ if (right > overall_right)
+ overall_right = right;
+ if (bottom > overall_bottom)
+ overall_bottom = bottom;
x += gi->xOff;
y += gi->yOff;
}
+ extents->x = -overall_left;
+ extents->y = -overall_top;
+ extents->width = overall_right - overall_left;
+ extents->height = overall_bottom - overall_top;
extents->xOff = x;
extents->yOff = y;
}
@@ -402,13 +434,16 @@ XftRenderExtentsUtf8 (Display *dpy,
int len,
XGlyphInfo *extents)
{
- unsigned int missing[XFT_NMISSING];
+ XftChar32 missing[XFT_NMISSING];
int nmissing;
XftChar8 *s;
XftChar32 c;
int l, clen;
XGlyphInfo *gi;
int x, y;
+ int left, right, top, bottom;
+ int overall_left, overall_right;
+ int overall_top, overall_bottom;
s = string;
l = len;
@@ -418,7 +453,7 @@ XftRenderExtentsUtf8 (Display *dpy,
clen = XftUtf8ToUcs4 (s, &c, l);
if (clen < 0)
break;
- XftGlyphCheck (dpy, font, c, missing, &nmissing);
+ XftGlyphCheck (dpy, font, (XftChar32) c, missing, &nmissing);
s += clen;
l -= clen;
}
@@ -450,9 +485,14 @@ XftRenderExtentsUtf8 (Display *dpy,
extents->xOff = 0;
return;
}
- *extents = *gi;
- x = gi->xOff;
- y = gi->yOff;
+ x = 0;
+ y = 0;
+ overall_left = x - gi->x;
+ overall_top = y - gi->y;
+ overall_right = overall_left + (int) gi->width;
+ overall_bottom = overall_top + (int) gi->height;
+ x += gi->xOff;
+ y += gi->yOff;
while (len)
{
clen = XftUtf8ToUcs4 (string, &c, len);
@@ -463,17 +503,25 @@ XftRenderExtentsUtf8 (Display *dpy,
gi = c < font->nrealized ? font->realized[c] : 0;
if (!gi)
continue;
- if (gi->x + x < extents->x)
- extents->x = gi->x + x;
- if (gi->y + y < extents->y)
- extents->y = gi->y + y;
- if (gi->width + x > extents->width)
- extents->width = gi->width + x;
- if (gi->height + y > extents->height)
- extents->height = gi->height + y;
+ left = x - gi->x;
+ top = y - gi->y;
+ right = left + (int) gi->width;
+ bottom = top + (int) gi->height;
+ if (left < overall_left)
+ overall_left = left;
+ if (top < overall_top)
+ overall_top = top;
+ if (right > overall_right)
+ overall_right = right;
+ if (bottom > overall_bottom)
+ overall_bottom = bottom;
x += gi->xOff;
y += gi->yOff;
}
+ extents->x = -overall_left;
+ extents->y = -overall_top;
+ extents->width = overall_right - overall_left;
+ extents->height = overall_bottom - overall_top;
extents->xOff = x;
extents->yOff = y;
}
diff --git a/xc/lib/xtrans/Xtransam.c b/xc/lib/xtrans/Xtransam.c
deleted file mode 100644
index fe9f2bccf..000000000
--- a/xc/lib/xtrans/Xtransam.c
+++ /dev/null
@@ -1,2002 +0,0 @@
-/* $TOG: Xtransam.c /main/5 1998/02/06 15:54:26 kaleb $ */
-/*
-
-Copyright 1994, 1998 The Open Group
-
-All Rights Reserved.
-
-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 OPEN GROUP 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.
-
-Except as contained in this notice, the name of The Open Group shall
-not be used in advertising or otherwise to promote the sale, use or
-other dealings in this Software without prior written authorization
-from The Open Group.
-
-*/
-/* $XFree86: xc/lib/xtrans/Xtransam.c,v 3.2 1998/10/03 09:07:34 dawes Exp $ */
-
-/* Copyright 1994 Vrije Universiteit Amsterdam, Netherlands
- *
- * All Rights Reserved
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, 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 Vrije Universiteit not be used
- * in advertising or publicity pertaining to distribution of the software
- * without specific, written prior permission. The Vrije Universiteit
- * makes no representations about the suitability of this software for
- * any purpose. It is provided "as is" without express or implied warranty.
- *
- * THE VRIJE UNIVERSITEIT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
- * NO EVENT SHALL THE VRIJE UNIVERSITEIT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-/*
- * This is the Amoeba implementation of the X Transport service layer
- */
-
-#define event am_event_t
-#define interval am_interval_t
-#define port am_port_t
-#include <amoeba.h>
-#include <semaphore.h>
-#include <cmdreg.h>
-#include <stdcom.h>
-#include <stderr.h>
-#include <vc.h>
-#include <circbuf.h>
-#include <exception.h>
-#include <module/signals.h>
-#include <ampolicy.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <exception.h>
-#include <fault.h>
-#include <signal.h>
-#include <ctype.h>
-#include <module/name.h>
-#include <server/x11/Xamoeba.h>
-#include <server/ip/hton.h>
-#include <server/ip/types.h>
-#include <server/ip/gen/in.h>
-#include <server/ip/gen/tcp.h>
-#include <server/ip/tcpip.h>
-#include <server/ip/tcp_io.h>
-#include <server/ip/gen/tcp_io.h>
-#include <server/ip/gen/netdb.h>
-#include <server/ip/gen/inet.h>
-#undef event
-#undef interval
-#undef port
-
-extern char *strdup();
-
-/* a new family for Amoeba RPC connections */
-#define AF_AMOEBA 33
-#define FamilyAmoeba 33
-
-#define MAX_TCPIP_RETRY 4
-#define CIRCBUFSIZE 4096 /* was 1024 */
-
-/*
- * Amoeba channel description:
- */
-typedef struct _XAmChanDesc {
- int state; /* current state of connection */
- int type; /* type of connection */
- int status; /* status used by server */
- signum signal; /* signal to kill TCP/IP reader */
- semaphore *sema; /* select semaphore */
- struct vc *virtcirc; /* virtual circuit for Amoeba RPC */
- struct circbuf *circbuf; /* circular buffer for TCP/IP */
- capability chancap; /* TCP/IP channel capability */
- XtransConnInfo conninfo; /* back pointer to the connect info */
-} XAmChanDesc;
-
-/* Amoeba channel descriptor states */
-#define ACDS_FREE 0 /* unused */
-#define ACDS_USED 1 /* intermediate state */
-#define ACDS_CLOSED 2 /* just closed */
-
-/* Amoeba channel types */
-#define ACDT_TCPIP 1 /* TCP/IP connection */
-#define ACDT_VIRTCIRC 2 /* Amoeba virtual circuit connection */
-
-
-#ifdef XSERV_t
-#include "dix.h" /* clients[] needed by AmFindReadyClients */
-#define Error(list) ErrorF list
-#define Fatal(list) FatalError list
-#else
-#define Error(list) printf list
-#define Fatal(list) { printf list; exit(1); }
-#endif
-
-#define dbprintf(list) /* printf list */
-#define doprintf(list) printf list /**/
-
-/*
- * First: utility functions.
- */
-
-#if defined(XSERV_t) || defined(FS_t)
-
-static semaphore main_sema;
-
-/* The X-server consists of one main thread, running the non re-entrant
- * X code, and a number of auxilary threads that take care of reading
- * the input streams, and input devices. The following set of routines
- * wake up the main thread when it has something to do.
- */
-void
-InitMainThread()
-{
- sema_init(&main_sema, 0);
-}
-
-void
-WakeUpMainThread()
-{
- sema_up(&main_sema);
-}
-
-int
-SleepMainThread(timeout)
-am_interval_t timeout;
-{
- dbprintf(("Sleeping main thread timeout %d\n", timeout));
- return (sema_trydown(&main_sema, timeout) == 0) ? 0 : -1;
-}
-
-
-static int init_waiters;
-static semaphore init_sema;
-
-void
-AmInitWaitFor()
-{
- init_waiters = 0;
- sema_init(&init_sema, 0);
-}
-
-/*
- * Force caller thread to wait until main has finished the initialization.
- */
-void
-WaitForInitialization()
-{
- init_waiters++;
- dbprintf(("Waiting for initialization (%d)\n", init_waiters));
- sema_down(&init_sema);
-}
-
-void
-WakeupInitWaiters()
-{
- /* wakeup threads in initial sleep */
- if (init_waiters > 0) {
- dbprintf(("%d waiters wait for something ...\n", init_waiters));
- while (init_waiters-- > 0) {
- sema_up(&init_sema);
- }
- }
-}
-
-#endif /* XSERV_t || FS_t */
-
-
-#define THREAD_STACK_SIZE (8*1024)
-
-/*
- * Amoeba connection information is stored in, so called,
- * channel descriptors. Channel descriptors are identified
- * by their index in the table below.
- */
-static XAmChanDesc XAmChanDescriptors[OPEN_MAX];
-static void XAmCleanUpChanDesc(); /* forward */
-
-/*
- * Cleanup connection descriptors on a signal
- */
-static void
-XAmSignalCleanUpChanDesc(sig)
- int sig;
-{
- XAmCleanUpChanDesc();
- _exit(sig | 0x80);
-}
-
-/*
- * Cleanup connection descriptors
- */
-static void
-XAmCleanUpChanDesc()
-{
- register int i;
-
- for (i = 0; i < OPEN_MAX; i++) {
- switch (XAmChanDescriptors[i].type) {
- case ACDT_TCPIP:
- /* The Amoeba TCP/IP server is capability based, i.e.
- * it uses capabilities to identify connections. Since a
- * capability is only destroyed when it has aged too much
- * or is explicitly deleted, the connection it identifies
- * will tend to exist for some while even if the client is
- * already gone. To force connections to close this loop
- * destroys all open TCP/IP connection. This loop us auto-
- * matically executed when exit() is called.
- */
- std_destroy(&XAmChanDescriptors[i].chancap);
- break;
- case ACDT_VIRTCIRC:
- /* Close the virtual circuit asynchronously, or otherwise
- * we may hang for a minute under some (?) conditions.
- */
- vc_close(XAmChanDescriptors[i].virtcirc, VC_BOTH | VC_ASYNC);
- break;
- }
- XAmChanDescriptors[i].state = ACDS_FREE;
- }
-}
-
-/*
- * Allocate a channel descriptor
- */
-static XAmChanDesc *
-XAmAllocChanDesc()
-{
- register int i;
-
-#ifndef XSERV_t
-
- static int initialized = 0;
-
- /*
- * Since the TCP/IP server is capability based its connections exists
- * even if the owner process is long gone. To overcome this nuisance,
- * a sweep is made over the connection descriptors when exit() is
- * called or when an un-catched (by application program) signal is
- * received.
- */
- if (!initialized) {
- initialized = 1;
- atexit(XAmCleanUpChanDesc);
- if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
- signal(SIGHUP, XAmSignalCleanUpChanDesc);
- if (signal(SIGQUIT, SIG_IGN) != SIG_IGN)
- signal(SIGQUIT, XAmSignalCleanUpChanDesc);
- if (signal(SIGINT, SIG_IGN) != SIG_IGN)
- signal(SIGINT, XAmSignalCleanUpChanDesc);
- if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
- signal(SIGTERM, XAmSignalCleanUpChanDesc);
- }
-#endif
-
- for (i = 0; i < OPEN_MAX; i++) {
- if (XAmChanDescriptors[i].state == ACDS_FREE) {
- XAmChanDescriptors[i].state = ACDS_USED;
- XAmChanDescriptors[i].conninfo = NULL;
- return &XAmChanDescriptors[i];
- }
- }
- return NULL;
-}
-
-/*
- * Convert ``file descriptor'' to channel descriptor
- */
-static XAmChanDesc *
-XAmFdToChanDesc(fd)
- int fd;
-{
- if (fd >= 0 && fd < OPEN_MAX) {
- return &XAmChanDescriptors[fd];
- } else {
- return NULL;
- }
-}
-
-/*
- * Convert channel descriptor to ``file descriptor''
- */
-static int
-XAmChanDescToFd(chandesc)
- XAmChanDesc *chandesc;
-{
- return chandesc - XAmChanDescriptors;
-}
-
-/*
- * Free channel descriptor
- */
-static void
-XAmFreeChanDesc(chandesc)
- XAmChanDesc *chandesc;
-{
- if (chandesc->sema) {
- xfree(chandesc->sema);
- chandesc->sema = NULL;
- }
- chandesc->state = ACDS_FREE;
-}
-
-static void XAmReaderThread();
-
-static int
-MakeAmConnection(phostname, idisplay, familyp, saddrlenp, saddrp)
- char *phostname;
- int idisplay;
- int *familyp; /* RETURN */
- int *saddrlenp; /* RETURN */
- char **saddrp; /* RETURN */
-{
- capability xservercap;
- char xserverpath[256];
- XAmChanDesc *chandesc;
- errstat err;
-
- /* Amoeba requires a server hostname */
- if (phostname == NULL || *phostname == '\0') {
- fprintf(stderr, "MakeAmConnection: Display name expected\n");
- return -1;
- }
-
- /* allocate channel descriptor */
- chandesc = XAmAllocChanDesc();
- if (chandesc == NULL) {
- fprintf(stderr, "MakeAmConnection: Out of channel capabilities\n");
- return -1;
- }
-
- /*
- * There are two possible way to make a connection on Amoeba. Either
- * through an Amoeba RPC or a TCP/IP connection. Depending on whether
- * the X server resides on Amoeba, Amoeba RPC's are used. Otherwise
- * it uses a TCP/IP connection.
- */
- (void)sprintf(xserverpath, "%s/%s:%d", DEF_XSVRDIR, phostname, idisplay);
- if ((err = name_lookup(xserverpath, &xservercap)) == STD_OK) {
- am_port_t vccaps[2];
- bufsize size;
- errstat err;
- header hdr;
-
- /* Amoeba virtual circuit connection */
- chandesc->type = ACDT_VIRTCIRC;
-
- /* get the two connection ports from the X-server */
- hdr.h_command = AX_CONNECT;
- hdr.h_port = xservercap.cap_port;
- hdr.h_priv = xservercap.cap_priv;
- size = trans(&hdr, NILBUF, 0, &hdr, (char *)vccaps, sizeof(vccaps));
- if (ERR_STATUS(size)) {
- err = ERR_CONVERT(size);
- } else {
- err = ERR_CONVERT(hdr.h_status);
- }
- if (err != STD_OK || size != sizeof(vccaps)) {
- fprintf(stderr, "Xlib: connect to Amoeba X-server failed (%s)\n",
- err_why(err));
- XAmFreeChanDesc(chandesc);
- return -1;
- }
-
- /* setup an Amoeba virtual circuit */
- chandesc->virtcirc =
- vc_create(&vccaps[1], &vccaps[0], MAXBUFSIZE, MAXBUFSIZE);
- if (chandesc->virtcirc == (struct vc *)NULL) {
- fprintf(stderr, "Xlib: Amoeba virtual circuit create failed\n");
- XAmFreeChanDesc(chandesc);
- return -1;
- }
-
- /* Special Amoeba family type. For Amoeba no additional access control
- * mechanism exists; when you have the server capability, you have
- * the access. Just use a fake address.
- */
- *familyp = AF_AMOEBA;
- *saddrp = strdup("Amoeba");
- *saddrlenp = strlen(*saddrp);
- } else {
- char tcpname[256];
- capability tcpcap;
- ipaddr_t ipaddr;
- char *tcpsvr;
- nwio_tcpcl_t tcpcl;
- nwio_tcpconf_t tcpconf;
- XAmChanDesc **param;
- int result;
-
- /* Amoeba TCP/IP connection */
- chandesc->type = ACDT_TCPIP;
-
- /* lookup up TCP/IP server */
- if ((tcpsvr = getenv("TCP_SERVER")) == NULL) {
- tcpsvr = TCP_SVR_NAME;
- }
- if ((err = name_lookup(tcpsvr, &tcpcap)) != STD_OK) {
- fprintf(stderr, "Xlib: Cannot lookup %s (%s)\n",
- tcpsvr, err_why(err));
- std_destroy(&chandesc->chancap);
- XAmFreeChanDesc(chandesc);
- return -1;
- }
-
- /* establish TCP/IP connection */
- if ((err = tcpip_open(&tcpcap, &chandesc->chancap)) != STD_OK) {
- fprintf(stderr, "Xlib: Cannot open TCP/IP server on %s (%s)\n",
- tcpsvr, tcpip_why(err));
- std_destroy(&chandesc->chancap);
- XAmFreeChanDesc(chandesc);
- return -1;
- }
-
- /* lookup TCP/IP hostname */
- if (isdigit(phostname[0])) {
- ipaddr = inet_addr(phostname);
- } else {
- struct hostent *hp = gethostbyname(phostname);
- if (hp == NULL) {
- fprintf(stderr, "Xlib: %s unknown host\n", phostname);
- return -1;
- }
- memcpy(&ipaddr, hp->h_addr, hp->h_length);
- }
-
- /* set remote address/port on the TCP/IP connection */
- tcpconf.nwtc_flags = NWTC_SET_RA|NWTC_SET_RP|NWTC_LP_SEL;
- tcpconf.nwtc_remaddr = ipaddr;
- tcpconf.nwtc_remport = htons(6000+idisplay);
- if ((err = tcp_ioc_setconf(&chandesc->chancap, &tcpconf)) != STD_OK) {
- fprintf(stderr, "Xlib: Cannot configure TCP/IP server (%s)\n",
- tcpip_why(err));
- std_destroy(&chandesc->chancap);
- XAmFreeChanDesc(chandesc);
- return -1;
- }
-
- /* make the actual TCP/IP connection */
- tcpcl.nwtcl_flags = 0;
- if ((err = tcp_ioc_connect(&chandesc->chancap, &tcpcl)) != STD_OK) {
- fprintf(stderr, "Xlib: Cannot make TCP/IP connection (%s)\n",
- tcpip_why(err));
- std_destroy(&chandesc->chancap);
- XAmFreeChanDesc(chandesc);
- return -1;
- }
-
- /* start TCP/IP reader thread */
- chandesc->signal = sig_uniq();
- chandesc->circbuf = cb_alloc(CIRCBUFSIZE);
- param = (XAmChanDesc **) xalloc(sizeof(XAmChanDesc *)); /* error checking? */
- *param = chandesc;
- result = thread_newthread(XAmReaderThread, THREAD_STACK_SIZE,
- (char *)param, sizeof(XAmChanDesc *));
- if (result == 0) {
- fprintf(stderr, "Xlib: Cannot start reader thread\n");
- std_destroy(&chandesc->chancap);
- XAmFreeChanDesc(chandesc);
- return -1;
- }
- threadswitch(); /* give reader a try */
-
- /*
- * Family type is set to Internet so that the .Xauthority
- * files from Unix will work under Amoeba (for Unix displays).
- */
- *familyp = AF_INET;
- *saddrlenp = sizeof(ipaddr_t);
- *saddrp = xalloc(sizeof(ipaddr_t));
- memcpy(*saddrp, (char *)&ipaddr, sizeof(ipaddr_t)); /* error checking? */
- }
-
- return XAmChanDescToFd(chandesc);
-}
-
-/*
- * The TCP/IP server silently assumes a maximum buffer size of 30000 bytes.
- */
-#define TCPIP_BUFSIZE 16384
-
-static void
-XAMCloseChannel(chandesc)
-XAmChanDesc *chandesc;
-{
- if (chandesc->state == ACDS_USED && chandesc->type == ACDT_TCPIP) {
- cb_close(chandesc->circbuf);
- chandesc->state = ACDS_CLOSED;
- }
-}
-
-
-/*
- * Shutdown TCP/IP reader thread
- */
-static void
-XAmReaderSignalCatcher(sig, us, extra)
- signum sig;
- thread_ustate *us;
- _VOIDSTAR extra;
-{
- register XAmChanDesc *chandesc = (XAmChanDesc *)extra;
-
- XAMCloseChannel(chandesc);
- thread_exit();
-}
-
-/*
- * TCP/IP reader thread
- */
-static void
-XAmReaderThread(argptr, argsize)
- void *argptr;
- int argsize;
-{
- register XAmChanDesc *chandesc;
-
- chandesc = *((XAmChanDesc **)argptr);
- (void) sig_catch(chandesc->signal, XAmReaderSignalCatcher,
- (_VOIDSTAR) chandesc);
-
- while (chandesc->state == ACDS_USED) {
- char buffer[CIRCBUFSIZE];
- bufsize size;
-
- size = tcpip_read(&chandesc->chancap, buffer, sizeof(buffer));
- if (ERR_STATUS(size) || size == 0) {
- if (size == 0) {
- static char msg[] = "Xlib: TCP/IP channel closed\n";
-
- write(2, msg, sizeof(msg));
- } else {
- fprintf(stderr, "Xlib: TCP/IP read failed (%s)\n",
- err_why(ERR_CONVERT(size)));
- }
- XAMCloseChannel(chandesc);
- break;
- }
-
- if (cb_puts(chandesc->circbuf, buffer, size) != 0) {
- fprintf(stderr, "Xlib: short write to circular buffer\n");
- XAMCloseChannel(chandesc);
- }
- }
-
- thread_exit();
-}
-
-/*
- * Wait until input is available or until the timer expires.
- */
-int
-TRANS(AmSelect)(ifd, timout)
- int ifd;
- int timout;
-{
- XAmChanDesc *chandesc;
- int n;
-
- errno = 0;
-
- chandesc = XAmFdToChanDesc(ifd);
- if (chandesc == NULL || chandesc->state != ACDS_USED) {
- errno = EBADF;
- return -1;
- }
-
- if (chandesc->sema == NULL) {
- /* Allocate semaphore to sleep on when no data is
- * available. The underlying circular buffer and
- * virtual circuit packages manage this semaphore.
- */
- chandesc->sema = (semaphore *) xalloc(sizeof(semaphore));
- if (chandesc->sema == NULL) {
- errno = ENOMEM;
- return -1;
- }
-
- sema_init(chandesc->sema, 0);
- switch (chandesc->type) {
- case ACDT_TCPIP:
- cb_setsema(chandesc->circbuf, chandesc->sema);
- break;
- case ACDT_VIRTCIRC:
- vc_setsema(chandesc->virtcirc, chandesc->sema);
- break;
- }
- }
-
- switch (chandesc->type) {
- case ACDT_TCPIP:
- if ((n = cb_full(chandesc->circbuf)) != 0) {
- if (n < 0) errno = EPIPE;
- return n; /* includes error as well */
- }
- if (sema_trydown(chandesc->sema, timout) < 0) {
- errno = EINTR;
- return -1;
- } else {
- /* we down for all the bytes in AMRead, so undo the down */
- sema_up(chandesc->sema);
- }
- if ((n = cb_full(chandesc->circbuf)) < 0) {
- errno = EPIPE;
- return -1;
- }
- return n;
-
- case ACDT_VIRTCIRC:
- if ((n = vc_avail(chandesc->virtcirc, VC_IN)) != 0) {
- if (n < 0) errno = EPIPE;
- return n; /* includes error as well */
- }
- if (sema_trydown(chandesc->sema, timout) < 0) {
- errno = EINTR;
- return -1;
- } else {
- /* we down for all the bytes in AMRead, so undo the down */
- sema_up(chandesc->sema);
- }
- if ((n = vc_avail(chandesc->virtcirc, VC_IN)) < 0) {
- errno = EPIPE;
- return -1;
- }
- return n;
- }
-
- errno = EINVAL;
- return -1;
-}
-
-/*
- * This function gets the local address of the transport and stores it in the
- * XtransConnInfo structure for the connection.
- */
-
-static int
-TRANS(AMGetAddr)(ciptr)
-XtransConnInfo ciptr;
-{
- PRMSG(1,"AMGetAddr(%x)\n", ciptr, 0,0 );
- PRMSG(1,"AMGetAddr: TODO\n", 0, 0, 0);
-
- return -1;
-}
-
-
-/*
- * This function gets the remote address of the socket and stores it in the
- * XtransConnInfo structure for the connection.
- */
-
-static int
-TRANS(AMGetPeerAddr)(ciptr)
-XtransConnInfo ciptr;
-{
- struct nwio_tcpconf tcpconf;
- errstat err;
- XAmChanDesc *chandesc;
-
- PRMSG(2,"AMGetPeerAddr(%x)\n", ciptr, 0,0 );
-
- chandesc = XAmFdToChanDesc(ciptr->fd);
- if (chandesc == NULL || chandesc->state != ACDS_USED) {
- errno = EBADF;
- return -1;
- }
-
- switch (chandesc->type) {
- case ACDT_TCPIP:
- /* get the remote adress from the TCP/IP server */
- if ((err = tcp_ioc_getconf(&chandesc->chancap, &tcpconf)) != STD_OK) {
- PRMSG (1, "AMGetPeerAddr: Cannot get remote address (%d)\n",
- (int) err, 0, 0);
- return -1;
- }
-
-#if 0 /* debug */
- {
- struct hostent *remote;
- char *hostname;
-
- remote = gethostbyaddr((char *) &tcpconf.nwtc_remaddr,
- sizeof(tcpconf.nwtc_remaddr), AF_INET);
- if ((remote == NULL) || (remote->h_name == NULL)) {
- hostname = inet_ntoa(tcpconf.nwtc_remaddr);
- } else {
- hostname = remote->h_name;
- }
- PRMSG (1, "AMGetPeerAddr: remote addr `%s'\n",
- hostname, 0, 0);
- }
-#endif
-
- ciptr->peeraddrlen = sizeof(tcpconf.nwtc_remaddr);
- ciptr->peeraddr = (char *) xalloc (ciptr->peeraddrlen);
- if (ciptr->peeraddr == NULL) {
- PRMSG (1, "AMGetPeerAddr: Can't allocate peeraddr\n",
- 0, 0, 0);
- return -1;
- }
-
- memcpy (ciptr->peeraddr, &tcpconf.nwtc_remaddr, ciptr->peeraddrlen);
- break;
-
- case ACDT_VIRTCIRC:
- /* for Amoeba virtual circuits just copy the client address */
- if ((ciptr->peeraddr = (char *) xalloc (ciptr->addrlen)) == NULL) {
- PRMSG (1, "AMGetPeerAddr: Can't allocate peeraddr\n",
- 0, 0, 0);
- return -1;
- }
-
- ciptr->peeraddrlen = ciptr->addrlen;
- memcpy (ciptr->peeraddr, ciptr->addr, ciptr->peeraddrlen);
- break;
- }
-
- return 0;
-}
-
-
-static XtransConnInfo
-TRANS(AMOpen)(device)
-char *device;
-{
- PRMSG(1,"AMOpen(%s)\n", device, 0,0 );
- PRMSG(1,"AMOpen: TODO\n", 0, 0, 0);
-
- return NULL;
-}
-
-
-static int
-TRANS(AMAddrToNetbuf)(tlifamily, host, port, netbufp)
-int tlifamily;
-char *host;
-char *port;
-struct netbuf *netbufp;
-{
- PRMSG(1,"AMAddrToNetbuf(%d,%s,%s)\n", tlifamily, host, port );
- PRMSG(1,"AMAddrToNetbuf: TODO\n", 0, 0, 0);
-
- return -1;
-}
-
-/*
- * These functions are the interface supplied in the Xtransport structure
- */
-
-#ifdef TRANS_CLIENT
-
-static XtransConnInfo
-TRANS(AMOpenCOTSClient)(thistrans, protocol, host, port)
-Xtransport *thistrans;
-char *protocol;
-char *host;
-char *port;
-{
- XtransConnInfo ciptr;
- XAmChanDesc *chandesc;
-
- PRMSG(2,"AMOpenCOTSClient(%s,%s,%s)\n", protocol, host, port );
-
- ciptr = (XtransConnInfo) xcalloc (1, sizeof(struct _XtransConnInfo));
- if (ciptr == NULL) {
- PRMSG (1, "AMOpenCotsClient: malloc failed\n", 0, 0, 0);
- return NULL;
- }
-
- ciptr->fd = MakeAmConnection (host, 0 /* TODO */, &ciptr->family,
- &ciptr->addrlen, &ciptr->addr);
- if (ciptr->fd < 0) {
- PRMSG(1,"AMOpenCOTSClient: Unable to make connection to %s\n",
- host, 0,0 );
- xfree(ciptr);
- return NULL;
- }
-
- /* set the back pointer */
- chandesc = XAmFdToChanDesc(ciptr->fd);
- chandesc->conninfo = ciptr;
-
- TRANS(AMGetPeerAddr)(ciptr);
-
- PRMSG(2,"AMOpenCOTSClient: made connection to %s; fd = %d, family = %d\n",
- host, ciptr->fd, ciptr->family);
-
- return ciptr;
-}
-
-#endif /* TRANS_CLIENT */
-
-#if defined(XSERV_t) || defined(FS_t)
-
-/* The following defines come from osdep.h;
- * they should removed from there eventually.
- */
-
-/*
- * Some fundamental constants
- */
-#define CONNECTOR_STACK 4000 /* stack for connector task */
-#define DEVREADER_STACK 4000 /* stack for device reader */
-#define CREATOR_STACK 4000 /* stack for connection creator */
-#define MAXTASKS 100 /* Maximum # clients */
-
-/*
- * OsComm status bits
- */
-#define CONN_KILLED 0x1 /* Connection being closed */
-#define REQ_PUSHBACK 0x2 /* Request pushed back */
-#define IGNORE 0x4 /* True if client ignored */
-#define CONN_INIT 0x8 /* True if still initializing */
-#define CONN_ALIVE 0x10 /* True if living */
-
-
-#define REPLY_BUFSIZE 30000
-
-capability X; /* X capability */
-char *XServerHostName; /* X server host name */
-char *XTcpServerName; /* TCP/IP server name */
-
-static XtransConnInfo NewConns[MAXTASKS]; /* new client connections */
-int nNewConns; /* # of new clients */
-
-int maxClient; /* Highest allocated client fd + 1*/
-static int minClient = 1; /* Lowest allocated client fd */
-
-static char *
-OsCommStatus(status)
- int status;
-{
- static char buf[100];
-
- buf[0] = '\0';
- if (status == 0)
- sprintf(buf, "NONE");
- if (status & CONN_INIT)
- sprintf(buf, "%s INIT", buf);
- if (status & CONN_ALIVE)
- sprintf(buf, "%s ALIVE", buf);
- if (status & CONN_KILLED)
- sprintf(buf, "%s KILLED", buf);
- if (status & REQ_PUSHBACK)
- sprintf(buf, "%s PUSHBACK", buf);
- if (status & IGNORE)
- sprintf(buf, "%s IGNORE", buf);
- return buf;
-}
-
-static char *
-OsCommFamily(family)
- int family;
-{
- if (family == FamilyAmoeba) {
- return "AMOEBA";
- } else {
- return "TCP/IP";
- }
-}
-
-
-/*
- * Return status information about the open connections
- */
-static errstat
-ConnectionStatus(hdr, buf, size)
- header *hdr;
- char *buf;
- int size;
-{
- char *begin, *end;
- char *bprintf();
- int fd;
- XAmChanDesc *chandesc;
-
- begin = buf;
- end = buf + size;
-
-
- /* all active clients */
- begin = bprintf(begin, end, "Active clients:\n");
- for (fd = minClient; fd < maxClient; fd++) {
- static XAmChanDesc *chandesc;
-
- chandesc = XAmFdToChanDesc(fd);
- if (chandesc != NULL && chandesc->conninfo != NULL) {
- begin = bprintf(begin, end, "%d: Family %s, State %d, Status %s\n",
- fd, OsCommFamily(chandesc->conninfo->family),
- chandesc->state, OsCommStatus(chandesc->status));
- }
- }
-
- if (begin == NULL) {
- hdr->h_size = 0;
- return STD_SYSERR;
- } else {
- hdr->h_size = begin - buf;
- return STD_OK;
- }
-}
-
-/*
- * Wakeup main thread if necessary
- */
-static void
-UnblockMain(fd)
-int fd;
-{
- XAmChanDesc *chandesc;
-
- chandesc = XAmFdToChanDesc(fd);
- if (chandesc != NULL) {
- if ((chandesc->status & IGNORE) == 0) {
- WakeUpMainThread();
- }
- } else {
- Error(("UnblockMain: invalid fd %d\n", fd));
- }
-}
-
-static void
-TcpIpReaderSignalCatcher(sig, us, extra)
- signum sig;
- thread_ustate *us;
- _VOIDSTAR extra;
-{
- XAmChanDesc *chandesc = (XAmChanDesc *) extra;
-
- if (chandesc->conninfo != NULL) {
- dbprintf(("TcpIpReaderSignalCatcher(%d), number %d\n",
- sig, chandesc->conninfo->fd));
- if (chandesc->signal != sig) {
- Error(("TCP/IP Reader: Connection %s got unexpected signal %d\n",
- chandesc->conninfo->fd, sig));
- }
- }
-
- chandesc->signal = -1;
- thread_exit();
-}
-
-void
-TcpIpReaderThread(argptr, argsize)
- void *argptr;
- int argsize;
-{
- XAmChanDesc *chandesc;
-
- if (argsize != sizeof(XAmChanDesc *)) {
- Fatal(("Internal error: TcpIpReaderThread incorrectly called\n"));
- }
-
- chandesc = * ((XAmChanDesc **) argptr);
- (void) sig_catch(chandesc->signal, TcpIpReaderSignalCatcher,
- (_VOIDSTAR) chandesc);
-
- for (;;) {
- char buffer[MAXBUFSIZE];
- bufsize size;
-
- size = tcpip_read(&chandesc->chancap, buffer, sizeof(buffer));
-
- dbprintf(("TcpIpReaderThread() read %d bytes\n", size));
- if (ERR_STATUS(size)) {
- Error(("TCP/IP read failed (%s)\n", tcpip_why(ERR_CONVERT(size))));
- chandesc->status |= CONN_KILLED;
- chandesc->status &= ~CONN_ALIVE;
- chandesc->signal = -1;
- thread_exit();
- }
-
- if (size == 0 || cb_puts(chandesc->circbuf, buffer, size)) {
- if (size != 0) {
- Error(("TCP/IP short write to circular buffer for %d\n",
- XAmChanDescToFd(chandesc)));
- } else {
- Error(("TCP/IP read failed for client %d\n",
- XAmChanDescToFd(chandesc)));
- }
-
- chandesc->status |= CONN_KILLED;
- chandesc->status &= ~CONN_ALIVE;
- chandesc->signal = -1;
- thread_exit();
- }
- UnblockMain(XAmChanDescToFd(chandesc));
- }
-}
-
-static XAmChanDesc *
-AllocClientChannel()
-{
- XAmChanDesc *chandesc;
- int fd;
-
- chandesc = XAmAllocChanDesc();
- if (chandesc == NULL) {
- return NULL;
- }
-
- fd = XAmChanDescToFd(chandesc);
- if (fd >= maxClient) {
- maxClient = fd + 1;
- dbprintf(("new max Client: %d\n", fd));
- }
- if (fd < minClient) {
- minClient = fd;
- }
-
- return chandesc;
-}
-
-static errstat
-AmRegisterRPCconn(client_ports, server_ports)
-am_port_t client_ports[2];
-am_port_t server_ports[2];
-{
- XAmChanDesc *chandesc;
-
- if ((chandesc = AllocClientChannel()) == NULL) {
- return STD_NOSPACE;
- }
-
- chandesc->type = ACDT_VIRTCIRC;
- chandesc->virtcirc = vc_create(&server_ports[0], &server_ports[1],
- MAXBUFSIZE, MAXBUFSIZE);
- if (chandesc->virtcirc == NULL) {
- Error(("Connection refused: No memory for virtual circuit\n"));
- XAmFreeChanDesc(chandesc);
- return STD_NOSPACE;
- }
-
- dbprintf(("Amoeba connection registered\n"));
-
- vc_warn(chandesc->virtcirc, VC_IN, UnblockMain, XAmChanDescToFd(chandesc));
-
- chandesc->status = CONN_INIT;
-
- /* cause WaitFor to call EstablishNewConnections: */
- nNewConns++;
- WakeUpMainThread();
-
- return STD_OK;
-}
-
-static XAmChanDesc *
-XAmFetchConnectingClient()
-{
- XAmChanDesc *chandesc;
- int fd;
-
- for (fd = minClient; fd < maxClient; fd++) {
- chandesc = XAmFdToChanDesc(fd);
-
- if (chandesc->status & CONN_INIT) {
- Error(("Client %d is connecting\n", fd));
- chandesc->status &= ~CONN_INIT;
- return chandesc;
- }
- }
-
- return NULL;
-}
-
-static errstat
-AmRegisterTCPconn(chancap)
-capability *chancap;
-{
- XAmChanDesc *chandesc, **param;
-
- if ((chandesc = AllocClientChannel()) == NULL) {
- return STD_NOSPACE;
- }
-
- chandesc->type = ACDT_TCPIP;
- chandesc->chancap = *chancap;
-
- if ((chandesc->circbuf = cb_alloc(MAXBUFSIZE)) == NULL) {
- Error(("TCPconn refused: No memory for circular buffer\n"));
- XAmFreeChanDesc(chandesc);
- return STD_NOSPACE;
- }
-
- chandesc->signal = sig_uniq();
- param = (XAmChanDesc **) xalloc(sizeof(XAmChanDesc *)); /* error checking? */
- *param = chandesc;
- if (thread_newthread(TcpIpReaderThread, MAXBUFSIZE + CONNECTOR_STACK,
- (char *)param, sizeof(XAmChanDesc *)) == 0)
- {
- Error(("TCPconn refused: Cannot start reader thread\n"));
- cb_close(chandesc->circbuf);
- cb_free(chandesc->circbuf);
- XAmFreeChanDesc(chandesc);
- return STD_NOSPACE;
- }
-
- dbprintf(("TCP connection registered\n"));
-
- chandesc->status = CONN_INIT;
-
- /* cause WaitFor to call EstablishNewConnections: */
- nNewConns++;
- WakeUpMainThread();
-
- return STD_OK;
-}
-
-
-/*
- * Establishing a new connection is done in two phases. This thread does the
- * first part. It filters out bad connect requests. A new rendevous port is
- * sent to the client and the main loop is informed if there is a legal
- * request. The sleep synchronizes with the main loop so that the paperwork
- * is finished for the current connect request before the thread is ready to
- * accept another connect.
- */
-static void
-AmConnectorThread()
-{
- header req, rep;
- am_port_t client_ports[2];
- am_port_t server_ports[2];
- short s;
- char *repb;
- extern CreateNewClient();
-
- WaitForInitialization();
- dbprintf(("AmConnectorThread() running ...\n"));
- if ((repb = (char *)xalloc(REPLY_BUFSIZE)) == NULL) {
- Fatal(("Amoeba connector thread: malloc failed"));
- }
- for (;;) {
- do {
- req.h_port = X.cap_port;
- s = getreq(&req, NILBUF, 0);
- } while (ERR_CONVERT(s) == RPC_ABORTED);
- if (ERR_STATUS(s))
- Fatal(("Amoeba connector thread: getreq failed"));
-
- /* TODO: check privilege fields here */
-
- dbprintf(("AmConnectorThread() accepting a request\n"));
-
- switch (req.h_command) {
-
- case STD_INFO:
- rep.h_status = STD_OK;
- sprintf(repb, "X11R6 server on %s", XServerHostName);
- rep.h_size = strlen(repb);
- putrep(&rep, repb, rep.h_size);
- break;
-
- case STD_STATUS:
- rep.h_status = ConnectionStatus(&rep, repb, REPLY_BUFSIZE);
- putrep(&rep, repb, rep.h_size);
- break;
-
-#ifdef XSERV_t
- case AX_SHUTDOWN:
- rep.h_status = STD_OK;
- putrep(&rep, NILBUF, 0);
- GiveUp(SIGTERM);
- break;
-
- case AX_REINIT:
- rep.h_status = STD_OK;
- putrep(&rep, NILBUF, 0);
- AutoResetServer(SIGINT);
- break;
-#endif
-
- case AX_CONNECT:
- uniqport(&client_ports[0]);
- uniqport(&server_ports[1]);
- priv2pub(&client_ports[0], &server_ports[0]);
- priv2pub(&server_ports[1], &client_ports[1]);
-
- rep.h_status = AmRegisterRPCconn(client_ports, server_ports);
- if (rep.h_status == STD_OK) {
- putrep(&rep, (bufptr)client_ports, 2*sizeof(am_port_t));
- } else {
- putrep(&rep, NILBUF, 0);
- }
- break;
-
- default:
- rep.h_status = STD_COMBAD;
- putrep(&rep, NILBUF, 0);
- break;
- }
- }
-}
-
-#ifdef XSERV_t
-
-/*
- * To prevent the X-server from generating lots of error messages,
- * in case the server is gone or when its full.
- */
-#define LOOP_OPEN 1
-#define LOOP_SETCONF 2
-#define LOOP_LISTEN 4
-
-extern char *display; /* The display number */
-
-/*
- * The TCP/IP connector thread listens to a well known port (6000 +
- * display number) for connection request. When such a request arrives
- * it allocates a communication structure and a reader thread. This
- * thread prevents the main loop from blocking when there's no data.
- */
-static void
-AmTCPConnectorThread()
-{
- capability svrcap, chancap;
- nwio_tcpconf_t tcpconf;
- nwio_tcpcl_t tcpconnopt;
- char name[BUFSIZ];
- errstat err;
- int result;
- int looping = 0;
-
- strncpy(name, XTcpServerName, BUFSIZ);
- if ((err = name_lookup(name, &svrcap)) != STD_OK) {
- sprintf(name, "%s/%s", TCP_SVR_NAME, XTcpServerName);
- if ((err = name_lookup(name, &svrcap)) != STD_OK)
- Fatal(("Lookup %s failed: %s\n", XTcpServerName, err_why(err)));
- }
-
- WaitForInitialization();
- dbprintf(("AmTCPConnectorThread() running ...\n"));
-
- for (;;) {
- /*
- * Listen to TCP/IP port X_TCP_PORT + display for connections.
- * Some interesting actions have to be taken to keep this connection
- * alive and kicking :-)
- */
- if ((err = tcpip_open(&svrcap, &chancap)) != STD_OK) {
- /* the server probably disappeared, just wait for it to return */
- if (looping & LOOP_OPEN) {
- Error(("TCP/IP open failed: %s\n", tcpip_why(err)));
- looping |= LOOP_OPEN;
- }
- sleep(60);
- (void) name_lookup(name, &svrcap);
- continue;
- }
- looping &= ~LOOP_OPEN;
-
- tcpconf.nwtc_locport = htons(X_TCP_PORT + atoi(display));
- tcpconf.nwtc_flags = NWTC_EXCL | NWTC_LP_SET | NWTC_UNSET_RA |
- NWTC_UNSET_RP;
- if ((err = tcp_ioc_setconf(&chancap, &tcpconf)) != STD_OK) {
- /* couldn't configure, probably server space problem */
- if (looping & LOOP_SETCONF) {
- Error(("TCP/IP setconf failed: %s\n", tcpip_why(err)));
- looping |= LOOP_SETCONF;
- }
- std_destroy(&chancap);
- sleep(60);
- continue;
- }
- looping &= ~LOOP_SETCONF;
-
- tcpconnopt.nwtcl_flags = 0;
- if ((err = tcp_ioc_listen(&chancap, &tcpconnopt)) != STD_OK) {
- /* couldn't listen, definitely a server memory problem */
- if (looping & LOOP_LISTEN) {
- Error(("TCP/IP listen failed: %s\n", tcpip_why(err)));
- looping |= LOOP_LISTEN;
- }
- std_destroy(&chancap);
- sleep(60);
- continue;
- }
- looping &= ~LOOP_LISTEN;
-
- if ((err = tcpip_keepalive_cap(&chancap)) != STD_OK) {
- Error(("TCP/IP keep alive failed: %s\n", tcpip_why(err)));
- std_destroy(&chancap);
- continue;
- }
-
- err = AmRegisterTCPconn(&chancap);
- if (err != STD_OK) {
- Error(("AmRegisterTCPconn failed (%s)\n", err_why(err)));
- std_destroy(&chancap);
- }
- }
-}
-
-static void
-AmStartXserverThreads(chandesc)
-XAmChanDesc *chandesc;
-{
- char host[100];
- errstat err;
- capability pubX;
- static int threadsStarted = 0;
-
- /*
- * Each time the server is reset this routine is called to
- * setup the new well known sockets. For Amoeba we'll just
- * keep using the old threads that are already running.
- */
- if (!threadsStarted) {
- threadsStarted = 1;
-
- /*
- * Create a new capability for this X server
- */
- if (XServerHostName == NULL)
- XServerHostName = getenv("XHOST");
- if (XServerHostName == NULL) {
- Fatal(("XHOST not set, or server host name not given\n"));
- }
- sprintf(host, "%s/%s:%s", DEF_XSVRDIR, XServerHostName, display);
-
- uniqport(&X.cap_port);
- priv2pub(&X.cap_port, &pubX.cap_port);
- (void) name_delete(host);
- if ((err = name_append(host, &pubX)) != 0) {
- Error(("Cannot create capability %s: %s\n", host, err_why(err)));
- exit(1);
- }
-
- /* Allow WaitFor module to initialize */
- AmInitWaitFor();
-
- /* Also, initialize main thread locking */
- InitMainThread();
-
- /* Initialize and start IOP reader thread */
- InitializeIOPServerReader();
-
- /* Start native Amoeba service threads */
- if (thread_newthread(AmConnectorThread, CONNECTOR_STACK, 0, 0) <= 0) {
- Fatal(("Cannot start Amoeba connector thread\n"));
- }
- if (thread_newthread(AmConnectorThread, CONNECTOR_STACK, 0, 0) <= 0) {
- Fatal(("Cannot start Amoeba connector thread\n"));
- }
- chandesc->type = ACDT_VIRTCIRC;
- chandesc->status = CONN_ALIVE;
-
- /*
- * Start TCP/IP service threads
- */
- if (XTcpServerName) {
- if (thread_newthread(AmTCPConnectorThread,
- CONNECTOR_STACK, 0, 0) <= 0)
- Fatal(("Cannot start TCP connector thread\n"));
- if (thread_newthread(AmTCPConnectorThread,
- CONNECTOR_STACK, 0, 0) <= 0)
- Fatal(("Cannot start TCP connector thread\n"));
- }
- }
-}
-
-int
-AmFindReadyClients(pClientsReady, mask)
-int *pClientsReady;
-long *mask;
-{
- /* Check for clients needing attention. They may have input,
- * or they might be dying. Ignore the clients not present in
- * the file descriptor bit vector `mask'. This is used for
- * implementing server grabs.
- * Returns the number of clients having data for us.
- */
- extern int ConnectionTranslation[];
- XAmChanDesc *chandesc;
- int fd;
- int nready;
-
- /* Since we're scheduled non-preemptively by default, allow the
- * listener threads to run first, if needed:
- */
- threadswitch();
-
- nready = 0;
- for (fd = minClient; fd < maxClient; fd++) {
- int which;
- int n;
-
- if (fd > 0 && (fd % 32) == 0) {
- /* switch to next fd mask */
- mask++;
- }
-
- if ((*mask & (1L << fd)) == 0) {
- dbprintf(("skip %d\n", fd));
- continue;
- }
-
- chandesc = XAmFdToChanDesc(fd);
- if (chandesc->state != ACDS_USED) {
- dbprintf(("AmFindReady: fd %d not in use\n", fd));
- continue;
- }
-
- which = ConnectionTranslation[fd];
- dbprintf(("checking client %d (fd %d) of %d\n",
- fd, which, maxClient));
-
- if (chandesc->status & CONN_KILLED) {
- dbprintf(("conn killed; close client with fd %d\n", fd));
- CloseDownClient(clients[which]);
- chandesc->status &= ~(CONN_KILLED | CONN_ALIVE);
- continue;
- }
-
- if ((chandesc->status & CONN_ALIVE) == 0) {
- dbprintf(("conn with %d is not alive\n", fd));
- continue;
- }
-
- /* see if there is data available */
- switch (chandesc->type) {
- case ACDT_TCPIP:
- n = cb_full(chandesc->circbuf);
- break;
- case ACDT_VIRTCIRC:
- n = vc_avail(chandesc->virtcirc, VC_IN);
- break;
- default:
- n = -1;
- }
-
- if (n < 0) {
- dbprintf(("avail %d; close client %d\n", n, which));
- CloseDownClient(clients[which]);
- continue;
- } else {
- if (n > 0) {
- *pClientsReady++ = which;
- nready++;
- dbprintf(("client %d has %d bytes available\n", which, n));
- } else {
- dbprintf(("client %d has no data available\n", which, n));
- }
- }
-
- /* Clients that already have (possibly inserted) data are found
- * with help from io.c (the ClientsWithData bit array).
- */
- }
-
- return nready;
-}
-
-#endif /* XSERV_t */
-
-#endif /* XSERV_t || FS_t */
-
-static
-TRANS(AmSetAddr)(ciptr, chandesc)
- XtransConnInfo ciptr;
- XAmChanDesc *chandesc;
-{
- switch (chandesc->type) {
- case ACDT_TCPIP:
- /* should really ask the TCP/IP server */
- ciptr->family = AF_INET;
- ciptr->addr = strdup("XXXXTODO");
- ciptr->addrlen = strlen("XXXXTODO");
- break;
- case ACDT_VIRTCIRC:
- /* For Amoeba connections the adress is not really used,
- * so just fake something
- */
- ciptr->family = AF_AMOEBA;
- ciptr->addr = strdup("Amoeba");
- ciptr->addrlen = strlen(ciptr->addr);
- break;
- }
-}
-
-#ifdef TRANS_SERVER
-
-static XtransConnInfo
-TRANS(AMOpenCOTSServer)(thistrans, protocol, given_host, port)
-Xtransport *thistrans;
-char *protocol;
-char *given_host;
-char *port;
-{
- XAmChanDesc *chandesc;
- XtransConnInfo ciptr;
-
- PRMSG(2,"AMOpenCOTSServer(%s,%s,%s)\n", protocol, given_host, port);
-
- ciptr = (XtransConnInfo) xcalloc (1, sizeof(struct _XtransConnInfo));
- if (ciptr == NULL) {
- PRMSG (1, "AMOpenCotsClient: malloc failed\n", 0, 0, 0);
- return NULL;
- }
-
- chandesc = XAmAllocChanDesc();
- if (chandesc == NULL) {
- return NULL;
- }
-
-#ifdef XSERV_t
- AmStartXserverThreads(chandesc);
-#endif
-
- chandesc->conninfo = ciptr;
- ciptr->fd = XAmChanDescToFd(chandesc);
-
- TRANS(AmSetAddr)(ciptr, chandesc);
- TRANS(AMGetPeerAddr)(ciptr);
-
- return ciptr;
-}
-
-#endif /* TRANS_SERVER */
-
-
-#ifdef TRANS_CLIENT
-
-static XtransConnInfo
-TRANS(AMOpenCLTSClient)(thistrans, protocol, host, port)
-Xtransport *thistrans;
-char *protocol;
-char *host;
-char *port;
-{
- XtransConnInfo ciptr;
- int i;
-
- PRMSG(1,"AMOpenCLTSClient(%d,%s,%s)\n", protocol, host, port );
- /* TODO */
- return NULL;
-}
-
-#endif /* TRANS_CLIENT */
-
-
-#ifdef TRANS_SERVER
-
-static XtransConnInfo
-TRANS(AMOpenCLTSServer)(thistrans, protocol, host, port)
-Xtransport *thistrans;
-char *protocol;
-char *host;
-char *port;
-{
- XtransConnInfo ciptr;
- int i;
-
- PRMSG(1,"AMOpenCLTSServer(%d,%s,%s)\n", protocol, host, port );
- /* TODO */
- return NULL;
-}
-
-static int
-TRANS(AMResetListener)(ciptr)
-XtransConnInfo ciptr;
-{
- PRMSG(2,"AMResetListener()\n", 0, 0, 0 );
-
- /* nothing to do? */
- return 0;
-}
-
-#endif /* TRANS_SERVER */
-
-static
-TRANS(AMSetOption)(ciptr, option, arg)
-XtransConnInfo ciptr;
-int option;
-int arg;
-{
- PRMSG(1,"AMSetOption(%d,%d,%d)\n", ciptr->fd, option, arg );
- /* TODO */
- return -1;
-}
-
-
-#ifdef TRANS_SERVER
-
-static
-TRANS(AMCreateListener)(ciptr, req)
-XtransConnInfo ciptr;
-char *req;
-{
- PRMSG(2,"AMCreateListener(%x->%d,%x)\n", ciptr, ciptr->fd, req );
-
- /* Listener threads are already created at this point */
- return 0;
-}
-
-
-static XtransConnInfo
-TRANS(AMAccept)(ciptr)
-XtransConnInfo ciptr;
-{
- XAmChanDesc *chandesc;
- XtransConnInfo newciptr;
-
- PRMSG(2,"AMAccept(%x->%d)\n", ciptr, ciptr->fd, 0 );
-
-#if defined(XSERV_t) || defined(FS_t)
- chandesc = XAmFetchConnectingClient();
- if (chandesc == NULL) {
- PRMSG (1, "AMAccept: no client waiting?\n", 0, 0, 0);
- return NULL;
- }
- nNewConns--;
-
- newciptr = (XtransConnInfo) xcalloc (1, sizeof(struct _XtransConnInfo));
- if (newciptr == NULL)
- {
- PRMSG (1, "AMAccept: malloc failed\n", 0, 0, 0);
- return NULL;
- }
-
- newciptr->fd = XAmChanDescToFd(chandesc);
- chandesc->conninfo = newciptr;
- chandesc->status |= CONN_ALIVE;
-
- PRMSG(2,"AMAccept: OK: (%x->%d)\n", newciptr, newciptr->fd, 0 );
-
- TRANS(AmSetAddr)(newciptr, chandesc);
- TRANS(AMGetPeerAddr)(newciptr);
-
- return newciptr;
-#else
- return NULL;
-#endif
-}
-
-#endif /* TRANS_SERVER */
-
-
-#ifdef TRANS_CLIENT
-
-static
-TRANS(AMConnect)(ciptr, host, port)
-XtransConnInfo ciptr;
-char *host;
-char *port;
-{
- /* If this function is called, we are already connected */
- PRMSG(2, "AMConnect(%d,%s)\n", ciptr->fd, host, 0);
- return 0;
-}
-
-#endif /* TRANS_CLIENT */
-
-
-int
-TRANS(AmFdBytesReadable)(fd, count)
-int fd;
-BytesReadable_t *count;
-{
- register XAmChanDesc *chandesc;
-
- PRMSG(2, "AmFdBytesReadable(%d,%x): ", fd, count, 0 );
-
-#ifndef XSERV_t
- /* give reader threads a chance: */
- threadswitch();
-#endif
-
- errno = 0;
- chandesc = XAmFdToChanDesc(fd);
- if (chandesc == NULL || chandesc->state != ACDS_USED) {
- errno = EBADF;
- *count = 0;
- return -1;
- }
-
- switch (chandesc->type) {
- case ACDT_TCPIP:
- *count = cb_full(chandesc->circbuf);
- break;
- case ACDT_VIRTCIRC:
- *count = vc_avail(chandesc->virtcirc, VC_IN);
- break;
- }
-
- if (*count < 0) {
- errno = (chandesc->state == ACDS_CLOSED) ? EINTR : EPIPE;
- *count = 0;
- return -1;
- }
-
- PRMSG(2, "AMFdBytesReadable: %d\n", *count, 0, 0 );
-
- return 0;
-}
-
-static
-TRANS(AMBytesReadable)(ciptr, count)
-XtransConnInfo ciptr;
-BytesReadable_t *count;
-{
- return TRANS(AmFdBytesReadable)(ciptr->fd, count);
-}
-
-
-static
-TRANS(AMRead)(ciptr, buf, count)
-XtransConnInfo ciptr;
-char *buf;
-int count;
-{
- int fdi;
- register XAmChanDesc *chandesc;
- register int rv;
- BytesReadable_t avail;
-
- fdi = ciptr->fd;
- PRMSG(2, "AMRead(%d,%x,%d)\n", ciptr->fd, buf, count );
-
- errno = 0;
- chandesc = XAmFdToChanDesc(fdi);
- if (chandesc == NULL || chandesc->state != ACDS_USED) {
- errno = EBADF;
- return -1;
- }
-
- /* do a non-blocking read (maybe only conditionally?) */
- if ((TRANS(AMBytesReadable)(ciptr, &avail)) == 0) {
- if (avail <= 0) {
- PRMSG(2, "AMRead: nothing available yet\n", 0, 0, 0);
- errno = EAGAIN;
- return 0;
- } else if (count > avail) {
- PRMSG(2, "AMRead(%d): only %d of %d available\n",
- ciptr->fd, avail, count);
- count = avail; /* just read amount available */
- }
- } else {
- PRMSG(1, "AMRead: ...BytesReadable failed\n", 0, 0, 0);
- return -1;
- }
-
- switch (chandesc->type) {
- case ACDT_TCPIP:
- rv = cb_gets(chandesc->circbuf, buf, count, count);
- if (rv != count) {
- if (rv == 0) {
- fprintf(stderr, "Xlib: Cannot read circbuf\n");
- errno = EPIPE;
- rv = -1;
- } else {
- fprintf(stderr, "Xlib: Cannot read circbuf (%d)\n", rv);
- }
- }
- break;
-
- case ACDT_VIRTCIRC:
- rv = vc_readall(chandesc->virtcirc, buf, count);
- if (rv < 0) {
- fprintf(stderr, "Xlib: Cannot read virtual circuit\n");
- errno = EPIPE;
- rv = -1;
- }
- break;
- }
-
- /* The circular buffer writer will only UP the semaphore when
- * characters are available; we have to down it ourselfs.
- */
- if (chandesc->sema && rv > 0)
- sema_mdown(chandesc->sema, rv);
-
- PRMSG(2, "AMRead: %d bytes\n", rv, 0, 0);
-
- return rv;
-}
-
-
-static
-TRANS(AMWrite)(ciptr, buf, count)
-XtransConnInfo ciptr;
-char *buf;
-int count;
-{
- register XAmChanDesc *chandesc;
- register int written;
-
- PRMSG(2, "AMWrite(%d,%x,%d)\n", ciptr->fd, buf, count );
-
- errno = 0;
- written = 0;
-
- chandesc = XAmFdToChanDesc(ciptr->fd);
- if (chandesc == NULL || chandesc->state != ACDS_USED) {
- errno = EBADF;
- return -1;
- }
-
- switch (chandesc->type) {
- case ACDT_TCPIP:
- while (count > 0) {
- bufsize bsize;
- int wrcnt;
-
- wrcnt = count > TCPIP_BUFSIZE ? TCPIP_BUFSIZE : count;
- bsize = tcpip_write(&chandesc->chancap, buf, wrcnt);
- if (ERR_STATUS(bsize)) {
- fprintf(stderr, "Xlib: TCP/IP write failed (%s)\n",
- tcpip_why(ERR_CONVERT(bsize)));
- errno = EPIPE;
- return -1;
- }
- if (bsize != wrcnt) {
- fprintf(stderr,
- "Xlib: TCP/IP write failed (expected %d, wrote %d)\n",
- (int)bsize, wrcnt);
- errno = EPIPE;
- return -1;
- }
- buf += bsize;
- count -= (int) bsize;
- written += (int) bsize;
- }
- break;
-
- case ACDT_VIRTCIRC:
- if ((written = vc_write(chandesc->virtcirc, buf, count)) < 0) {
- fprintf(stderr, "Xlib: virtual circuit write failed\n");
- errno = EPIPE;
- return -1;
- }
- break;
- }
-
- return written;
-}
-
-
-static
-TRANS(AMReadv)(ciptr, iov, n)
-XtransConnInfo ciptr;
-struct iovec *iov;
-int n;
-{
- int i;
- int count = 0, thiscount;
-
- PRMSG(2, "AMReadv(%d,%x,%d)\n", ciptr->fd, ciptr, n );
-
- for (i = 0; i < n; i++, iov++) {
- if (iov->iov_len) {
- thiscount = TRANS(AMRead)(ciptr, iov->iov_base, iov->iov_len);
- if (thiscount < 0) return thiscount;
- count += thiscount;
- if (thiscount < iov->iov_len) break;
- }
- }
-
- return count;
-}
-
-
-static
-TRANS(AMWritev)(ciptr, iov, n)
-XtransConnInfo ciptr;
-struct iovec *iov;
-int n;
-{
- int i;
- int count = 0, thiscount;
-
- PRMSG(2, "AMWritev(%d,%x,%d)\n", ciptr->fd, iov, n );
-
- for (i = 0; i < n; i++, iov++) {
- if (iov->iov_len) {
- thiscount = TRANS(AMWrite)(ciptr, iov->iov_base, iov->iov_len);
- if (thiscount < 0)
- return thiscount;
- count += thiscount;
- if (thiscount < iov->iov_len) break;
- }
- }
-
- return count;
-}
-
-
-static
-TRANS(AMDisconnect)(ciptr)
-XtransConnInfo ciptr;
-{
- register XAmChanDesc *chandesc;
-
- PRMSG(2, "AMDisconnect(%x->%d)\n", ciptr, ciptr->fd, 0 );
-
- chandesc = XAmFdToChanDesc(ciptr->fd);
- if (chandesc != NULL) {
- switch (chandesc->type) {
- case ACDT_TCPIP:
- if (chandesc->signal != -1) {
- sig_raise(chandesc->signal);
- chandesc->signal = -1;
- }
- std_destroy(&chandesc->chancap);
- break;
-
- case ACDT_VIRTCIRC:
- vc_close(chandesc->virtcirc, VC_BOTH | VC_ASYNC);
- break;
- }
-#ifdef XSERV_t
- if (ciptr->fd == maxClient - 1) {
- maxClient--;
- /* we could look if maxClient can be reduced even more */
- }
-#endif
- XAmFreeChanDesc(chandesc);
- }
-
- return 0;
-}
-
-
-static
-TRANS(AMClose)(ciptr)
-XtransConnInfo ciptr;
-{
- PRMSG(2, "AMClose(%x->%d)\n", ciptr, ciptr->fd, 0 );
-
- return TRANS(AMDisconnect)(ciptr);
-}
-
-
-Xtransport TRANS(AmConnFuncs) = {
- /* Combined AMOEBA RPC/TCP Interface; maybe we should split this */
- "amcon",
- 0,
-#ifdef TRANS_CLIENT
- TRANS(AMOpenCOTSClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(AMOpenCOTSServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(AMOpenCLTSClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(AMOpenCLTSServer),
-#endif /* TRANS_SERVER */
- TRANS(AMSetOption),
-#ifdef TRANS_SERVER
- TRANS(AMCreateListener),
- TRANS(AMResetListener),
- TRANS(AMAccept),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(AMConnect),
-#endif /* TRANS_CLIENT */
- TRANS(AMBytesReadable),
- TRANS(AMRead),
- TRANS(AMWrite),
- TRANS(AMReadv),
- TRANS(AMWritev),
- TRANS(AMDisconnect),
- TRANS(AMClose),
-};
diff --git a/xc/lib/xtrans/Xtransmnx.c b/xc/lib/xtrans/Xtransmnx.c
deleted file mode 100644
index 9e5b5e616..000000000
--- a/xc/lib/xtrans/Xtransmnx.c
+++ /dev/null
@@ -1,1639 +0,0 @@
-/* $XFree86: xc/lib/xtrans/Xtransmnx.c,v 3.3 1996/05/10 06:55:50 dawes Exp $ */
-
-/*
-Xtransmnx.c
-
-Created: 11 April 1994 by Philip Homburg <philip@cs.vu.nl>
-*/
-
-
-#include <stdlib.h>
-#include <sys/ioctl.h>
-#include <sys/nbio.h>
-#include <net/hton.h>
-#include <net/netlib.h>
-#include <net/gen/in.h>
-#include <net/gen/netdb.h>
-#include <net/gen/tcp.h>
-#include <net/gen/tcp_io.h>
-
-struct private
-{
- int nonblocking;
-
- int read_inprogress;
- char *read_buffer;
- size_t read_bufsize;
- size_t read_size;
- size_t read_offset;
-
- int write_inprogress;
- char *write_buffer;
- size_t write_bufsize;
- size_t write_size;
- size_t write_offset;
- int write_errno;
-
- int listen_completed;
- u16_t listen_port;
- XtransConnInfo listen_list;
-};
-#define RD_BUFSIZE 1024
-#define WR_BUFSIZE 1024
-
-static XtransConnInfo listen_list= NULL;
-
-static XtransConnInfo alloc_ConnInfo(Xtransport *thistrans);
-static void free_ConnInfo(XtransConnInfo ciptr);
-static struct private *alloc_private(size_t rd_size, size_t wr_size);
-static void free_private(struct private *priv);
-static void read_cb(nbio_ref_t ref, int res, int err);
-static void write_cb(nbio_ref_t ref, int res, int err);
-static void listen_cb(nbio_ref_t ref, int res, int err);
-static int restart_listen(XtransConnInfo ciptr);
-
-#ifdef TRANS_CLIENT
-static XtransConnInfo
-TRANS(MnxTcpOpenCOTSClient) (thistrans, protocol, host, port)
-
-Xtransport *thistrans;
-char *protocol;
-char *host;
-char *port;
-
-{
- XtransConnInfo ciptr;
- char *tcp_device;
- int s_errno;
- int fd;
- nbio_ref_t ref;
-
-
- PRMSG(2, "MnxTcpOpenCOTSClient(%s,%s,%s)\n",
- protocol, host, port);
-
- if ((ciptr= alloc_ConnInfo(thistrans)) == NULL)
- {
- PRMSG(1,
- "MnxTcpOpenCOTSClient: alloc_ConnInfo failed\n",
- 0, 0, 0);
- return NULL;
- }
- if ((ciptr->priv= (char *)alloc_private(RD_BUFSIZE, WR_BUFSIZE)) ==
- NULL)
- {
- PRMSG(1,
- "MnxTcpOpenCOTSClient: alloc_private() failed\n",
- 0, 0, 0);
- s_errno= errno;
- free_ConnInfo(ciptr);
- errno= s_errno;
- return NULL;
- }
-
- if ((tcp_device= getenv("TCP_DEVICE")) == NULL)
- tcp_device= TCP_DEVICE;
- PRMSG(4, "MnxTcpOpenCOTSClient: tcp_device= '%s'\n",
- tcp_device, 0, 0);
-
- if ((fd= open(tcp_device, O_RDWR)) == -1)
- {
- PRMSG(1,
- "MnxTcpOpenCOTSClient: open '%s' failed: %s\n",
- tcp_device, strerror(errno), 0);
- s_errno= errno;
- free_ConnInfo(ciptr);
- errno= s_errno;
- return NULL;
- }
- ciptr->fd= fd;
- ref.ref_ptr= ciptr;
- nbio_register(fd);
- nbio_setcallback(fd, ASIO_READ, read_cb, ref);
- nbio_setcallback(fd, ASIO_WRITE, write_cb, ref);
- return ciptr;
-}
-#endif /* TRANS_CLIENT */
-
-#ifdef TRANS_SERVER
-static XtransConnInfo
-TRANS(MnxTcpOpenCOTSServer) (thistrans, protocol, host, port)
-
-Xtransport *thistrans;
-char *protocol;
-char *host;
-char *port;
-
-{
- XtransConnInfo ciptr;
- char *tcp_device;
- int s_errno;
- int fd;
- nbio_ref_t ref;
-
-
- PRMSG(2, "MnxTcpOpenCOTSServer(%s,%s,%s)\n",
- protocol, host, port);
-
- if ((ciptr= alloc_ConnInfo(thistrans)) == NULL)
- {
- PRMSG(1,
- "MnxTcpOpenCOTSServer: alloc_ConnInfo failed\n",
- 0, 0, 0);
- return NULL;
- }
- if ((ciptr->priv= (char *)alloc_private(RD_BUFSIZE, WR_BUFSIZE)) ==
- NULL)
- {
- PRMSG(1,
- "MnxTcpOpenCOTSServer: alloc_private() failed\n",
- 0, 0, 0);
- s_errno= errno;
- free_ConnInfo(ciptr);
- errno= s_errno;
- return NULL;
- }
-
- if ((tcp_device= getenv("TCP_DEVICE")) == NULL)
- tcp_device= TCP_DEVICE;
- PRMSG(4, "MnxTcpOpenCOTSServer: tcp_device= '%s'\n",
- tcp_device, 0, 0);
-
- if ((fd= open(tcp_device, O_RDWR)) == -1)
- {
- PRMSG(1,
- "MnxTcpOpenCOTSServer: open '%s' failed: %s\n",
- tcp_device, strerror(errno), 0);
- s_errno= errno;
- free_ConnInfo(ciptr);
- errno= s_errno;
- return NULL;
- }
- PRMSG(5, "MnxTcpOpenCOTSServer: fd= '%d'\n", fd, 0, 0);
- ciptr->fd= fd;
- ref.ref_ptr= ciptr;
- nbio_register(fd);
- nbio_setcallback(fd, ASIO_IOCTL, listen_cb, ref);
- return ciptr;
-}
-#endif /* TRANS_SERVER */
-
-#ifdef TRANS_CLIENT
-static XtransConnInfo
-TRANS(MnxTcpOpenCLTSClient) (thistrans, protocol, host, port)
-
-Xtransport *thistrans;
-char *protocol;
-char *host;
-char *port;
-
-{
- abort();
-}
-#endif /* TRANS_CLIENT */
-
-#ifdef TRANS_SERVER
-static XtransConnInfo
-TRANS(MnxTcpOpenCLTSServer) (thistrans, protocol, host, port)
-
-Xtransport *thistrans;
-char *protocol;
-char *host;
-char *port;
-
-{
- abort();
-}
-#endif /* TRANS_SERVER */
-
-#ifdef TRANS_REOPEN
-
-static XtransConnInfo
-TRANS(MnxTcpReopenCOTSServer) (thistrans, fd, port)
-
-Xtransport *thistrans;
-int fd;
-char *port;
-
-{
- XtransConnInfo ciptr;
- int i;
-
- PRMSG (2,
- "MnxTcpReopenCOTSServer(%d, %s)\n", fd, port, 0);
-
- abort();
-}
-
-static XtransConnInfo
-TRANS(MnxTcpReopenCLTSServer) (thistrans, fd, port)
-
-Xtransport *thistrans;
-int fd;
-char *port;
-
-{
- XtransConnInfo ciptr;
- int i;
-
-
- PRMSG (2,
- "MnxTcpReopenCLTSServer(%d, %s)\n", fd, port, 0);
-
- abort();
-}
-
-#endif /* TRANS_REOPEN */
-
-
-
-static int
-TRANS(MnxTcpSetOption) (ciptr, option, arg)
-
-XtransConnInfo ciptr;
-int option;
-int arg;
-
-{
- int flags;
- struct private *priv;
-
- PRMSG(2, "MnxTcpSetOption(%d,%d,%d)\n",
- ciptr->fd, option, arg);
-
- priv= (struct private *)ciptr->priv;
- switch(option)
- {
- case TRANS_NONBLOCKING:
- flags= fcntl(ciptr->fd, F_GETFD);
- if (flags == -1)
- {
- PRMSG(1,
- "MnxTcpSetOption: fcntl F_GETFD failed: %s\n",
- strerror(errno), 0, 0);
- return -1;
- }
- if (arg == 0)
- flags &= ~FD_ASYNCHIO;
- else if (arg == 1)
- flags |= FD_ASYNCHIO;
- else
- {
- PRMSG(1,
- "MnxTcpSetOption: bad arg for TRANS_NONBLOCKING: %d\n",
- arg, 0, 0);
- return -1;
- }
- if (fcntl(ciptr->fd, F_SETFD, flags) == -1)
- {
- PRMSG(1,
- "MnxTcpSetOption: fcntl F_SETFD failed: %s\n",
- strerror(errno), 0, 0);
- return -1;
- }
- priv->nonblocking= arg;
- return 0;
- case TRANS_CLOSEONEXEC:
- flags= fcntl(ciptr->fd, F_GETFD);
- if (flags == -1)
- {
- PRMSG(1,
- "MnxTcpSetOption: fcntl F_GETFD failed: %s\n",
- strerror(errno), 0, 0);
- return -1;
- }
- if (arg == 0)
- flags &= ~FD_CLOEXEC;
- else if (arg == 1)
- flags |= FD_CLOEXEC;
- else
- {
- PRMSG(1,
- "MnxTcpSetOption: bad arg for TRANS_CLOSEONEXEC: %d\n",
- arg, 0, 0);
- return -1;
- }
- if (fcntl(ciptr->fd, F_SETFD, flags) == -1)
- {
- PRMSG(1,
- "MnxTcpSetOption: fcntl F_SETFD failed: %s\n",
- strerror(errno), 0, 0);
- return -1;
- }
- return 0;
- default:
- PRMSG(1, "MnxTcpSetOption: unknown option '%d'\n",
- option, 0, 0);
- errno= EINVAL;
- return -1;
- }
-}
-
-
-#ifdef TRANS_SERVER
-static int
-TRANS(MnxTcpCreateListener) (ciptr, port)
-
-XtransConnInfo ciptr;
-char *port;
-
-{
- struct servent *servp;
- tcpport_t num_port;
- char *check;
- nwio_tcpconf_t tcpconf;
- nwio_tcpcl_t tcpcl;
- int r, s_errno, flags;
- struct private *priv;
- struct sockaddr_in *addr;
-
- PRMSG(2, "MnxTcpCreateListener(%d,%s)\n", ciptr->fd, port, 0);
-
- priv= (struct private *)ciptr->priv;
-
- if (port == NULL)
- num_port= 0;
- else
- {
- num_port= strtol(port, &check, 10);
- num_port= htons(num_port);
- if (check[0] == '\0')
- port= NULL;
- }
-
-#ifdef X11_t
- /*
- * X has a well known port, that is transport dependent. It is easier
- * to handle it here, than try and come up with a transport independent
- * representation that can be passed in and resolved the usual way.
- *
- * The port that is passed here is really a string containing the
- * idisplay from ConnectDisplay().
- */
- if (port == NULL)
- num_port= htons(ntohs(num_port) + X_TCP_PORT);
-#endif
- if (port != NULL)
- {
- if ((servp = getservbyname (port, "tcp")) == NULL)
- {
- PRMSG(1,
- "MnxTcpCreateListener: can't get service for %s\n",
- port, 0, 0);
- errno= EINVAL;
- return TRANS_CREATE_LISTENER_FAILED;
- }
- num_port= servp->s_port;
- }
-
- tcpconf.nwtc_flags= NWTC_SHARED | NWTC_UNSET_RA | NWTC_UNSET_RP;
- if (num_port != 0)
- {
- tcpconf.nwtc_locport= num_port;
- tcpconf.nwtc_flags |= NWTC_LP_SET;
- }
- else
- tcpconf.nwtc_flags |= NWTC_LP_SEL;
-
- if (ioctl(ciptr->fd, NWIOSTCPCONF, &tcpconf) == -1)
- {
- PRMSG(1,
- "MnxTcpCreateListener: NWIOSTCPCONF failed: %s\n",
- strerror(errno),0, 0);
- return TRANS_CREATE_LISTENER_FAILED;
- }
-
- if (ioctl(ciptr->fd, NWIOGTCPCONF, &tcpconf) == -1)
- {
- PRMSG(1,
- "MnxTcpListen: NWIOGTCPCONF failed: %s\n",
- strerror(errno),0, 0);
- return TRANS_CREATE_LISTENER_FAILED;
- }
-
- priv->listen_port= tcpconf.nwtc_locport;
-
- if ((addr= (struct sockaddr_in *)xalloc(sizeof(struct sockaddr_in)))
- == NULL)
- {
- PRMSG(1, "MnxTcpAccept: malloc failed\n", 0, 0, 0);
- return TRANS_CREATE_LISTENER_FAILED;
- }
- addr->sin_family= AF_INET;
- addr->sin_addr.s_addr= tcpconf.nwtc_locaddr;
- addr->sin_port= tcpconf.nwtc_locport;
- if (ciptr->addr)
- xfree(ciptr->addr);
- ciptr->addr= (char *)addr;
- ciptr->addrlen= sizeof(struct sockaddr_in);
-
- flags= fcntl(ciptr->fd, F_GETFD);
- if (flags == -1)
- {
- PRMSG(1,
- "MnxTcpCreateListener: fcntl F_GETFD failed: %s\n",
- strerror(errno), 0, 0);
- return TRANS_CREATE_LISTENER_FAILED;
- }
- if (fcntl(ciptr->fd, F_SETFD, flags | FD_ASYNCHIO) == -1)
- {
- PRMSG(1,
- "MnxTcpCreateListener: fcntl F_SETFD failed: %s\n",
- strerror(errno), 0, 0);
- return TRANS_CREATE_LISTENER_FAILED;
- }
-
- tcpcl.nwtcl_flags= 0;
- r= ioctl(ciptr->fd, NWIOTCPLISTEN, &tcpcl);
- s_errno= errno;
-
- if (fcntl(ciptr->fd, F_SETFD, flags) == -1)
- {
- PRMSG(1,
- "MnxTcpCreateListener: fcntl F_SETFD failed: %s\n",
- strerror(errno), 0, 0);
- return TRANS_CREATE_LISTENER_FAILED;
- }
-
- if (r == -1 && s_errno == EINPROGRESS)
- {
- nbio_inprogress(ciptr->fd, ASIO_IOCTL, 1 /* read */,
- 1 /* write */, 0 /* exception */);
- return 0;
- }
- if (r == 0)
- {
- priv->listen_completed= 1;
- return 0;
- }
-
- errno= s_errno;
- PRMSG(1, "MnxTcpCreateListener: NWIOTCPLISTEN failed: %s\n",
- strerror(errno), 0, 0);
- return TRANS_CREATE_LISTENER_FAILED;
-}
-#endif /* TRANS_SERVER */
-
-
-#ifdef TRANS_SERVER
-static int
-TRANS(MnxTcpResetListener) (ciptr)
-
-XtransConnInfo ciptr;
-{
- PRMSG(2, "MnxTcpResetListener(%d)\n", ciptr->fd, 0, 0);
- return TRANS_RESET_NOOP;
-}
-#endif /* TRANS_SERVER */
-
-#ifdef TRANS_SERVER
-static XtransConnInfo
-TRANS(MnxTcpAccept) (ciptr_listen, status)
-
-XtransConnInfo ciptr_listen;
-int *status;
-
-{
- XtransConnInfo ciptr;
- int s_errno;
- int fd;
- nbio_ref_t ref;
- struct private *priv;
- nwio_tcpconf_t tcpconf;
- struct sockaddr_in *addr;
-
- PRMSG(2, "MnxTcpAccept(%d,%p)\n", ciptr_listen->fd, status, 0);
-
- priv= (struct private *)ciptr_listen->priv;
- *status= TRANS_ACCEPT_MISC_ERROR;
-
- if (!priv->listen_completed)
- {
- PRMSG(1, "MnxTcpAccept: listen is not completed\n",
- 0, 0, 0);
- *status= TRANS_ACCEPT_FAILED;
- return NULL;
- }
- priv->listen_completed= 0;
-
- if ((ciptr= alloc_ConnInfo(ciptr_listen->transptr)) == NULL)
- {
- PRMSG(1,
- "MnxTcpAccept: alloc_ConnInfo failed\n",
- 0, 0, 0);
- *status= TRANS_ACCEPT_BAD_MALLOC;
- return NULL;
- }
- if ((ciptr->priv= (char *)alloc_private(RD_BUFSIZE, WR_BUFSIZE)) ==
- NULL)
- {
- PRMSG(1,
- "MnxTcpAccept: alloc_private() failed\n",
- 0, 0, 0);
- s_errno= errno;
- free_ConnInfo(ciptr);
- errno= s_errno;
- *status= TRANS_ACCEPT_BAD_MALLOC;
- return NULL;
- }
-
- fd= dup(ciptr_listen->fd);
- if (fd == -1)
- {
- s_errno= errno;
- PRMSG(1, "MnxTcpAccept: dup failed: %s\n",
- strerror(errno), 0, 0);
- free_ConnInfo(ciptr);
- *status= TRANS_ACCEPT_FAILED;
- return NULL;
- }
- if (restart_listen(ciptr_listen) == -1)
- {
- priv->listen_list= listen_list;
- listen_list= ciptr_listen;
- PRMSG(1, "MnxTcpAccept: unable to restart listen\n",
- 0, 0, 0);
- }
- ciptr->fd= fd;
- ref.ref_ptr= ciptr;
- nbio_register(fd);
- nbio_setcallback(fd, ASIO_WRITE, write_cb, ref);
- nbio_setcallback(fd, ASIO_READ, read_cb, ref);
-
- if (ioctl(ciptr->fd, NWIOGTCPCONF, &tcpconf) == -1)
- {
- PRMSG(1, "MnxTcpAccept: NWIOGTCPCONF failed: %s\n",
- strerror(errno),0, 0);
- close(fd);
- free_ConnInfo(ciptr);
- *status= TRANS_ACCEPT_MISC_ERROR;
- return NULL;
- }
- if ((addr= (struct sockaddr_in *)xalloc(sizeof(struct sockaddr_in)))
- == NULL)
- {
- PRMSG(1, "MnxTcpAccept: malloc failed\n", 0, 0, 0);
- close(fd);
- free_ConnInfo(ciptr);
- *status= TRANS_ACCEPT_BAD_MALLOC;
- return NULL;
- }
- addr->sin_family= AF_INET;
- addr->sin_addr.s_addr= tcpconf.nwtc_locaddr;
- addr->sin_port= tcpconf.nwtc_locport;
- if (ciptr->addr)
- xfree(ciptr->addr);
- ciptr->addr= (char *)addr;
- ciptr->addrlen= sizeof(struct sockaddr_in);
- if (*(u8_t *)&tcpconf.nwtc_remaddr == 127)
- {
- /* Make ConvertAddress return FamilyLocal */
- addr->sin_addr.s_addr= tcpconf.nwtc_remaddr;
- }
-
- if ((addr= (struct sockaddr_in *)xalloc(sizeof(struct sockaddr_in)))
- == NULL)
- {
- PRMSG(1, "MnxTcpConnect: malloc failed\n", 0, 0, 0);
- close(fd);
- free_ConnInfo(ciptr);
- *status= TRANS_ACCEPT_BAD_MALLOC;
- return NULL;
- }
- addr->sin_family= AF_INET;
- addr->sin_addr.s_addr= tcpconf.nwtc_remaddr;
- addr->sin_port= tcpconf.nwtc_remport;
- ciptr->peeraddr= (char *)addr;
- ciptr->peeraddrlen= sizeof(struct sockaddr_in);
- *status= 0;
- return ciptr;
-}
-#endif /* TRANS_SERVER */
-
-TRANS(MnxTcpConnect) (ciptr, host, port)
-
-XtransConnInfo ciptr;
-char *host;
-char *port;
-
-{
- struct hostent *hostp;
- struct servent *servp;
- char hostnamebuf[256]; /* tmp space */
- tcpport_t num_port;
- ipaddr_t num_addr;
- char *check;
- nwio_tcpconf_t tcpconf;
- nwio_tcpcl_t tcpcl;
- struct sockaddr_in *addr;
-
- PRMSG(2, "MnxTcpConnect(%d,%s,%s)\n", ciptr->fd, host, port);
-
- if (!host)
- {
- hostnamebuf[0] = '\0';
- (void) TRANS(GetHostname) (hostnamebuf, sizeof hostnamebuf);
- host = hostnamebuf;
- }
-
-
- num_port= strtol(port, &check, 10);
- num_port= htons(num_port);
- if (check[0] == '\0')
- port= NULL;
-#ifdef X11_t
- /*
- * X has a well known port, that is transport dependent. It is easier
- * to handle it here, than try and come up with a transport independent
- * representation that can be passed in and resolved the usual way.
- *
- * The port that is passed here is really a string containing the
- * idisplay from ConnectDisplay().
- */
- if (port == NULL)
- num_port= htons(ntohs(num_port) + X_TCP_PORT);
-#endif
-
- num_addr= inet_addr(host);
- if (num_addr != -1)
- host= NULL;
-
- if (host != NULL)
- {
- if ((hostp = gethostbyname(host)) == NULL)
- {
- PRMSG(1,
- "MnxTcpConnect: can't get address for %s\n",
- host, 0, 0);
- errno= EINVAL;
- return TRANS_CONNECT_FAILED;
- }
- if (hostp->h_addrtype != AF_INET) /* is IP host? */
- {
- PRMSG(1, "MnxTcpConnect: %s in not an INET host\n",
- host, 0, 0);
- errno= EINVAL;
- return TRANS_CONNECT_FAILED;
- }
- num_addr= *(ipaddr_t *)hostp->h_addr;
- }
-
- if (port != NULL)
- {
- if ((servp = getservbyname (port, "tcp")) == NULL)
- {
- PRMSG(1,
- "MnxTcpConnect: can't get service for %s\n",
- port, 0, 0);
- errno= EINVAL;
- return TRANS_CONNECT_FAILED;
- }
- num_port= servp->s_port;
- }
-
- tcpconf.nwtc_flags= NWTC_EXCL | NWTC_LP_SEL | NWTC_SET_RA |
- NWTC_SET_RP;
- tcpconf.nwtc_remaddr= num_addr;
- tcpconf.nwtc_remport= num_port;
- if (ioctl(ciptr->fd, NWIOSTCPCONF, &tcpconf) == -1)
- {
- PRMSG(1, "MnxTcpConnect: NWIOSTCPCONF failed: %s\n",
- strerror(errno),0, 0);
- return TRANS_CONNECT_FAILED;
- }
-
- tcpcl.nwtcl_flags= 0;
- if (ioctl(ciptr->fd, NWIOTCPCONN, &tcpcl) == -1)
- {
- PRMSG(1, "MnxTcpConnect: connect failed: %s\n",
- strerror(errno),0, 0);
- if (errno == ECONNREFUSED || errno == EINTR)
- return TRANS_TRY_CONNECT_AGAIN;
- else
- return TRANS_CONNECT_FAILED;
- }
-
- if (ioctl(ciptr->fd, NWIOGTCPCONF, &tcpconf) == -1)
- {
- PRMSG(1, "MnxTcpConnect: NWIOGTCPCONF failed: %s\n",
- strerror(errno),0, 0);
- return TRANS_CONNECT_FAILED;
- }
- if ((addr= (struct sockaddr_in *)xalloc(sizeof(struct sockaddr_in)))
- == NULL)
- {
- PRMSG(1, "MnxTcpConnect: malloc failed\n", 0, 0, 0);
- return TRANS_CONNECT_FAILED;
- }
- addr->sin_family= AF_INET;
- addr->sin_addr.s_addr= tcpconf.nwtc_locaddr;
- addr->sin_port= tcpconf.nwtc_locport;
- ciptr->addr= (char *)addr;
- ciptr->addrlen= sizeof(struct sockaddr_in);
- if (*(u8_t *)&tcpconf.nwtc_remaddr == 127)
- {
- /* Make ConvertAddress return FamilyLocal */
- addr->sin_addr.s_addr= tcpconf.nwtc_remaddr;
- }
-
- if ((addr= (struct sockaddr_in *)xalloc(sizeof(struct sockaddr_in)))
- == NULL)
- {
- PRMSG(1, "MnxTcpConnect: malloc failed\n", 0, 0, 0);
- return TRANS_CONNECT_FAILED;
- }
- addr->sin_family= AF_INET;
- addr->sin_addr.s_addr= tcpconf.nwtc_remaddr;
- addr->sin_port= tcpconf.nwtc_remport;
- ciptr->peeraddr= (char *)addr;
- ciptr->peeraddrlen= sizeof(struct sockaddr_in);
-
- return 0;
-}
-
-static int
-TRANS(MnxTcpBytesReadable) (ciptr, pend)
-
-XtransConnInfo ciptr;
-BytesReadable_t *pend;
-
-{
- struct private *priv;
- int r;
-
- PRMSG(2, "MnxTcpBytesReadable(%x,%d,%x)\n",
- ciptr, ciptr->fd, pend);
-
- *pend= 0;
-
- priv= (struct private *)ciptr->priv;
- if (priv->read_inprogress)
- {
- PRMSG(5, "MnxTcpBytesReadable: read inprogress, %d\n",
- *pend, 0, 0);
- return *pend;
- }
- if (priv->read_offset < priv->read_size)
- {
- *pend= priv->read_size-priv->read_offset;
- PRMSG(5, "MnxTcpBytesReadable: %d\n",
- *pend, 0, 0);
- return *pend;
- }
- priv->read_offset= 0;
- r= read(ciptr->fd, priv->read_buffer, priv->read_bufsize);
- if (r >= 0)
- {
- if (r == 0)
- r= 1; /* Signal EOF condition */
-
- priv->read_size= r;
- PRMSG(5, "MnxTcpBytesReadable: %d\n",
- *pend, 0, 0);
- *pend= r;
- }
- else if (r == -1 && errno == EINPROGRESS)
- {
- priv->read_inprogress= 1;
- nbio_inprogress(ciptr->fd, ASIO_READ, 1 /* read */,
- 0 /* write */, 0 /* exception */);
- }
- else
- {
- PRMSG(1, "MnxTcpBytesReadable: read failed: %s\n",
- strerror(errno), 0, 0);
- return -1;
- }
- PRMSG(5, "MnxTcpBytesReadable: %d\n", *pend, 0, 0);
- return *pend;
-}
-
-
-static int
-TRANS(MnxTcpRead) (ciptr, buf, size)
-
-XtransConnInfo ciptr;
-char *buf;
-int size;
-
-{
- int len, r, ret, s_errno;
- int offset;
- struct private *priv;
- asio_fd_set_t fd_set;
- fwait_t fw;
-
- PRMSG(2, "MnxTcpRead(%d,%x,%d)\n", ciptr->fd, buf, size);
-
- priv= (struct private *)ciptr->priv;
- offset= 0;
-
- if (priv->read_inprogress)
- {
- PRMSG(5, "MnxTcpRead: EAGAIN\n", 0, 0, 0);
- errno= EAGAIN;
- return -1;
- }
-
- /* Copy any data left in the buffer */
- if (priv->read_offset < priv->read_size)
- {
- len= priv->read_size-priv->read_offset;
- if (len > size-offset)
- len= size-offset;
- PRMSG(5, "MnxTcpRead: copying %d bytes\n", len, 0, 0);
-
- memcpy(buf+offset, priv->read_buffer + priv->read_offset,
- len);
- offset += len;
- priv->read_offset += len;
- if (priv->read_offset < priv->read_size)
- return offset;
- }
-
- /* Try to read directly into the user's buffer. */
- ret= 0;
- s_errno= 0;
- while(offset < size)
- {
- r= read(ciptr->fd, buf+offset, size-offset);
- if (r == -1 && errno == EINPROGRESS)
- {
- r= fcancel(ciptr->fd, ASIO_READ);
- if (r == -1)
- abort();
- ASIO_FD_ZERO(&fd_set);
- ASIO_FD_SET(ciptr->fd, ASIO_READ, &fd_set);
- fw.fw_flags= FWF_NONBLOCK;
- fw.fw_bits= fd_set.afds_bits;
- fw.fw_maxfd= ASIO_FD_SETSIZE;
- r= fwait(&fw);
- if (r == -1 || fw.fw_fd != ciptr->fd ||
- fw.fw_operation != ASIO_READ)
- {
- abort();
- }
- r= fw.fw_result;
- errno= fw.fw_errno;
- }
-
- if (r > 0)
- {
- PRMSG(5, "MnxTcpRead: read %d bytes\n", r,
- 0, 0);
- offset += r;
- continue;
- }
- else if (r == 0)
- {
- PRMSG(5, "MnxTcpRead: read EOF\n", 0, 0, 0);
- break;
- }
- else
- {
- if (errno == EINTR)
- {
- PRMSG(5, "MnxTcpRead: EINTR\n",
- 0, 0, 0);
- errno= EAGAIN;
- }
- else
- {
- PRMSG(1, "MnxTcpRead: read error %s\n",
- strerror(errno), 0, 0);
- }
- s_errno= errno;
- ret= -1;
- break;
- }
- }
- if (offset != 0)
- ret= offset;
-
- if (priv->read_offset != priv->read_size)
- abort();
- priv->read_offset= 0;
- priv->read_size= 0;
- if (priv->nonblocking)
- {
- r= read(ciptr->fd, priv->read_buffer, priv->read_bufsize);
- if (r >= 0)
- {
- PRMSG(5, "MnxTcpRead: buffered %d bytes\n",
- r, 0, 0);
- priv->read_size= r;
- }
- else if (r == -1 && errno == EINPROGRESS)
- {
- priv->read_inprogress= 1;
- nbio_inprogress(ciptr->fd, ASIO_READ, 1 /* read */,
- 0 /* write */, 0 /* exception */);
- }
- else
- {
- PRMSG(1, "MnxTcpRead: read failed: %s\n",
- strerror(errno), 0, 0);
- }
- }
- errno= s_errno;
- return ret;
-}
-
-
-static int
-TRANS(MnxTcpWrite) (ciptr, buf, size)
-
-XtransConnInfo ciptr;
-char *buf;
-int size;
-
-{
- int len, r, ret, s_errno;
- int offset;
- struct private *priv;
- asio_fd_set_t fd_set;
- fwait_t fw;
-
- PRMSG(2, "MnxTcpWrite(%d,%x,%d)\n", ciptr->fd, buf, size);
-
- priv= (struct private *)ciptr->priv;
- offset= 0;
-
- if (priv->write_errno)
- {
- PRMSG(5, "MnxTcpWrite: write_errno %d\n",
- priv->write_errno, 0, 0);
- errno= priv->write_errno;
- return -1;
- }
-
- if (priv->write_inprogress)
- {
- PRMSG(5, "MnxTcpWrite: EAGAIN\n", 0, 0, 0);
- errno= EAGAIN;
- return -1;
- }
-
- /* Try to write directly out of the user's buffer. */
- ret= 0;
- s_errno= 0;
- while(offset < size)
- {
- r= write(ciptr->fd, buf+offset, size-offset);
- if (r == -1 && errno == EINPROGRESS)
- {
- r= fcancel(ciptr->fd, ASIO_WRITE);
- if (r == -1)
- abort();
- ASIO_FD_ZERO(&fd_set);
- ASIO_FD_SET(ciptr->fd, ASIO_WRITE, &fd_set);
- fw.fw_flags= FWF_NONBLOCK;
- fw.fw_bits= fd_set.afds_bits;
- fw.fw_maxfd= ASIO_FD_SETSIZE;
- r= fwait(&fw);
- if (r == -1 || fw.fw_fd != ciptr->fd ||
- fw.fw_operation != ASIO_WRITE)
- {
- abort();
- }
- r= fw.fw_result;
- errno= fw.fw_errno;
- }
- if (r > 0)
- {
- PRMSG(5, "MnxTcpWrite: wrote %d bytes\n", r,
- 0, 0);
- offset += r;
- continue;
- }
- else if (r == 0)
- abort();
- else
- {
- if (errno == EINTR)
- {
- PRMSG(5, "MnxTcpWrite: EINTR\n",
- 0, 0, 0);
- errno= EAGAIN;
- }
- else
- {
- PRMSG(1,
- "MnxTcpWrite: write error: %s\n",
- strerror(errno), 0, 0);
- }
- s_errno= errno;
- ret= -1;
- break;
- }
- }
-
- /* Copy any data to the buffer */
- if (offset < size)
- {
- len= priv->write_bufsize;
- if (len > size-offset)
- len= size-offset;
- PRMSG(5, "MnxTcpWrite: copying %d bytes\n", len, 0, 0);
-
- memcpy(priv->write_buffer, buf+offset, len);
- offset += len;
- priv->write_offset= 0;
- priv->write_size= len;
- }
- if (offset != 0)
- ret= offset;
-
- while (priv->write_offset < priv->write_size)
- {
- r= write(ciptr->fd, priv->write_buffer+priv->write_offset,
- priv->write_size-priv->write_offset);
- if (r > 0)
- {
- PRMSG(5, "MnxTcpWrite: wrote %d bytes\n",
- r, 0, 0);
- priv->write_offset += r;
- continue;
- }
- else if (r == -1 && errno == EINPROGRESS)
- {
- priv->write_inprogress= 1;
- nbio_inprogress(ciptr->fd, ASIO_WRITE, 0 /* read */,
- 1 /* write */, 0 /* exception */);
- }
- else
- {
- PRMSG(1, "MnxTcpWrite: write failed: %s\n",
- strerror(errno), 0, 0);
- priv->write_errno= errno;
- }
- break;
- }
-
- errno= s_errno;
- return ret;
-}
-
-
-static int
-TRANS(MnxTcpReadv) (ciptr, buf, size)
-
-XtransConnInfo ciptr;
-struct iovec *buf;
-int size;
-
-{
- int i, offset, total, len, r;
-
- PRMSG(2, "MnxTcpReadv(%d,%x,%d)\n", ciptr->fd, buf, size);
-
- /* Simply call read a number of times. */
- total= 0;
- offset= 0;
- i= 0;
- while(i<size)
- {
- PRMSG(5, "MnxTcpReadv: [%d] size %d-%d\n",
- i, buf[i].iov_len, offset);
- if (offset >= buf[i].iov_len)
- {
- offset= 0;
- i++;
- continue;
- }
- len= buf[i].iov_len-offset;
- r= TRANS(MnxTcpRead)(ciptr, buf[i].iov_base+offset, len);
- if (r == -1)
- {
- if (errno == EAGAIN)
- {
- PRMSG(5,
- "MnxTcpReadv: read returned: %s\n",
- strerror(errno), 0, 0);
- }
- else
- {
- PRMSG(1,
- "MnxTcpReadv: read failed: %s\n",
- strerror(errno), 0, 0);
- }
- if (total != 0)
- return total;
- else
- return -1;
- }
- if (r == 0)
- break;
- if (r > len)
- abort();
- total += r;
- offset += r;
- }
- return total;
-}
-
-static int
-TRANS(MnxTcpWritev) (ciptr, buf, size)
-
-XtransConnInfo ciptr;
-struct iovec *buf;
-int size;
-
-{
- int i, offset, total, len, r;
-
- PRMSG(2, "MnxTcpWritev(%d,%x,%d)\n", ciptr->fd, buf, size);
-
- /* Simply call write a number of times. */
- total= 0;
- offset= 0;
- i= 0;
- while(i<size)
- {
- if (offset >= buf[i].iov_len)
- {
- offset= 0;
- i++;
- continue;
- }
- len= buf[i].iov_len-offset;
- r= TRANS(MnxTcpWrite)(ciptr, buf[i].iov_base+offset, len);
- if (r == -1)
- {
- if (errno == EAGAIN)
- {
- PRMSG(5, "MnxTcpWritev: AGAIN\n",
- 0, 0, 0);
- }
- else
- {
- PRMSG(1,
- "MnxTcpWritev: write failed: %s\n",
- strerror(errno), 0, 0);
- }
- if (total != 0)
- return total;
- else
- return -1;
- }
- if (r == 0 || r > len)
- abort();
- total += r;
- offset += r;
- }
- return total;
-}
-
-
-static int
-TRANS(MnxTcpDisconnect) (ciptr)
-
-XtransConnInfo ciptr;
-
-{
- PRMSG(2, "MnxTcpDisconnect(%x,%d)\n", ciptr, ciptr->fd, 0);
-
- return ioctl(ciptr->fd, NWIOTCPSHUTDOWN, NULL);
-}
-
-static int
-TRANS(MnxTcpClose) (ciptr)
-
-XtransConnInfo ciptr;
-
-{
- XtransConnInfo list, t_ciptr;
- struct private *priv;
-
- PRMSG(2, "MnxTcpClose(%x,%d)\n", ciptr, ciptr->fd, 0);
-
-
- if (listen_list)
- {
- list= listen_list;
- listen_list= NULL;
- while(list)
- {
- t_ciptr= list;
- priv= (struct private *)t_ciptr->priv;
- list= priv->listen_list;
- if (t_ciptr == ciptr)
- continue;
- if (restart_listen(t_ciptr) == -1)
- {
- priv->listen_list= listen_list;
- listen_list= t_ciptr;
- }
- }
- }
-
- free_private((struct private *)ciptr->priv);
- nbio_unregister(ciptr->fd);
- return close (ciptr->fd);
-}
-
-
-static XtransConnInfo
-alloc_ConnInfo(thistrans)
-Xtransport *thistrans;
-{
- XtransConnInfo ciptr;
-
- PRMSG(2, " alloc_ConnInfo(%p)\n", thistrans, 0, 0);
-
- if ((ciptr= (XtransConnInfo) xalloc(sizeof(struct _XtransConnInfo)))
- == NULL)
- {
- PRMSG(1, " alloc_ConnInfo: malloc failed\n", 0, 0, 0);
- return NULL;
- }
- ciptr->transptr= thistrans;
- ciptr->priv= NULL;
- ciptr->flags= 0;
- ciptr->fd= -1;
- ciptr->port= NULL;
- ciptr->family= AF_INET;
- ciptr->addr= NULL;
- ciptr->addrlen= 0;
- ciptr->peeraddr= NULL;
- ciptr->peeraddrlen= 0;
- return ciptr;
-}
-
-static void
-free_ConnInfo(ciptr)
-XtransConnInfo ciptr;
-{
- if (ciptr == NULL)
- return;
- free_private((struct private *)ciptr->priv);
- xfree(ciptr);
-}
-
-static struct private *
-alloc_private(rd_size, wr_size)
-size_t rd_size;
-size_t wr_size;
-{
- struct private *priv;
- int s_errno;
- char *buf;
-
- PRMSG(2, ":alloc_private(%d, %d)\n", rd_size, wr_size, 0);
-
- if ((priv= (struct private *)xalloc(sizeof(struct private))) == NULL)
- {
- PRMSG(1, ":alloc_private: malloc failed\n", 0, 0, 0);
- return NULL;
- }
- priv->nonblocking= 0;
- priv->read_inprogress= 0;
- priv->read_buffer= NULL;
- priv->read_bufsize= rd_size;
- priv->read_size= 0;
- priv->read_offset= 0;
-
- if (rd_size != 0)
- {
- if ((buf= xalloc(rd_size)) == NULL)
- {
- PRMSG(1, ":alloc_private: malloc failed\n", 0, 0, 0);
- s_errno= errno;
- free_private(priv);
- errno= s_errno;
- return NULL;
- }
- priv->read_buffer= buf;
- }
-
- priv->write_inprogress= 0;
- priv->write_buffer= NULL;
- priv->write_bufsize= rd_size;
- priv->write_size= 0;
- priv->write_offset= 0;
- priv->write_errno= 0;
-
- if (wr_size != 0)
- {
- if ((buf= xalloc(wr_size)) == NULL)
- {
- PRMSG(1, ":alloc_private: malloc failed\n", 0, 0, 0);
- s_errno= errno;
- free_private(priv);
- errno= s_errno;
- return NULL;
- }
- priv->write_buffer= buf;
- }
-
- priv->listen_completed= 0;
- priv->listen_port= 0;
- priv->listen_list= NULL;
-
- return priv;
-}
-
-static void
-free_private(priv)
-struct private *priv;
-{
- if (priv == NULL)
- return;
- xfree(priv->read_buffer);
- xfree(priv->write_buffer);
- xfree(priv);
-}
-
-static void
-read_cb(ref, res, err)
-nbio_ref_t ref;
-int res;
-int err;
-{
- XtransConnInfo ciptr;
- struct private *priv;
-
- PRMSG(2, ":read_cb(%x,%d,%d)\n", ref.ref_ptr, res, err);
-
- ciptr= ref.ref_ptr;
- priv= (struct private *)ciptr->priv;
- if (res > 0)
- priv->read_size= res;
- priv->read_inprogress= 0;
-}
-
-static void
-write_cb(ref, res, err)
-nbio_ref_t ref;
-int res;
-int err;
-{
- XtransConnInfo ciptr;
- struct private *priv;
- int r;
-
- PRMSG(2, ":write_cb(%x,%d,%d)\n", ref.ref_ptr, res, err);
-
- ciptr= ref.ref_ptr;
- priv= (struct private *)ciptr->priv;
- if (res > 0)
- priv->write_offset += res;
- else if (res == 0)
- abort();
- else
- {
- priv->write_errno= err;
- return;
- }
- priv->write_inprogress= 0;
-
- while (priv->write_offset < priv->write_size)
- {
- r= write(ciptr->fd, priv->write_buffer+priv->write_offset,
- priv->write_size-priv->write_offset);
- if (r > 0)
- {
- PRMSG(5, "MnxTcpWrite: wrote %d bytes\n",
- r, 0, 0);
- priv->write_offset += r;
- continue;
- }
- else if (r == -1 && errno == EINPROGRESS)
- {
- priv->write_inprogress= 1;
- nbio_inprogress(ciptr->fd, ASIO_WRITE, 0 /* read */,
- 1 /* write */, 0 /* exception */);
- }
- else
- {
- PRMSG(1, "MnxTcpWrite: write failed: %s\n",
- strerror(errno), 0, 0);
- priv->write_errno= errno;
- }
- break;
- }
-}
-
-static void
-listen_cb(ref, res, err)
-nbio_ref_t ref;
-int res;
-int err;
-{
- XtransConnInfo ciptr;
- struct private *priv;
- struct sockaddr_in *addr;
- nwio_tcpconf_t tcpconf;
-
- PRMSG(2, ":listen_cb(%x,%d,%d)\n", ref.ref_ptr, res, err);
-
- ciptr= ref.ref_ptr;
- priv= (struct private *)ciptr->priv;
- if (res == 0)
- {
- if (ioctl(ciptr->fd, NWIOGTCPCONF, &tcpconf) == -1)
- {
- PRMSG(1,
- ":listen_cb: NWIOGTCPCONF failed: %s\n",
- strerror(errno),0, 0);
- return;
- }
- if ((addr= (struct sockaddr_in *)xalloc(sizeof(struct sockaddr_in)))
- == NULL)
- {
- PRMSG(1, ":listen_cb: malloc failed\n", 0, 0, 0);
- return;
- }
- addr->sin_family= AF_INET;
- addr->sin_addr.s_addr= tcpconf.nwtc_locaddr;
- addr->sin_port= tcpconf.nwtc_locport;
- if (ciptr->addr)
- xfree(ciptr->addr);
- ciptr->addr= (char *)addr;
- ciptr->addrlen= sizeof(struct sockaddr_in);
- priv->listen_completed= 1;
- return;
- }
- PRMSG(2, ":listen_cb: listen failed: %s\n", strerror(err), 0, 0);
- if (restart_listen(ciptr) == -1)
- {
- priv->listen_list= listen_list;
- listen_list= ciptr;
- }
-}
-
-static int
-restart_listen(ciptr)
-XtransConnInfo ciptr;
-{
- char *tcp_device;
- nwio_tcpconf_t tcpconf;
- nwio_tcpcl_t tcpcl;
- int fd, r, s_errno, flags;
- struct private *priv;
- nbio_ref_t ref;
-
- PRMSG(2, ":restart_listen(%d)\n", ciptr->fd, 0, 0);
-
- nbio_unregister(ciptr->fd);
-
- if ((tcp_device= getenv("TCP_DEVICE")) == NULL)
- tcp_device= TCP_DEVICE;
-
- if ((fd= open(tcp_device, O_RDWR)) == -1)
- {
- PRMSG(1, ":restart_listen: open '%s' failed: %s\n",
- tcp_device, strerror(errno), 0);
- return -1;
- }
- PRMSG(5, ":restart_listen: fd= '%d'\n", fd, 0, 0);
- if (fd != ciptr->fd)
- {
- if (dup2(fd, ciptr->fd) == -1)
- abort(); /* no way to recover */
- close(fd);
- }
- fd= ciptr->fd;
- ref.ref_ptr= ciptr;
- nbio_register(fd);
- nbio_setcallback(fd, ASIO_IOCTL, listen_cb, ref);
-
- priv= (struct private *)ciptr->priv;
-
- tcpconf.nwtc_flags= NWTC_SHARED | NWTC_UNSET_RA | NWTC_UNSET_RP;
- tcpconf.nwtc_locport= priv->listen_port;
- tcpconf.nwtc_flags |= NWTC_LP_SET;
-
- if (ioctl(ciptr->fd, NWIOSTCPCONF, &tcpconf) == -1)
- {
- PRMSG(1,
- ":restart_listen: NWIOSTCPCONF failed: %s\n",
- strerror(errno),0, 0);
- return -1;
- }
-
- flags= fcntl(ciptr->fd, F_GETFD);
- if (flags == -1)
- {
- PRMSG(1,
- ":restart_listen: fcntl F_GETFD failed: %s\n",
- strerror(errno), 0, 0);
- return -1;
- }
- if (fcntl(ciptr->fd, F_SETFD, flags | FD_ASYNCHIO) == -1)
- {
- PRMSG(1,
- ":restart_listen: fcntl F_SETFD failed: %s\n",
- strerror(errno), 0, 0);
- return -1;
- }
-
- tcpcl.nwtcl_flags= 0;
- r= ioctl(ciptr->fd, NWIOTCPLISTEN, &tcpcl);
- s_errno= errno;
-
- if (fcntl(ciptr->fd, F_SETFD, flags) == -1)
- {
- PRMSG(1,
- ":restart_listen: fcntl F_SETFD failed: %s\n",
- strerror(errno), 0, 0);
- return -1;
- }
-
- if (r == -1 && s_errno == EINPROGRESS)
- {
- nbio_inprogress(ciptr->fd, ASIO_IOCTL, 1 /* read */,
- 1 /* write */, 0 /* exception */);
- return 0;
- }
- if (r == 0)
- {
- priv->listen_completed= 1;
- return 0;
- }
- errno= s_errno;
- PRMSG(1, ":restart_listen: NWIOTCPLISTEN failed: %s\n",
- strerror(errno), 0, 0);
- return -1;
-}
-
-
-Xtransport TRANS(MnxINETFuncs) =
-{
- /* Minix TCP Interface */
- "inet",
- 0,
-#ifdef TRANS_CLIENT
- TRANS(MnxTcpOpenCOTSClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(MnxTcpOpenCOTSServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(MnxTcpOpenCLTSClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(MnxTcpOpenCLTSServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(MnxTcpReopenCOTSServer),
- TRANS(MnxTcpReopenCLTSServer),
-#endif
- TRANS(MnxTcpSetOption),
-#ifdef TRANS_SERVER
- TRANS(MnxTcpCreateListener),
- TRANS(MnxTcpResetListener),
- TRANS(MnxTcpAccept),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(MnxTcpConnect),
-#endif /* TRANS_CLIENT */
- TRANS(MnxTcpBytesReadable),
- TRANS(MnxTcpRead),
- TRANS(MnxTcpWrite),
- TRANS(MnxTcpReadv),
- TRANS(MnxTcpWritev),
- TRANS(MnxTcpDisconnect),
- TRANS(MnxTcpClose),
- TRANS(MnxTcpClose),
-};
-
-Xtransport TRANS(MnxTCPFuncs) =
-{
- /* Minix TCP Interface */
- "tcp",
- TRANS_ALIAS,
-#ifdef TRANS_CLIENT
- TRANS(MnxTcpOpenCOTSClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(MnxTcpOpenCOTSServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(MnxTcpOpenCLTSClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(MnxTcpOpenCLTSServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(MnxTcpReopenCOTSServer),
- TRANS(MnxTcpReopenCLTSServer),
-#endif
- TRANS(MnxTcpSetOption),
-#ifdef TRANS_SERVER
- TRANS(MnxTcpCreateListener),
- TRANS(MnxTcpResetListener),
- TRANS(MnxTcpAccept),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(MnxTcpConnect),
-#endif /* TRANS_CLIENT */
- TRANS(MnxTcpBytesReadable),
- TRANS(MnxTcpRead),
- TRANS(MnxTcpWrite),
- TRANS(MnxTcpReadv),
- TRANS(MnxTcpWritev),
- TRANS(MnxTcpDisconnect),
- TRANS(MnxTcpClose),
- TRANS(MnxTcpClose),
-};