diff options
Diffstat (limited to 'xc/lib')
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), -}; |