xserver: Branch 'XACE-SELINUX' - 45 commits

Eamon Walsh ewalsh at kemper.freedesktop.org
Tue Dec 12 20:55:19 EET 2006


 GL/glx/indirect_dispatch_swap.c          |    2 
 GL/glx/indirect_program.c                |    2 
 GL/glx/indirect_reqsize.c                |    2 
 GL/glx/indirect_texture_compression.c    |    2 
 GL/glx/indirect_util.c                   |    2 
 GL/glx/swap_interval.c                   |    2 
 Xext/security.c                          |   14 
 Xext/xace.c                              |    2 
 Xext/xace.h                              |   26 +
 Xext/xselinux.c                          |   34 -
 composite/compext.c                      |    5 
 config/config.c                          |  241 ++++++++----
 configure.ac                             |    6 
 cpprules.in                              |    1 
 dix/Makefile.am                          |    2 
 dix/devices.c                            |   22 -
 dix/dispatch.c                           |   45 --
 dix/dixutils.c                           |    2 
 dix/events.c                             |   53 +-
 dix/extension.c                          |   17 
 dix/getevents.c                          |   19 
 dix/main.c                               |    6 
 dix/property.c                           |   77 +--
 dix/resource.c                           |    8 
 dix/window.c                             |   42 --
 hw/kdrive/linux/keyboard.c               |    3 
 hw/kdrive/linux/tslib.c                  |   20 -
 hw/kdrive/mga/g400_composite.c           |    4 
 hw/xfree86/Makefile.am                   |    1 
 hw/xfree86/common/compiler.h             |    4 
 hw/xfree86/common/xf86.h                 |    2 
 hw/xfree86/common/xf86Bus.c              |    8 
 hw/xfree86/common/xf86Bus.h              |    2 
 hw/xfree86/common/xf86Configure.c        |    8 
 hw/xfree86/common/xf86Events.c           |    2 
 hw/xfree86/common/xf86Init.c             |    3 
 hw/xfree86/common/xf86Xinput.c           |   51 --
 hw/xfree86/ddc/ddcProperty.c             |    3 
 hw/xfree86/ddc/interpret_edid.c          |   12 
 hw/xfree86/dixmods/type1mod.c            |   15 
 hw/xfree86/doc/man/Xorg.man.pre          |    2 
 hw/xfree86/doc/man/xorg.conf.man.pre     |    2 
 hw/xfree86/loader/xf86sym.c              |    2 
 hw/xfree86/os-support/solaris/sun_bell.c |   12 
 hw/xfree86/scanpci/pci.ids               |   85 +++-
 hw/xfree86/scanpci/xf86PciStdIds.h       |  619 ++++++++++++++++++++++++++++---
 hw/xfree86/utils/xorgcfg/loadmod.c       |    2 
 hw/xfree86/xorgconf.cpp                  |    1 
 hw/xwin/InitOutput.c                     |    1 
 hw/xwin/winmultiwindowwindow.c           |    7 
 include/Makefile.am                      |    2 
 os/Makefile.am                           |    2 
 os/access.c                              |    6 
 os/connection.c                          |    6 
 randr/rrcrtc.c                           |    2 
 randr/rroutput.c                         |    2 
 randr/rrproperty.c                       |    2 
 xkb/xkbUtils.c                           |   14 
 58 files changed, 1042 insertions(+), 499 deletions(-)

New commits:
diff-tree 62e7722ebd8d341a23eb56cb330eeb00e6a975a6 (from parents)
Merge: e124806994675e16ca8e3937388f2cadeb529fc3 f3c60900e575e65254cd2576cc6c90b97c8f63ae
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Tue Dec 12 13:54:33 2006 -0500

    Merge branch 'XACE-SELINUX' into my-XACE-SELINUX

diff-tree e124806994675e16ca8e3937388f2cadeb529fc3 (from ca77c121075a9de1f47d42f6aaf91c20185231de)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Tue Dec 12 13:35:22 2006 -0500

    Remove trailing whitespace (whitespace police).

diff --git a/Xext/xselinux.c b/Xext/xselinux.c
index 8d710f6..1c2b508 100644
--- a/Xext/xselinux.c
+++ b/Xext/xselinux.c
@@ -135,8 +135,8 @@ static char *XSELinuxRootWindowContext =
 extern Selection *CurrentSelections;
 extern int NumCurrentSelections;
 
-/* 
- * list of classes corresponding to SIDs in the 
+/*
+ * list of classes corresponding to SIDs in the
  * rsid array of the security state structure (below).
  *
  * XXX SIDs should be stored in their native objects, not all
@@ -193,7 +193,7 @@ IndexByClass(security_class_t class)
 }
 
 /*
- * Does sanity checking on a resource ID.  This can be removed after 
+ * Does sanity checking on a resource ID.  This can be removed after
  * testing.
  */
 static void
@@ -351,7 +351,7 @@ ObjectSIDByLabel(security_context_t base
     con = context_new(base);
     if (!con)
 	goto out2;
-    
+
     /* look in the mappings of names to types */
     ptr = (class == SECCLASS_PROPERTY) ? propertyTypes : extensionTypes;
     for (; *ptr; ptr+=2)
@@ -564,14 +564,14 @@ CheckSendEventPerms(ClientPtr client)
 	swapl(&stuff->destination, n);
     return IDPerm(client, stuff->destination, SECCLASS_WINDOW, perm);
 }
-     
+
 static int
 CheckConvertSelectionPerms(ClientPtr client)
 {
     register char n;
     int rval = TRUE;
     REQUEST(xConvertSelectionReq);
-    
+
     if (!REQUEST_SIZE_CHECK(client, xConvertSelectionReq))
 	return FALSE;
 
@@ -620,11 +620,11 @@ CheckSetSelectionOwnerPerms(ClientPtr cl
 	    rval = rval && IDPerm(client, CurrentSelections[i].window,
 				  SECCLASS_WINDOW, WINDOW__CHSELECTION);
     }
-    rval = rval && IDPerm(client, stuff->window, 
+    rval = rval && IDPerm(client, stuff->window,
 			  SECCLASS_WINDOW, WINDOW__CHSELECTION);
     return rval;
 }
-    
+
 CALLBACK(XSELinuxCoreDispatch)
 {
     XaceCoreDispatchRec *rec = (XaceCoreDispatchRec*)calldata;
@@ -678,7 +678,7 @@ CALLBACK(XSELinuxCoreDispatch)
     /* Window class control requirements */
     case X_ChangeProperty:
 	rval = IDPERM(client, xChangePropertyReq, window,
-		      SECCLASS_WINDOW, 
+		      SECCLASS_WINDOW,
 		      WINDOW__CHPROPLIST | WINDOW__CHPROP |
 		      WINDOW__LISTPROP);
 	break;
@@ -914,7 +914,7 @@ CALLBACK(XSELinuxCoreDispatch)
 	    && IDPERM(client, xPolyTextReq, drawable,
 		      SECCLASS_DRAWABLE, DRAWABLE__DRAW);
 	break;
-	
+
     /* Pixmap class control requirements */
     case X_CreatePixmap:
 	rval = IDPERM(client, xCreatePixmapReq, pid,
@@ -950,7 +950,7 @@ CALLBACK(XSELinuxCoreDispatch)
 	rval = IDPERM(client, xResourceReq, id,
 		      SECCLASS_CURSOR, CURSOR__FREE);
 	break;
-	    
+
     /* GC class control requirements */
     case X_CreateGC:
 	rval = IDPERM(client, xCreateGCReq, gc,
@@ -1018,7 +1018,7 @@ CALLBACK(XSELinuxExtDispatch)
     security_id_t extsid;
     access_vector_t perm;
     REQUEST(xReq);
-    
+
     /* XXX there should be a separate callback for this */
     if (!EXTENSIONSID(ext))
     {
@@ -1215,7 +1215,7 @@ CALLBACK(XSELinuxWindowInit)
 	rc = ChangeWindowProperty(rec->pWin, atom_client_ctx, XA_STRING, 8,
 				  PropModeReplace, strlen(ctx), ctx, FALSE);
 	freecon(ctx);
-    } 
+    }
     else
 	rc = ChangeWindowProperty(rec->pWin, atom_client_ctx, XA_STRING, 8,
 				  PropModeReplace, 10, "UNLABELED!", FALSE);
@@ -1441,7 +1441,7 @@ XSELinuxParsePropertyTypeRule(char *p)
 
     newTypes[propertyTypesCount*2 - 2] = propcopy;
     newTypes[propertyTypesCount*2 - 1] = typecopy;
-    
+
     propertyTypes = newTypes;
 
     return TRUE;
@@ -1612,7 +1612,7 @@ XSELinuxLoadConfigFile(void)
     int lineNumber = 0;
     char **newTypes;
     Bool ret = FALSE;
-    
+
     if (!XSELINUXCONFIGFILE)
         return FALSE;
 
@@ -1837,7 +1837,7 @@ XSELinuxExtensionSetup(INITARGS)
 {
     /* Allocate the client private index */
     clientPrivateIndex = AllocateClientPrivateIndex();
-    if (!AllocateClientPrivate(clientPrivateIndex, 
+    if (!AllocateClientPrivate(clientPrivateIndex,
 			       sizeof (XSELinuxClientStateRec)))
 	FatalError("XSELinux: Failed to allocate client private.\n");
 
diff-tree ca77c121075a9de1f47d42f6aaf91c20185231de (from a60da1db7cced28c07960a713eb18deb45beb432)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Tue Dec 12 13:26:52 2006 -0500

    Naming change: Security*Operation -> Xace*Operation

diff --git a/Xext/xselinux.c b/Xext/xselinux.c
index 2f960d1..8d710f6 100644
--- a/Xext/xselinux.c
+++ b/Xext/xselinux.c
@@ -1090,7 +1090,7 @@ CALLBACK(XSELinuxProperty)
 	{
 	    if (errno != EACCES)
 		ErrorF("Property: unexpected error %d\n", errno);
-	    rec->rval = SecurityIgnoreOperation;
+	    rec->rval = XaceIgnoreOperation;
 	}
     } else
 	ErrorF("No client state in property callback!\n");
diff-tree a60da1db7cced28c07960a713eb18deb45beb432 (from 5719afe6d3a246985709e6f045617c1e16a7da51)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Wed Nov 29 22:19:57 2006 -0500

    Add required root window context to config file.

diff --git a/Xext/XSELinuxConfig b/Xext/XSELinuxConfig
index faf815e..9c953f5 100644
--- a/Xext/XSELinuxConfig
+++ b/Xext/XSELinuxConfig
@@ -9,6 +9,7 @@
 # security policy.  Only one nonlocal_context rule may be defined.
 #
 nonlocal_context			system_u:object_r:remote_xclient_t:s1
+root_window_context			system_u:object_r:root_window_t:s1
 
 #
 # Property rules map a property name to a SELinux type.  The type must
diff-tree 5719afe6d3a246985709e6f045617c1e16a7da51 (from 354c80da66af141e8ba6d75fed75a0f482987956)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Thu Oct 26 20:20:57 2006 -0400

    Change symbol in libaudit library test.

diff --git a/configure.ac b/configure.ac
index 7e931ce..7306463 100644
--- a/configure.ac
+++ b/configure.ac
@@ -685,7 +685,7 @@ if test "x$XSELINUX" = xyes; then
 	AC_CHECK_HEADERS([selinux/selinux.h selinux/avc.h], [], AC_MSG_ERROR([SELinux include files not found]))
 	AC_CHECK_LIB(selinux, avc_init, [], AC_MSG_ERROR([SELinux library not found])) 
 	AC_CHECK_HEADERS([libaudit.h], [], AC_MSG_ERROR([SELinux extension requires audit system headers]))
-	AC_CHECK_LIB(audit, audit_log_avc, [], AC_MSG_ERROR([SELinux extension requires audit system library]))
+	AC_CHECK_LIB(audit, audit_open, [], AC_MSG_ERROR([SELinux extension requires audit system library]))
 	AC_DEFINE(XSELINUX, 1, [Build SELinux extension])
 	SELINUX_LIB="-lselinux -laudit"
 fi
diff-tree 354c80da66af141e8ba6d75fed75a0f482987956 (from 3714d9149928754afcd6b2466a1371ca32e17985)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Thu Oct 5 16:07:26 2006 -0400

    Improve error handling, messages during initialization.

diff --git a/Xext/xselinux.c b/Xext/xselinux.c
index df19e5d..2f960d1 100644
--- a/Xext/xselinux.c
+++ b/Xext/xselinux.c
@@ -1211,7 +1211,7 @@ CALLBACK(XSELinuxWindowInit)
     if (HAVESTATE(rec->client)) {
 	rc = avc_sid_to_context(SID(rec->client), &ctx);
 	if (rc < 0)
-	    FatalError("Failed to get security context!\n");
+	    FatalError("XSELinux: Failed to get security context!\n");
 	rc = ChangeWindowProperty(rec->pWin, atom_client_ctx, XA_STRING, 8,
 				  PropModeReplace, strlen(ctx), ctx, FALSE);
 	freecon(ctx);
@@ -1220,7 +1220,7 @@ CALLBACK(XSELinuxWindowInit)
 	rc = ChangeWindowProperty(rec->pWin, atom_client_ctx, XA_STRING, 8,
 				  PropModeReplace, 10, "UNLABELED!", FALSE);
     if (rc != Success)
-	FatalError("Failed to set context property on window!\n");
+	FatalError("XSELinux: Failed to set context property on window!\n");
 } /* XSELinuxWindowInit */
 
 static char *XSELinuxKeywords[] = {
@@ -1859,13 +1859,13 @@ XSELinuxExtensionInit(INITARGS)
 
     if (!is_selinux_enabled())
     {
-        ErrorF("SELinux Extension failed to load: SELinux not enabled\n");
+        ErrorF("XSELinux: Extension failed to load: SELinux not enabled\n");
         return;
     }
 
     if (avc_init("xserver", NULL, &alc, NULL, NULL) < 0)
     {
-	FatalError("couldn't initialize SELinux userspace AVC\n");
+	FatalError("XSELinux: Couldn't initialize SELinux userspace AVC\n");
     }
 
     if (!AddCallback(&ClientStateCallback, XSELinuxClientState, NULL))
@@ -1874,10 +1874,10 @@ XSELinuxExtensionInit(INITARGS)
     /* Create atoms for doing window labeling */
     atom_ctx = MakeAtom("_SELINUX_CONTEXT", 16, 1);
     if (atom_ctx == BAD_RESOURCE)
-	return;
+	FatalError("XSELinux: Failed to create atom\n");
     atom_client_ctx = MakeAtom("_SELINUX_CLIENT_CONTEXT", 23, 1);
     if (atom_client_ctx == BAD_RESOURCE)
-	return;
+	FatalError("XSELinux: Failed to create atom\n");
 
     /* Load the config file.  If this fails, shut down the server,
      * since an unknown security status is worse than no security.
diff-tree 3714d9149928754afcd6b2466a1371ca32e17985 (from 7f16c38ae2b47b195609d8fedefb7b28f612b2d4)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Wed Oct 4 16:23:35 2006 -0400

    Experimental window property holding security context.

diff --git a/Xext/xselinux.c b/Xext/xselinux.c
index 5a6d2ef..df19e5d 100644
--- a/Xext/xselinux.c
+++ b/Xext/xselinux.c
@@ -35,6 +35,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE 
 #endif
 
 #include <X11/X.h>
+#include <X11/Xatom.h>
 #include <X11/Xproto.h>
 #include <X11/Xfuncproto.h>
 #include "dixstruct.h"
@@ -120,6 +121,10 @@ static char **extensionTypes = NULL;
 static int extensionTypesCount = 0;
 static char *XSELinuxExtensionTypeDefault = NULL;
 
+/* Atoms for SELinux window labeling properties */
+Atom atom_ctx;
+Atom atom_client_ctx;
+
 /* security context for non-local clients */
 static char *XSELinuxNonlocalContextDefault = NULL;
 
@@ -1196,6 +1201,28 @@ CALLBACK(XSELinuxClientState)
     }
 } /* XSELinuxClientState */
 
+/* Labeling callbacks */
+CALLBACK(XSELinuxWindowInit)
+{
+    XaceWindowRec *rec = (XaceWindowRec*)calldata;
+    security_context_t ctx;
+    int rc;
+
+    if (HAVESTATE(rec->client)) {
+	rc = avc_sid_to_context(SID(rec->client), &ctx);
+	if (rc < 0)
+	    FatalError("Failed to get security context!\n");
+	rc = ChangeWindowProperty(rec->pWin, atom_client_ctx, XA_STRING, 8,
+				  PropModeReplace, strlen(ctx), ctx, FALSE);
+	freecon(ctx);
+    } 
+    else
+	rc = ChangeWindowProperty(rec->pWin, atom_client_ctx, XA_STRING, 8,
+				  PropModeReplace, 10, "UNLABELED!", FALSE);
+    if (rc != Success)
+	FatalError("Failed to set context property on window!\n");
+} /* XSELinuxWindowInit */
+
 static char *XSELinuxKeywords[] = {
 #define XSELinuxKeywordComment 0
     "#",
@@ -1844,6 +1871,14 @@ XSELinuxExtensionInit(INITARGS)
     if (!AddCallback(&ClientStateCallback, XSELinuxClientState, NULL))
 	return;
 
+    /* Create atoms for doing window labeling */
+    atom_ctx = MakeAtom("_SELINUX_CONTEXT", 16, 1);
+    if (atom_ctx == BAD_RESOURCE)
+	return;
+    atom_client_ctx = MakeAtom("_SELINUX_CLIENT_CONTEXT", 23, 1);
+    if (atom_client_ctx == BAD_RESOURCE)
+	return;
+
     /* Load the config file.  If this fails, shut down the server,
      * since an unknown security status is worse than no security.
      *
@@ -1873,6 +1908,7 @@ XSELinuxExtensionInit(INITARGS)
     XaceRegisterCallback(XACE_BACKGRND_ACCESS, XSELinuxBackgrnd, NULL);
     XaceRegisterCallback(XACE_DRAWABLE_ACCESS, XSELinuxDrawable, NULL);
     XaceRegisterCallback(XACE_PROPERTY_ACCESS, XSELinuxProperty, NULL);
+    XaceRegisterCallback(XACE_WINDOW_INIT, XSELinuxWindowInit, NULL);
     /* XaceRegisterCallback(XACE_DECLARE_EXT_SECURE, XSELinuxDeclare, NULL);
     XaceRegisterCallback(XACE_DEVICE_ACCESS, XSELinuxDevice, NULL); */
 
diff-tree 7f16c38ae2b47b195609d8fedefb7b28f612b2d4 (from a7f4bbea87ada1d699bfd9e3b6a98f06191650f6)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Fri Sep 8 15:31:18 2006 -0400

    Add SELinux extension configure-time support.

diff --git a/Xext/Makefile.am b/Xext/Makefile.am
index 6ea3d74..be04c84 100644
--- a/Xext/Makefile.am
+++ b/Xext/Makefile.am
@@ -76,6 +76,16 @@ if XACE
 BUILTIN_SRCS += $(XACE_SRCS)
 endif
 
+# SELinux extension: provides SELinux policy support for X objects
+# requires X-ACE extension
+XSELINUX_SRCS = xselinux.c xselinux.h
+if XSELINUX
+BUILTIN_SRCS += $(XSELINUX_SRCS)
+
+SERVERCONFIG_DATA += XSELinuxConfig
+AM_CFLAGS += -DXSELINUXCONFIGFILE=\"$(SERVERCONFIGdir)/XSELinuxConfig\"
+endif
+
 # Security extension: multi-level security to protect clients from each other
 XCSECURITY_SRCS = security.c securitysrv.h
 if XCSECURITY   
diff-tree a7f4bbea87ada1d699bfd9e3b6a98f06191650f6 (from 28e80cd65b1207b123c02f895851bb6d207aa3c1)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Fri Sep 8 15:17:01 2006 -0400

    Add SELinux extension to the module/extension loader.

diff --git a/hw/xfree86/dixmods/extmod/modinit.h b/hw/xfree86/dixmods/extmod/modinit.h
index 41f060b..131b9e6 100644
--- a/hw/xfree86/dixmods/extmod/modinit.h
+++ b/hw/xfree86/dixmods/extmod/modinit.h
@@ -129,6 +129,11 @@ extern void ShmRegisterFuncs(
 extern void XaceExtensionInit(INITARGS);
 #endif
 
+#ifdef XSELINUX
+extern void XSELinuxExtensionSetup(INITARGS);
+extern void XSELinuxExtensionInit(INITARGS);
+#endif
+
 #if 1
 extern void SecurityExtensionSetup(INITARGS);
 extern void SecurityExtensionInit(INITARGS);
diff --git a/mi/miinitext.c b/mi/miinitext.c
index cb34473..e270bc6 100644
--- a/mi/miinitext.c
+++ b/mi/miinitext.c
@@ -248,6 +248,9 @@ typedef void (*InitExtension)(INITARGS);
 #include "securitysrv.h"
 #include <X11/extensions/securstr.h>
 #endif
+#ifdef XSELINUX
+#include "xselinux.h"
+#endif
 #ifdef PANORAMIX
 #include <X11/extensions/panoramiXproto.h>
 #endif
@@ -321,6 +324,10 @@ extern void XaceExtensionInit(INITARGS);
 extern void SecurityExtensionSetup(INITARGS);
 extern void SecurityExtensionInit(INITARGS);
 #endif
+#ifdef XSELINUX
+extern void XSELinuxExtensionSetup(INITARGS);
+extern void XSELinuxExtensionInit(INITARGS);
+#endif
 #ifdef XPRINT
 extern void XpExtensionInit(INITARGS);
 #endif
@@ -532,6 +539,9 @@ InitExtensions(argc, argv)
 #ifdef XCSECURITY
     SecurityExtensionSetup();
 #endif
+#ifdef XSELINUX
+    XSELinuxExtensionSetup();
+#endif
 #ifdef PANORAMIX
 # if !defined(PRINT_ONLY_SERVER) && !defined(NO_PANORAMIX)
   if (!noPanoramiXExtension) PanoramiXExtensionInit();
@@ -600,6 +610,9 @@ InitExtensions(argc, argv)
 #ifdef XCSECURITY
     if (!noSecurityExtension) SecurityExtensionInit();
 #endif
+#ifdef XSELINUX
+    XSELinuxExtensionInit();
+#endif
 #ifdef XPRINT
     XpExtensionInit(); /* server-specific extension, cannot be disabled */
 #endif
@@ -705,6 +718,9 @@ static ExtensionModule staticExtensions[
 #ifdef XCSECURITY
     { SecurityExtensionInit, SECURITY_EXTENSION_NAME, &noSecurityExtension, SecurityExtensionSetup, NULL },
 #endif
+#ifdef XSELINUX
+    { XSELinuxExtensionInit, XSELINUX_EXTENSION_NAME, NULL, XSELinuxExtensionSetup, NULL },
+#endif
 #ifdef XPRINT
     { XpExtensionInit, XP_PRINTNAME, NULL, NULL, NULL },
 #endif
diff-tree 28e80cd65b1207b123c02f895851bb6d207aa3c1 (from 83aad2be8a80890f349c2f9caf84786333f7cc8c)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Fri Sep 8 15:15:19 2006 -0400

    Add SELinux extension configure-time support.

diff --git a/configure.ac b/configure.ac
index 002be62..7e931ce 100644
--- a/configure.ac
+++ b/configure.ac
@@ -442,6 +442,7 @@ AC_ARG_ENABLE(xinerama,	      AS_HELP_ST
 AC_ARG_ENABLE(xf86vidmode,    AS_HELP_STRING([--disable-xf86vidmode], [Build XF86VidMode extension (default: auto)]), [XF86VIDMODE=$enableval], [XF86VIDMODE=auto])
 AC_ARG_ENABLE(xf86misc,       AS_HELP_STRING([--disable-xf86misc], [Build XF86Misc extension (default: auto)]), [XF86MISC=$enableval], [XF86MISC=auto])
 AC_ARG_ENABLE(xace,     AS_HELP_STRING([--disable-xace], [Build X-ACE extension (default: enabled)]), [XACE=$enableval], [XACE=yes])
+AC_ARG_ENABLE(xselinux,     AS_HELP_STRING([--disable-xselinux], [Build SELinux extension (default: enabled)]), [XSELINUX=$enableval], [XSELINUX=$XACE])
 AC_ARG_ENABLE(xcsecurity,     AS_HELP_STRING([--disable-xcsecurity], [Build Security extension (default: enabled)]), [XCSECURITY=$enableval], [XCSECURITY=$XACE])
 AC_ARG_ENABLE(appgroup,       AS_HELP_STRING([--disable-appgroup], [Build XC-APPGROUP extension (default: enabled)]), [APPGROUP=$enableval], [APPGROUP=$XCSECURITY])
 AC_ARG_ENABLE(xcalibrate,     AS_HELP_STRING([--enable-xcalibrate], [Build XCalibrate extension (default: disabled)]), [XCALIBRATE=$enableval], [XCALIBRATE=no])
@@ -676,6 +677,19 @@ if test "x$XACE" = xyes; then
 	AC_DEFINE(XACE, 1, [Build X-ACE extension])
 fi
 
+AM_CONDITIONAL(XSELINUX, [test "x$XSELINUX" = xyes])
+if test "x$XSELINUX" = xyes; then
+	if test "x$XACE" != xyes; then
+		AC_MSG_ERROR([cannot build SELinux extension without X-ACE])
+	fi
+	AC_CHECK_HEADERS([selinux/selinux.h selinux/avc.h], [], AC_MSG_ERROR([SELinux include files not found]))
+	AC_CHECK_LIB(selinux, avc_init, [], AC_MSG_ERROR([SELinux library not found])) 
+	AC_CHECK_HEADERS([libaudit.h], [], AC_MSG_ERROR([SELinux extension requires audit system headers]))
+	AC_CHECK_LIB(audit, audit_log_avc, [], AC_MSG_ERROR([SELinux extension requires audit system library]))
+	AC_DEFINE(XSELINUX, 1, [Build SELinux extension])
+	SELINUX_LIB="-lselinux -laudit"
+fi
+
 AM_CONDITIONAL(XCSECURITY, [test "x$XCSECURITY" = xyes])
 if test "x$XCSECURITY" = xyes; then
 	if test "x$XACE" != xyes; then
@@ -1162,7 +1176,7 @@ if test "x$XORG" = xyes -o "x$XGL" = xye
 	XORG_OSINCS='-I$(top_srcdir)/hw/xfree86/os-support -I$(top_srcdir)/hw/xfree86/os-support/bus -I$(top_srcdir)/os'
 	XORG_INCS="$XORG_DDXINCS $XORG_OSINCS"
 	XORG_CFLAGS="$XORGSERVER_CFLAGS -DHAVE_XORG_CONFIG_H"
-	XORG_LIBS="$COMPOSITE_LIB $MI_LIB $FIXES_LIB $XEXTXORG_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XPSTUBS_LIB $OS_LIB"
+	XORG_LIBS="$COMPOSITE_LIB $MI_LIB $FIXES_LIB $XEXTXORG_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XPSTUBS_LIB $SELINUX_LIB $OS_LIB"
 
 	if test "x$DGA" = xauto; then
 		PKG_CHECK_MODULES(DGA, xf86dgaproto, [DGA=yes], [DGA=no])
diff --git a/include/dix-config.h.in b/include/dix-config.h.in
index 7aabae2..4a0b128 100644
--- a/include/dix-config.h.in
+++ b/include/dix-config.h.in
@@ -317,6 +317,9 @@
 /* Build X-ACE extension */
 #undef XACE
 
+/* Build SELinux extension */
+#undef XSELINUX
+
 /* Support XCMisc extension */
 #undef XCMISC
 
diff-tree 83aad2be8a80890f349c2f9caf84786333f7cc8c (from 81281cb298a5825bc7a2e692375a86199293bbbe)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Fri Sep 8 15:11:04 2006 -0400

    Add SELinux extension source files.

diff --git a/Xext/XSELinuxConfig b/Xext/XSELinuxConfig
new file mode 100644
index 0000000..faf815e
--- /dev/null
+++ b/Xext/XSELinuxConfig
@@ -0,0 +1,83 @@
+#
+# Config file for XSELinux extension
+#
+
+#
+# The nonlocal_context rule defines a context to be used for all clients
+# connecting to the server from a remote host.  The nonlocal context must
+# be defined, and it must be a valid context according to the SELinux
+# security policy.  Only one nonlocal_context rule may be defined.
+#
+nonlocal_context			system_u:object_r:remote_xclient_t:s1
+
+#
+# Property rules map a property name to a SELinux type.  The type must
+# be valid according to the SELinux security policy.  There can be any
+# number of property rules.  Additionally, a default property type can be
+# defined for all properties not explicitly listed.  The default
+# property type may not be omitted.  The default rule may appear in
+# any position (it need not be the last property rule listed).
+#
+property WM_NAME			wm_property_t
+property WM_CLASS			wm_property_t
+property WM_ICON_NAME			wm_property_t
+property WM_HINTS			wm_property_t
+property WM_NORMAL_HINTS		wm_property_t
+property WM_COMMAND			wm_property_t
+
+property CUT_BUFFER0			cut_buffer_property_t
+property CUT_BUFFER1			cut_buffer_property_t
+property CUT_BUFFER2			cut_buffer_property_t
+property CUT_BUFFER3			cut_buffer_property_t
+property CUT_BUFFER4			cut_buffer_property_t
+property CUT_BUFFER5			cut_buffer_property_t
+property CUT_BUFFER6			cut_buffer_property_t
+property CUT_BUFFER7			cut_buffer_property_t
+
+property default			unknown_property_t
+
+#
+# Extension rules map an extension name to a SELinux type.  The type must
+# be valid according to the SELinux security policy.  There can be any
+# number of extension rules.  Additionally, a default extension type can
+# be defined for all extensions not explicitly listed.  The default
+# extension type may not be omitted.  The default rule may appear in
+# any position (it need not be the last extension rule listed).
+#
+extension BIG-REQUESTS			std_ext_t
+extension DOUBLE-BUFFER			std_ext_t
+extension DPMS				screensaver_ext_t
+extension Extended-Visual-Information	std_ext_t
+extension FontCache			font_ext_t
+extension GLX				std_ext_t
+extension LBX				std_ext_t
+extension MIT-SCREEN-SAVER		screensaver_ext_t
+extension MIT-SHM			shmem_ext_t
+extension MIT-SUNDRY-NONSTANDARD	std_ext_t
+extension NV-CONTROL			accelgraphics_ext_t
+extension NV-GLX			accelgraphics_ext_t
+extension NVIDIA-GLX			accelgraphics_ext_t
+extension RANDR				std_ext_t
+extension RECORD			debug_ext_t
+extension RENDER			std_ext_t
+extension SECURITY			security_ext_t
+extension SELinux			security_ext_t
+extension SHAPE				std_ext_t
+extension SYNC				sync_ext_t
+extension TOG-CUP			windowmgr_ext_t
+extension X-Resource			debug_ext_t
+extension XAccessControlExtension	security_ext_t
+extension XACEUSR			security_ext_t
+extension XC-APPGROUP			security_ext_t
+extension XC-MISC			std_ext_t
+extension XFree86-Bigfont		font_ext_t
+extension XFree86-DGA			accelgraphics_ext_t
+extension XFree86-Misc			std_ext_t
+extension XFree86-VidModeExtension	video_ext_t
+extension XInputExtension		input_ext_t
+extension XKEYBOARD			input_ext_t
+extension XpExtension                   std_ext_t
+extension XTEST				debug_ext_t
+extension XVideo			video_ext_t
+extension XVideo-MotionCompensation	video_ext_t
+extension default			unknown_ext_t
diff --git a/Xext/xselinux.c b/Xext/xselinux.c
new file mode 100644
index 0000000..5a6d2ef
--- /dev/null
+++ b/Xext/xselinux.c
@@ -0,0 +1,1884 @@
+/************************************************************
+
+Author: Eamon Walsh <ewalsh at epoch.ncsc.mil>
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+this permission notice appear in supporting documentation.  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
+AUTHOR 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.
+
+********************************************************/
+
+/*
+ * Portions of this code copyright (c) 2005 by Trusted Computer Solutions, Inc.
+ * All rights reserved.
+ */
+
+#include <selinux/flask.h>
+#include <selinux/av_permissions.h>
+#include <selinux/selinux.h>
+#include <selinux/context.h>
+#include <selinux/avc.h>
+
+#include <libaudit.h>
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/Xfuncproto.h>
+#include "dixstruct.h"
+#include "extnsionst.h"
+#include "resource.h"
+#include "selection.h"
+#include "xacestr.h"
+#include "xselinux.h"
+#define XSERV_t
+#define TRANS_SERVER
+#include <X11/Xtrans/Xtrans.h>
+#include "../os/osdep.h"
+#include <stdio.h>
+#include <stdarg.h>
+#include "modinit.h"
+
+#ifndef XSELINUXCONFIGFILE
+#warning "XSELinux Policy file is not defined"
+#define XSELINUXCONFIGFILE  NULL
+#endif
+
+
+/* Make sure a locally connecting client has a valid context.  The context
+ * for this client is retrieved again later on in AssignClientState(), but
+ * by that point it's too late to reject the client.
+ */
+static char *
+XSELinuxValidContext (ClientPtr client)
+{
+    security_context_t ctx = NULL;
+    XtransConnInfo ci = ((OsCommPtr)client->osPrivate)->trans_conn;
+    char reason[256];
+    char *ret = (char *)NULL;
+
+    if (_XSERVTransIsLocal(ci))
+    {
+        int fd = _XSERVTransGetConnectionNumber(ci);
+        if (getpeercon(fd, &ctx) < 0)
+        {
+            snprintf(reason, sizeof(reason), "Failed to retrieve SELinux context from socket");
+            ret = reason;
+            goto out;
+        }
+        if (security_check_context(ctx))
+        {
+            snprintf(reason, sizeof(reason), "Client's SELinux context is invalid: %s", ctx);
+            ret = reason;
+        }
+
+        freecon(ctx);
+    }
+
+out:
+    return ret;
+}
+
+
+/* devPrivates in client and extension */
+static int clientPrivateIndex;
+static int extnsnPrivateIndex;
+
+/* audit file descriptor */
+static int audit_fd;
+
+/* structure passed to auditing callback */
+typedef struct {
+    ClientPtr client;	/* client */
+    char *property;	/* property name, if any */
+    char *extension;	/* extension name, if any */
+} XSELinuxAuditRec;
+
+/*
+ * Table of SELinux types for property names.
+ */
+static char **propertyTypes = NULL;
+static int propertyTypesCount = 0;
+char *XSELinuxPropertyTypeDefault = NULL;
+
+/*
+ * Table of SELinux types for each extension.
+ */
+static char **extensionTypes = NULL;
+static int extensionTypesCount = 0;
+static char *XSELinuxExtensionTypeDefault = NULL;
+
+/* security context for non-local clients */
+static char *XSELinuxNonlocalContextDefault = NULL;
+
+/* security context for the root window */
+static char *XSELinuxRootWindowContext = NULL;
+
+/* Selection stuff from dix */
+extern Selection *CurrentSelections;
+extern int NumCurrentSelections;
+
+/* 
+ * list of classes corresponding to SIDs in the 
+ * rsid array of the security state structure (below).
+ *
+ * XXX SIDs should be stored in their native objects, not all
+ * bunched together in the client structure.  However, this will
+ * require modification to the resource manager.
+ */
+static security_class_t sClasses[] = {
+    SECCLASS_WINDOW,
+    SECCLASS_DRAWABLE,
+    SECCLASS_GC,
+    SECCLASS_CURSOR,
+    SECCLASS_FONT,
+    SECCLASS_COLORMAP,
+    SECCLASS_PROPERTY,
+    SECCLASS_XCLIENT,
+    SECCLASS_XINPUT
+};
+#define NRES (sizeof(sClasses)/sizeof(sClasses[0]))
+
+/* This is what we store for client security state */
+typedef struct {
+    int haveState;
+    security_id_t sid;
+    security_id_t rsid[NRES];
+    struct avc_entry_ref aeref;
+} XSELinuxClientStateRec;
+
+/* Convenience macros for accessing security state fields */
+#define STATEPTR(client) \
+    ((client)->devPrivates[clientPrivateIndex].ptr)
+#define HAVESTATE(client) \
+    (((XSELinuxClientStateRec*)STATEPTR(client))->haveState)
+#define SID(client) \
+    (((XSELinuxClientStateRec*)STATEPTR(client))->sid)
+#define RSID(client,n) \
+    (((XSELinuxClientStateRec*)STATEPTR(client))->rsid[n])
+#define AEREF(client) \
+    (((XSELinuxClientStateRec*)STATEPTR(client))->aeref)
+#define EXTENSIONSID(ext) \
+    ((ext)->devPrivates[extnsnPrivateIndex].ptr)
+
+/*
+ * Returns the index into the rsid array where the SID for the
+ * given class is stored.
+ */
+static int
+IndexByClass(security_class_t class)
+{
+    int i;
+    for (i=0; i<NRES; i++)
+	if (class == sClasses[i])
+	    return i;
+    return 0;
+}
+
+/*
+ * Does sanity checking on a resource ID.  This can be removed after 
+ * testing.
+ */
+static void
+CheckXID(XID id)
+{
+    /*
+    XID c = CLIENT_ID(id);
+
+    if (c > 10)
+	ErrorF("Warning: possibly mangled ID %x\n", id);
+
+    c = id & RESOURCE_ID_MASK;
+    if (c > 100)
+	ErrorF("Warning: possibly mangled ID %x\n", id);
+        */
+}
+
+/*
+ * Byte-swap a CARD32 id if necessary.
+ */
+static XID
+SwapXID(ClientPtr client, XID id)
+{
+    register char n;
+    if (client->swapped)
+	swapl(&id, n);
+    return id;
+}
+
+/*
+ * ServerPerm - check access permissions on a server-owned object.
+ *
+ * Arguments:
+ * client: Client doing the request.
+ * class: Security class of the server object being accessed.
+ * perm: Permissions required on the object.
+ *
+ * Returns: boolean TRUE=allowed, FALSE=denied.
+ */
+static int
+ServerPerm(ClientPtr client,
+	   security_class_t class,
+	   access_vector_t perm)
+{
+    int idx = IndexByClass(class);
+    if (HAVESTATE(client))
+    {
+	XSELinuxAuditRec auditdata;
+	auditdata.client = client;
+	auditdata.property = NULL;
+	auditdata.extension = NULL;
+	errno = 0;
+        if (avc_has_perm(SID(client), RSID(serverClient,idx), class,
+                         perm, &AEREF(client), &auditdata) < 0)
+        {
+            if (errno != EACCES)
+                ErrorF("ServerPerm: unexpected error %d\n", errno);
+            return FALSE;
+        }
+    }
+    else
+    {
+	ErrorF("No client state in server-perm check!\n");
+        return TRUE;
+    }
+
+    return TRUE;
+}
+
+/*
+ * IDPerm - check access permissions on a resource.
+ *
+ * Arguments:
+ * client: Client doing the request.
+ * id: resource id of the resource being accessed.
+ * class: Security class of the resource being accessed.
+ * perm: Permissions required on the resource.
+ *
+ * Returns: boolean TRUE=allowed, FALSE=denied.
+ */
+static int
+IDPerm(ClientPtr sclient,
+	 XID id,
+	 security_class_t class,
+	 access_vector_t perm)
+{
+    ClientPtr tclient;
+    int idx = IndexByClass(class);
+    XSELinuxAuditRec auditdata;
+
+    if (id == None)
+	return TRUE;
+
+    CheckXID(id);
+    tclient = clients[CLIENT_ID(id)];
+
+    /*
+     * This happens in the case where a client has
+     * disconnected.  XXX might want to make the server
+     * own orphaned resources...
+     */
+    if (!tclient || !HAVESTATE(tclient) || !HAVESTATE(sclient))
+    {
+	return TRUE;
+    }
+
+    auditdata.client = sclient;
+    auditdata.property = NULL;
+    auditdata.extension = NULL;
+    errno = 0;
+    if (avc_has_perm(SID(sclient), RSID(tclient,idx), class,
+		     perm, &AEREF(sclient), &auditdata) < 0)
+    {
+	if (errno != EACCES)
+	    ErrorF("IDPerm: unexpected error %d\n", errno);
+	return FALSE;
+    }
+
+    return TRUE;
+}
+
+/*
+ * ObjectSIDByLabel - get SID for an extension or property.
+ *
+ * Arguments:
+ * class: should be SECCLASS_XEXTENSION or SECCLASS_PROPERTY.
+ * name: name of the extension or property.
+ *
+ * Returns: proper SID for the object or NULL on error.
+ */
+static security_id_t
+ObjectSIDByLabel(security_context_t basecontext, security_class_t class,
+                 const char *name)
+{
+    security_context_t base, new;
+    context_t con;
+    security_id_t sid = NULL;
+    char **ptr, *type = NULL;
+
+    if (basecontext != NULL)
+    {
+        /* use the supplied context */
+        base = strdup(basecontext);
+        if (base == NULL)
+            goto out;
+    }
+    else
+    {
+        /* get server context */
+        if (getcon(&base) < 0)
+            goto out;
+    }
+
+    /* make a new context-manipulation object */
+    con = context_new(base);
+    if (!con)
+	goto out2;
+    
+    /* look in the mappings of names to types */
+    ptr = (class == SECCLASS_PROPERTY) ? propertyTypes : extensionTypes;
+    for (; *ptr; ptr+=2)
+	if (!strcmp(*ptr, name))
+	    break;
+    type = ptr[1];
+
+    /* set the role and type in the context (user unchanged) */
+    if (context_type_set(con, type) ||
+	context_role_set(con, "object_r"))
+	goto out3;
+
+    /* get a context string from the context-manipulation object */
+    new = context_str(con);
+    if (!new)
+	goto out3;
+
+    /* get a SID for the context */
+    if (avc_context_to_sid(new, &sid) < 0)
+	goto out3;
+
+  out3:
+    context_free(con);
+  out2:
+    freecon(base);
+  out:
+    return sid;
+}
+
+/*
+ * AssignClientState - set up client security state.
+ *
+ * Arguments:
+ * client: client to set up (can be serverClient).
+ */
+static void
+AssignClientState(ClientPtr client)
+{
+    int i, needToFree = 0;
+    security_context_t basectx, objctx;
+    XSELinuxClientStateRec *state = (XSELinuxClientStateRec*)STATEPTR(client);
+    Bool isServerClient = FALSE;
+
+    avc_entry_ref_init(&state->aeref);
+
+    if (client->index > 0)
+    {
+	XtransConnInfo ci = ((OsCommPtr)client->osPrivate)->trans_conn;
+	if (_XSERVTransIsLocal(ci)) {
+	    /* for local clients, can get context from the socket */
+	    int fd = _XSERVTransGetConnectionNumber(ci);
+	    if (getpeercon(fd, &basectx) < 0)
+	    {
+		FatalError("Client %d: couldn't get context from socket\n",
+			   client->index);
+	    }
+	    needToFree = 1;
+	}
+        else
+        {
+	    /* for remote clients, need to use a default context */
+	    basectx = XSELinuxNonlocalContextDefault;
+	}
+    }
+    else
+    {
+        isServerClient = TRUE;
+
+	/* use the context of the X server process for the serverClient */
+	if (getcon(&basectx) < 0)
+	{
+	    FatalError("Couldn't get context of X server process\n");
+	}
+	needToFree = 1;
+    }
+
+    /* get a SID from the context */
+    if (avc_context_to_sid(basectx, &state->sid) < 0)
+    {
+	FatalError("Client %d: couldn't get security ID for client\n",
+		   client->index);
+    }
+
+    /* get contexts and then SIDs for each resource type */
+    for (i=0; i<NRES; i++)
+    {
+	if (security_compute_create(basectx, basectx, sClasses[i],
+				    &objctx) < 0)
+	{
+	    FatalError("Client %d: couldn't get context for class %x\n",
+		       client->index, sClasses[i]);
+	}
+	else if (avc_context_to_sid(objctx, &state->rsid[i]) < 0)
+	{
+	    FatalError("Client %d: couldn't get SID for class %x\n",
+		       client->index, sClasses[i]);
+	}
+	freecon(objctx);
+    }
+
+    /* special handling for serverClient windows (that is, root windows) */
+    if (isServerClient == TRUE)
+    {
+        i = IndexByClass(SECCLASS_WINDOW);
+        sidput(state->rsid[i]);
+        if (avc_context_to_sid(XSELinuxRootWindowContext, &state->rsid[i]))
+        {
+            FatalError("Failed to set SID for root window\n");
+        }
+    }
+
+    /* mark as set up, free base context if necessary, and return */
+    state->haveState = TRUE;
+    if (needToFree)
+	freecon(basectx);
+}
+
+/*
+ * FreeClientState - tear down client security state.
+ *
+ * Arguments:
+ * client: client to release (can be serverClient).
+ */
+static void
+FreeClientState(ClientPtr client)
+{
+    int i;
+    XSELinuxClientStateRec *state = (XSELinuxClientStateRec*)STATEPTR(client);
+
+    /* client state may not be set up if its auth was rejected */
+    if (state->haveState) {
+	state = (XSELinuxClientStateRec*)STATEPTR(client);
+	sidput(state->sid);
+	for (i=0; i<NRES; i++)
+	    sidput(state->rsid[i]);
+	state->haveState = FALSE;
+    }
+}
+
+#define REQUEST_SIZE_CHECK(client, req) \
+    (client->req_len >= (sizeof(req) >> 2))
+#define IDPERM(client, req, field, class, perm) \
+    (REQUEST_SIZE_CHECK(client,req) && \
+    IDPerm(client, SwapXID(client,((req*)stuff)->field), class, perm))
+#define CALLBACK(name) static void \
+name(CallbackListPtr *pcbl, pointer nulldata, pointer calldata)
+
+static int
+CheckSendEventPerms(ClientPtr client)
+{
+    register char n;
+    access_vector_t perm = 0;
+    REQUEST(xSendEventReq);
+
+    /* might need type bounds checking here */
+    if (!REQUEST_SIZE_CHECK(client, xSendEventReq))
+	return FALSE;
+
+    switch (stuff->event.u.u.type) {
+	case SelectionClear:
+	case SelectionNotify:
+	case SelectionRequest:
+	case ClientMessage:
+	case PropertyNotify:
+	    perm = WINDOW__CLIENTCOMEVENT;
+	    break;
+	case ButtonPress:
+	case ButtonRelease:
+	case KeyPress:
+	case KeyRelease:
+	case KeymapNotify:
+	case MotionNotify:
+	case EnterNotify:
+	case LeaveNotify:
+	case FocusIn:
+	case FocusOut:
+	    perm = WINDOW__INPUTEVENT;
+	    break;
+	case Expose:
+	case GraphicsExpose:
+	case NoExpose:
+	case VisibilityNotify:
+	    perm = WINDOW__DRAWEVENT;
+	    break;
+	case CirculateNotify:
+	case ConfigureNotify:
+	case CreateNotify:
+	case DestroyNotify:
+	case MapNotify:
+	case UnmapNotify:
+	case GravityNotify:
+	case ReparentNotify:
+	    perm = WINDOW__WINDOWCHANGEEVENT;
+	    break;
+	case CirculateRequest:
+	case ConfigureRequest:
+	case MapRequest:
+	case ResizeRequest:
+	    perm = WINDOW__WINDOWCHANGEREQUEST;
+	    break;
+	case ColormapNotify:
+	case MappingNotify:
+	    perm = WINDOW__SERVERCHANGEEVENT;
+	    break;
+	default:
+	    perm = WINDOW__EXTENSIONEVENT;
+	    break;
+    }
+    if (client->swapped)
+	swapl(&stuff->destination, n);
+    return IDPerm(client, stuff->destination, SECCLASS_WINDOW, perm);
+}
+     
+static int
+CheckConvertSelectionPerms(ClientPtr client)
+{
+    register char n;
+    int rval = TRUE;
+    REQUEST(xConvertSelectionReq);
+    
+    if (!REQUEST_SIZE_CHECK(client, xConvertSelectionReq))
+	return FALSE;
+
+    if (client->swapped)
+    {
+	swapl(&stuff->selection, n);
+	swapl(&stuff->requestor, n);
+    }
+
+    if (ValidAtom(stuff->selection))
+    {
+	int i = 0;
+	while ((i < NumCurrentSelections) &&
+	       CurrentSelections[i].selection != stuff->selection) i++;
+	if (i < NumCurrentSelections)
+	    rval = rval && IDPerm(client, CurrentSelections[i].window,
+				  SECCLASS_WINDOW, WINDOW__CLIENTCOMEVENT);
+    }
+    rval = rval && IDPerm(client, stuff->requestor,
+			  SECCLASS_WINDOW, WINDOW__CLIENTCOMEVENT);
+    return rval;
+}
+
+static int
+CheckSetSelectionOwnerPerms(ClientPtr client)
+{
+    register char n;
+    int rval = TRUE;
+    REQUEST(xSetSelectionOwnerReq);
+
+    if (!REQUEST_SIZE_CHECK(client, xSetSelectionOwnerReq))
+	return FALSE;
+
+    if (client->swapped)
+    {
+	swapl(&stuff->selection, n);
+	swapl(&stuff->window, n);
+    }
+
+    if (ValidAtom(stuff->selection))
+    {
+	int i = 0;
+	while ((i < NumCurrentSelections) &&
+	       CurrentSelections[i].selection != stuff->selection) i++;
+	if (i < NumCurrentSelections)
+	    rval = rval && IDPerm(client, CurrentSelections[i].window,
+				  SECCLASS_WINDOW, WINDOW__CHSELECTION);
+    }
+    rval = rval && IDPerm(client, stuff->window, 
+			  SECCLASS_WINDOW, WINDOW__CHSELECTION);
+    return rval;
+}
+    
+CALLBACK(XSELinuxCoreDispatch)
+{
+    XaceCoreDispatchRec *rec = (XaceCoreDispatchRec*)calldata;
+    ClientPtr client = rec->client;
+    REQUEST(xReq);
+    Bool rval;
+
+    switch(stuff->reqType) {
+    /* Drawable class control requirements */
+    case X_ClearArea:
+	rval = IDPERM(client, xClearAreaReq, window,
+		      SECCLASS_DRAWABLE, DRAWABLE__DRAW);
+	break;
+    case X_PolySegment:
+    case X_PolyRectangle:
+    case X_PolyArc:
+    case X_PolyFillRectangle:
+    case X_PolyFillArc:
+	rval = IDPERM(client, xPolySegmentReq, drawable,
+		      SECCLASS_DRAWABLE, DRAWABLE__DRAW);
+	break;
+    case X_PolyPoint:
+    case X_PolyLine:
+	rval = IDPERM(client, xPolyPointReq, drawable,
+		      SECCLASS_DRAWABLE, DRAWABLE__DRAW);
+	break;
+    case X_FillPoly:
+	rval = IDPERM(client, xFillPolyReq, drawable,
+		      SECCLASS_DRAWABLE, DRAWABLE__DRAW);
+	break;
+    case X_PutImage:
+	rval = IDPERM(client, xPutImageReq, drawable,
+		      SECCLASS_DRAWABLE, DRAWABLE__DRAW);
+	break;
+    case X_CopyArea:
+    case X_CopyPlane:
+	rval = IDPERM(client, xCopyAreaReq, srcDrawable,
+		      SECCLASS_DRAWABLE, DRAWABLE__COPY)
+	    && IDPERM(client, xCopyAreaReq, dstDrawable,
+		      SECCLASS_DRAWABLE, DRAWABLE__DRAW);
+	break;
+    case X_GetImage:
+	rval = IDPERM(client, xGetImageReq, drawable,
+		      SECCLASS_DRAWABLE, DRAWABLE__COPY);
+	break;
+    case X_GetGeometry:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_DRAWABLE, DRAWABLE__GETATTR);
+	break;
+
+    /* Window class control requirements */
+    case X_ChangeProperty:
+	rval = IDPERM(client, xChangePropertyReq, window,
+		      SECCLASS_WINDOW, 
+		      WINDOW__CHPROPLIST | WINDOW__CHPROP |
+		      WINDOW__LISTPROP);
+	break;
+    case X_ChangeSaveSet:
+	rval = IDPERM(client, xChangeSaveSetReq, window,
+		      SECCLASS_WINDOW,
+		      WINDOW__CTRLLIFE | WINDOW__CHPARENT);
+	break;
+    case X_ChangeWindowAttributes:
+	rval = IDPERM(client, xChangeWindowAttributesReq, window,
+		      SECCLASS_WINDOW, WINDOW__SETATTR);
+	break;
+    case X_CirculateWindow:
+	rval = IDPERM(client, xCirculateWindowReq, window,
+		      SECCLASS_WINDOW, WINDOW__CHSTACK);
+	break;
+    case X_ConfigureWindow:
+	rval = IDPERM(client, xConfigureWindowReq, window,
+		      SECCLASS_WINDOW,
+		      WINDOW__SETATTR | WINDOW__MOVE | WINDOW__CHSTACK);
+	break;
+    case X_ConvertSelection:
+	rval = CheckConvertSelectionPerms(client);
+	break;
+    case X_CreateWindow:
+	rval = IDPERM(client, xCreateWindowReq, wid,
+		      SECCLASS_WINDOW,
+		      WINDOW__CREATE | WINDOW__SETATTR | WINDOW__MOVE)
+	    && IDPERM(client, xCreateWindowReq, parent,
+		      SECCLASS_WINDOW,
+		      WINDOW__CHSTACK | WINDOW__ADDCHILD)
+	    && IDPERM(client, xCreateWindowReq, wid,
+		      SECCLASS_DRAWABLE, DRAWABLE__CREATE);
+	break;
+    case X_DeleteProperty:
+	rval = IDPERM(client, xDeletePropertyReq, window,
+		      SECCLASS_WINDOW,
+		      WINDOW__CHPROP | WINDOW__CHPROPLIST);
+	break;
+    case X_DestroyWindow:
+    case X_DestroySubwindows:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_WINDOW,
+		      WINDOW__ENUMERATE | WINDOW__UNMAP | WINDOW__DESTROY)
+	    && IDPERM(client, xResourceReq, id,
+		      SECCLASS_DRAWABLE, DRAWABLE__DESTROY);
+	break;
+    case X_GetMotionEvents:
+	rval = IDPERM(client, xGetMotionEventsReq, window,
+		      SECCLASS_WINDOW, WINDOW__MOUSEMOTION);
+	break;
+    case X_GetProperty:
+	rval = IDPERM(client, xGetPropertyReq, window,
+		      SECCLASS_WINDOW, WINDOW__LISTPROP);
+	break;
+    case X_GetWindowAttributes:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_WINDOW, WINDOW__GETATTR);
+	break;
+    case X_KillClient:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_XCLIENT, XCLIENT__KILL);
+	break;
+    case X_ListProperties:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_WINDOW, WINDOW__LISTPROP);
+	break;
+    case X_MapWindow:
+    case X_MapSubwindows:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_WINDOW,
+		      WINDOW__ENUMERATE | WINDOW__GETATTR | WINDOW__MAP);
+	break;
+    case X_QueryTree:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_WINDOW, WINDOW__ENUMERATE | WINDOW__GETATTR);
+	break;
+    case X_RotateProperties:
+	rval = IDPERM(client, xRotatePropertiesReq, window,
+		      SECCLASS_WINDOW, WINDOW__CHPROP | WINDOW__CHPROPLIST);
+	break;
+    case X_ReparentWindow:
+	rval = IDPERM(client, xReparentWindowReq, window,
+		      SECCLASS_WINDOW, WINDOW__CHPARENT | WINDOW__MOVE)
+	    && IDPERM(client, xReparentWindowReq, parent,
+		      SECCLASS_WINDOW, WINDOW__CHSTACK | WINDOW__ADDCHILD);
+	break;
+    case X_SendEvent:
+	rval = CheckSendEventPerms(client);
+	break;
+    case X_SetInputFocus:
+	rval = IDPERM(client, xSetInputFocusReq, focus,
+		      SECCLASS_WINDOW, WINDOW__SETFOCUS)
+	    && ServerPerm(client, SECCLASS_XINPUT, XINPUT__SETFOCUS);
+	break;
+    case X_SetSelectionOwner:
+	rval = CheckSetSelectionOwnerPerms(client);
+	break;
+    case X_TranslateCoords:
+	rval = IDPERM(client, xTranslateCoordsReq, srcWid,
+		      SECCLASS_WINDOW, WINDOW__GETATTR)
+	    && IDPERM(client, xTranslateCoordsReq, dstWid,
+		      SECCLASS_WINDOW, WINDOW__GETATTR);
+	break;
+    case X_UnmapWindow:
+    case X_UnmapSubwindows:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_WINDOW,
+		      WINDOW__ENUMERATE | WINDOW__GETATTR |
+		      WINDOW__UNMAP);
+	break;
+    case X_WarpPointer:
+	rval = IDPERM(client, xWarpPointerReq, srcWid,
+		      SECCLASS_WINDOW, WINDOW__GETATTR)
+	    && IDPERM(client, xWarpPointerReq, dstWid,
+		      SECCLASS_WINDOW, WINDOW__GETATTR)
+	    && ServerPerm(client, SECCLASS_XINPUT, XINPUT__WARPPOINTER);
+	break;
+
+    /* Input class control requirements */
+    case X_GrabButton:
+    case X_GrabKey:
+	rval = ServerPerm(client, SECCLASS_XINPUT, XINPUT__PASSIVEGRAB);
+	break;
+    case X_GrabKeyboard:
+    case X_GrabPointer:
+    case X_ChangeActivePointerGrab:
+	rval = ServerPerm(client, SECCLASS_XINPUT, XINPUT__ACTIVEGRAB);
+	break;
+    case X_AllowEvents:
+    case X_UngrabButton:
+    case X_UngrabKey:
+    case X_UngrabKeyboard:
+    case X_UngrabPointer:
+	rval = ServerPerm(client, SECCLASS_XINPUT, XINPUT__UNGRAB);
+	break;
+    case X_GetKeyboardControl:
+    case X_GetKeyboardMapping:
+    case X_GetPointerControl:
+    case X_GetPointerMapping:
+    case X_GetModifierMapping:
+    case X_QueryKeymap:
+    case X_QueryPointer:
+	rval = ServerPerm(client, SECCLASS_XINPUT, XINPUT__GETATTR);
+	break;
+    case X_ChangeKeyboardControl:
+    case X_ChangePointerControl:
+    case X_ChangeKeyboardMapping:
+    case X_SetModifierMapping:
+    case X_SetPointerMapping:
+	rval = ServerPerm(client, SECCLASS_XINPUT, XINPUT__SETATTR);
+	break;
+    case X_Bell:
+	rval = ServerPerm(client, SECCLASS_XINPUT, XINPUT__BELL);
+	break;
+
+    /* Colormap class control requirements */
+    case X_AllocColor:
+    case X_AllocColorCells:
+    case X_AllocColorPlanes:
+    case X_AllocNamedColor:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_COLORMAP,
+		      COLORMAP__READ | COLORMAP__STORE);
+	break;
+    case X_CopyColormapAndFree:
+	rval = IDPERM(client, xCopyColormapAndFreeReq, mid,
+		      SECCLASS_COLORMAP, COLORMAP__CREATE)
+	    && IDPERM(client, xCopyColormapAndFreeReq, srcCmap,
+		      SECCLASS_COLORMAP,
+		      COLORMAP__READ | COLORMAP__FREE);
+	break;
+    case X_CreateColormap:
+	rval = IDPERM(client, xCreateColormapReq, mid,
+		      SECCLASS_COLORMAP, COLORMAP__CREATE)
+	    && IDPERM(client, xCreateColormapReq, window,
+		      SECCLASS_DRAWABLE, DRAWABLE__DRAW);
+	break;
+    case X_FreeColormap:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_COLORMAP, COLORMAP__FREE);
+	break;
+    case X_FreeColors:
+	rval = IDPERM(client, xFreeColorsReq, cmap,
+		      SECCLASS_COLORMAP, COLORMAP__STORE);
+	break;
+    case X_InstallColormap:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_COLORMAP, COLORMAP__INSTALL)
+	    && ServerPerm(client, SECCLASS_COLORMAP, COLORMAP__INSTALL);
+	break;
+    case X_ListInstalledColormaps:
+	rval = ServerPerm(client, SECCLASS_COLORMAP, COLORMAP__LIST);
+	break;
+    case X_LookupColor:
+    case X_QueryColors:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_COLORMAP, COLORMAP__READ);
+	break;
+    case X_StoreColors:
+    case X_StoreNamedColor:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_COLORMAP, COLORMAP__STORE);
+	break;
+    case X_UninstallColormap:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_COLORMAP, COLORMAP__UNINSTALL)
+	    && ServerPerm(client, SECCLASS_COLORMAP, COLORMAP__UNINSTALL);
+	break;
+
+    /* Font class control requirements */
+    case X_CloseFont:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_FONT, FONT__FREE);
+	break;
+    case X_ImageText8:
+    case X_ImageText16:
+	/* Font accesses checked through the resource manager */
+	rval = IDPERM(client, xImageTextReq, drawable,
+		      SECCLASS_DRAWABLE, DRAWABLE__DRAW);
+	break;
+    case X_OpenFont:
+	rval = ServerPerm(client, SECCLASS_FONT, FONT__LOAD)
+	    && IDPERM(client, xOpenFontReq, fid,
+		      SECCLASS_FONT, FONT__USE);
+	break;
+    case X_PolyText8:
+    case X_PolyText16:
+	/* Font accesses checked through the resource manager */
+	rval = ServerPerm(client, SECCLASS_FONT, FONT__LOAD)
+	    && IDPERM(client, xPolyTextReq, gc,
+		      SECCLASS_GC, GC__SETATTR)
+	    && IDPERM(client, xPolyTextReq, drawable,
+		      SECCLASS_DRAWABLE, DRAWABLE__DRAW);
+	break;
+	
+    /* Pixmap class control requirements */
+    case X_CreatePixmap:
+	rval = IDPERM(client, xCreatePixmapReq, pid,
+		      SECCLASS_DRAWABLE, DRAWABLE__CREATE);
+	break;
+    case X_FreePixmap:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_DRAWABLE, DRAWABLE__DESTROY);
+	break;
+
+    /* Cursor class control requirements */
+    case X_CreateCursor:
+	rval = IDPERM(client, xCreateCursorReq, cid,
+		      SECCLASS_CURSOR, CURSOR__CREATE)
+	    && IDPERM(client, xCreateCursorReq, source,
+		      SECCLASS_DRAWABLE, DRAWABLE__DRAW)
+	    && IDPERM(client, xCreateCursorReq, mask,
+		      SECCLASS_DRAWABLE, DRAWABLE__COPY);
+	break;
+    case X_CreateGlyphCursor:
+	rval = IDPERM(client, xCreateGlyphCursorReq, cid,
+		      SECCLASS_CURSOR, CURSOR__CREATEGLYPH)
+	    && IDPERM(client, xCreateGlyphCursorReq, source,
+		      SECCLASS_FONT, FONT__USE)
+	    && IDPERM(client, xCreateGlyphCursorReq, mask,
+		      SECCLASS_FONT, FONT__USE);
+	break;
+    case X_RecolorCursor:
+	rval = IDPERM(client, xRecolorCursorReq, cursor,
+		      SECCLASS_CURSOR, CURSOR__SETATTR);
+	break;
+    case X_FreeCursor:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_CURSOR, CURSOR__FREE);
+	break;
+	    
+    /* GC class control requirements */
+    case X_CreateGC:
+	rval = IDPERM(client, xCreateGCReq, gc,
+		      SECCLASS_GC, GC__CREATE | GC__SETATTR);
+	break;
+    case X_ChangeGC:
+    case X_SetDashes:
+    case X_SetClipRectangles:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_GC, GC__SETATTR);
+	break;
+    case X_CopyGC:
+	rval = IDPERM(client, xCopyGCReq, srcGC,
+		      SECCLASS_GC, GC__GETATTR)
+	    && IDPERM(client, xCopyGCReq, dstGC,
+		      SECCLASS_GC, GC__SETATTR);
+	break;
+    case X_FreeGC:
+	rval = IDPERM(client, xResourceReq, id,
+		      SECCLASS_GC, GC__FREE);
+	break;
+
+    /* Server class control requirements */
+    case X_GrabServer:
+	rval = ServerPerm(client, SECCLASS_XSERVER, XSERVER__GRAB);
+	break;
+    case X_UngrabServer:
+	rval = ServerPerm(client, SECCLASS_XSERVER, XSERVER__UNGRAB);
+	break;
+    case X_ForceScreenSaver:
+    case X_GetScreenSaver:
+    case X_SetScreenSaver:
+	rval = ServerPerm(client, SECCLASS_XSERVER, XSERVER__SCREENSAVER);
+	break;
+    case X_ListHosts:
+	rval = ServerPerm(client, SECCLASS_XSERVER, XSERVER__GETHOSTLIST);
+	break;
+    case X_ChangeHosts:
+    case X_SetAccessControl:
+	rval = ServerPerm(client, SECCLASS_XSERVER, XSERVER__SETHOSTLIST);
+	break;
+    case X_GetFontPath:
+	rval = ServerPerm(client, SECCLASS_XSERVER, XSERVER__GETFONTPATH);
+	break;
+    case X_SetFontPath:
+	rval = ServerPerm(client, SECCLASS_XSERVER, XSERVER__SETFONTPATH);
+	break;
+    case X_QueryBestSize:
+	rval = ServerPerm(client, SECCLASS_XSERVER, XSERVER__GETATTR);
+	break;
+
+    default:
+	rval = TRUE;
+	break;
+    }
+    if (!rval)
+	rec->rval = FALSE;
+}
+
+CALLBACK(XSELinuxExtDispatch)
+{
+    XaceExtAccessRec *rec = (XaceExtAccessRec*)calldata;
+    ClientPtr client = rec->client;
+    ExtensionEntry *ext = rec->ext;
+    security_id_t extsid;
+    access_vector_t perm;
+    REQUEST(xReq);
+    
+    /* XXX there should be a separate callback for this */
+    if (!EXTENSIONSID(ext))
+    {
+	extsid = ObjectSIDByLabel(NULL, SECCLASS_XEXTENSION, ext->name);
+	if (!extsid)
+	    return;
+	EXTENSIONSID(ext) = extsid;
+    }
+
+    extsid = (security_id_t)EXTENSIONSID(ext);
+    perm = ((stuff->reqType == X_QueryExtension) ||
+	    (stuff->reqType == X_ListExtensions)) ?
+	XEXTENSION__QUERY : XEXTENSION__USE;
+
+    if (HAVESTATE(client))
+    {
+	XSELinuxAuditRec auditdata;
+	auditdata.client = client;
+	auditdata.property = NULL;
+	auditdata.extension = ext->name;
+	errno = 0;
+	if (avc_has_perm(SID(client), extsid, SECCLASS_XEXTENSION,
+			 perm, &AEREF(client), &auditdata) < 0)
+	{
+	    if (errno != EACCES)
+		ErrorF("ExtDispatch: unexpected error %d\n", errno);
+	    rec->rval = FALSE;
+	}
+    } else
+	ErrorF("No client state in extension dispatcher!\n");
+} /* XSELinuxExtDispatch */
+
+CALLBACK(XSELinuxProperty)
+{
+    XacePropertyAccessRec *rec = (XacePropertyAccessRec*)calldata;
+    WindowPtr pWin = rec->pWin;
+    ClientPtr client = rec->client;
+    ClientPtr tclient;
+    access_vector_t perm = 0;
+    security_id_t propsid;
+    char *propname = NameForAtom(rec->propertyName);
+
+    tclient = wClient(pWin);
+    if (!tclient || !HAVESTATE(tclient))
+        return;
+
+    propsid = ObjectSIDByLabel(SID(tclient)->ctx, SECCLASS_PROPERTY, propname);
+    if (!propsid)
+	return;
+
+    if (rec->access_mode & SecurityReadAccess)
+	perm |= PROPERTY__READ;
+    if (rec->access_mode & SecurityWriteAccess)
+	perm |= PROPERTY__WRITE;
+    if (rec->access_mode & SecurityDestroyAccess)
+	perm |= PROPERTY__FREE;
+    if (!rec->access_mode)
+	perm = PROPERTY__READ | PROPERTY__WRITE | PROPERTY__FREE;
+
+    if (HAVESTATE(client))
+    {
+	XSELinuxAuditRec auditdata;
+	auditdata.client = client;
+	auditdata.property = propname;
+	auditdata.extension = NULL;
+	errno = 0;
+	if (avc_has_perm(SID(client), propsid, SECCLASS_PROPERTY,
+			 perm, &AEREF(client), &auditdata) < 0)
+	{
+	    if (errno != EACCES)
+		ErrorF("Property: unexpected error %d\n", errno);
+	    rec->rval = SecurityIgnoreOperation;
+	}
+    } else
+	ErrorF("No client state in property callback!\n");
+
+    /* XXX this should be saved in the property structure */
+    sidput(propsid);
+} /* XSELinuxProperty */
+
+CALLBACK(XSELinuxResLookup)
+{
+    XaceResourceAccessRec *rec = (XaceResourceAccessRec*)calldata;
+    ClientPtr client = rec->client;
+    REQUEST(xReq);
+    access_vector_t perm = 0;
+    Bool rval = TRUE;
+
+    /* serverClient requests OK */
+    if (client->index == 0)
+	return;
+
+    switch(rec->rtype) {
+	case RT_FONT: {
+	    switch(stuff->reqType) {
+		case X_ImageText8:
+		case X_ImageText16:
+		case X_PolyText8:
+		case X_PolyText16:
+		    perm = FONT__USE;
+		    break;
+		case X_ListFonts:
+		case X_ListFontsWithInfo:
+		case X_QueryFont:
+		case X_QueryTextExtents:
+		    perm = FONT__GETATTR;
+		    break;
+		default:
+		    break;
+	    }
+	    if (perm)
+		rval = IDPerm(client, rec->id, SECCLASS_FONT, perm);
+	    break;
+	}
+	default:
+	    break;
+    }
+    if (!rval)
+	rec->rval = FALSE;
+} /* XSELinuxResLookup */
+
+CALLBACK(XSELinuxMap)
+{
+    XaceMapAccessRec *rec = (XaceMapAccessRec*)calldata;
+    if (!IDPerm(rec->client, rec->pWin->drawable.id,
+		SECCLASS_WINDOW, WINDOW__MAP))
+	rec->rval = FALSE;
+} /* XSELinuxMap */
+
+CALLBACK(XSELinuxBackgrnd)
+{
+    XaceMapAccessRec *rec = (XaceMapAccessRec*)calldata;
+    if (!IDPerm(rec->client, rec->pWin->drawable.id,
+		SECCLASS_WINDOW, WINDOW__TRANSPARENT))
+	rec->rval = FALSE;
+} /* XSELinuxBackgrnd */
+
+CALLBACK(XSELinuxDrawable)
+{
+    XaceDrawableAccessRec *rec = (XaceDrawableAccessRec*)calldata;
+    if (!IDPerm(rec->client, rec->pDraw->id,
+		SECCLASS_DRAWABLE, DRAWABLE__COPY))
+	rec->rval = FALSE;
+} /* XSELinuxDrawable */
+
+CALLBACK(XSELinuxHostlist)
+{
+    XaceHostlistAccessRec *rec = (XaceHostlistAccessRec*)calldata;
+    access_vector_t perm = (rec->access_mode == SecurityReadAccess) ?
+	XSERVER__GETHOSTLIST : XSERVER__SETHOSTLIST;
+
+    if (!ServerPerm(rec->client, SECCLASS_XSERVER, perm))
+	rec->rval = FALSE;
+} /* XSELinuxHostlist */
+
+/* Extension callbacks */
+CALLBACK(XSELinuxClientState)
+{
+    NewClientInfoRec *pci = (NewClientInfoRec *)calldata;
+    ClientPtr client = pci->client;
+
+    switch(client->clientState)
+    {
+    case ClientStateInitial:
+	AssignClientState(serverClient);
+	break;
+
+	case ClientStateRunning:
+	{
+	    AssignClientState(client);
+	    break;
+	}
+	case ClientStateGone:
+	case ClientStateRetained:
+	{
+	    FreeClientState(client);
+	    break;
+	}
+	default: break;
+    }
+} /* XSELinuxClientState */
+
+static char *XSELinuxKeywords[] = {
+#define XSELinuxKeywordComment 0
+    "#",
+#define XSELinuxKeywordProperty 1
+    "property",
+#define XSELinuxKeywordExtension 2
+    "extension",
+#define XSELinuxKeywordNonlocalContext 3
+    "nonlocal_context",
+#define XSELinuxKeywordRootWindowContext 4
+    "root_window_context",
+#define XSELinuxKeywordDefault 5
+    "default"
+};
+
+#define NUMKEYWORDS (sizeof(XSELinuxKeywords) / sizeof(char *))
+
+#ifndef __UNIXOS2__
+#define XSELinuxIsWhitespace(c) ( (c == ' ') || (c == '\t') || (c == '\n') )
+#else
+#define XSELinuxIsWhitespace(c) ( (c == ' ') || (c == '\t') || (c == '\n') || (c == '\r') )
+#endif
+
+static char *
+XSELinuxSkipWhitespace(
+    char *p)
+{
+    while (XSELinuxIsWhitespace(*p))
+	p++;
+    return p;
+} /* XSELinuxSkipWhitespace */
+
+static char *
+XSELinuxParseString(
+    char **rest)
+{
+    char *startOfString;
+    char *s = *rest;
+    char endChar = 0;
+
+    s = XSELinuxSkipWhitespace(s);
+
+    if (*s == '"' || *s == '\'')
+    {
+	endChar = *s++;
+	startOfString = s;
+	while (*s && (*s != endChar))
+	    s++;
+    }
+    else
+    {
+	startOfString = s;
+	while (*s && !XSELinuxIsWhitespace(*s))
+	    s++;
+    }
+    if (*s)
+    {
+	*s = '\0';
+	*rest = s + 1;
+	return startOfString;
+    }
+    else
+    {
+	*rest = s;
+	return (endChar) ? NULL : startOfString;
+    }
+} /* XSELinuxParseString */
+
+static int
+XSELinuxParseKeyword(
+    char **p)
+{
+    int i;
+    char *s = *p;
+    s = XSELinuxSkipWhitespace(s);
+    for (i = 0; i < NUMKEYWORDS; i++)
+    {
+	int len = strlen(XSELinuxKeywords[i]);
+	if (strncmp(s, XSELinuxKeywords[i], len) == 0)
+	{
+	    *p = s + len;
+	    return (i);
+	}
+    }
+    *p = s;
+    return -1;
+} /* XSELinuxParseKeyword */
+
+static Bool
+XSELinuxTypeIsValid(char *typename)
+{
+    security_context_t base, new;
+    context_t con;
+    Bool ret = FALSE;
+
+    /* get the server's context */
+    if (getcon(&base) < 0)
+        goto out;
+
+    /* make a new context-manipulation object */
+    con = context_new(base);
+    if (!con)
+        goto out_free;
+
+    /* set the role */
+    if (context_role_set(con, "object_r"))
+        goto out_free2;
+
+    /* set the type */
+    if (context_type_set(con, typename))
+        goto out_free2;
+
+    /* get a context string - note: context_str() returns a pointer
+     * to the string inside the context; the returned pointer should
+     * not be freed
+     */
+    new = context_str(con);
+    if (!new)
+        goto out_free2;
+
+    /* finally, check to see if it's valid */
+    if (security_check_context(new) == 0)
+        ret = TRUE;
+
+out_free2:
+    context_free(con);
+out_free:
+    freecon(base);
+out:
+    return ret;
+}
+
+static Bool
+XSELinuxParsePropertyTypeRule(char *p)
+{
+    int keyword;
+    char *propname = NULL, *propcopy = NULL;
+    char *typename = NULL, *typecopy = NULL;
+    char **newTypes;
+    Bool defaultPropertyType = FALSE;
+
+    /* get property name */
+    keyword = XSELinuxParseKeyword(&p);
+    if (keyword == XSELinuxKeywordDefault)
+    {
+        defaultPropertyType = TRUE;
+    }
+    else
+    {
+        propname = XSELinuxParseString(&p);
+        if (!propname || (strlen(propname) == 0))
+        {
+            return FALSE;
+        }
+    }
+
+    /* get the SELinux type corresponding to the property */
+    typename = XSELinuxParseString(&p);
+    if (!typename || (strlen(typename) == 0))
+        return FALSE;
+
+    /* validate the type */
+    if (XSELinuxTypeIsValid(typename) != TRUE)
+        return FALSE;
+
+    /* if it's the default property, save it to append to the end of the
+     * property types list
+     */
+    if (defaultPropertyType == TRUE)
+    {
+        if (XSELinuxPropertyTypeDefault != NULL)
+        {
+            return FALSE;
+        }
+        else
+        {
+            XSELinuxPropertyTypeDefault = (char *)xalloc(strlen(typename)+1);
+            if (!XSELinuxPropertyTypeDefault)
+            {
+                ErrorF("XSELinux: out of memory\n");
+                return FALSE;
+            }
+            strcpy(XSELinuxPropertyTypeDefault, typename);
+            return TRUE;
+        }
+    }
+
+    /* insert the property and type into the propertyTypes array */
+    propcopy = (char *)xalloc(strlen(propname)+1);
+    if (!propcopy)
+    {
+        ErrorF("XSELinux: out of memory\n");
+        return FALSE;
+    }
+    strcpy(propcopy, propname);
+
+    typecopy = (char *)xalloc(strlen(typename)+1);
+    if (!typecopy)
+    {
+        ErrorF("XSELinux: out of memory\n");
+        xfree(propcopy);
+        return FALSE;
+    }
+    strcpy(typecopy, typename);
+
+    newTypes = (char **)xrealloc(propertyTypes, sizeof (char *) * ((propertyTypesCount+1) * 2));
+    if (!newTypes)
+    {
+        ErrorF("XSELinux: out of memory\n");
+        xfree(propcopy);
+        xfree(typecopy);
+        return FALSE;
+    }
+
+    propertyTypesCount++;
+
+    newTypes[propertyTypesCount*2 - 2] = propcopy;
+    newTypes[propertyTypesCount*2 - 1] = typecopy;
+    
+    propertyTypes = newTypes;
+
+    return TRUE;
+} /* XSELinuxParsePropertyTypeRule */
+
+static Bool
+XSELinuxParseExtensionTypeRule(char *p)
+{
+    int keyword;
+    char *extname = NULL, *extcopy = NULL;
+    char *typename = NULL, *typecopy = NULL;
+    char **newTypes;
+    Bool defaultExtensionType = FALSE;
+
+    /* get extension name */
+    keyword = XSELinuxParseKeyword(&p);
+    if (keyword == XSELinuxKeywordDefault)
+    {
+        defaultExtensionType = TRUE;
+    }
+    else
+    {
+        extname = XSELinuxParseString(&p);
+        if (!extname || (strlen(extname) == 0))
+        {
+            return FALSE;
+        }
+    }
+
+    /* get the SELinux type corresponding to the extension */
+    typename = XSELinuxParseString(&p);
+    if (!typename || (strlen(typename) == 0))
+        return FALSE;
+
+    /* validate the type */
+    if (XSELinuxTypeIsValid(typename) != TRUE)
+        return FALSE;
+
+    /* if it's the default extension, save it to append to the end of the
+     * extension types list
+     */
+    if (defaultExtensionType == TRUE)
+    {
+        if (XSELinuxExtensionTypeDefault != NULL)
+        {
+            return FALSE;
+        }
+        else
+        {
+            XSELinuxExtensionTypeDefault = (char *)xalloc(strlen(typename)+1);
+            if (!XSELinuxExtensionTypeDefault)
+            {
+                ErrorF("XSELinux: out of memory\n");
+                return FALSE;
+            }
+            strcpy(XSELinuxExtensionTypeDefault, typename);
+            return TRUE;
+        }
+    }
+
+    /* insert the extension and type into the extensionTypes array */
+    extcopy = (char *)xalloc(strlen(extname)+1);
+    if (!extcopy)
+    {
+        ErrorF("XSELinux: out of memory\n");
+        return FALSE;
+    }
+    strcpy(extcopy, extname);
+
+    typecopy = (char *)xalloc(strlen(typename)+1);
+    if (!typecopy)
+    {
+        ErrorF("XSELinux: out of memory\n");
+        xfree(extcopy);
+        return FALSE;
+    }
+    strcpy(typecopy, typename);
+
+    newTypes = (char **)xrealloc(extensionTypes, sizeof(char *) *( (extensionTypesCount+1) * 2));
+    if (!newTypes)
+    {
+        ErrorF("XSELinux: out of memory\n");
+        xfree(extcopy);
+        xfree(typecopy);
+        return FALSE;
+    }
+
+    extensionTypesCount++;
+
+    newTypes[extensionTypesCount*2 - 2] = extcopy;
+    newTypes[extensionTypesCount*2 - 1] = typecopy;
+
+    extensionTypes = newTypes;
+
+    return TRUE;
+} /* XSELinuxParseExtensionTypeRule */
+
+static Bool
+XSELinuxParseNonlocalContext(char *p)
+{
+    char *context;
+
+    context = XSELinuxParseString(&p);
+    if (!context || (strlen(context) == 0))
+    {
+        return FALSE;
+    }
+
+    if (XSELinuxNonlocalContextDefault != NULL)
+    {
+        return FALSE;
+    }
+
+    /* validate the context */
+    if (security_check_context(context))
+    {
+        return FALSE;
+    }
+
+    XSELinuxNonlocalContextDefault = (char *)xalloc(strlen(context)+1);
+    if (!XSELinuxNonlocalContextDefault)
+    {
+        ErrorF("XSELinux: out of memory\n");
+        return FALSE;
+    }
+    strcpy(XSELinuxNonlocalContextDefault, context);
+
+    return TRUE;
+} /* XSELinuxParseNonlocalContext */
+
+static Bool
+XSELinuxParseRootWindowContext(char *p)
+{
+    char *context;
+
+    context = XSELinuxParseString(&p);
+    if (!context || (strlen(context) == 0))
+    {
+        return FALSE;
+    }
+
+    if (XSELinuxRootWindowContext != NULL)
+    {
+        return FALSE;
+    }
+
+    /* validate the context */
+    if (security_check_context(context))
+    {
+        return FALSE;
+    }
+
+    XSELinuxRootWindowContext = (char *)xalloc(strlen(context)+1);
+    if (!XSELinuxRootWindowContext)
+    {
+        ErrorF("XSELinux: out of memory\n");
+        return FALSE;
+    }
+    strcpy(XSELinuxRootWindowContext, context);
+
+    return TRUE;
+} /* XSELinuxParseRootWindowContext */
+
+static Bool
+XSELinuxLoadConfigFile(void)
+{
+    FILE *f;
+    int lineNumber = 0;
+    char **newTypes;
+    Bool ret = FALSE;
+    
+    if (!XSELINUXCONFIGFILE)
+        return FALSE;
+
+    /* some initial bookkeeping */
+    propertyTypesCount = extensionTypesCount = 0;
+    propertyTypes = extensionTypes = NULL;
+    XSELinuxPropertyTypeDefault = XSELinuxExtensionTypeDefault = NULL;
+    XSELinuxNonlocalContextDefault = NULL;
+    XSELinuxRootWindowContext = NULL;
+
+#ifndef __UNIXOS2__
+    f = fopen(XSELINUXCONFIGFILE, "r");
+#else
+    f = fopen((char*)__XOS2RedirRoot(XSELINUXCONFIGFILE), "r");
+#endif
+    if (!f)
+    {
+        ErrorF("Error opening XSELinux policy file %s\n", XSELINUXCONFIGFILE);
+        return FALSE;
+    }
+
+    while (!feof(f))
+    {
+        char buf[200];
+        Bool validLine;
+        char *p;
+
+        if (!(p = fgets(buf, sizeof(buf), f)))
+            break;
+        lineNumber++;
+
+        switch (XSELinuxParseKeyword(&p))
+        {
+            case XSELinuxKeywordComment:
+                validLine = TRUE;
+                break;
+
+            case XSELinuxKeywordProperty:
+                validLine = XSELinuxParsePropertyTypeRule(p);
+                break;
+
+            case XSELinuxKeywordExtension:
+                validLine = XSELinuxParseExtensionTypeRule(p);
+                break;
+
+            case XSELinuxKeywordNonlocalContext:
+                validLine = XSELinuxParseNonlocalContext(p);
+                break;
+
+            case XSELinuxKeywordRootWindowContext:
+                validLine = XSELinuxParseRootWindowContext(p);
+                break;
+
+            default:
+                validLine = (*p == '\0');
+                break;
+        }
+
+        if (!validLine)
+        {
+            ErrorF("XSELinux: Line %d of %s is invalid\n",
+                   lineNumber, XSELINUXCONFIGFILE);
+            goto out;
+        }
+    }
+
+    /* check to make sure the default types and the nonlocal context
+     * were specified
+     */
+    if (XSELinuxPropertyTypeDefault == NULL)
+    {
+        ErrorF("XSELinux: No default property type specified\n");
+        goto out;
+    }
+    else if (XSELinuxExtensionTypeDefault == NULL)
+    {
+        ErrorF("XSELinux: No default extension type specified\n");
+        goto out;
+    }
+    else if (XSELinuxNonlocalContextDefault == NULL)
+    {
+        ErrorF("XSELinux: No default context for non-local clients specified\n");
+        goto out;
+    }
+    else if (XSELinuxRootWindowContext == NULL)
+    {
+        ErrorF("XSELinux: No context specified for the root window\n");
+        goto out;
+    }
+
+    /* Finally, append the default property and extension types to the
+     * bottoms of the propertyTypes and extensionTypes arrays, respectively.
+     * The 'name' of the property / extension is NULL.
+     */
+    newTypes = (char **)xrealloc(propertyTypes, sizeof(char *) *((propertyTypesCount+1) * 2));
+    if (!newTypes)
+    {
+        ErrorF("XSELinux: out of memory\n");
+        goto out;
+    }
+    propertyTypesCount++;
+    newTypes[propertyTypesCount*2 - 2] = NULL;
+    newTypes[propertyTypesCount*2 - 1] = XSELinuxPropertyTypeDefault;
+    propertyTypes = newTypes;
+
+    newTypes = (char **)xrealloc(extensionTypes, sizeof(char *) *((extensionTypesCount+1) * 2));
+    if (!newTypes)
+    {
+        ErrorF("XSELinux: out of memory\n");
+        goto out;
+    }
+    extensionTypesCount++;
+    newTypes[extensionTypesCount*2 - 2] = NULL;
+    newTypes[extensionTypesCount*2 - 1] = XSELinuxExtensionTypeDefault;
+    extensionTypes = newTypes;
+
+    ret = TRUE;
+
+out:
+    fclose(f);
+    return ret;
+} /* XSELinuxLoadConfigFile */
+
+static void
+XSELinuxFreeConfigData(void)
+{
+    char **ptr;
+
+    /* Free all the memory in the table until we reach the NULL, then
+     * skip one past the NULL and free the default type.  Then take care
+     * of some bookkeeping.
+     */
+    for (ptr = propertyTypes; *ptr; ptr++)
+        xfree(*ptr);
+    ptr++;
+    xfree(*ptr);
+
+    XSELinuxPropertyTypeDefault = NULL;
+    propertyTypesCount = 0;
+
+    xfree(propertyTypes);
+    propertyTypes = NULL;
+
+    /* ... and the same for the extension type table */
+    for (ptr = extensionTypes; *ptr; ptr++)
+        xfree(*ptr);
+    ptr++;
+    xfree(*ptr);
+
+    XSELinuxExtensionTypeDefault = NULL;
+    extensionTypesCount = 0;
+
+    xfree(extensionTypes);
+    extensionTypes = NULL;
+
+    /* finally, take care of the context for non-local connections */
+    xfree(XSELinuxNonlocalContextDefault);
+    XSELinuxNonlocalContextDefault = NULL;
+
+    /* ... and for the root window */
+    xfree(XSELinuxRootWindowContext);
+    XSELinuxRootWindowContext = NULL;
+} /* XSELinuxFreeConfigData */
+
+/* Extension dispatch functions */
+static int
+ProcXSELinuxDispatch(ClientPtr client)
+{
+    return BadRequest;
+} /* ProcXSELinuxDispatch */
+
+static void
+XSELinuxResetProc(ExtensionEntry *extEntry)
+{
+    FreeClientState(serverClient);
+
+    XSELinuxFreeConfigData();
+
+    audit_close(audit_fd);
+
+    avc_destroy();
+} /* XSELinuxResetProc */
+
+static void
+XSELinuxAVCAudit(void *auditdata,
+		 security_class_t class,
+		 char *msgbuf,
+		 size_t msgbufsize)
+{
+    XSELinuxAuditRec *audit = (XSELinuxAuditRec*)auditdata;
+    ClientPtr client = audit->client;
+    char requestNum[8];
+    REQUEST(xReq);
+
+    if (stuff)
+	snprintf(requestNum, 8, "%d", stuff->reqType);
+
+    snprintf(msgbuf, msgbufsize, "%s%s%s%s%s%s",
+	     stuff ? "request=" : "",
+	     stuff ? requestNum : "",
+	     audit->property ? " property=" : "",
+	     audit->property ? audit->property : "",
+	     audit->extension ? " extension=" : "",
+	     audit->extension ? audit->extension : "");
+}
+
+static void
+XSELinuxAVCLog(const char *fmt, ...)
+{
+    va_list ap;
+    va_start(ap, fmt);
+    VErrorF(fmt, ap);
+    va_end(ap);
+}
+
+/* XSELinuxExtensionSetup
+ *
+ * Set up the XSELinux Extension (pre-init)
+ */
+void
+XSELinuxExtensionSetup(INITARGS)
+{
+    /* Allocate the client private index */
+    clientPrivateIndex = AllocateClientPrivateIndex();
+    if (!AllocateClientPrivate(clientPrivateIndex, 
+			       sizeof (XSELinuxClientStateRec)))
+	FatalError("XSELinux: Failed to allocate client private.\n");
+
+    /* Allocate the extension private index */
+    extnsnPrivateIndex = AllocateExtensionPrivateIndex();
+    if (!AllocateExtensionPrivate(extnsnPrivateIndex, 0))
+	FatalError("XSELinux: Failed to allocate extension private.\n");
+}
+
+/* XSELinuxExtensionInit
+ *
+ * Initialize the XSELinux Extension
+ */
+void
+XSELinuxExtensionInit(INITARGS)
+{
+    ExtensionEntry	*extEntry;
+    struct avc_log_callback alc = {XSELinuxAVCLog, XSELinuxAVCAudit};
+
+    if (!is_selinux_enabled())
+    {
+        ErrorF("SELinux Extension failed to load: SELinux not enabled\n");
+        return;
+    }
+
+    if (avc_init("xserver", NULL, &alc, NULL, NULL) < 0)
+    {
+	FatalError("couldn't initialize SELinux userspace AVC\n");
+    }
+
+    if (!AddCallback(&ClientStateCallback, XSELinuxClientState, NULL))
+	return;
+
+    /* Load the config file.  If this fails, shut down the server,
+     * since an unknown security status is worse than no security.
+     *
+     * Note that this must come before we assign a security state
+     * for the serverClient, because the serverClient's root windows
+     * are assigned a context based on data in the config file.
+     */
+    if (XSELinuxLoadConfigFile() != TRUE)
+    {
+	FatalError("XSELinux: Failed to load security policy\n");
+    }
+
+    /* prepare for auditing */
+    audit_fd = audit_open();
+    if (audit_fd < 0)
+    {
+        FatalError("XSELinux: Failed to open the system audit log\n");
+    }
+
+    /* register security callbacks */
+    XaceRegisterCallback(XACE_CORE_DISPATCH, XSELinuxCoreDispatch, NULL);
+    XaceRegisterCallback(XACE_EXT_ACCESS, XSELinuxExtDispatch, NULL);
+    XaceRegisterCallback(XACE_EXT_DISPATCH, XSELinuxExtDispatch, NULL);
+    XaceRegisterCallback(XACE_RESOURCE_ACCESS, XSELinuxResLookup, NULL);
+    XaceRegisterCallback(XACE_MAP_ACCESS, XSELinuxMap, NULL);
+    XaceRegisterCallback(XACE_HOSTLIST_ACCESS, XSELinuxHostlist, NULL);
+    XaceRegisterCallback(XACE_BACKGRND_ACCESS, XSELinuxBackgrnd, NULL);
+    XaceRegisterCallback(XACE_DRAWABLE_ACCESS, XSELinuxDrawable, NULL);
+    XaceRegisterCallback(XACE_PROPERTY_ACCESS, XSELinuxProperty, NULL);
+    /* XaceRegisterCallback(XACE_DECLARE_EXT_SECURE, XSELinuxDeclare, NULL);
+    XaceRegisterCallback(XACE_DEVICE_ACCESS, XSELinuxDevice, NULL); */
+
+    /* register extension with server */
+    extEntry = AddExtension(XSELINUX_EXTENSION_NAME,
+			    XSELinuxNumberEvents, XSELinuxNumberErrors,
+			    ProcXSELinuxDispatch, ProcXSELinuxDispatch,
+			    XSELinuxResetProc, StandardMinorOpcode);
+}
diff --git a/Xext/xselinux.h b/Xext/xselinux.h
new file mode 100644
index 0000000..eff6db5
--- /dev/null
+++ b/Xext/xselinux.h
@@ -0,0 +1,29 @@
+/************************************************************
+
+Author: Eamon Walsh <ewalsh at epoch.ncsc.mil>
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+this permission notice appear in supporting documentation.  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
+AUTHOR 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.
+
+********************************************************/
+
+#ifndef _XSELINUX_H
+#define _XSELINUX_H
+
+#define XSELINUX_EXTENSION_NAME		"SELinux"
+#define XSELINUX_MAJOR_VERSION		1
+#define XSELINUX_MINOR_VERSION		0
+#define XSELinuxNumberEvents		0
+#define XSELinuxNumberErrors		0
+
+#endif /* _XSELINUX_H */
diff-tree 81281cb298a5825bc7a2e692375a86199293bbbe (from 792e0f71c6a435b2e28f8a4cdcc790f3b982e62c)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Tue Dec 12 11:28:24 2006 +0000

    Fix bad commit

diff --git a/hw/xwin/InitOutput.c b/hw/xwin/InitOutput.c
index 9964980..39a5eda 100644
--- a/hw/xwin/InitOutput.c
+++ b/hw/xwin/InitOutput.c
@@ -694,7 +694,7 @@ winFixupPaths (void)
         if (sizeof(xkbbasedir) > 0)
             xkbbasedir[sizeof(xkbbasedir)-1] = 0;
         XkbBaseDirectory = xkbbasedir;
-	XkbBinDirectory = xkbbasedir
+	XkbBinDirectory = basedir;
     }
 #endif /* XKB */
 #endif /* RELOCATE_PROJECTROOT */
diff-tree 792e0f71c6a435b2e28f8a4cdcc790f3b982e62c (from 27d4b84f268ac21601f7f52a7e257f70753396b3)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Mon Dec 11 14:54:49 2006 +0000

    Fix Xming fails to use xkb bug
    bug #5049 (Colin Harrison)

diff --git a/hw/xwin/InitOutput.c b/hw/xwin/InitOutput.c
index b64eee9..9964980 100644
--- a/hw/xwin/InitOutput.c
+++ b/hw/xwin/InitOutput.c
@@ -694,6 +694,7 @@ winFixupPaths (void)
         if (sizeof(xkbbasedir) > 0)
             xkbbasedir[sizeof(xkbbasedir)-1] = 0;
         XkbBaseDirectory = xkbbasedir;
+	XkbBinDirectory = xkbbasedir
     }
 #endif /* XKB */
 #endif /* RELOCATE_PROJECTROOT */
diff-tree 27d4b84f268ac21601f7f52a7e257f70753396b3 (from fb8364bca30fe9268e807b0a9a3ebf875ee1fce2)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Mon Dec 11 14:50:08 2006 +0000

    Fix Tooltip from minimized clients
    
    Bug #3678 (Colin Harrison)

diff --git a/hw/xwin/winmultiwindowwindow.c b/hw/xwin/winmultiwindowwindow.c
index dc8e38b..037c881 100644
--- a/hw/xwin/winmultiwindowwindow.c
+++ b/hw/xwin/winmultiwindowwindow.c
@@ -982,11 +982,10 @@ winAdjustXWindow (WindowPtr pWin, HWND h
       /*
        * If the Windows window is minimized, its WindowRect has
        * meaningless values so we don't adjust X window to it.
-       * Instead we put the X window to the bottom in Z order to
-       * be obscured by other windows.
        */
-      vlist[0] = Below;
-      return ConfigureWindow (pWin, CWStackMode, vlist, wClient(pWin));
+      vlist[0] = 0;
+      vlist[1] = 0;
+      return ConfigureWindow (pWin, CWX | CWY, vlist, wClient(pWin));
     }
   
   pDraw = &pWin->drawable;
diff-tree fb8364bca30fe9268e807b0a9a3ebf875ee1fce2 (from d56249a15ead51ad4d2117d5538ada24af05b693)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Sun Dec 10 11:24:05 2006 -0500

    Accept EDID > 1.3 but < 2.0 if we find it, assume it's compatible.

diff --git a/hw/xfree86/ddc/ddcProperty.c b/hw/xfree86/ddc/ddcProperty.c
index 11b5e26..13083dd 100644
--- a/hw/xfree86/ddc/ddcProperty.c
+++ b/hw/xfree86/ddc/ddcProperty.c
@@ -32,9 +32,6 @@
 #include "propertyst.h"
 #include "xf86DDC.h"
 
-
-
-
 #define EDID1_ATOM_NAME         "XFree86_DDC_EDID1_RAWDATA"
 #define EDID2_ATOM_NAME         "XFree86_DDC_EDID2_RAWDATA"
 #define VDIF_ATOM_NAME          "XFree86_DDC_VDIF_RAWDATA"
diff --git a/hw/xfree86/ddc/interpret_edid.c b/hw/xfree86/ddc/interpret_edid.c
index c58bb2f..7b4b2b9 100644
--- a/hw/xfree86/ddc/interpret_edid.c
+++ b/hw/xfree86/ddc/interpret_edid.c
@@ -304,16 +304,18 @@ get_detailed_timing_section(Uchar *c, st
   r->misc = MISC;
 }
 
+#define MAX_EDID_MINOR 3
 
 static Bool
 validate_version(int scrnIndex, struct edid_version *r)
 {
     if (r->version != 1)
 	return FALSE;
-    if (r->revision > 3) {
-	xf86DrvMsg(scrnIndex, X_ERROR,"EDID Version 1.%i not yet supported\n",
-		   r->revision);
-	return FALSE;
-    }
+
+    if (r->revision > MAX_EDID_MINOR)
+	xf86DrvMsg(scrnIndex, X_WARNING,
+		   "Assuming version 1.%d is compatible with 1.%d\n",
+		   r->revision, MAX_EDID_MINOR);
+
     return TRUE;
 }
diff-tree d56249a15ead51ad4d2117d5538ada24af05b693 (from parents)
Merge: f1f8df1889ab656bb57596e2f85408f15f42cd5d ec84f72d077eaf2e7768a1f5398f65a5e1714d08
Author: Jeremy C. Reed <reed at glacier.reedmedia.net>
Date:   Fri Dec 8 15:52:37 2006 -0600

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver

diff-tree f1f8df1889ab656bb57596e2f85408f15f42cd5d (from f17e3c34dfd1f1418440bdebf45764e4dbf550f0)
Author: Jeremy C. Reed <reed at glacier.reedmedia.net>
Date:   Fri Dec 8 15:51:44 2006 -0600

    For MANDEFS, also replace __mandir__ for $(mandir) which includes
    the prefix. Noticed wrong path to man pages on both Ubuntu and on
    NetBSD with pkgsrc.

diff --git a/cpprules.in b/cpprules.in
index 667b133..4901ea8 100644
--- a/cpprules.in
+++ b/cpprules.in
@@ -34,6 +34,7 @@ MANDEFS = \
 	-D__miscmansuffix__=$(MISC_MAN_SUFFIX) \
 	-D__drivermansuffix__=$(DRIVER_MAN_SUFFIX) \
 	-D__adminmansuffix__=$(ADMIN_MAN_SUFFIX) \
+	-D__mandir__=$(mandir) \
 	-D__projectroot__=$(prefix) \
 	-D__xconfigfile__=$(__XCONFIGFILE__) -D__xconfigdir__=$(XCONFIGDIR) \
 	-D__xlogfile__=$(XLOGFILE) -D__xservername__=$(XSERVERNAME) 
diff --git a/hw/xfree86/doc/man/Xorg.man.pre b/hw/xfree86/doc/man/Xorg.man.pre
index b7fa990..d91b796 100644
--- a/hw/xfree86/doc/man/Xorg.man.pre
+++ b/hw/xfree86/doc/man/Xorg.man.pre
@@ -580,7 +580,7 @@ Client error message database.
 .B __projectroot__/lib/X11/app-defaults/\(**
 Client resource specifications.
 .TP 30
-.B __projectroot__/man/man?/\(**
+.B __mandir__/man?/\(**
 Manual pages.
 .TP 30
 .BI /etc/X n .hosts
diff-tree ec84f72d077eaf2e7768a1f5398f65a5e1714d08 (from e59aeac1ff13ea53f44dba1ac7800f37f4532ca1)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Dec 8 21:31:47 2006 +0200

    XkbCopyKeymap: always initialise map and preserve
    
    If we don't have map or preserve in the source map, make sure the
    destination is initialised to NULL, and freed if it's a valid type.

diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index 321bf2e..c9c5ed0 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -1144,6 +1144,11 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
                         memcpy(dtype->map, stype->map,
                                stype->map_count * sizeof(XkbKTMapEntryRec));
                     }
+                    else {
+                        if (dtype->map && i < dst->map->num_types)
+                            xfree(dtype->map);
+                        dtype->map = NULL;
+                    }
 
                     if (stype->preserve) {
                         if (stype->map_count != dtype->map_count &&
@@ -1168,17 +1173,22 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
                         memcpy(dtype->preserve, stype->preserve,
                                stype->map_count * sizeof(XkbModsRec));
                     }
+                    else {
+                        if (dtype->preserve && i < dst->map->num_types)
+                            xfree(dtype->preserve);
+                        dtype->preserve = NULL;
+                    }
 
                     dtype->map_count = stype->map_count;
                 }
                 else {
-                    if (dtype->map_count) {
+                    if (dtype->map_count && i < dst->map->num_types) {
                         if (dtype->map)
                             xfree(dtype->map);
                         if (dtype->preserve)
                             xfree(dtype->preserve);
-                        dtype->map_count = 0;
                     }
+                    dtype->map_count = 0;
                     dtype->map = NULL;
                     dtype->preserve = NULL;
                 }
diff-tree e59aeac1ff13ea53f44dba1ac7800f37f4532ca1 (from 729fca33a417ae3dfb180caf0ea8946ef9eee1df)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Dec 6 23:44:06 2006 +0200

    xfree86: remove stray debug line

diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 5469426..05e62f1 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -789,8 +789,6 @@ xf86ReleaseKeys(DeviceIntPtr pDev)
     xEvent ke;
     int i = 0, j = 0, nevents = 0;
 
-    ErrorF("releasekeys: called on device %s (%d)\n", pDev->name, pDev->id);
-
     if (!pDev || !pDev->key)
         return;
 
diff-tree 729fca33a417ae3dfb180caf0ea8946ef9eee1df (from 4ea6dfb984063117eef5c2f931205b1c3eb3108b)
Author: Michel Dänzer <michel at tungstengraphics.com>
Date:   Thu Dec 7 12:09:18 2006 +0100

    Revert "xfree86 DDX: Delete DDX screens in ddxGiveUp()."
    
    This reverts commit a6381e69845f58d2b3282992b1f881015190f1bc.
    
    See https://bugs.freedesktop.org/show_bug.cgi?id=9224 .

diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index 68d69c5..ff878d5 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -1119,9 +1119,6 @@ ddxGiveUp()
     DGAShutdown();
 #endif
 
-    while (xf86NumScreens)
-	xf86DeleteScreen(xf86NumScreens - 1, 0);
-
     xf86CloseConsole();
 
     xf86CloseLog();
diff-tree 4ea6dfb984063117eef5c2f931205b1c3eb3108b (from 4cba1a1ebfbdd7ab489b1b1ffb6656cbe88eb61e)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Dec 6 23:24:39 2006 +0200

    whitespace police

diff --git a/config/config.c b/config/config.c
index 66a15fc..523327d 100644
--- a/config/config.c
+++ b/config/config.c
@@ -357,7 +357,7 @@ configSetup(void)
 
     if (!dbus_connection_add_filter(configData->connection, configFilter,
                                     configData, NULL)) {
-        
+
         ErrorF("[dbus] couldn't add signal filter: %s (%s)\n", error.name,
                error.message);
         dbus_error_free(&error);
diff-tree 4cba1a1ebfbdd7ab489b1b1ffb6656cbe88eb61e (from 0c5dab5c8eaa174f28054b9d20244a709c015210)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Dec 6 23:21:38 2006 +0200

    config: bus reconnect support
    
    Add support for reconnecting to the bus when it restarts.

diff --git a/config/config.c b/config/config.c
index 9ecdbb4..66a15fc 100644
--- a/config/config.c
+++ b/config/config.c
@@ -36,10 +36,10 @@
                     /* the above comment lies.  there is no better way. */
 #include "input.h"
 #include "inputstr.h"
-#include "config.h"
+#include "hotplug.h"
 #include "os.h"
 
-#define MATCH_RULE "type='method_call',interface='org.x.config.input'"
+#define CONFIG_MATCH_RULE "type='method_call',interface='org.x.config.input'"
 
 #define MALFORMED_MSG "[config] malformed message, dropping"
 #define MALFORMED_MESSAGE() { DebugF(MALFORMED_MSG "\n"); \
@@ -50,6 +50,9 @@
                                   ret = BadValue; \
                                   goto unwind; }
 
+/* How often to attempt reconnecting when we get booted off the bus. */
+#define RECONNECT_DELAY 10000 /* in ms */
+
 struct config_data {
     int fd;
     DBusConnection *connection;
@@ -59,6 +62,8 @@ struct config_data {
 
 static struct config_data *configData;
 
+static CARD32 configReconnect(OsTimerPtr timer, CARD32 time, pointer arg);
+
 static void
 configWakeupHandler(pointer blockData, int err, pointer pReadMask)
 {
@@ -73,6 +78,18 @@ configBlockHandler(pointer data, struct 
 {
 }
 
+static void
+configTeardown(void)
+{
+    if (configData) {
+        RemoveGeneralSocket(configData->fd);
+        RemoveBlockAndWakeupHandlers(configBlockHandler, configWakeupHandler,
+                                     configData);
+        xfree(configData);
+        configData = NULL;
+    }
+}
+
 static int
 configAddDevice(DBusMessage *message, DBusMessageIter *iter, DBusError *error)
 {
@@ -226,23 +243,22 @@ configMessage(DBusConnection *connection
             ret = configAddDevice(message, &iter, &error);
         else if (strcmp(dbus_message_get_member(message), "remove") == 0)
             ret = configRemoveDevice(message, &iter, &error);
-    }
-
-    if (ret != BadDrawable && ret != BadAlloc) {
-        reply = dbus_message_new_method_return(message);
-        dbus_message_iter_init_append(reply, &iter);
+        if (ret != BadDrawable && ret != BadAlloc) {
+            reply = dbus_message_new_method_return(message);
+            dbus_message_iter_init_append(reply, &iter);
+
+            if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret)) {
+                ErrorF("[config] couldn't append to iterator\n");
+                dbus_error_free(&error);
+                return DBUS_HANDLER_RESULT_HANDLED;
+            }
+
+            if (!dbus_connection_send(bus, reply, NULL))
+                ErrorF("[config] failed to send reply\n");
+            dbus_connection_flush(bus);
 
-        if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret)) {
-            ErrorF("[config] couldn't append to iterator\n");
-            dbus_error_free(&error);
-            return DBUS_HANDLER_RESULT_HANDLED;
+            dbus_message_unref(reply);
         }
-
-        if (!dbus_connection_send(bus, reply, NULL))
-            ErrorF("[config] failed to send reply\n");
-        dbus_connection_flush(bus);
-
-        dbus_message_unref(reply);
     }
 
     dbus_error_free(&error);
@@ -255,16 +271,40 @@ configMessage(DBusConnection *connection
         return DBUS_HANDLER_RESULT_HANDLED;
 }
 
-void
-configInitialise()
+/**
+ * This is a filter, which only handles the disconnected signal, which
+ * doesn't go to the normal message handling function.  This takes
+ * precedence over the message handling function, so have have to be
+ * careful to ignore anything we don't want to deal with here.
+ *
+ * Yes, this is brutally stupid.
+ */
+static DBusHandlerResult
+configFilter(DBusConnection *connection, DBusMessage *message, void *closure)
+{
+    if (dbus_message_is_signal(message, DBUS_INTERFACE_LOCAL,
+                                    "Disconnected")) {
+        ErrorF("[dbus] disconnected from bus\n");
+        TimerSet(NULL, 0, RECONNECT_DELAY, configReconnect, NULL);
+        configTeardown();
+        return DBUS_HANDLER_RESULT_HANDLED;
+    }
+
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+}
+
+static Bool
+configSetup(void)
 {
     DBusError error;
     DBusObjectPathVTable vtable = { .message_function = configMessage };
 
     if (!configData)
         configData = (struct config_data *) xcalloc(sizeof(struct config_data), 1);
-    if (!configData)
-        return;
+    if (!configData) {
+        ErrorF("[dbus] failed to allocate data struct.\n");
+        return FALSE;
+    }
 
     dbus_error_init(&error);
     configData->connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
@@ -272,15 +312,20 @@ configInitialise()
         ErrorF("[dbus] some kind of error occurred: %s (%s)\n", error.name,
                 error.message);
         dbus_error_free(&error);
-        return;
+        xfree(configData);
+        configData = NULL;
+        return FALSE;
     }
 
+    dbus_connection_set_exit_on_disconnect(configData->connection, FALSE);
+
     if (!dbus_connection_get_unix_fd(configData->connection, &configData->fd)) {
         dbus_connection_unref(configData->connection);
         ErrorF("[dbus] couldn't get fd for bus\n");
         dbus_error_free(&error);
-        configData->fd = -1;
-        return;
+        xfree(configData);
+        configData = NULL;
+        return FALSE;
     }
 
     snprintf(configData->busname, sizeof(configData->busname),
@@ -291,12 +336,13 @@ configInitialise()
                error.name, error.message);
         dbus_error_free(&error);
         dbus_connection_unref(configData->connection);
-        configData->fd = -1;
-        return;
+        xfree(configData);
+        configData = NULL;
+        return FALSE;
     }
 
     /* blocks until we get a reply. */
-    dbus_bus_add_match(configData->connection, MATCH_RULE, &error);
+    dbus_bus_add_match(configData->connection, CONFIG_MATCH_RULE, &error);
     if (dbus_error_is_set(&error)) {
         ErrorF("[dbus] couldn't match X.Org rule: %s (%s)\n", error.name,
                error.message);
@@ -304,8 +350,25 @@ configInitialise()
         dbus_bus_release_name(configData->connection, configData->busname,
                               &error);
         dbus_connection_unref(configData->connection);
-        configData->fd = -1;
-        return;
+        xfree(configData);
+        configData = NULL;
+        return FALSE;
+    }
+
+    if (!dbus_connection_add_filter(configData->connection, configFilter,
+                                    configData, NULL)) {
+        
+        ErrorF("[dbus] couldn't add signal filter: %s (%s)\n", error.name,
+               error.message);
+        dbus_error_free(&error);
+        dbus_bus_release_name(configData->connection, configData->busname,
+                              &error);
+        dbus_bus_remove_match(configData->connection, CONFIG_MATCH_RULE,
+                              &error);
+        dbus_connection_unref(configData->connection);
+        xfree(configData);
+        configData = NULL;
+        return FALSE;
     }
 
     snprintf(configData->busobject, sizeof(configData->busobject),
@@ -314,13 +377,15 @@ configInitialise()
                                               configData->busobject, &vtable,
                                               configData->connection)) {
         ErrorF("[dbus] couldn't register object path\n");
-        configData->fd = -1;
         dbus_bus_release_name(configData->connection, configData->busname,
                               &error);
-        dbus_bus_remove_match(configData->connection, MATCH_RULE, &error);
+        dbus_bus_remove_match(configData->connection, CONFIG_MATCH_RULE,
+                              &error);
         dbus_connection_unref(configData->connection);
         dbus_error_free(&error);
-        return;
+        xfree(configData);
+        configData = NULL;
+        return FALSE;
     }
 
     DebugF("[dbus] registered object path %s\n", configData->busobject);
@@ -330,6 +395,23 @@ configInitialise()
 
     RegisterBlockAndWakeupHandlers(configBlockHandler, configWakeupHandler,
                                    configData);
+
+    return TRUE;
+}
+
+static CARD32
+configReconnect(OsTimerPtr timer, CARD32 time, pointer arg)
+{
+    if (configSetup())
+        return 0;
+    else
+        return RECONNECT_DELAY;
+}
+
+void
+configInitialise()
+{
+    TimerSet(NULL, 0, 1, configReconnect, NULL);
 }
 
 void
@@ -341,16 +423,15 @@ configFini()
         dbus_error_init(&error);
         dbus_connection_unregister_object_path(configData->connection,
                                                configData->busobject);
-        dbus_bus_remove_match(configData->connection, MATCH_RULE, &error);
+        dbus_connection_remove_filter(configData->connection, configFilter,
+                                      configData);
+        dbus_bus_remove_match(configData->connection, CONFIG_MATCH_RULE,
+                              &error);
         dbus_bus_release_name(configData->connection, configData->busname,
                               &error);
         dbus_connection_unref(configData->connection);
-        RemoveGeneralSocket(configData->fd);
-        RemoveBlockAndWakeupHandlers(configBlockHandler, configWakeupHandler,
-                                     configData);
-        xfree(configData);
-        configData = NULL;
         dbus_error_free(&error);
+        configTeardown();
     }
 }
 
diff-tree 0c5dab5c8eaa174f28054b9d20244a709c015210 (from 72e7f2ac6cf0db474d0defa7918f2a3ba76c0e46)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Dec 6 23:21:15 2006 +0200

    config: move config.h to hotplug.h
    
    Also, move configInitialise to after OsInit, since the next commit will
    make it use a timer.

diff --git a/dix/dispatch.c b/dix/dispatch.c
index 4c5a9b7..0a761eb 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -130,7 +130,6 @@ int ProcInitialConnection();
 #include "dispatch.h"
 #include "swaprep.h"
 #include "swapreq.h"
-#include "config.h"
 #ifdef PANORAMIX
 #include "panoramiX.h"
 #include "panoramiXsrv.h"
diff --git a/dix/main.c b/dix/main.c
index 077fdea..3a77533 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -98,7 +98,7 @@ Equipment Corporation.
 #include <X11/fonts/font.h>
 #include "opaque.h"
 #include "servermd.h"
-#include "config.h"
+#include "hotplug.h"
 #include "site.h"
 #include "dixfont.h"
 #include "extnsionst.h"
@@ -309,9 +309,9 @@ main(int argc, char *argv[], char *envp[
 	DPMSPowerLevel = 0;
 #endif
 	InitBlockAndWakeupHandlers();
-        configInitialise();
 	/* Perform any operating system dependent initializations you'd like */
-	OsInit();		
+	OsInit();
+        configInitialise();
 	if(serverGeneration == 1)
 	{
 	    CreateWellKnownSockets();
diff --git a/include/Makefile.am b/include/Makefile.am
index 9f07fa6..4289b81 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -7,7 +7,7 @@ sdk_HEADERS =		\
 	closure.h	\
 	colormap.h	\
 	colormapst.h	\
-	config.h	\
+	hotplug.h	\
 	cursor.h	\
 	cursorstr.h	\
 	dix.h		\
diff --git a/include/config.h b/include/config.h
deleted file mode 100644
index 0c304b1..0000000
--- a/include/config.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright © 2006 Daniel Stone
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of the copyright holders and/or authors
- * not be used in advertising or publicity pertaining to distribution of the
- * software without specific, written prior permission.  The copyright holders
- * and/or authors make no representations about the suitability of this
- * software for any purpose.  It is provided "as is" without express or
- * implied warranty.
- *
- * THE COPYRIGHT HOLDERS AND/OR AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD
- * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND/OR AUTHORS 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.
- */
-
-#ifndef CONFIG_H
-#define CONFIG_H
-
-void configInitialise(void);
-void configFini(void);
-void configDispatch(void);
-
-#endif /* CONFIG_H */
diff --git a/include/hotplug.h b/include/hotplug.h
new file mode 100644
index 0000000..0c304b1
--- /dev/null
+++ b/include/hotplug.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright © 2006 Daniel Stone
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holders and/or authors
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  The copyright holders
+ * and/or authors make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS AND/OR AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD
+ * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND/OR AUTHORS 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.
+ */
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+void configInitialise(void);
+void configFini(void);
+void configDispatch(void);
+
+#endif /* CONFIG_H */
diff-tree 72e7f2ac6cf0db474d0defa7918f2a3ba76c0e46 (from c458a70d650bd62b8f4706f022d1f3f347636db1)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Dec 6 23:18:52 2006 +0200

    GetPointerEvents: always send valuator events for MotionNotify
    
    Always chase a DeviceMotionNotify event with a DeviceValuator, which is
    not required in the spec, but will silently break the lib if you don't
    include.

diff --git a/dix/getevents.c b/dix/getevents.c
index 9c4ed0e..0150d66 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -484,6 +484,8 @@ GetPointerEvents(xEvent *events, DeviceI
     int num_events = 0, final_valuator = 0;
     CARD32 ms = 0;
     deviceKeyButtonPointer *kbp = NULL;
+    /* Thanks to a broken lib, we _always_ have to chase DeviceMotionNotifies
+     * with DeviceValuators. */
     Bool sendValuators = (type == MotionNotify || flags & POINTER_ABSOLUTE);
     DeviceIntPtr cp = inputInfo.pointer;
     int x = 0, y = 0;
@@ -500,15 +502,16 @@ GetPointerEvents(xEvent *events, DeviceI
     else
         num_events = 1;
 
+    if (type == MotionNotify && num_valuators <= 0) {
+        return 0;
+    }
+
     /* Do we need to send a DeviceValuator event? */
-    if ((num_valuators + first_valuator) > 2 && sendValuators) {
+    if (sendValuators) {
         if ((((num_valuators - 1) / 6) + 1) > MAX_VALUATOR_EVENTS)
             num_valuators = MAX_VALUATOR_EVENTS * 6;
         num_events += ((num_valuators - 1) / 6) + 1;
     }
-    else if (type == MotionNotify && num_valuators <= 0) {
-        return 0;
-    }
 
     final_valuator = num_valuators + first_valuator;
 
@@ -614,7 +617,7 @@ GetPointerEvents(xEvent *events, DeviceI
     kbp->root_y = y;
 
     events++;
-    if (final_valuator > 2 && sendValuators) {
+    if (sendValuators) {
         kbp->deviceid |= MORE_EVENTS;
         clipValuators(pDev, first_valuator, num_valuators, valuators);
         events = getValuatorEvents(events, pDev, first_valuator,
diff-tree c458a70d650bd62b8f4706f022d1f3f347636db1 (from edabf45425f9ed79547f918cc0dfff4c268de386)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Dec 6 20:30:44 2006 +0200

    GetPointerEvents: fix typo
    
    Fix typo that resulted in inverted axes when using an absolute positioning
    device that didn't report y, and thus relied on the previous value.

diff --git a/dix/getevents.c b/dix/getevents.c
index 4154262..9c4ed0e 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -540,7 +540,7 @@ GetPointerEvents(xEvent *events, DeviceI
         }
         else {
             if (pDev->coreEvents)
-                x = cp->valuator->lasty;
+                y = cp->valuator->lasty;
             else
                 y = pDev->valuator->lasty;
         }
diff-tree edabf45425f9ed79547f918cc0dfff4c268de386 (from 8724af248cd6c93182fecd060fed09a556361080)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Dec 2 16:37:19 2006 +0200

    configure.ac: add CONFIG_LIB to Xvfb

diff --git a/configure.ac b/configure.ac
index 851194c..002be62 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1059,7 +1059,7 @@ AC_MSG_RESULT([$XVFB])
 AM_CONDITIONAL(XVFB, [test "x$XVFB" = xyes])
 
 if test "x$XVFB" = xyes; then
-	XVFB_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $CWRAP_LIB $OS_LIB $LIBS"
+	XVFB_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $CONFIG_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $CWRAP_LIB $OS_LIB $LIBS"
 	AC_SUBST([XVFB_LIBS])
 fi
 
diff-tree 8724af248cd6c93182fecd060fed09a556361080 (from 2f0a800ffdc881cdb3adf84f1ed97bbb63cba34c)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Dec 2 16:20:34 2006 +0200

    kdrive/mga: fix compiler warning
    
    Change a case that only made one test for an if, preventing the compiler
    warning about all other PICT_* types being unsupported.

diff --git a/hw/kdrive/mga/g400_composite.c b/hw/kdrive/mga/g400_composite.c
index 671e517..da2e8b8 100644
--- a/hw/kdrive/mga/g400_composite.c
+++ b/hw/kdrive/mga/g400_composite.c
@@ -286,10 +286,8 @@ mgaCheckComposite(int op, PicturePtr pSr
     if (pMaskPicture->componentAlpha)
 	MGA_FALLBACK(("Component alpha unsupported"));
 
-    switch (pDstPicture->format) {
-    case PICT_a8:
+    if (pDstPicture->format == PICT_a8)
 	MGA_FALLBACK(("render to A8 unsupported"));
-    }
 
     return TRUE;
 }
diff-tree 2f0a800ffdc881cdb3adf84f1ed97bbb63cba34c (from 99378b58dbc63160382ad9c41f9cb0dd2a24e9d1)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Nov 27 22:22:53 2006 +0200

    config: move to block/wakeup handler

diff --git a/config/config.c b/config/config.c
index 05757e2..9ecdbb4 100644
--- a/config/config.c
+++ b/config/config.c
@@ -50,18 +50,27 @@
                                   ret = BadValue; \
                                   goto unwind; }
 
-static DBusConnection *configConnection = NULL;
-static int configfd = -1;
-static char busobject[32] = { 0 };
-static char busname[64] = { 0 };
+struct config_data {
+    int fd;
+    DBusConnection *connection;
+    char busobject[32];
+    char busname[64];
+};
 
-void
-configDispatch()
+static struct config_data *configData;
+
+static void
+configWakeupHandler(pointer blockData, int err, pointer pReadMask)
 {
-    if (!configConnection)
-        return;
+    struct config_data *data = blockData;
 
-    dbus_connection_read_write_dispatch(configConnection, 0);
+    if (data->connection && FD_ISSET(data->fd, (fd_set *) pReadMask))
+        dbus_connection_read_write_dispatch(data->connection, 0);
+}
+
+static void
+configBlockHandler(pointer data, struct timeval **tv, pointer pReadMask)
+{
 }
 
 static int
@@ -249,68 +258,78 @@ configMessage(DBusConnection *connection
 void
 configInitialise()
 {
-    DBusConnection *bus = NULL;
     DBusError error;
     DBusObjectPathVTable vtable = { .message_function = configMessage };
 
-    configConnection = NULL;
+    if (!configData)
+        configData = (struct config_data *) xcalloc(sizeof(struct config_data), 1);
+    if (!configData)
+        return;
 
     dbus_error_init(&error);
-    bus = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
-    if (!bus || dbus_error_is_set(&error)) {
+    configData->connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
+    if (!configData->connection || dbus_error_is_set(&error)) {
         ErrorF("[dbus] some kind of error occurred: %s (%s)\n", error.name,
                 error.message);
         dbus_error_free(&error);
         return;
     }
 
-    if (!dbus_connection_get_unix_fd(bus, &configfd)) {
-        dbus_connection_unref(bus);
+    if (!dbus_connection_get_unix_fd(configData->connection, &configData->fd)) {
+        dbus_connection_unref(configData->connection);
         ErrorF("[dbus] couldn't get fd for bus\n");
         dbus_error_free(&error);
-        configfd = -1;
+        configData->fd = -1;
         return;
     }
 
-    snprintf(busname, sizeof(busname), "org.x.config.display%d", atoi(display));
-    if (!dbus_bus_request_name(bus, busname, 0, &error) ||
-        dbus_error_is_set(&error)) {
+    snprintf(configData->busname, sizeof(configData->busname),
+             "org.x.config.display%d", atoi(display));
+    if (!dbus_bus_request_name(configData->connection, configData->busname,
+                               0, &error) || dbus_error_is_set(&error)) {
         ErrorF("[dbus] couldn't take over org.x.config: %s (%s)\n",
                error.name, error.message);
         dbus_error_free(&error);
-        dbus_connection_unref(bus);
-        configfd = -1;
+        dbus_connection_unref(configData->connection);
+        configData->fd = -1;
         return;
     }
 
     /* blocks until we get a reply. */
-    dbus_bus_add_match(bus, MATCH_RULE, &error);
+    dbus_bus_add_match(configData->connection, MATCH_RULE, &error);
     if (dbus_error_is_set(&error)) {
         ErrorF("[dbus] couldn't match X.Org rule: %s (%s)\n", error.name,
                error.message);
         dbus_error_free(&error);
-        dbus_bus_release_name(bus, busname, &error);
-        dbus_connection_unref(bus);
-        configfd = -1;
+        dbus_bus_release_name(configData->connection, configData->busname,
+                              &error);
+        dbus_connection_unref(configData->connection);
+        configData->fd = -1;
         return;
     }
 
-    snprintf(busobject, sizeof(busobject), "/org/x/config/%d", atoi(display));
-    if (!dbus_connection_register_object_path(bus, busobject, &vtable, bus)) {
+    snprintf(configData->busobject, sizeof(configData->busobject),
+             "/org/x/config/%d", atoi(display));
+    if (!dbus_connection_register_object_path(configData->connection,
+                                              configData->busobject, &vtable,
+                                              configData->connection)) {
         ErrorF("[dbus] couldn't register object path\n");
-        configfd = -1;
-        dbus_bus_release_name(bus, busname, &error);
-        dbus_bus_remove_match(bus, MATCH_RULE, &error);
-        dbus_connection_unref(bus);
+        configData->fd = -1;
+        dbus_bus_release_name(configData->connection, configData->busname,
+                              &error);
+        dbus_bus_remove_match(configData->connection, MATCH_RULE, &error);
+        dbus_connection_unref(configData->connection);
         dbus_error_free(&error);
         return;
     }
 
-    DebugF("[dbus] registered object path %s\n", busobject);
+    DebugF("[dbus] registered object path %s\n", configData->busobject);
 
     dbus_error_free(&error);
-    configConnection = bus;
-    AddGeneralSocket(configfd);
+    AddGeneralSocket(configData->fd);
+
+    RegisterBlockAndWakeupHandlers(configBlockHandler, configWakeupHandler,
+                                   configData);
 }
 
 void
@@ -318,15 +337,19 @@ configFini()
 {
     DBusError error;
 
-    if (configConnection) {
+    if (configData) {
         dbus_error_init(&error);
-        dbus_connection_unregister_object_path(configConnection, busobject);
-        dbus_bus_remove_match(configConnection, MATCH_RULE, &error);
-        dbus_bus_release_name(configConnection, busname, &error);
-        dbus_connection_unref(configConnection);
-        RemoveGeneralSocket(configfd);
-        configConnection = NULL;
-        configfd = -1;
+        dbus_connection_unregister_object_path(configData->connection,
+                                               configData->busobject);
+        dbus_bus_remove_match(configData->connection, MATCH_RULE, &error);
+        dbus_bus_release_name(configData->connection, configData->busname,
+                              &error);
+        dbus_connection_unref(configData->connection);
+        RemoveGeneralSocket(configData->fd);
+        RemoveBlockAndWakeupHandlers(configBlockHandler, configWakeupHandler,
+                                     configData);
+        xfree(configData);
+        configData = NULL;
         dbus_error_free(&error);
     }
 }
@@ -334,11 +357,6 @@ configFini()
 #else /* !HAVE_DBUS */
 
 void
-configDispatch()
-{
-}
-
-void
 configInitialise()
 {
 }
diff --git a/dix/dispatch.c b/dix/dispatch.c
index 0a93c3b..4c5a9b7 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -426,9 +426,6 @@ Dispatch(void)
 
 	nready = WaitForSomething(clientReady);
 
-        /* this is an enormous hack and NEEDS TO GO AWAY. */
-        configDispatch();
-
 #ifdef SMART_SCHEDULE
 	if (nready && !SmartScheduleDisable)
 	{
diff-tree 99378b58dbc63160382ad9c41f9cb0dd2a24e9d1 (from 8884a73a3f4efa8276c5e38b9573201574c4f1f6)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Nov 27 22:22:33 2006 +0200

    kdrive/tslib: remove vendor-specific hacks
    
    Parts of the KDrive merge accidentally contained a bunch of
    vendor-specific hacks; sorry.

diff --git a/hw/kdrive/linux/tslib.c b/hw/kdrive/linux/tslib.c
index 44b4b54..41b74fa 100644
--- a/hw/kdrive/linux/tslib.c
+++ b/hw/kdrive/linux/tslib.c
@@ -75,10 +75,7 @@ TsRead (int fd, void *closure)
 
     while (ts_read(private->tsDev, &event, 1) == 1) {
         if (event.pressure) {
-            if (event.pressure > pi->dixdev->absolute->button_threshold) 
-                flags = KD_BUTTON_8;
-            else
-                flags = KD_BUTTON_1;
+            flags = KD_BUTTON_1;
 
             /* 
              * Here we test for the touch screen driver actually being on the
@@ -113,9 +110,8 @@ TsRead (int fd, void *closure)
 static Status
 TslibEnable (KdPointerInfo *pi)
 {
-  struct TslibPrivate *private = pi->driverPrivate;
+    struct TslibPrivate *private = pi->driverPrivate;
 
-    private->holdThumbEvents = 1;
     private->raw_event_hook = NULL;
     private->raw_event_closure = NULL;
     private->tsDev = ts_open(pi->path, 0);
@@ -126,9 +122,6 @@ TslibEnable (KdPointerInfo *pi)
             close(private->fd);
         return BadAlloc;
     }
-    if (pi->dixdev && pi->dixdev->absolute &&
-        pi->dixdev->absolute->button_threshold == 0)
-        pi->dixdev->absolute->button_threshold = 115;
 
     KdRegisterFd(private->fd, TsRead, pi);
   
@@ -141,12 +134,12 @@ TslibDisable (KdPointerInfo *pi)
 {
     struct TslibPrivate *private = pi->driverPrivate;
 
-    if (private->fd) {
-        KdUnregisterFd(pi, private->fd);
-        close(private->fd);
-    }
+    if (private->fd)
+        KdUnregisterFd(pi, private->fd, TRUE);
+
     if (private->tsDev)
         ts_close(private->tsDev);
+
     private->fd = 0;
     private->tsDev = NULL;
 }
@@ -156,7 +149,6 @@ static Status
 TslibInit (KdPointerInfo *pi)
 {
     int		        fd = 0, i = 0;
-    char                devpath[PATH_MAX], devname[TS_NAME_SIZE];
     DIR                 *inputdir = NULL;
     struct dirent       *inputent = NULL;
     struct tsdev        *tsDev = NULL;
diff-tree 8884a73a3f4efa8276c5e38b9573201574c4f1f6 (from f2903c12bb4bb0b7c94b96c55af8fa55507f9d7d)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Nov 27 22:39:56 2006 +0200

    xfree86/input: re-add support for disabling drag events

diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index be3368d..16e330d 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -90,16 +90,6 @@
 
 #include "mi.h"
 
-/******************************************************************************
- * debugging macro
- *****************************************************************************/
-#ifdef DEBUG
-static int      debug_level = 0;
-#define DBG(lvl, f) {if ((lvl) <= debug_level) f;}
-#else
-#define DBG(lvl, f)
-#endif
-
 xEvent *xf86Events = NULL;
 
 static Bool
@@ -140,33 +130,6 @@ xf86ProcessCommonOptions(LocalDevicePtr 
     }
 }
 
-void
-xf86AlwaysCoreControl(DeviceIntPtr pDev, IntegerCtrl *control)
-{
-}
-
-/***********************************************************************
- *
- * xf86XinputFinalizeInit --
- * 
- *	Create and initialize an integer feedback to control the always
- * core feature.
- *
- ***********************************************************************
- */
-void
-xf86XinputFinalizeInit(DeviceIntPtr	dev)
-{
-    LocalDevicePtr        local = (LocalDevicePtr)dev->public.devicePrivate;
-
-    if (InitIntegerFeedbackClassDeviceStruct(dev, xf86AlwaysCoreControl) == FALSE) {
-        ErrorF("Unable to init integer feedback for always core feature\n");
-    } else {
-        local->always_core_feedback = dev->intfeed;
-        dev->intfeed->ctrl.integer_displayed = (local->flags & XI86_ALWAYS_CORE) ? 1 : 0;
-    }
-}
-
 /***********************************************************************
  *
  * xf86ActivateDevice --
@@ -193,8 +156,6 @@ xf86ActivateDevice(LocalDevicePtr local)
         dev->public.devicePrivate = (pointer) local;
         local->dev = dev;      
         
-        xf86XinputFinalizeInit(dev);
-
         dev->coreEvents = local->flags & XI86_ALWAYS_CORE;
         RegisterOtherDevice(dev);
 
@@ -435,9 +396,9 @@ xf86PostMotionEvent(DeviceIntPtr	device,
     va_list var;
     int i = 0, nevents = 0;
     Bool drag = xf86SendDragEvents(device);
-    LocalDevicePtr local = (LocalDevicePtr) device->public.devicePrivate;
     int *valuators = NULL;
     int flags = 0;
+    xEvent *xE = NULL;
 
     if (is_absolute)
         flags = POINTER_ABSOLUTE;
@@ -460,8 +421,14 @@ xf86PostMotionEvent(DeviceIntPtr	device,
                                flags, first_valuator, num_valuators,
                                valuators);
 
-    for (i = 0; i < nevents; i++)
-        mieqEnqueue(device, xf86Events + i);
+    for (i = 0; i < nevents; i++) {
+        xE = xf86Events + i;
+        /* Don't post core motion events for devices not registered to send
+         * drag events. */
+        if (xE->u.u.type != MotionNotify || drag) {
+            mieqEnqueue(device, xf86Events + i);
+        }
+    }
 
     xfree(valuators);
 }
diff-tree f2903c12bb4bb0b7c94b96c55af8fa55507f9d7d (from d17ec01e8395a8f14b75a10c8bf082b3f5a4fb36)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Tue Nov 7 11:13:32 2006 +0200

    SyntheticMotion: don't dereference sprite.screen when not using Xinerama
    
    (cherry picked from aa052e43c6c293e14f78837e00c6b7581f9713bb commit)

diff --git a/dix/events.c b/dix/events.c
index 7cfe0ad..0a39dcd 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -328,7 +328,8 @@ static void ConfineToShape(RegionPtr sha
 static void PostNewCursor(void);
 
 #define SyntheticMotion(x, y) \
-    PostSyntheticMotion(x, y, sprite.screen, \
+    PostSyntheticMotion(x, y, noPanoramiXExtension ? 0 : \
+                              sprite.screen->myNum, \
                         syncEvents.playingEvents ? \
                           syncEvents.time.milliseconds : \
                           currentTime.milliseconds);
diff --git a/hw/kdrive/linux/keyboard.c b/hw/kdrive/linux/keyboard.c
index b7571f6..ad9907a 100644
--- a/hw/kdrive/linux/keyboard.c
+++ b/hw/kdrive/linux/keyboard.c
@@ -745,14 +745,11 @@ LinuxKeyboardEnable (KdKeyboardInfo *ki)
     cfsetispeed(&nTty, 9600);
     cfsetospeed(&nTty, 9600);
     tcsetattr(fd, TCSANOW, &nTty);
-    /* Our kernel cleverly ignores O_NONBLOCK.  Sigh. */
-#if 0
     /*
      * Flush any pending keystrokes
      */
     while ((n = read (fd, buf, sizeof (buf))) > 0)
 	;
-#endif
     KdRegisterFd (fd, LinuxKeyboardRead, ki);
     return Success;
 }
diff-tree d17ec01e8395a8f14b75a10c8bf082b3f5a4fb36 (from abe5e079af715713097ab0daad29a3e9f523c398)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Dec 1 00:41:41 2006 +0200

    remove CID support (bug #5553)
    
    Remove CID from all our fontpaths.
    (cherry picked from 69820a10e33e4582c192360996e866007114639d commit)

diff --git a/configure.ac b/configure.ac
index 1aa5455..851194c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -391,7 +391,7 @@ AC_ARG_WITH(mesa-source,     AS_HELP_STR
 AC_ARG_WITH(fontdir,         AS_HELP_STRING([--with-fontdir=FONTDIR], [Path to top level dir where fonts are installed (default: ${libdir}/X11/fonts)]),
                                 [ FONTDIR="$withval" ],
                                 [ FONTDIR="${libdir}/X11/fonts" ])
-DEFAULT_FONT_PATH="${FONTDIR}/misc/,${FONTDIR}/TTF/,${FONTDIR}/OTF,${FONTDIR}/Type1/,${FONTDIR}/CID/,${FONTDIR}/100dpi/,${FONTDIR}/75dpi/"
+DEFAULT_FONT_PATH="${FONTDIR}/misc/,${FONTDIR}/TTF/,${FONTDIR}/OTF,${FONTDIR}/Type1/,${FONTDIR}/100dpi/,${FONTDIR}/75dpi/"
 AC_ARG_WITH(default-font-path, AS_HELP_STRING([--with-default-font-path=PATH], [Comma separated list of font dirs]),
 				[ FONTPATH="$withval" ],
 				[ FONTPATH="${DEFAULT_FONT_PATH}" ])
diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am
index b373242..0c1306f 100644
--- a/hw/xfree86/Makefile.am
+++ b/hw/xfree86/Makefile.am
@@ -93,7 +93,6 @@ CPP_FILES_FLAGS = \
 	-DMISCFONTPATH="\"$(BASE_FONT_PATH)/misc\"" \
 	-DT1FONTPATH="\"$(BASE_FONT_PATH)/Type1\"" \
 	-DTRUETYPEFONTPATH="\"$(BASE_FONT_PATH)/TTF\"" \
-	-DCIDFONTPATH="\"$(BASE_FONT_PATH)/CID\"" \
 	-DDPI75FONTPATH="\"$(BASE_FONT_PATH)/75dpi\"" \
 	-DDPI100FONTPATH="\"$(BASE_FONT_PATH)/100dpi\"" \
 	-DMODULEPATH=\"$(DEFAULT_MODULE_PATH)\"
diff --git a/hw/xfree86/dixmods/type1mod.c b/hw/xfree86/dixmods/type1mod.c
index 48c1d04..3da53ea 100644
--- a/hw/xfree86/dixmods/type1mod.c
+++ b/hw/xfree86/dixmods/type1mod.c
@@ -57,9 +57,6 @@ static XF86ModuleVersionInfo VersRec =
 _X_EXPORT XF86ModuleData type1ModuleData = { &VersRec, type1Setup, NULL };
 
 extern void Type1RegisterFontFileFunctions(void);
-#ifdef BUILDCID
-extern void CIDRegisterFontFileFunctions(void);
-#endif
 
 FontModule type1Module = {
     Type1RegisterFontFileFunctions,
@@ -67,23 +64,11 @@ FontModule type1Module = {
     NULL
 };
 
-#ifdef BUILDCID
-FontModule CIDModule = {
-    CIDRegisterFontFileFunctions,
-    "CID",
-    NULL
-};
-#endif
-
 static pointer
 type1Setup(pointer module, pointer opts, int *errmaj, int *errmin)
 {
     type1Module.module = module;
     LoadFont(&type1Module);
-#ifdef BUILDCID
-    CIDModule.module = module;
-    LoadFont(&CIDModule);
-#endif
 
     /* Need a non-NULL return */
     return (pointer)1;
diff --git a/hw/xfree86/doc/man/xorg.conf.man.pre b/hw/xfree86/doc/man/xorg.conf.man.pre
index abf3146..8d52b2b 100644
--- a/hw/xfree86/doc/man/xorg.conf.man.pre
+++ b/hw/xfree86/doc/man/xorg.conf.man.pre
@@ -311,7 +311,6 @@ font path elements:
 .I __projectroot__/lib/X11/fonts/misc/
 .I __projectroot__/lib/X11/fonts/TTF/
 .I __projectroot__/lib/X11/fonts/Type1/
-.I __projectroot__/lib/X11/fonts/CID/
 .I __projectroot__/lib/X11/fonts/75dpi/
 .I __projectroot__/lib/X11/fonts/100dpi/
 .fi
@@ -326,7 +325,6 @@ The recommended font path contains the f
 .I __projectroot__/lib/X11/fonts/75dpi/:unscaled
 .I __projectroot__/lib/X11/fonts/100dpi/:unscaled
 .I __projectroot__/lib/X11/fonts/Type1/
-.I __projectroot__/lib/X11/fonts/CID/
 .I __projectroot__/lib/X11/fonts/Speedo/
 .I __projectroot__/lib/X11/fonts/75dpi/
 .I __projectroot__/lib/X11/fonts/100dpi/
diff --git a/hw/xfree86/xorgconf.cpp b/hw/xfree86/xorgconf.cpp
index 71abe13..1995045 100644
--- a/hw/xfree86/xorgconf.cpp
+++ b/hw/xfree86/xorgconf.cpp
@@ -56,7 +56,6 @@ XCOMM command (or a combination of both 
     FontPath	MISCFONTPATH
     FontPath	T1FONTPATH
     FontPath	TRUETYPEFONTPATH
-    FontPath	CIDFONTPATH
     FontPath	DPI75FONTPATH
     FontPath	DPI100FONTPATH
 
diff-tree abe5e079af715713097ab0daad29a3e9f523c398 (from 724f9cb578086e8483a2d0636dd6eb05d664d31c)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Wed Dec 6 07:58:03 2006 -0800

    Update pci.ids to 2006-12-06 from pciids.sf.net

diff --git a/hw/xfree86/scanpci/pci.ids b/hw/xfree86/scanpci/pci.ids
index c6f5653..d48e25c 100644
--- a/hw/xfree86/scanpci/pci.ids
+++ b/hw/xfree86/scanpci/pci.ids
@@ -11,7 +11,7 @@
 #	This file can be distributed under either the GNU General Public License
 #	(version 2 or higher) or the 3-clause BSD License.
 #
-#	Daily snapshot on Tue 2006-10-03 01:05:01
+#	Daily snapshot on Wed 2006-12-06 02:05:02
 #
 
 # Vendors, devices and subsystems. Please keep sorted.
@@ -3012,20 +3012,22 @@
 	2200  QLA2200 64-bit Fibre Channel Adapter
 		1077 0002  QLA2200
 	2300  QLA2300 64-bit Fibre Channel Adapter
-	2312  QLA2312 Fibre Channel Adapter
+	2312  ISP2312-based 2Gb Fibre Channel to PCI-X HBA
 		103c 0131  2Gb Fibre Channel - Single port [A7538A]
 		103c 12ba  2Gb Fibre Channel - Dual port [A6826A]
-	2322  QLA2322 Fibre Channel Adapter
-	2422  QLA2422 Fibre Channel Adapter
+	2322  ISP2322-based 2Gb Fibre Channel to PCI-X HBA
+	2422  ISP2422-based 4Gb Fibre Channel to PCI-X HBA
 		103c 12d7  4Gb Fibre Channel [AB379A]
 		103c 12dd  4Gb Fibre Channel [AB429A]
-	2432  QLA2432 Fibre Channel Adapter
-	3010  QLA3010 Network Adapter
-	3022  QLA3022 Network Adapter
-	4010  QLA4010 iSCSI TOE Adapter
-	4022  QLA4022 iSCSI TOE Adapter
-	6312  QLA6312 Fibre Channel Adapter
-	6322  QLA6322 Fibre Channel Adapter
+	2432  ISP2432-based 4Gb Fibre Channel to PCI Express HBA
+	3022  ISP4022-based Ethernet NIC
+	3032  ISP4032-based Ethernet NIC
+	4010  ISP4010-based iSCSI TOE HBA
+	4022  ISP4022-based iSCSI TOE HBA
+	4032  ISP4032-based iSCSI TOE IPv6 HBA
+	5432  SP232-based 4Gb Fibre Channel to PCI Express HBA
+	6312  SP202-based 2Gb Fibre Channel to PCI-X HBA
+	6322  SP212-based 2Gb Fibre Channel to PCI-X HBA
 1078  Cyrix Corporation
 	0000  5510 [Grappa]
 	0001  PCI Master
@@ -10565,7 +10567,9 @@
 		16be 1040  V.9X DSP Data Fax Modem
 	1043  PRO/Wireless LAN 2100 3B Mini PCI Adapter
 		103c 08b0  tc1100 tablet
+		8086 2522  Samsung P30 integrated WLAN
 		8086 2527  MIM2000/Centrino
+		8086 2581  Toshiba Satellite M10
 	1048  PRO/10GbE LR Server Adapter
 		8086 a01f  PRO/10GbE LR Server Adapter
 		8086 a11f  PRO/10GbE LR Server Adapter
@@ -10583,6 +10587,10 @@
 	1051  82801EB/ER (ICH5/ICH5R) integrated LAN Controller
 	1052  PRO/100 VM Network Connection
 	1053  PRO/100 VM Network Connection
+	1054  PRO/100 VE Network Connection
+	1055  PRO/100 VM Network Connection
+	1056  PRO/100 VE Network Connection
+	1057  PRO/100 VE Network Connection
 	1059  82551QM Ethernet Controller
 	105b  82546GB Gigabit Ethernet Controller (Copper)
 	105e  82571EB Gigabit Ethernet Controller
@@ -10673,19 +10681,30 @@
 	108c  82573E Gigabit Ethernet Controller (Copper)
 	108e  82573E KCS (Active Management)
 	108f  Active Management Technology - SOL
+	1091  PRO/100 VM Network Connection
 	1092  PRO/100 VE Network Connection
+	1093  PRO/100 VM Network Connection
+	1094  PRO/100 VE Network Connection
+	1095  PRO/100 VE Network Connection
 	1096  80003ES2LAN Gigabit Ethernet Controller (Copper)
 	1097  631xESB/632xESB DPT LAN Controller (Fiber)
 	1098  80003ES2LAN Gigabit Ethernet Controller (Serdes)
 	1099  82546GB Gigabit Ethernet Controller (Copper)
 		8086 1099  PRO/1000 GT Quad Port Server Adapter
 	109a  82573L Gigabit Ethernet Controller
+		1179 ff10  PRO/1000 PL
 		17aa 2001  ThinkPad T60
 		17aa 207e  Thinkpad X60s
 		8086 109a  PRO/1000 PL Network Connection
 	109b  82546GB PRO/1000 GF Quad Port Server Adapter
+	109e  82597EX 10GbE Ethernet Controller
+		8086 a01f  PRO/10GbE CX4 Server Adapter
+		8086 a11f  PRO/10GbE CX4 Server Adapter
 	10a0  82571EB PRO/1000 AT Quad Port Bypass Adapter
 	10a1  82571EB PRO/1000 AF Quad Port Bypass Adapter
+	10a4  82571EB Gigabit Ethernet Controller
+		8086 10a4  PRO/1000 PT Quad Port Server Adapter
+		8086 11a4  PRO/1000 PT Quad Port Server Adapter
 	10b0  82573L PRO/1000 PL Network Connection
 	10b2  82573V PRO/1000 PM Network Connection
 	10b3  82573E PRO/1000 PM Network Connection
@@ -10699,6 +10718,11 @@
 		8086 1093  PRO/1000 PT Desktop Adapter
 	10ba  80003ES2LAN Gigabit Ethernet Controller (Copper)
 	10bb  80003ES2LAN Gigabit Ethernet Controller (Serdes)
+	10bc  82571EB Gigabit Ethernet Controller (Copper)
+		8086 10bc  PRO/1000 PT Quad Port LP Server Adapter
+		8086 11bc  PRO/1000 PT Quad Port LP Server Adapter
+	10c4  82562GT 10/100 Network Connection
+	10c5  82562G 10/100 Network Connection
 	1107  PRO/1000 MF Server Adapter (LX)
 	1130  82815 815 Chipset Host Bridge and Memory Controller Hub
 		1025 1016  Travelmate 612 TX
@@ -10946,6 +10970,9 @@
 	1a31  82845 845 (Brookdale) Chipset AGP Bridge
 	1a38  5000 Series Chipset DMA Engine
 	1a48  PRO/10GbE SR Server Adapter
+	1b48  82597EX 10GbE Ethernet Controller
+		8086 a01f  PRO/10GbE LR Server Adapter
+		8086 a11f  PRO/10GbE LR Server Adapter
 	2410  82801AA ISA Bridge (LPC)
 	2411  82801AA IDE
 	2412  82801AA USB
@@ -10998,6 +11025,7 @@
 		147b 0507  TH7II-RAID
 		8086 4532  D815EEA2 mainboard
 	2445  82801BA/BAM AC'97 Audio
+		0e11 000b  Compaq Deskpro EN Audio
 		0e11 0088  Evo D500
 		1014 01c6  Netvista A40/A40p
 		1025 1016  Travelmate 612 TX
@@ -11010,6 +11038,7 @@
 		104d 80df  Vaio PCG-FX403
 	2448  82801 Mobile PCI Bridge
 		103c 099c  NX6110/NC6120
+		144d c00c  P30 notebook
 		1734 1055  Amilo M1420
 	2449  82801BA/BAM/CA/CAM Ethernet Controller
 		0e11 0012  EtherExpress PRO/100 VM
@@ -11129,6 +11158,7 @@
 		103c 0890  NC6000 laptop
 		103c 08b0  tc1100 tablet
 		1071 8160  MIM2000
+		144d c00c  P30 notebook
 		1462 5800  845PE Max (MS-6580)
 		1509 2990  Averatec 5110H laptop
 		1734 1004  D1451 Mainboard (SCENIC N300, i845GV)
@@ -11160,6 +11190,7 @@
 		103c 0890  NC6000 laptop
 		103c 08b0  tc1100 tablet
 		1071 8160  MIM2000
+		144d c00c  P30 notebook
 		1462 5800  845PE Max (MS-6580)
 		1509 2990  Averatec 5110H
 		1734 1004  D1451 Mainboard (SCENIC N300, i845GV)
@@ -11177,6 +11208,7 @@
 		103c 0890  NC6000 laptop
 		103c 08b0  tc1100 tablet
 		1071 8160  MIM2000
+		144d c00c  P30 notebook
 		1458 a002  GA-8PE667 Ultra
 		1462 5800  845PE Max (MS-6580)
 		1734 1005  D1451 (SCENIC N300, i845GV) Sigmatel STAC9750T
@@ -11190,6 +11222,7 @@
 		103c 0890  NC6000 laptop
 		103c 08b0  tc1100 tablet
 		1071 8160  MIM2000
+		144d c00c  P30 notebook
 	24c7  82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3
 		1014 0267  NetVista A30p
 		1014 052d  Thinkpad R50e model 1634
@@ -11201,6 +11234,7 @@
 		103c 0890  NC6000 laptop
 		103c 08b0  tc1100 tablet
 		1071 8160  MIM2000
+		144d c00c  P30 notebook
 		1462 5800  845PE Max (MS-6580)
 		1509 2990  Averatec 5110H
 		1734 1004  D1451 Mainboard (SCENIC N300, i845GV)
@@ -11215,6 +11249,7 @@
 		103c 0890  NC6000 laptop
 		103c 08b0  tc1100 tablet
 		1071 8160  MIM2000
+		144d c00c  P30 notebook
 		1734 1055  Amilo M1420
 		8086 4541  Latitude D400
 	24cb  82801DB (ICH4) IDE Controller
@@ -11225,6 +11260,7 @@
 		1734 1004  D1451 Mainboard (SCENIC N300, i845GV)
 		4c53 1090  Cx9 / Vx9 mainboard
 	24cc  82801DBM (ICH4-M) LPC Interface Bridge
+		144d c00c  P30 notebook
 		1734 1055  Amilo M1420
 	24cd  82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller
 		1014 0267  NetVista A30p
@@ -11240,6 +11276,7 @@
 		103c 08b0  tc1100 tablet
 		1071 8160  MIM2000
 		1179 ff00  Satellite 2430
+		144d c00c  P30 notebook
 		1462 3981  845PE Max (MS-6580)
 		1509 1968  Averatec 5110H
 		1734 1004  D1451 Mainboard (SCENIC N300, i845GV)
@@ -11278,6 +11315,7 @@
 		1014 02ed  xSeries server mainboard
 		1028 0156  Precision 360
 		1028 0169  Precision 470
+		103c 12bc  d330 uT
 		1043 80a6  P4P800 Mainboard
 		1458 24d2  GA-8IPE1000 Pro2 motherboard (865PE)
 		1462 7280  865PE Neo2 (MS-6728)
@@ -11304,6 +11342,7 @@
 		8086 4c43  Desktop Board D865GLC
 		8086 524c  D865PERL mainboard
 	24d5  82801EB/ER (ICH5/ICH5R) AC'97 Audio Controller
+		100a 147b  Abit IS7-E motherboard
 		1028 0169  Precision 470
 		103c 006a  NX9500
 		103c 12bc  d330 uT
@@ -11427,6 +11466,7 @@
 		1734 1004  D1451 Mainboard (SCENIC N300, i845GV)
 	2570  82865G/PE/P DRAM Controller/Host-Hub Interface
 		103c 006a  NX9500
+		103c 12bc  d330 uT
 		1043 80f2  P5P800-MX Mainboard
 		1458 2570  GA-8IPE1000 Pro2 motherboard (865PE)
 	2571  82865G/PE/P PCI to AGP Controller
@@ -11533,7 +11573,7 @@
 	25e5  5000 Series Chipset PCI Express x4 Port 5
 	25e6  5000 Series Chipset PCI Express x4 Port 6
 	25e7  5000 Series Chipset PCI Express x4 Port 7
-	25f0  5000 Series Chipset Error Reporting Registers
+	25f0  5000 Series Chipset FSB Registers
 	25f1  5000 Series Chipset Reserved Registers
 	25f3  5000 Series Chipset Reserved Registers
 	25f5  5000 Series Chipset FBD Registers
@@ -11554,7 +11594,7 @@
 	2609  E8500/E8501 PCI Express x8 Port B
 	260a  E8500/E8501 PCI Express x8 Port A
 	260c  E8500/E8501 IMI Registers
-	2610  E8500/E8501 Front Side Bus, Boot, and Interrupt Registers
+	2610  E8500/E8501 FSB Registers
 	2611  E8500/E8501 Address Mapping Registers
 	2612  E8500/E8501 RAS Registers
 	2613  E8500/E8501 Reserved Registers
@@ -11713,6 +11753,7 @@
 		107b 5048  E4500
 		8086 544e  DeskTop Board D945GTP
 	27b9  82801GBM (ICH7-M) LPC Interface Bridge
+		10f7 8338  Panasonic CF-Y5 laptop
 		17aa 2009  ThinkPad T60/R60 series
 	27bd  82801GHM (ICH7-M DH) LPC Interface Bridge
 	27c0  82801GB/GR/GH (ICH7 Family) Serial ATA Storage Controller IDE
@@ -11749,9 +11790,12 @@
 	27d6  82801G (ICH7 Family) PCI Express Port 4
 	27d8  82801G (ICH7 Family) High Definition Audio Controller
 		107b 5048  E4500
+		10f7 8338  Panasonic CF-Y5 laptop
+		1179 ff31  Toshiba America Information Systems:AC97 Data Fax SoftModem with SmartCP
 		152d 0753  Softmodem
 		17aa 2010  ThinkPad T60/R60 series
 	27da  82801G (ICH7 Family) SMBus Controller
+		10f7 8338  Panasonic CF-Y5 laptop
 		17aa 200f  ThinkPad T60/R60 series
 		8086 544e  DeskTop Board D945GTP
 	27dc  82801G (ICH7 Family) LAN Controller
@@ -11760,6 +11804,7 @@
 	27de  82801G (ICH7 Family) AC'97 Audio Controller
 	27df  82801G (ICH7 Family) IDE Controller
 		107b 5048  E4500
+		10f7 8338  Panasonic CF-Y5 laptop
 		17aa 200c  Thinkpad R60e model 0657
 		8086 544e  DeskTop Board D945GTP
 	27e0  82801GR/GH/GHM (ICH7 Family) PCI Express Port 5
@@ -11770,21 +11815,28 @@
 	2814  82801HO (ICH8DO) LPC Interface Controller
 	2815  Mobile LPC Interface Controller
 	2820  82801H (ICH8 Family) 4 port SATA IDE Controller
-	2821  82801HB (ICH8) SATA AHCI Controller
+		1462 7235  P965 Neo MS-7235 mainboard
+	2821  82801HR/HO/HH (ICH8R/DO/DH) 6 port SATA AHCI Controller
 	2822  82801HR/HO/HH (ICH8R/DO/DH) SATA RAID Controller
-	2824  82801HR/HO/HH (ICH8R/DO/DH) SATA AHCI Controller
+	2824  82801HB (ICH8) 4 port SATA AHCI Controller
 	2825  82801H (ICH8 Family) 2 port SATA IDE Controller
+		1462 7235  P965 Neo MS-7235 mainboard
 	2828  Mobile SATA IDE Controller
 	2829  Mobile SATA AHCI Controller
 	282a  Mobile SATA RAID Controller
 	2830  82801H (ICH8 Family) USB UHCI #1
+		1462 7235  P965 Neo MS-7235 mainboard
 	2831  82801H (ICH8 Family) USB UHCI #2
+		1462 7235  P965 Neo MS-7235 mainboard
 	2832  82801H (ICH8 Family) USB UHCI #3
 	2834  82801H (ICH8 Family) USB UHCI #4
+		1462 7235  P965 Neo MS-7235 mainboard
 	2835  82801H (ICH8 Family) USB UHCI #5
 	2836  82801H (ICH8 Family) USB2 EHCI #1
+		1462 7235  P965 Neo MS-7235 mainboard
 	283a  82801H (ICH8 Family) USB2 EHCI #2
 	283e  82801H (ICH8 Family) SMBus Controller
+		1462 7235  P965 Neo MS-7235 mainboard
 	283f  82801H (ICH8 Family) PCI Express Port 1
 	2841  82801H (ICH8 Family) PCI Express Port 2
 	2843  82801H (ICH8 Family) PCI Express Port 3
@@ -11831,12 +11883,15 @@
 	2a07  Mobile KT Controller
 	3092  Integrated RAID
 	3200  GD31244 PCI-X SATA HBA
+		1775 c200  C2K onboard SATA host bus adapter
 	3340  82855PM Processor to I/O Controller
 		1025 005a  TravelMate 290
 		103c 088c  NC8000 laptop
 		103c 0890  NC6000 laptop
 		103c 08b0  tc1100 tablet
+		144d c00c  P30 notebook
 	3341  82855PM Processor to AGP Controller
+		144d c00c  P30 notebook
 	3500  6311ESB/6321ESB PCI Express Upstream Port
 	3501  6310ESB PCI Express Upstream Port
 	3504  6311ESB/6321ESB I/OxAPIC Interrupt Controller
diff --git a/hw/xfree86/scanpci/xf86PciStdIds.h b/hw/xfree86/scanpci/xf86PciStdIds.h
index d86d686..0cf8d4e 100644
--- a/hw/xfree86/scanpci/xf86PciStdIds.h
+++ b/hw/xfree86/scanpci/xf86PciStdIds.h
@@ -5712,7 +5712,7 @@ static const char pci_device_1077_2200[]
 static const char pci_subsys_1077_2200_1077_0002[] = "QLA2200";
 #endif
 static const char pci_device_1077_2300[] = "QLA2300 64-bit Fibre Channel Adapter";
-static const char pci_device_1077_2312[] = "QLA2312 Fibre Channel Adapter";
+static const char pci_device_1077_2312[] = "ISP2312-based 2Gb Fibre Channel to PCI-X HBA";
 #endif
 #ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_1077_2312_103c_0131[] = "2Gb Fibre Channel - Single port [A7538A]";
@@ -5723,8 +5723,8 @@ static const char pci_subsys_1077_2312_1
 static const char pci_subsys_1077_2312_103c_12ba[] = "2Gb Fibre Channel - Dual port [A6826A]";
 #endif
 #ifdef VENDOR_INCLUDE_NONVIDEO
-static const char pci_device_1077_2322[] = "QLA2322 Fibre Channel Adapter";
-static const char pci_device_1077_2422[] = "QLA2422 Fibre Channel Adapter";
+static const char pci_device_1077_2322[] = "ISP2322-based 2Gb Fibre Channel to PCI-X HBA";
+static const char pci_device_1077_2422[] = "ISP2422-based 4Gb Fibre Channel to PCI-X HBA";
 #endif
 #ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_1077_2422_103c_12d7[] = "4Gb Fibre Channel [AB379A]";
@@ -5735,13 +5735,15 @@ static const char pci_subsys_1077_2422_1
 static const char pci_subsys_1077_2422_103c_12dd[] = "4Gb Fibre Channel [AB429A]";
 #endif
 #ifdef VENDOR_INCLUDE_NONVIDEO
-static const char pci_device_1077_2432[] = "QLA2432 Fibre Channel Adapter";
-static const char pci_device_1077_3010[] = "QLA3010 Network Adapter";
-static const char pci_device_1077_3022[] = "QLA3022 Network Adapter";
-static const char pci_device_1077_4010[] = "QLA4010 iSCSI TOE Adapter";
-static const char pci_device_1077_4022[] = "QLA4022 iSCSI TOE Adapter";
-static const char pci_device_1077_6312[] = "QLA6312 Fibre Channel Adapter";
-static const char pci_device_1077_6322[] = "QLA6322 Fibre Channel Adapter";
+static const char pci_device_1077_2432[] = "ISP2432-based 4Gb Fibre Channel to PCI Express HBA";
+static const char pci_device_1077_3022[] = "ISP4022-based Ethernet NIC";
+static const char pci_device_1077_3032[] = "ISP4032-based Ethernet NIC";
+static const char pci_device_1077_4010[] = "ISP4010-based iSCSI TOE HBA";
+static const char pci_device_1077_4022[] = "ISP4022-based iSCSI TOE HBA";
+static const char pci_device_1077_4032[] = "ISP4032-based iSCSI TOE IPv6 HBA";
+static const char pci_device_1077_5432[] = "SP232-based 4Gb Fibre Channel to PCI Express HBA";
+static const char pci_device_1077_6312[] = "SP202-based 2Gb Fibre Channel to PCI-X HBA";
+static const char pci_device_1077_6322[] = "SP212-based 2Gb Fibre Channel to PCI-X HBA";
 #endif
 static const char pci_vendor_1078[] = "Cyrix Corporation";
 static const char pci_device_1078_0000[] = "5510 [Grappa]";
@@ -20449,10 +20451,8 @@ static const char pci_device_19e7_1003[]
 static const char pci_device_19e7_1004[] = "STIX - 4 Port T1/E1 Card";
 static const char pci_device_19e7_1005[] = "STIX - 4 Port FXS Card";
 #endif
-#ifdef VENDOR_INCLUDE_NONVIDEO
 static const char pci_vendor_1a03[] = "ASPEED Technology, Inc.";
 static const char pci_device_1a03_2000[] = "AST2000";
-#endif
 #ifdef VENDOR_INCLUDE_NONVIDEO
 static const char pci_vendor_1a08[] = "Sierra semiconductor";
 static const char pci_device_1a08_0000[] = "SC15064";
@@ -21670,8 +21670,14 @@ static const char pci_device_8086_1043[]
 static const char pci_subsys_8086_1043_103c_08b0[] = "tc1100 tablet";
 #endif
 #ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_1043_8086_2522[] = "Samsung P30 integrated WLAN";
+#endif
+#ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_1043_8086_2527[] = "MIM2000/Centrino";
 #endif
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_1043_8086_2581[] = "Toshiba Satellite M10";
+#endif
 static const char pci_device_8086_1048[] = "PRO/10GbE LR Server Adapter";
 #ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_1048_8086_a01f[] = "PRO/10GbE LR Server Adapter";
@@ -21703,6 +21709,10 @@ static const char pci_subsys_8086_1050_8
 static const char pci_device_8086_1051[] = "82801EB/ER (ICH5/ICH5R) integrated LAN Controller";
 static const char pci_device_8086_1052[] = "PRO/100 VM Network Connection";
 static const char pci_device_8086_1053[] = "PRO/100 VM Network Connection";
+static const char pci_device_8086_1054[] = "PRO/100 VE Network Connection";
+static const char pci_device_8086_1055[] = "PRO/100 VM Network Connection";
+static const char pci_device_8086_1056[] = "PRO/100 VE Network Connection";
+static const char pci_device_8086_1057[] = "PRO/100 VE Network Connection";
 static const char pci_device_8086_1059[] = "82551QM Ethernet Controller";
 static const char pci_device_8086_105b[] = "82546GB Gigabit Ethernet Controller (Copper)";
 static const char pci_device_8086_105e[] = "82571EB Gigabit Ethernet Controller";
@@ -21897,7 +21907,11 @@ static const char pci_device_8086_108b[]
 static const char pci_device_8086_108c[] = "82573E Gigabit Ethernet Controller (Copper)";
 static const char pci_device_8086_108e[] = "82573E KCS (Active Management)";
 static const char pci_device_8086_108f[] = "Active Management Technology - SOL";
+static const char pci_device_8086_1091[] = "PRO/100 VM Network Connection";
 static const char pci_device_8086_1092[] = "PRO/100 VE Network Connection";
+static const char pci_device_8086_1093[] = "PRO/100 VM Network Connection";
+static const char pci_device_8086_1094[] = "PRO/100 VE Network Connection";
+static const char pci_device_8086_1095[] = "PRO/100 VE Network Connection";
 static const char pci_device_8086_1096[] = "80003ES2LAN Gigabit Ethernet Controller (Copper)";
 static const char pci_device_8086_1097[] = "631xESB/632xESB DPT LAN Controller (Fiber)";
 static const char pci_device_8086_1098[] = "80003ES2LAN Gigabit Ethernet Controller (Serdes)";
@@ -21907,6 +21921,9 @@ static const char pci_subsys_8086_1099_8
 #endif
 static const char pci_device_8086_109a[] = "82573L Gigabit Ethernet Controller";
 #ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_109a_1179_ff10[] = "PRO/1000 PL";
+#endif
+#ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_109a_17aa_2001[] = "ThinkPad T60";
 #endif
 #ifdef INIT_SUBSYS_INFO
@@ -21916,8 +21933,22 @@ static const char pci_subsys_8086_109a_1
 static const char pci_subsys_8086_109a_8086_109a[] = "PRO/1000 PL Network Connection";
 #endif
 static const char pci_device_8086_109b[] = "82546GB PRO/1000 GF Quad Port Server Adapter";
+static const char pci_device_8086_109e[] = "82597EX 10GbE Ethernet Controller";
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_109e_8086_a01f[] = "PRO/10GbE CX4 Server Adapter";
+#endif
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_109e_8086_a11f[] = "PRO/10GbE CX4 Server Adapter";
+#endif
 static const char pci_device_8086_10a0[] = "82571EB PRO/1000 AT Quad Port Bypass Adapter";
 static const char pci_device_8086_10a1[] = "82571EB PRO/1000 AF Quad Port Bypass Adapter";
+static const char pci_device_8086_10a4[] = "82571EB Gigabit Ethernet Controller";
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_10a4_8086_10a4[] = "PRO/1000 PT Quad Port Server Adapter";
+#endif
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_10a4_8086_11a4[] = "PRO/1000 PT Quad Port Server Adapter";
+#endif
 static const char pci_device_8086_10b0[] = "82573L PRO/1000 PL Network Connection";
 static const char pci_device_8086_10b2[] = "82573V PRO/1000 PM Network Connection";
 static const char pci_device_8086_10b3[] = "82573E PRO/1000 PM Network Connection";
@@ -21941,6 +21972,15 @@ static const char pci_subsys_8086_10b9_8
 #endif
 static const char pci_device_8086_10ba[] = "80003ES2LAN Gigabit Ethernet Controller (Copper)";
 static const char pci_device_8086_10bb[] = "80003ES2LAN Gigabit Ethernet Controller (Serdes)";
+static const char pci_device_8086_10bc[] = "82571EB Gigabit Ethernet Controller (Copper)";
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_10bc_8086_10bc[] = "PRO/1000 PT Quad Port LP Server Adapter";
+#endif
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_10bc_8086_11bc[] = "PRO/1000 PT Quad Port LP Server Adapter";
+#endif
+static const char pci_device_8086_10c4[] = "82562GT 10/100 Network Connection";
+static const char pci_device_8086_10c5[] = "82562G 10/100 Network Connection";
 static const char pci_device_8086_1107[] = "PRO/1000 MF Server Adapter (LX)";
 static const char pci_device_8086_1130[] = "82815 815 Chipset Host Bridge and Memory Controller Hub";
 #ifdef INIT_SUBSYS_INFO
@@ -22587,6 +22627,13 @@ static const char pci_subsys_8086_1a30_1
 static const char pci_device_8086_1a31[] = "82845 845 (Brookdale) Chipset AGP Bridge";
 static const char pci_device_8086_1a38[] = "5000 Series Chipset DMA Engine";
 static const char pci_device_8086_1a48[] = "PRO/10GbE SR Server Adapter";
+static const char pci_device_8086_1b48[] = "82597EX 10GbE Ethernet Controller";
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_1b48_8086_a01f[] = "PRO/10GbE LR Server Adapter";
+#endif
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_1b48_8086_a11f[] = "PRO/10GbE LR Server Adapter";
+#endif
 static const char pci_device_8086_2410[] = "82801AA ISA Bridge (LPC)";
 static const char pci_device_8086_2411[] = "82801AA IDE";
 static const char pci_device_8086_2412[] = "82801AA USB";
@@ -22706,6 +22753,9 @@ static const char pci_subsys_8086_2444_8
 #endif
 static const char pci_device_8086_2445[] = "82801BA/BAM AC'97 Audio";
 #ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_2445_0e11_000b[] = "Compaq Deskpro EN Audio";
+#endif
+#ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_2445_0e11_0088[] = "Evo D500";
 #endif
 #ifdef INIT_SUBSYS_INFO
@@ -22738,6 +22788,9 @@ static const char pci_device_8086_2448[]
 static const char pci_subsys_8086_2448_103c_099c[] = "NX6110/NC6120";
 #endif
 #ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_2448_144d_c00c[] = "P30 notebook";
+#endif
+#ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_2448_1734_1055[] = "Amilo M1420";
 #endif
 static const char pci_device_8086_2449[] = "82801BA/BAM/CA/CAM Ethernet Controller";
@@ -23045,6 +23098,9 @@ static const char pci_subsys_8086_24c2_1
 static const char pci_subsys_8086_24c2_1071_8160[] = "MIM2000";
 #endif
 #ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_24c2_144d_c00c[] = "P30 notebook";
+#endif
+#ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_24c2_1462_5800[] = "845PE Max (MS-6580)";
 #endif
 #ifdef INIT_SUBSYS_INFO
@@ -23134,6 +23190,9 @@ static const char pci_subsys_8086_24c4_1
 static const char pci_subsys_8086_24c4_1071_8160[] = "MIM2000";
 #endif
 #ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_24c4_144d_c00c[] = "P30 notebook";
+#endif
+#ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_24c4_1462_5800[] = "845PE Max (MS-6580)";
 #endif
 #ifdef INIT_SUBSYS_INFO
@@ -23183,6 +23242,9 @@ static const char pci_subsys_8086_24c5_1
 static const char pci_subsys_8086_24c5_1071_8160[] = "MIM2000";
 #endif
 #ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_24c5_144d_c00c[] = "P30 notebook";
+#endif
+#ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_24c5_1458_a002[] = "GA-8PE667 Ultra";
 #endif
 #ifdef INIT_SUBSYS_INFO
@@ -23219,6 +23281,9 @@ static const char pci_subsys_8086_24c6_1
 #ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_24c6_1071_8160[] = "MIM2000";
 #endif
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_24c6_144d_c00c[] = "P30 notebook";
+#endif
 static const char pci_device_8086_24c7[] = "82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3";
 #ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_24c7_1014_0267[] = "NetVista A30p";
@@ -23251,6 +23316,9 @@ static const char pci_subsys_8086_24c7_1
 static const char pci_subsys_8086_24c7_1071_8160[] = "MIM2000";
 #endif
 #ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_24c7_144d_c00c[] = "P30 notebook";
+#endif
+#ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_24c7_1462_5800[] = "845PE Max (MS-6580)";
 #endif
 #ifdef INIT_SUBSYS_INFO
@@ -23291,6 +23359,9 @@ static const char pci_subsys_8086_24ca_1
 static const char pci_subsys_8086_24ca_1071_8160[] = "MIM2000";
 #endif
 #ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_24ca_144d_c00c[] = "P30 notebook";
+#endif
+#ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_24ca_1734_1055[] = "Amilo M1420";
 #endif
 #ifdef INIT_SUBSYS_INFO
@@ -23317,6 +23388,9 @@ static const char pci_subsys_8086_24cb_4
 #endif
 static const char pci_device_8086_24cc[] = "82801DBM (ICH4-M) LPC Interface Bridge";
 #ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_24cc_144d_c00c[] = "P30 notebook";
+#endif
+#ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_24cc_1734_1055[] = "Amilo M1420";
 #endif
 static const char pci_device_8086_24cd[] = "82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller";
@@ -23360,6 +23434,9 @@ static const char pci_subsys_8086_24cd_1
 static const char pci_subsys_8086_24cd_1179_ff00[] = "Satellite 2430";
 #endif
 #ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_24cd_144d_c00c[] = "P30 notebook";
+#endif
+#ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_24cd_1462_3981[] = "845PE Max (MS-6580)";
 #endif
 #ifdef INIT_SUBSYS_INFO
@@ -23466,6 +23543,9 @@ static const char pci_subsys_8086_24d3_1
 static const char pci_subsys_8086_24d3_1028_0169[] = "Precision 470";
 #endif
 #ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_24d3_103c_12bc[] = "d330 uT";
+#endif
+#ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_24d3_1043_80a6[] = "P4P800 Mainboard";
 #endif
 #ifdef INIT_SUBSYS_INFO
@@ -23540,6 +23620,9 @@ static const char pci_subsys_8086_24d4_8
 #endif
 static const char pci_device_8086_24d5[] = "82801EB/ER (ICH5/ICH5R) AC'97 Audio Controller";
 #ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_24d5_100a_147b[] = "Abit IS7-E motherboard";
+#endif
+#ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_24d5_1028_0169[] = "Precision 470";
 #endif
 #ifdef INIT_SUBSYS_INFO
@@ -23835,6 +23918,9 @@ static const char pci_device_8086_2570[]
 static const char pci_subsys_8086_2570_103c_006a[] = "NX9500";
 #endif
 #ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_2570_103c_12bc[] = "d330 uT";
+#endif
+#ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_2570_1043_80f2[] = "P5P800-MX Mainboard";
 #endif
 #ifdef INIT_SUBSYS_INFO
@@ -24068,7 +24154,7 @@ static const char pci_device_8086_25e4[]
 static const char pci_device_8086_25e5[] = "5000 Series Chipset PCI Express x4 Port 5";
 static const char pci_device_8086_25e6[] = "5000 Series Chipset PCI Express x4 Port 6";
 static const char pci_device_8086_25e7[] = "5000 Series Chipset PCI Express x4 Port 7";
-static const char pci_device_8086_25f0[] = "5000 Series Chipset Error Reporting Registers";
+static const char pci_device_8086_25f0[] = "5000 Series Chipset FSB Registers";
 static const char pci_device_8086_25f1[] = "5000 Series Chipset Reserved Registers";
 static const char pci_device_8086_25f3[] = "5000 Series Chipset Reserved Registers";
 static const char pci_device_8086_25f5[] = "5000 Series Chipset FBD Registers";
@@ -24089,7 +24175,7 @@ static const char pci_device_8086_2608[]
 static const char pci_device_8086_2609[] = "E8500/E8501 PCI Express x8 Port B";
 static const char pci_device_8086_260a[] = "E8500/E8501 PCI Express x8 Port A";
 static const char pci_device_8086_260c[] = "E8500/E8501 IMI Registers";
-static const char pci_device_8086_2610[] = "E8500/E8501 Front Side Bus, Boot, and Interrupt Registers";
+static const char pci_device_8086_2610[] = "E8500/E8501 FSB Registers";
 static const char pci_device_8086_2611[] = "E8500/E8501 Address Mapping Registers";
 static const char pci_device_8086_2612[] = "E8500/E8501 RAS Registers";
 static const char pci_device_8086_2613[] = "E8500/E8501 Reserved Registers";
@@ -24400,6 +24486,9 @@ static const char pci_subsys_8086_27b8_8
 #endif
 static const char pci_device_8086_27b9[] = "82801GBM (ICH7-M) LPC Interface Bridge";
 #ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_27b9_10f7_8338[] = "Panasonic CF-Y5 laptop";
+#endif
+#ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_27b9_17aa_2009[] = "ThinkPad T60/R60 series";
 #endif
 static const char pci_device_8086_27bd[] = "82801GHM (ICH7-M DH) LPC Interface Bridge";
@@ -24474,6 +24563,12 @@ static const char pci_device_8086_27d8[]
 static const char pci_subsys_8086_27d8_107b_5048[] = "E4500";
 #endif
 #ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_27d8_10f7_8338[] = "Panasonic CF-Y5 laptop";
+#endif
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_27d8_1179_ff31[] = "Toshiba America Information Systems:AC97 Data Fax SoftModem with SmartCP";
+#endif
+#ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_27d8_152d_0753[] = "Softmodem";
 #endif
 #ifdef INIT_SUBSYS_INFO
@@ -24481,6 +24576,9 @@ static const char pci_subsys_8086_27d8_1
 #endif
 static const char pci_device_8086_27da[] = "82801G (ICH7 Family) SMBus Controller";
 #ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_27da_10f7_8338[] = "Panasonic CF-Y5 laptop";
+#endif
+#ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_27da_17aa_200f[] = "ThinkPad T60/R60 series";
 #endif
 #ifdef INIT_SUBSYS_INFO
@@ -24497,6 +24595,9 @@ static const char pci_device_8086_27df[]
 static const char pci_subsys_8086_27df_107b_5048[] = "E4500";
 #endif
 #ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_27df_10f7_8338[] = "Panasonic CF-Y5 laptop";
+#endif
+#ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_27df_17aa_200c[] = "Thinkpad R60e model 0657";
 #endif
 #ifdef INIT_SUBSYS_INFO
@@ -24510,21 +24611,42 @@ static const char pci_device_8086_2812[]
 static const char pci_device_8086_2814[] = "82801HO (ICH8DO) LPC Interface Controller";
 static const char pci_device_8086_2815[] = "Mobile LPC Interface Controller";
 static const char pci_device_8086_2820[] = "82801H (ICH8 Family) 4 port SATA IDE Controller";
-static const char pci_device_8086_2821[] = "82801HB (ICH8) SATA AHCI Controller";
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_2820_1462_7235[] = "P965 Neo MS-7235 mainboard";
+#endif
+static const char pci_device_8086_2821[] = "82801HR/HO/HH (ICH8R/DO/DH) 6 port SATA AHCI Controller";
 static const char pci_device_8086_2822[] = "82801HR/HO/HH (ICH8R/DO/DH) SATA RAID Controller";
-static const char pci_device_8086_2824[] = "82801HR/HO/HH (ICH8R/DO/DH) SATA AHCI Controller";
+static const char pci_device_8086_2824[] = "82801HB (ICH8) 4 port SATA AHCI Controller";
 static const char pci_device_8086_2825[] = "82801H (ICH8 Family) 2 port SATA IDE Controller";
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_2825_1462_7235[] = "P965 Neo MS-7235 mainboard";
+#endif
 static const char pci_device_8086_2828[] = "Mobile SATA IDE Controller";
 static const char pci_device_8086_2829[] = "Mobile SATA AHCI Controller";
 static const char pci_device_8086_282a[] = "Mobile SATA RAID Controller";
 static const char pci_device_8086_2830[] = "82801H (ICH8 Family) USB UHCI #1";
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_2830_1462_7235[] = "P965 Neo MS-7235 mainboard";
+#endif
 static const char pci_device_8086_2831[] = "82801H (ICH8 Family) USB UHCI #2";
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_2831_1462_7235[] = "P965 Neo MS-7235 mainboard";
+#endif
 static const char pci_device_8086_2832[] = "82801H (ICH8 Family) USB UHCI #3";
 static const char pci_device_8086_2834[] = "82801H (ICH8 Family) USB UHCI #4";
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_2834_1462_7235[] = "P965 Neo MS-7235 mainboard";
+#endif
 static const char pci_device_8086_2835[] = "82801H (ICH8 Family) USB UHCI #5";
 static const char pci_device_8086_2836[] = "82801H (ICH8 Family) USB2 EHCI #1";
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_2836_1462_7235[] = "P965 Neo MS-7235 mainboard";
+#endif
 static const char pci_device_8086_283a[] = "82801H (ICH8 Family) USB2 EHCI #2";
 static const char pci_device_8086_283e[] = "82801H (ICH8 Family) SMBus Controller";
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_283e_1462_7235[] = "P965 Neo MS-7235 mainboard";
+#endif
 static const char pci_device_8086_283f[] = "82801H (ICH8 Family) PCI Express Port 1";
 static const char pci_device_8086_2841[] = "82801H (ICH8 Family) PCI Express Port 2";
 static const char pci_device_8086_2843[] = "82801H (ICH8 Family) PCI Express Port 3";
@@ -24571,6 +24693,9 @@ static const char pci_device_8086_2a06[]
 static const char pci_device_8086_2a07[] = "Mobile KT Controller";
 static const char pci_device_8086_3092[] = "Integrated RAID";
 static const char pci_device_8086_3200[] = "GD31244 PCI-X SATA HBA";
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_3200_1775_c200[] = "C2K onboard SATA host bus adapter";
+#endif
 static const char pci_device_8086_3340[] = "82855PM Processor to I/O Controller";
 #ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_3340_1025_005a[] = "TravelMate 290";
@@ -24584,7 +24709,13 @@ static const char pci_subsys_8086_3340_1
 #ifdef INIT_SUBSYS_INFO
 static const char pci_subsys_8086_3340_103c_08b0[] = "tc1100 tablet";
 #endif
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_3340_144d_c00c[] = "P30 notebook";
+#endif
 static const char pci_device_8086_3341[] = "82855PM Processor to AGP Controller";
+#ifdef INIT_SUBSYS_INFO
+static const char pci_subsys_8086_3341_144d_c00c[] = "P30 notebook";
+#endif
 static const char pci_device_8086_3500[] = "6311ESB/6321ESB PCI Express Upstream Port";
 static const char pci_device_8086_3501[] = "6310ESB PCI Express Upstream Port";
 static const char pci_device_8086_3504[] = "6311ESB/6321ESB I/OxAPIC Interrupt Controller";
@@ -40853,10 +40984,18 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x103c, 0x08b0, pci_subsys_8086_1043_103c_08b0, 0};
 #undef pci_ss_info_103c_08b0
 #define pci_ss_info_103c_08b0 pci_ss_info_8086_1043_103c_08b0
+static const pciSubsystemInfo pci_ss_info_8086_1043_8086_2522 =
+	{0x8086, 0x2522, pci_subsys_8086_1043_8086_2522, 0};
+#undef pci_ss_info_8086_2522
+#define pci_ss_info_8086_2522 pci_ss_info_8086_1043_8086_2522
 static const pciSubsystemInfo pci_ss_info_8086_1043_8086_2527 =
 	{0x8086, 0x2527, pci_subsys_8086_1043_8086_2527, 0};
 #undef pci_ss_info_8086_2527
 #define pci_ss_info_8086_2527 pci_ss_info_8086_1043_8086_2527
+static const pciSubsystemInfo pci_ss_info_8086_1043_8086_2581 =
+	{0x8086, 0x2581, pci_subsys_8086_1043_8086_2581, 0};
+#undef pci_ss_info_8086_2581
+#define pci_ss_info_8086_2581 pci_ss_info_8086_1043_8086_2581
 static const pciSubsystemInfo pci_ss_info_8086_1048_8086_a01f =
 	{0x8086, 0xa01f, pci_subsys_8086_1048_8086_a01f, 0};
 #undef pci_ss_info_8086_a01f
@@ -41097,6 +41236,10 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x8086, 0x1099, pci_subsys_8086_1099_8086_1099, 0};
 #undef pci_ss_info_8086_1099
 #define pci_ss_info_8086_1099 pci_ss_info_8086_1099_8086_1099
+static const pciSubsystemInfo pci_ss_info_8086_109a_1179_ff10 =
+	{0x1179, 0xff10, pci_subsys_8086_109a_1179_ff10, 0};
+#undef pci_ss_info_1179_ff10
+#define pci_ss_info_1179_ff10 pci_ss_info_8086_109a_1179_ff10
 static const pciSubsystemInfo pci_ss_info_8086_109a_17aa_2001 =
 	{0x17aa, 0x2001, pci_subsys_8086_109a_17aa_2001, 0};
 #undef pci_ss_info_17aa_2001
@@ -41109,6 +41252,22 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x8086, 0x109a, pci_subsys_8086_109a_8086_109a, 0};
 #undef pci_ss_info_8086_109a
 #define pci_ss_info_8086_109a pci_ss_info_8086_109a_8086_109a
+static const pciSubsystemInfo pci_ss_info_8086_109e_8086_a01f =
+	{0x8086, 0xa01f, pci_subsys_8086_109e_8086_a01f, 0};
+#undef pci_ss_info_8086_a01f
+#define pci_ss_info_8086_a01f pci_ss_info_8086_109e_8086_a01f
+static const pciSubsystemInfo pci_ss_info_8086_109e_8086_a11f =
+	{0x8086, 0xa11f, pci_subsys_8086_109e_8086_a11f, 0};
+#undef pci_ss_info_8086_a11f
+#define pci_ss_info_8086_a11f pci_ss_info_8086_109e_8086_a11f
+static const pciSubsystemInfo pci_ss_info_8086_10a4_8086_10a4 =
+	{0x8086, 0x10a4, pci_subsys_8086_10a4_8086_10a4, 0};
+#undef pci_ss_info_8086_10a4
+#define pci_ss_info_8086_10a4 pci_ss_info_8086_10a4_8086_10a4
+static const pciSubsystemInfo pci_ss_info_8086_10a4_8086_11a4 =
+	{0x8086, 0x11a4, pci_subsys_8086_10a4_8086_11a4, 0};
+#undef pci_ss_info_8086_11a4
+#define pci_ss_info_8086_11a4 pci_ss_info_8086_10a4_8086_11a4
 static const pciSubsystemInfo pci_ss_info_8086_10b5_103c_3109 =
 	{0x103c, 0x3109, pci_subsys_8086_10b5_103c_3109, 0};
 #undef pci_ss_info_103c_3109
@@ -41129,6 +41288,14 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x8086, 0x1093, pci_subsys_8086_10b9_8086_1093, 0};
 #undef pci_ss_info_8086_1093
 #define pci_ss_info_8086_1093 pci_ss_info_8086_10b9_8086_1093
+static const pciSubsystemInfo pci_ss_info_8086_10bc_8086_10bc =
+	{0x8086, 0x10bc, pci_subsys_8086_10bc_8086_10bc, 0};
+#undef pci_ss_info_8086_10bc
+#define pci_ss_info_8086_10bc pci_ss_info_8086_10bc_8086_10bc
+static const pciSubsystemInfo pci_ss_info_8086_10bc_8086_11bc =
+	{0x8086, 0x11bc, pci_subsys_8086_10bc_8086_11bc, 0};
+#undef pci_ss_info_8086_11bc
+#define pci_ss_info_8086_11bc pci_ss_info_8086_10bc_8086_11bc
 static const pciSubsystemInfo pci_ss_info_8086_1130_1025_1016 =
 	{0x1025, 0x1016, pci_subsys_8086_1130_1025_1016, 0};
 #undef pci_ss_info_1025_1016
@@ -41929,6 +42096,14 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x1028, 0x010e, pci_subsys_8086_1a30_1028_010e, 0};
 #undef pci_ss_info_1028_010e
 #define pci_ss_info_1028_010e pci_ss_info_8086_1a30_1028_010e
+static const pciSubsystemInfo pci_ss_info_8086_1b48_8086_a01f =
+	{0x8086, 0xa01f, pci_subsys_8086_1b48_8086_a01f, 0};
+#undef pci_ss_info_8086_a01f
+#define pci_ss_info_8086_a01f pci_ss_info_8086_1b48_8086_a01f
+static const pciSubsystemInfo pci_ss_info_8086_1b48_8086_a11f =
+	{0x8086, 0xa11f, pci_subsys_8086_1b48_8086_a11f, 0};
+#undef pci_ss_info_8086_a11f
+#define pci_ss_info_8086_a11f pci_ss_info_8086_1b48_8086_a11f
 static const pciSubsystemInfo pci_ss_info_8086_2415_1028_0095 =
 	{0x1028, 0x0095, pci_subsys_8086_2415_1028_0095, 0};
 #undef pci_ss_info_1028_0095
@@ -42061,6 +42236,10 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x8086, 0x4532, pci_subsys_8086_2444_8086_4532, 0};
 #undef pci_ss_info_8086_4532
 #define pci_ss_info_8086_4532 pci_ss_info_8086_2444_8086_4532
+static const pciSubsystemInfo pci_ss_info_8086_2445_0e11_000b =
+	{0x0e11, 0x000b, pci_subsys_8086_2445_0e11_000b, 0};
+#undef pci_ss_info_0e11_000b
+#define pci_ss_info_0e11_000b pci_ss_info_8086_2445_0e11_000b
 static const pciSubsystemInfo pci_ss_info_8086_2445_0e11_0088 =
 	{0x0e11, 0x0088, pci_subsys_8086_2445_0e11_0088, 0};
 #undef pci_ss_info_0e11_0088
@@ -42101,6 +42280,10 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x103c, 0x099c, pci_subsys_8086_2448_103c_099c, 0};
 #undef pci_ss_info_103c_099c
 #define pci_ss_info_103c_099c pci_ss_info_8086_2448_103c_099c
+static const pciSubsystemInfo pci_ss_info_8086_2448_144d_c00c =
+	{0x144d, 0xc00c, pci_subsys_8086_2448_144d_c00c, 0};
+#undef pci_ss_info_144d_c00c
+#define pci_ss_info_144d_c00c pci_ss_info_8086_2448_144d_c00c
 static const pciSubsystemInfo pci_ss_info_8086_2448_1734_1055 =
 	{0x1734, 0x1055, pci_subsys_8086_2448_1734_1055, 0};
 #undef pci_ss_info_1734_1055
@@ -42477,6 +42660,10 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x1071, 0x8160, pci_subsys_8086_24c2_1071_8160, 0};
 #undef pci_ss_info_1071_8160
 #define pci_ss_info_1071_8160 pci_ss_info_8086_24c2_1071_8160
+static const pciSubsystemInfo pci_ss_info_8086_24c2_144d_c00c =
+	{0x144d, 0xc00c, pci_subsys_8086_24c2_144d_c00c, 0};
+#undef pci_ss_info_144d_c00c
+#define pci_ss_info_144d_c00c pci_ss_info_8086_24c2_144d_c00c
 static const pciSubsystemInfo pci_ss_info_8086_24c2_1462_5800 =
 	{0x1462, 0x5800, pci_subsys_8086_24c2_1462_5800, 0};
 #undef pci_ss_info_1462_5800
@@ -42593,6 +42780,10 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x1071, 0x8160, pci_subsys_8086_24c4_1071_8160, 0};
 #undef pci_ss_info_1071_8160
 #define pci_ss_info_1071_8160 pci_ss_info_8086_24c4_1071_8160
+static const pciSubsystemInfo pci_ss_info_8086_24c4_144d_c00c =
+	{0x144d, 0xc00c, pci_subsys_8086_24c4_144d_c00c, 0};
+#undef pci_ss_info_144d_c00c
+#define pci_ss_info_144d_c00c pci_ss_info_8086_24c4_144d_c00c
 static const pciSubsystemInfo pci_ss_info_8086_24c4_1462_5800 =
 	{0x1462, 0x5800, pci_subsys_8086_24c4_1462_5800, 0};
 #undef pci_ss_info_1462_5800
@@ -42657,6 +42848,10 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x1071, 0x8160, pci_subsys_8086_24c5_1071_8160, 0};
 #undef pci_ss_info_1071_8160
 #define pci_ss_info_1071_8160 pci_ss_info_8086_24c5_1071_8160
+static const pciSubsystemInfo pci_ss_info_8086_24c5_144d_c00c =
+	{0x144d, 0xc00c, pci_subsys_8086_24c5_144d_c00c, 0};
+#undef pci_ss_info_144d_c00c
+#define pci_ss_info_144d_c00c pci_ss_info_8086_24c5_144d_c00c
 static const pciSubsystemInfo pci_ss_info_8086_24c5_1458_a002 =
 	{0x1458, 0xa002, pci_subsys_8086_24c5_1458_a002, 0};
 #undef pci_ss_info_1458_a002
@@ -42705,6 +42900,10 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x1071, 0x8160, pci_subsys_8086_24c6_1071_8160, 0};
 #undef pci_ss_info_1071_8160
 #define pci_ss_info_1071_8160 pci_ss_info_8086_24c6_1071_8160
+static const pciSubsystemInfo pci_ss_info_8086_24c6_144d_c00c =
+	{0x144d, 0xc00c, pci_subsys_8086_24c6_144d_c00c, 0};
+#undef pci_ss_info_144d_c00c
+#define pci_ss_info_144d_c00c pci_ss_info_8086_24c6_144d_c00c
 static const pciSubsystemInfo pci_ss_info_8086_24c7_1014_0267 =
 	{0x1014, 0x0267, pci_subsys_8086_24c7_1014_0267, 0};
 #undef pci_ss_info_1014_0267
@@ -42745,6 +42944,10 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x1071, 0x8160, pci_subsys_8086_24c7_1071_8160, 0};
 #undef pci_ss_info_1071_8160
 #define pci_ss_info_1071_8160 pci_ss_info_8086_24c7_1071_8160
+static const pciSubsystemInfo pci_ss_info_8086_24c7_144d_c00c =
+	{0x144d, 0xc00c, pci_subsys_8086_24c7_144d_c00c, 0};
+#undef pci_ss_info_144d_c00c
+#define pci_ss_info_144d_c00c pci_ss_info_8086_24c7_144d_c00c
 static const pciSubsystemInfo pci_ss_info_8086_24c7_1462_5800 =
 	{0x1462, 0x5800, pci_subsys_8086_24c7_1462_5800, 0};
 #undef pci_ss_info_1462_5800
@@ -42797,6 +43000,10 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x1071, 0x8160, pci_subsys_8086_24ca_1071_8160, 0};
 #undef pci_ss_info_1071_8160
 #define pci_ss_info_1071_8160 pci_ss_info_8086_24ca_1071_8160
+static const pciSubsystemInfo pci_ss_info_8086_24ca_144d_c00c =
+	{0x144d, 0xc00c, pci_subsys_8086_24ca_144d_c00c, 0};
+#undef pci_ss_info_144d_c00c
+#define pci_ss_info_144d_c00c pci_ss_info_8086_24ca_144d_c00c
 static const pciSubsystemInfo pci_ss_info_8086_24ca_1734_1055 =
 	{0x1734, 0x1055, pci_subsys_8086_24ca_1734_1055, 0};
 #undef pci_ss_info_1734_1055
@@ -42829,6 +43036,10 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x4c53, 0x1090, pci_subsys_8086_24cb_4c53_1090, 0};
 #undef pci_ss_info_4c53_1090
 #define pci_ss_info_4c53_1090 pci_ss_info_8086_24cb_4c53_1090
+static const pciSubsystemInfo pci_ss_info_8086_24cc_144d_c00c =
+	{0x144d, 0xc00c, pci_subsys_8086_24cc_144d_c00c, 0};
+#undef pci_ss_info_144d_c00c
+#define pci_ss_info_144d_c00c pci_ss_info_8086_24cc_144d_c00c
 static const pciSubsystemInfo pci_ss_info_8086_24cc_1734_1055 =
 	{0x1734, 0x1055, pci_subsys_8086_24cc_1734_1055, 0};
 #undef pci_ss_info_1734_1055
@@ -42885,6 +43096,10 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x1179, 0xff00, pci_subsys_8086_24cd_1179_ff00, 0};
 #undef pci_ss_info_1179_ff00
 #define pci_ss_info_1179_ff00 pci_ss_info_8086_24cd_1179_ff00
+static const pciSubsystemInfo pci_ss_info_8086_24cd_144d_c00c =
+	{0x144d, 0xc00c, pci_subsys_8086_24cd_144d_c00c, 0};
+#undef pci_ss_info_144d_c00c
+#define pci_ss_info_144d_c00c pci_ss_info_8086_24cd_144d_c00c
 static const pciSubsystemInfo pci_ss_info_8086_24cd_1462_3981 =
 	{0x1462, 0x3981, pci_subsys_8086_24cd_1462_3981, 0};
 #undef pci_ss_info_1462_3981
@@ -43021,6 +43236,10 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x1028, 0x0169, pci_subsys_8086_24d3_1028_0169, 0};
 #undef pci_ss_info_1028_0169
 #define pci_ss_info_1028_0169 pci_ss_info_8086_24d3_1028_0169
+static const pciSubsystemInfo pci_ss_info_8086_24d3_103c_12bc =
+	{0x103c, 0x12bc, pci_subsys_8086_24d3_103c_12bc, 0};
+#undef pci_ss_info_103c_12bc
+#define pci_ss_info_103c_12bc pci_ss_info_8086_24d3_103c_12bc
 static const pciSubsystemInfo pci_ss_info_8086_24d3_1043_80a6 =
 	{0x1043, 0x80a6, pci_subsys_8086_24d3_1043_80a6, 0};
 #undef pci_ss_info_1043_80a6
@@ -43117,6 +43336,10 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x8086, 0x524c, pci_subsys_8086_24d4_8086_524c, 0};
 #undef pci_ss_info_8086_524c
 #define pci_ss_info_8086_524c pci_ss_info_8086_24d4_8086_524c
+static const pciSubsystemInfo pci_ss_info_8086_24d5_100a_147b =
+	{0x100a, 0x147b, pci_subsys_8086_24d5_100a_147b, 0};
+#undef pci_ss_info_100a_147b
+#define pci_ss_info_100a_147b pci_ss_info_8086_24d5_100a_147b
 static const pciSubsystemInfo pci_ss_info_8086_24d5_1028_0169 =
 	{0x1028, 0x0169, pci_subsys_8086_24d5_1028_0169, 0};
 #undef pci_ss_info_1028_0169
@@ -43461,6 +43684,10 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x103c, 0x006a, pci_subsys_8086_2570_103c_006a, 0};
 #undef pci_ss_info_103c_006a
 #define pci_ss_info_103c_006a pci_ss_info_8086_2570_103c_006a
+static const pciSubsystemInfo pci_ss_info_8086_2570_103c_12bc =
+	{0x103c, 0x12bc, pci_subsys_8086_2570_103c_12bc, 0};
+#undef pci_ss_info_103c_12bc
+#define pci_ss_info_103c_12bc pci_ss_info_8086_2570_103c_12bc
 static const pciSubsystemInfo pci_ss_info_8086_2570_1043_80f2 =
 	{0x1043, 0x80f2, pci_subsys_8086_2570_1043_80f2, 0};
 #undef pci_ss_info_1043_80f2
@@ -44021,6 +44248,10 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x8086, 0x544e, pci_subsys_8086_27b8_8086_544e, 0};
 #undef pci_ss_info_8086_544e
 #define pci_ss_info_8086_544e pci_ss_info_8086_27b8_8086_544e
+static const pciSubsystemInfo pci_ss_info_8086_27b9_10f7_8338 =
+	{0x10f7, 0x8338, pci_subsys_8086_27b9_10f7_8338, 0};
+#undef pci_ss_info_10f7_8338
+#define pci_ss_info_10f7_8338 pci_ss_info_8086_27b9_10f7_8338
 static const pciSubsystemInfo pci_ss_info_8086_27b9_17aa_2009 =
 	{0x17aa, 0x2009, pci_subsys_8086_27b9_17aa_2009, 0};
 #undef pci_ss_info_17aa_2009
@@ -44097,6 +44328,14 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x107b, 0x5048, pci_subsys_8086_27d8_107b_5048, 0};
 #undef pci_ss_info_107b_5048
 #define pci_ss_info_107b_5048 pci_ss_info_8086_27d8_107b_5048
+static const pciSubsystemInfo pci_ss_info_8086_27d8_10f7_8338 =
+	{0x10f7, 0x8338, pci_subsys_8086_27d8_10f7_8338, 0};
+#undef pci_ss_info_10f7_8338
+#define pci_ss_info_10f7_8338 pci_ss_info_8086_27d8_10f7_8338
+static const pciSubsystemInfo pci_ss_info_8086_27d8_1179_ff31 =
+	{0x1179, 0xff31, pci_subsys_8086_27d8_1179_ff31, 0};
+#undef pci_ss_info_1179_ff31
+#define pci_ss_info_1179_ff31 pci_ss_info_8086_27d8_1179_ff31
 static const pciSubsystemInfo pci_ss_info_8086_27d8_152d_0753 =
 	{0x152d, 0x0753, pci_subsys_8086_27d8_152d_0753, 0};
 #undef pci_ss_info_152d_0753
@@ -44105,6 +44344,10 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x17aa, 0x2010, pci_subsys_8086_27d8_17aa_2010, 0};
 #undef pci_ss_info_17aa_2010
 #define pci_ss_info_17aa_2010 pci_ss_info_8086_27d8_17aa_2010
+static const pciSubsystemInfo pci_ss_info_8086_27da_10f7_8338 =
+	{0x10f7, 0x8338, pci_subsys_8086_27da_10f7_8338, 0};
+#undef pci_ss_info_10f7_8338
+#define pci_ss_info_10f7_8338 pci_ss_info_8086_27da_10f7_8338
 static const pciSubsystemInfo pci_ss_info_8086_27da_17aa_200f =
 	{0x17aa, 0x200f, pci_subsys_8086_27da_17aa_200f, 0};
 #undef pci_ss_info_17aa_200f
@@ -44121,6 +44364,10 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x107b, 0x5048, pci_subsys_8086_27df_107b_5048, 0};
 #undef pci_ss_info_107b_5048
 #define pci_ss_info_107b_5048 pci_ss_info_8086_27df_107b_5048
+static const pciSubsystemInfo pci_ss_info_8086_27df_10f7_8338 =
+	{0x10f7, 0x8338, pci_subsys_8086_27df_10f7_8338, 0};
+#undef pci_ss_info_10f7_8338
+#define pci_ss_info_10f7_8338 pci_ss_info_8086_27df_10f7_8338
 static const pciSubsystemInfo pci_ss_info_8086_27df_17aa_200c =
 	{0x17aa, 0x200c, pci_subsys_8086_27df_17aa_200c, 0};
 #undef pci_ss_info_17aa_200c
@@ -44129,6 +44376,38 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x8086, 0x544e, pci_subsys_8086_27df_8086_544e, 0};
 #undef pci_ss_info_8086_544e
 #define pci_ss_info_8086_544e pci_ss_info_8086_27df_8086_544e
+static const pciSubsystemInfo pci_ss_info_8086_2820_1462_7235 =
+	{0x1462, 0x7235, pci_subsys_8086_2820_1462_7235, 0};
+#undef pci_ss_info_1462_7235
+#define pci_ss_info_1462_7235 pci_ss_info_8086_2820_1462_7235
+static const pciSubsystemInfo pci_ss_info_8086_2825_1462_7235 =
+	{0x1462, 0x7235, pci_subsys_8086_2825_1462_7235, 0};
+#undef pci_ss_info_1462_7235
+#define pci_ss_info_1462_7235 pci_ss_info_8086_2825_1462_7235
+static const pciSubsystemInfo pci_ss_info_8086_2830_1462_7235 =
+	{0x1462, 0x7235, pci_subsys_8086_2830_1462_7235, 0};
+#undef pci_ss_info_1462_7235
+#define pci_ss_info_1462_7235 pci_ss_info_8086_2830_1462_7235
+static const pciSubsystemInfo pci_ss_info_8086_2831_1462_7235 =
+	{0x1462, 0x7235, pci_subsys_8086_2831_1462_7235, 0};
+#undef pci_ss_info_1462_7235
+#define pci_ss_info_1462_7235 pci_ss_info_8086_2831_1462_7235
+static const pciSubsystemInfo pci_ss_info_8086_2834_1462_7235 =
+	{0x1462, 0x7235, pci_subsys_8086_2834_1462_7235, 0};
+#undef pci_ss_info_1462_7235
+#define pci_ss_info_1462_7235 pci_ss_info_8086_2834_1462_7235
+static const pciSubsystemInfo pci_ss_info_8086_2836_1462_7235 =
+	{0x1462, 0x7235, pci_subsys_8086_2836_1462_7235, 0};
+#undef pci_ss_info_1462_7235
+#define pci_ss_info_1462_7235 pci_ss_info_8086_2836_1462_7235
+static const pciSubsystemInfo pci_ss_info_8086_283e_1462_7235 =
+	{0x1462, 0x7235, pci_subsys_8086_283e_1462_7235, 0};
+#undef pci_ss_info_1462_7235
+#define pci_ss_info_1462_7235 pci_ss_info_8086_283e_1462_7235
+static const pciSubsystemInfo pci_ss_info_8086_3200_1775_c200 =
+	{0x1775, 0xc200, pci_subsys_8086_3200_1775_c200, 0};
+#undef pci_ss_info_1775_c200
+#define pci_ss_info_1775_c200 pci_ss_info_8086_3200_1775_c200
 static const pciSubsystemInfo pci_ss_info_8086_3340_1025_005a =
 	{0x1025, 0x005a, pci_subsys_8086_3340_1025_005a, 0};
 #undef pci_ss_info_1025_005a
@@ -44145,6 +44424,14 @@ static const pciSubsystemInfo pci_ss_inf
 	{0x103c, 0x08b0, pci_subsys_8086_3340_103c_08b0, 0};
 #undef pci_ss_info_103c_08b0
 #define pci_ss_info_103c_08b0 pci_ss_info_8086_3340_103c_08b0
+static const pciSubsystemInfo pci_ss_info_8086_3340_144d_c00c =
+	{0x144d, 0xc00c, pci_subsys_8086_3340_144d_c00c, 0};
+#undef pci_ss_info_144d_c00c
+#define pci_ss_info_144d_c00c pci_ss_info_8086_3340_144d_c00c
+static const pciSubsystemInfo pci_ss_info_8086_3341_144d_c00c =
+	{0x144d, 0xc00c, pci_subsys_8086_3341_144d_c00c, 0};
+#undef pci_ss_info_144d_c00c
+#define pci_ss_info_144d_c00c pci_ss_info_8086_3341_144d_c00c
 static const pciSubsystemInfo pci_ss_info_8086_3575_0e11_0030 =
 	{0x0e11, 0x0030, pci_subsys_8086_3575_0e11_0030, 0};
 #undef pci_ss_info_0e11_0030
@@ -48590,10 +48877,12 @@ static const pciSubsystemInfo *pci_ss_li
 	NULL
 };
 #define pci_ss_list_1077_2432 NULL
-#define pci_ss_list_1077_3010 NULL
 #define pci_ss_list_1077_3022 NULL
+#define pci_ss_list_1077_3032 NULL
 #define pci_ss_list_1077_4010 NULL
 #define pci_ss_list_1077_4022 NULL
+#define pci_ss_list_1077_4032 NULL
+#define pci_ss_list_1077_5432 NULL
 #define pci_ss_list_1077_6312 NULL
 #define pci_ss_list_1077_6322 NULL
 #endif
@@ -55730,7 +56019,9 @@ static const pciSubsystemInfo *pci_ss_li
 };
 static const pciSubsystemInfo *pci_ss_list_8086_1043[] = {
 	&pci_ss_info_8086_1043_103c_08b0,
+	&pci_ss_info_8086_1043_8086_2522,
 	&pci_ss_info_8086_1043_8086_2527,
+	&pci_ss_info_8086_1043_8086_2581,
 	NULL
 };
 static const pciSubsystemInfo *pci_ss_list_8086_1048[] = {
@@ -55754,6 +56045,10 @@ static const pciSubsystemInfo *pci_ss_li
 #define pci_ss_list_8086_1051 NULL
 #define pci_ss_list_8086_1052 NULL
 #define pci_ss_list_8086_1053 NULL
+#define pci_ss_list_8086_1054 NULL
+#define pci_ss_list_8086_1055 NULL
+#define pci_ss_list_8086_1056 NULL
+#define pci_ss_list_8086_1057 NULL
 #define pci_ss_list_8086_1059 NULL
 #define pci_ss_list_8086_105b NULL
 static const pciSubsystemInfo *pci_ss_list_8086_105e[] = {
@@ -55874,7 +56169,11 @@ static const pciSubsystemInfo *pci_ss_li
 #define pci_ss_list_8086_108c NULL
 #define pci_ss_list_8086_108e NULL
 #define pci_ss_list_8086_108f NULL
+#define pci_ss_list_8086_1091 NULL
 #define pci_ss_list_8086_1092 NULL
+#define pci_ss_list_8086_1093 NULL
+#define pci_ss_list_8086_1094 NULL
+#define pci_ss_list_8086_1095 NULL
 #define pci_ss_list_8086_1096 NULL
 #define pci_ss_list_8086_1097 NULL
 #define pci_ss_list_8086_1098 NULL
@@ -55883,14 +56182,25 @@ static const pciSubsystemInfo *pci_ss_li
 	NULL
 };
 static const pciSubsystemInfo *pci_ss_list_8086_109a[] = {
+	&pci_ss_info_8086_109a_1179_ff10,
 	&pci_ss_info_8086_109a_17aa_2001,
 	&pci_ss_info_8086_109a_17aa_207e,
 	&pci_ss_info_8086_109a_8086_109a,
 	NULL
 };
 #define pci_ss_list_8086_109b NULL
+static const pciSubsystemInfo *pci_ss_list_8086_109e[] = {
+	&pci_ss_info_8086_109e_8086_a01f,
+	&pci_ss_info_8086_109e_8086_a11f,
+	NULL
+};
 #define pci_ss_list_8086_10a0 NULL
 #define pci_ss_list_8086_10a1 NULL
+static const pciSubsystemInfo *pci_ss_list_8086_10a4[] = {
+	&pci_ss_info_8086_10a4_8086_10a4,
+	&pci_ss_info_8086_10a4_8086_11a4,
+	NULL
+};
 #define pci_ss_list_8086_10b0 NULL
 #define pci_ss_list_8086_10b2 NULL
 #define pci_ss_list_8086_10b3 NULL
@@ -55908,6 +56218,13 @@ static const pciSubsystemInfo *pci_ss_li
 };
 #define pci_ss_list_8086_10ba NULL
 #define pci_ss_list_8086_10bb NULL
+static const pciSubsystemInfo *pci_ss_list_8086_10bc[] = {
+	&pci_ss_info_8086_10bc_8086_10bc,
+	&pci_ss_info_8086_10bc_8086_11bc,
+	NULL
+};
+#define pci_ss_list_8086_10c4 NULL
+#define pci_ss_list_8086_10c5 NULL
 #define pci_ss_list_8086_1107 NULL
 static const pciSubsystemInfo *pci_ss_list_8086_1130[] = {
 	&pci_ss_info_8086_1130_1025_1016,
@@ -56176,6 +56493,11 @@ static const pciSubsystemInfo *pci_ss_li
 #define pci_ss_list_8086_1a31 NULL
 #define pci_ss_list_8086_1a38 NULL
 #define pci_ss_list_8086_1a48 NULL
+static const pciSubsystemInfo *pci_ss_list_8086_1b48[] = {
+	&pci_ss_info_8086_1b48_8086_a01f,
+	&pci_ss_info_8086_1b48_8086_a11f,
+	NULL
+};
 #define pci_ss_list_8086_2410 NULL
 #define pci_ss_list_8086_2411 NULL
 #define pci_ss_list_8086_2412 NULL
@@ -56238,6 +56560,7 @@ static const pciSubsystemInfo *pci_ss_li
 	NULL
 };
 static const pciSubsystemInfo *pci_ss_list_8086_2445[] = {
+	&pci_ss_info_8086_2445_0e11_000b,
 	&pci_ss_info_8086_2445_0e11_0088,
 	&pci_ss_info_8086_2445_1014_01c6,
 	&pci_ss_info_8086_2445_1025_1016,
@@ -56254,6 +56577,7 @@ static const pciSubsystemInfo *pci_ss_li
 };
 static const pciSubsystemInfo *pci_ss_list_8086_2448[] = {
 	&pci_ss_info_8086_2448_103c_099c,
+	&pci_ss_info_8086_2448_144d_c00c,
 	&pci_ss_info_8086_2448_1734_1055,
 	NULL
 };
@@ -56401,6 +56725,7 @@ static const pciSubsystemInfo *pci_ss_li
 	&pci_ss_info_8086_24c2_103c_0890,
 	&pci_ss_info_8086_24c2_103c_08b0,
 	&pci_ss_info_8086_24c2_1071_8160,
+	&pci_ss_info_8086_24c2_144d_c00c,
 	&pci_ss_info_8086_24c2_1462_5800,
 	&pci_ss_info_8086_24c2_1509_2990,
 	&pci_ss_info_8086_24c2_1734_1004,
@@ -56436,6 +56761,7 @@ static const pciSubsystemInfo *pci_ss_li
 	&pci_ss_info_8086_24c4_103c_0890,
 	&pci_ss_info_8086_24c4_103c_08b0,
 	&pci_ss_info_8086_24c4_1071_8160,
+	&pci_ss_info_8086_24c4_144d_c00c,
 	&pci_ss_info_8086_24c4_1462_5800,
 	&pci_ss_info_8086_24c4_1509_2990,
 	&pci_ss_info_8086_24c4_1734_1004,
@@ -56455,6 +56781,7 @@ static const pciSubsystemInfo *pci_ss_li
 	&pci_ss_info_8086_24c5_103c_0890,
 	&pci_ss_info_8086_24c5_103c_08b0,
 	&pci_ss_info_8086_24c5_1071_8160,
+	&pci_ss_info_8086_24c5_144d_c00c,
 	&pci_ss_info_8086_24c5_1458_a002,
 	&pci_ss_info_8086_24c5_1462_5800,
 	&pci_ss_info_8086_24c5_1734_1005,
@@ -56470,6 +56797,7 @@ static const pciSubsystemInfo *pci_ss_li
 	&pci_ss_info_8086_24c6_103c_0890,
 	&pci_ss_info_8086_24c6_103c_08b0,
 	&pci_ss_info_8086_24c6_1071_8160,
+	&pci_ss_info_8086_24c6_144d_c00c,
 	NULL
 };
 static const pciSubsystemInfo *pci_ss_list_8086_24c7[] = {
@@ -56483,6 +56811,7 @@ static const pciSubsystemInfo *pci_ss_li
 	&pci_ss_info_8086_24c7_103c_0890,
 	&pci_ss_info_8086_24c7_103c_08b0,
 	&pci_ss_info_8086_24c7_1071_8160,
+	&pci_ss_info_8086_24c7_144d_c00c,
 	&pci_ss_info_8086_24c7_1462_5800,
 	&pci_ss_info_8086_24c7_1509_2990,
 	&pci_ss_info_8086_24c7_1734_1004,
@@ -56499,6 +56828,7 @@ static const pciSubsystemInfo *pci_ss_li
 	&pci_ss_info_8086_24ca_103c_0890,
 	&pci_ss_info_8086_24ca_103c_08b0,
 	&pci_ss_info_8086_24ca_1071_8160,
+	&pci_ss_info_8086_24ca_144d_c00c,
 	&pci_ss_info_8086_24ca_1734_1055,
 	&pci_ss_info_8086_24ca_8086_4541,
 	NULL
@@ -56513,6 +56843,7 @@ static const pciSubsystemInfo *pci_ss_li
 	NULL
 };
 static const pciSubsystemInfo *pci_ss_list_8086_24cc[] = {
+	&pci_ss_info_8086_24cc_144d_c00c,
 	&pci_ss_info_8086_24cc_1734_1055,
 	NULL
 };
@@ -56530,6 +56861,7 @@ static const pciSubsystemInfo *pci_ss_li
 	&pci_ss_info_8086_24cd_103c_08b0,
 	&pci_ss_info_8086_24cd_1071_8160,
 	&pci_ss_info_8086_24cd_1179_ff00,
+	&pci_ss_info_8086_24cd_144d_c00c,
 	&pci_ss_info_8086_24cd_1462_3981,
 	&pci_ss_info_8086_24cd_1509_1968,
 	&pci_ss_info_8086_24cd_1734_1004,
@@ -56574,6 +56906,7 @@ static const pciSubsystemInfo *pci_ss_li
 	&pci_ss_info_8086_24d3_1014_02ed,
 	&pci_ss_info_8086_24d3_1028_0156,
 	&pci_ss_info_8086_24d3_1028_0169,
+	&pci_ss_info_8086_24d3_103c_12bc,
 	&pci_ss_info_8086_24d3_1043_80a6,
 	&pci_ss_info_8086_24d3_1458_24d2,
 	&pci_ss_info_8086_24d3_1462_7280,
@@ -56604,6 +56937,7 @@ static const pciSubsystemInfo *pci_ss_li
 	NULL
 };
 static const pciSubsystemInfo *pci_ss_list_8086_24d5[] = {
+	&pci_ss_info_8086_24d5_100a_147b,
 	&pci_ss_info_8086_24d5_1028_0169,
 	&pci_ss_info_8086_24d5_103c_006a,
 	&pci_ss_info_8086_24d5_103c_12bc,
@@ -56757,6 +57091,7 @@ static const pciSubsystemInfo *pci_ss_li
 };
 static const pciSubsystemInfo *pci_ss_list_8086_2570[] = {
 	&pci_ss_info_8086_2570_103c_006a,
+	&pci_ss_info_8086_2570_103c_12bc,
 	&pci_ss_info_8086_2570_1043_80f2,
 	&pci_ss_info_8086_2570_1458_2570,
 	NULL
@@ -57122,6 +57457,7 @@ static const pciSubsystemInfo *pci_ss_li
 	NULL
 };
 static const pciSubsystemInfo *pci_ss_list_8086_27b9[] = {
+	&pci_ss_info_8086_27b9_10f7_8338,
 	&pci_ss_info_8086_27b9_17aa_2009,
 	NULL
 };
@@ -57174,11 +57510,14 @@ static const pciSubsystemInfo *pci_ss_li
 #define pci_ss_list_8086_27d6 NULL
 static const pciSubsystemInfo *pci_ss_list_8086_27d8[] = {
 	&pci_ss_info_8086_27d8_107b_5048,
+	&pci_ss_info_8086_27d8_10f7_8338,
+	&pci_ss_info_8086_27d8_1179_ff31,
 	&pci_ss_info_8086_27d8_152d_0753,
 	&pci_ss_info_8086_27d8_17aa_2010,
 	NULL
 };
 static const pciSubsystemInfo *pci_ss_list_8086_27da[] = {
+	&pci_ss_info_8086_27da_10f7_8338,
 	&pci_ss_info_8086_27da_17aa_200f,
 	&pci_ss_info_8086_27da_8086_544e,
 	NULL
@@ -57191,6 +57530,7 @@ static const pciSubsystemInfo *pci_ss_li
 #define pci_ss_list_8086_27de NULL
 static const pciSubsystemInfo *pci_ss_list_8086_27df[] = {
 	&pci_ss_info_8086_27df_107b_5048,
+	&pci_ss_info_8086_27df_10f7_8338,
 	&pci_ss_info_8086_27df_17aa_200c,
 	&pci_ss_info_8086_27df_8086_544e,
 	NULL
@@ -57202,22 +57542,43 @@ static const pciSubsystemInfo *pci_ss_li
 #define pci_ss_list_8086_2812 NULL
 #define pci_ss_list_8086_2814 NULL
 #define pci_ss_list_8086_2815 NULL
-#define pci_ss_list_8086_2820 NULL
+static const pciSubsystemInfo *pci_ss_list_8086_2820[] = {
+	&pci_ss_info_8086_2820_1462_7235,
+	NULL
+};
 #define pci_ss_list_8086_2821 NULL
 #define pci_ss_list_8086_2822 NULL
 #define pci_ss_list_8086_2824 NULL
-#define pci_ss_list_8086_2825 NULL
+static const pciSubsystemInfo *pci_ss_list_8086_2825[] = {
+	&pci_ss_info_8086_2825_1462_7235,
+	NULL
+};
 #define pci_ss_list_8086_2828 NULL
 #define pci_ss_list_8086_2829 NULL
 #define pci_ss_list_8086_282a NULL
-#define pci_ss_list_8086_2830 NULL
-#define pci_ss_list_8086_2831 NULL
+static const pciSubsystemInfo *pci_ss_list_8086_2830[] = {
+	&pci_ss_info_8086_2830_1462_7235,
+	NULL
+};
+static const pciSubsystemInfo *pci_ss_list_8086_2831[] = {
+	&pci_ss_info_8086_2831_1462_7235,
+	NULL
+};
 #define pci_ss_list_8086_2832 NULL
-#define pci_ss_list_8086_2834 NULL
+static const pciSubsystemInfo *pci_ss_list_8086_2834[] = {
+	&pci_ss_info_8086_2834_1462_7235,
+	NULL
+};
 #define pci_ss_list_8086_2835 NULL
-#define pci_ss_list_8086_2836 NULL
+static const pciSubsystemInfo *pci_ss_list_8086_2836[] = {
+	&pci_ss_info_8086_2836_1462_7235,
+	NULL
+};
 #define pci_ss_list_8086_283a NULL
-#define pci_ss_list_8086_283e NULL
+static const pciSubsystemInfo *pci_ss_list_8086_283e[] = {
+	&pci_ss_info_8086_283e_1462_7235,
+	NULL
+};
 #define pci_ss_list_8086_283f NULL
 #define pci_ss_list_8086_2841 NULL
 #define pci_ss_list_8086_2843 NULL
@@ -57263,15 +57624,22 @@ static const pciSubsystemInfo *pci_ss_li
 #define pci_ss_list_8086_2a06 NULL
 #define pci_ss_list_8086_2a07 NULL
 #define pci_ss_list_8086_3092 NULL
-#define pci_ss_list_8086_3200 NULL
+static const pciSubsystemInfo *pci_ss_list_8086_3200[] = {
+	&pci_ss_info_8086_3200_1775_c200,
+	NULL
+};
 static const pciSubsystemInfo *pci_ss_list_8086_3340[] = {
 	&pci_ss_info_8086_3340_1025_005a,
 	&pci_ss_info_8086_3340_103c_088c,
 	&pci_ss_info_8086_3340_103c_0890,
 	&pci_ss_info_8086_3340_103c_08b0,
+	&pci_ss_info_8086_3340_144d_c00c,
+	NULL
+};
+static const pciSubsystemInfo *pci_ss_list_8086_3341[] = {
+	&pci_ss_info_8086_3341_144d_c00c,
 	NULL
 };
-#define pci_ss_list_8086_3341 NULL
 #define pci_ss_list_8086_3500 NULL
 #define pci_ss_list_8086_3501 NULL
 #define pci_ss_list_8086_3504 NULL
@@ -58120,6 +58488,7 @@ static const pciSubsystemInfo *pci_ss_li
 #define pci_ss_list_0b49 NULL
 #define pci_ss_list_0ccd NULL
 static const pciSubsystemInfo *pci_ss_list_0e11[] = {
+	&pci_ss_info_0e11_000b,
 	&pci_ss_info_0e11_0012,
 	&pci_ss_info_0e11_001e,
 	&pci_ss_info_0e11_0022,
@@ -58382,7 +58751,12 @@ static const pciSubsystemInfo *pci_ss_li
 #define pci_ss_list_1006 NULL
 #define pci_ss_list_1007 NULL
 #define pci_ss_list_1008 NULL
-#define pci_ss_list_100a NULL
+#ifdef VENDOR_INCLUDE_NONVIDEO
+static const pciSubsystemInfo *pci_ss_list_100a[] = {
+	&pci_ss_info_100a_147b,
+	NULL
+};
+#endif
 #define pci_ss_list_100b NULL
 #define pci_ss_list_100c NULL
 #define pci_ss_list_100d NULL
@@ -60499,6 +60873,7 @@ static const pciSubsystemInfo *pci_ss_li
 	&pci_ss_info_1179_ff00,
 	&pci_ss_info_1179_ff01,
 	&pci_ss_info_1179_ff10,
+	&pci_ss_info_1179_ff31,
 	NULL
 };
 #endif
@@ -62200,6 +62575,7 @@ static const pciSubsystemInfo *pci_ss_li
 	&pci_ss_info_1462_7030,
 	&pci_ss_info_1462_7100,
 	&pci_ss_info_1462_7207,
+	&pci_ss_info_1462_7235,
 	&pci_ss_info_1462_7280,
 	&pci_ss_info_1462_728c,
 	&pci_ss_info_1462_7580,
@@ -63348,6 +63724,7 @@ static const pciSubsystemInfo *pci_ss_li
 	&pci_ss_info_1775_10d0,
 	&pci_ss_info_1775_10d1,
 	&pci_ss_info_1775_6003,
+	&pci_ss_info_1775_c200,
 	&pci_ss_info_1775_ce90,
 	NULL
 };
@@ -64030,6 +64407,8 @@ static const pciSubsystemInfo *pci_ss_li
 	&pci_ss_info_8086_1094,
 	&pci_ss_info_8086_1099,
 	&pci_ss_info_8086_109a,
+	&pci_ss_info_8086_10a4,
+	&pci_ss_info_8086_10bc,
 	&pci_ss_info_8086_10f0,
 	&pci_ss_info_8086_1107,
 	&pci_ss_info_8086_1109,
@@ -64046,6 +64425,8 @@ static const pciSubsystemInfo *pci_ss_li
 	&pci_ss_info_8086_117a,
 	&pci_ss_info_8086_118a,
 	&pci_ss_info_8086_1199,
+	&pci_ss_info_8086_11a4,
+	&pci_ss_info_8086_11bc,
 	&pci_ss_info_8086_125e,
 	&pci_ss_info_8086_125f,
 	&pci_ss_info_8086_1276,
@@ -64098,7 +64479,9 @@ static const pciSubsystemInfo *pci_ss_li
 	&pci_ss_info_8086_2413,
 	&pci_ss_info_8086_24db,
 	&pci_ss_info_8086_2513,
+	&pci_ss_info_8086_2522,
 	&pci_ss_info_8086_2527,
+	&pci_ss_info_8086_2581,
 	&pci_ss_info_8086_265c,
 	&pci_ss_info_8086_3000,
 	&pci_ss_info_8086_3001,
@@ -79384,19 +79767,19 @@ static const pciDeviceInfo pci_dev_info_
 #endif
 	0
 };
-static const pciDeviceInfo pci_dev_info_1077_3010 = {
-	0x3010, pci_device_1077_3010,
+static const pciDeviceInfo pci_dev_info_1077_3022 = {
+	0x3022, pci_device_1077_3022,
 #ifdef INIT_SUBSYS_INFO
-	pci_ss_list_1077_3010,
+	pci_ss_list_1077_3022,
 #else
 	NULL,
 #endif
 	0
 };
-static const pciDeviceInfo pci_dev_info_1077_3022 = {
-	0x3022, pci_device_1077_3022,
+static const pciDeviceInfo pci_dev_info_1077_3032 = {
+	0x3032, pci_device_1077_3032,
 #ifdef INIT_SUBSYS_INFO
-	pci_ss_list_1077_3022,
+	pci_ss_list_1077_3032,
 #else
 	NULL,
 #endif
@@ -79420,6 +79803,24 @@ static const pciDeviceInfo pci_dev_info_
 #endif
 	0
 };
+static const pciDeviceInfo pci_dev_info_1077_4032 = {
+	0x4032, pci_device_1077_4032,
+#ifdef INIT_SUBSYS_INFO
+	pci_ss_list_1077_4032,
+#else
+	NULL,
+#endif
+	0
+};
+static const pciDeviceInfo pci_dev_info_1077_5432 = {
+	0x5432, pci_device_1077_5432,
+#ifdef INIT_SUBSYS_INFO
+	pci_ss_list_1077_5432,
+#else
+	NULL,
+#endif
+	0
+};
 static const pciDeviceInfo pci_dev_info_1077_6312 = {
 	0x6312, pci_device_1077_6312,
 #ifdef INIT_SUBSYS_INFO
@@ -109037,7 +109438,6 @@ static const pciDeviceInfo pci_dev_info_
 	0
 };
 #endif
-#ifdef VENDOR_INCLUDE_NONVIDEO
 static const pciDeviceInfo pci_dev_info_1a03_2000 = {
 	0x2000, pci_device_1a03_2000,
 #ifdef INIT_SUBSYS_INFO
@@ -109047,7 +109447,6 @@ static const pciDeviceInfo pci_dev_info_
 #endif
 	0
 };
-#endif
 #ifdef VENDOR_INCLUDE_NONVIDEO
 static const pciDeviceInfo pci_dev_info_1a08_0000 = {
 	0x0000, pci_device_1a08_0000,
@@ -111843,6 +112242,42 @@ static const pciDeviceInfo pci_dev_info_
 #endif
 	0
 };
+static const pciDeviceInfo pci_dev_info_8086_1054 = {
+	0x1054, pci_device_8086_1054,
+#ifdef INIT_SUBSYS_INFO
+	pci_ss_list_8086_1054,
+#else
+	NULL,
+#endif
+	0
+};
+static const pciDeviceInfo pci_dev_info_8086_1055 = {
+	0x1055, pci_device_8086_1055,
+#ifdef INIT_SUBSYS_INFO
+	pci_ss_list_8086_1055,
+#else
+	NULL,
+#endif
+	0
+};
+static const pciDeviceInfo pci_dev_info_8086_1056 = {
+	0x1056, pci_device_8086_1056,
+#ifdef INIT_SUBSYS_INFO
+	pci_ss_list_8086_1056,
+#else
+	NULL,
+#endif
+	0
+};
+static const pciDeviceInfo pci_dev_info_8086_1057 = {
+	0x1057, pci_device_8086_1057,
+#ifdef INIT_SUBSYS_INFO
+	pci_ss_list_8086_1057,
+#else
+	NULL,
+#endif
+	0
+};
 static const pciDeviceInfo pci_dev_info_8086_1059 = {
 	0x1059, pci_device_8086_1059,
 #ifdef INIT_SUBSYS_INFO
@@ -112185,6 +112620,15 @@ static const pciDeviceInfo pci_dev_info_
 #endif
 	0
 };
+static const pciDeviceInfo pci_dev_info_8086_1091 = {
+	0x1091, pci_device_8086_1091,
+#ifdef INIT_SUBSYS_INFO
+	pci_ss_list_8086_1091,
+#else
+	NULL,
+#endif
+	0
+};
 static const pciDeviceInfo pci_dev_info_8086_1092 = {
 	0x1092, pci_device_8086_1092,
 #ifdef INIT_SUBSYS_INFO
@@ -112194,6 +112638,33 @@ static const pciDeviceInfo pci_dev_info_
 #endif
 	0
 };
+static const pciDeviceInfo pci_dev_info_8086_1093 = {
+	0x1093, pci_device_8086_1093,
+#ifdef INIT_SUBSYS_INFO
+	pci_ss_list_8086_1093,
+#else
+	NULL,
+#endif
+	0
+};
+static const pciDeviceInfo pci_dev_info_8086_1094 = {
+	0x1094, pci_device_8086_1094,
+#ifdef INIT_SUBSYS_INFO
+	pci_ss_list_8086_1094,
+#else
+	NULL,
+#endif
+	0
+};
+static const pciDeviceInfo pci_dev_info_8086_1095 = {
+	0x1095, pci_device_8086_1095,
+#ifdef INIT_SUBSYS_INFO
+	pci_ss_list_8086_1095,
+#else
+	NULL,
+#endif
+	0
+};
 static const pciDeviceInfo pci_dev_info_8086_1096 = {
 	0x1096, pci_device_8086_1096,
 #ifdef INIT_SUBSYS_INFO
@@ -112248,6 +112719,15 @@ static const pciDeviceInfo pci_dev_info_
 #endif
 	0
 };
+static const pciDeviceInfo pci_dev_info_8086_109e = {
+	0x109e, pci_device_8086_109e,
+#ifdef INIT_SUBSYS_INFO
+	pci_ss_list_8086_109e,
+#else
+	NULL,
+#endif
+	0
+};
 static const pciDeviceInfo pci_dev_info_8086_10a0 = {
 	0x10a0, pci_device_8086_10a0,
 #ifdef INIT_SUBSYS_INFO
@@ -112266,6 +112746,15 @@ static const pciDeviceInfo pci_dev_info_
 #endif
 	0
 };
+static const pciDeviceInfo pci_dev_info_8086_10a4 = {
+	0x10a4, pci_device_8086_10a4,
+#ifdef INIT_SUBSYS_INFO
+	pci_ss_list_8086_10a4,
+#else
+	NULL,
+#endif
+	0
+};
 static const pciDeviceInfo pci_dev_info_8086_10b0 = {
 	0x10b0, pci_device_8086_10b0,
 #ifdef INIT_SUBSYS_INFO
@@ -112338,6 +112827,33 @@ static const pciDeviceInfo pci_dev_info_
 #endif
 	0
 };
+static const pciDeviceInfo pci_dev_info_8086_10bc = {
+	0x10bc, pci_device_8086_10bc,
+#ifdef INIT_SUBSYS_INFO
+	pci_ss_list_8086_10bc,
+#else
+	NULL,
+#endif
+	0
+};
+static const pciDeviceInfo pci_dev_info_8086_10c4 = {
+	0x10c4, pci_device_8086_10c4,
+#ifdef INIT_SUBSYS_INFO
+	pci_ss_list_8086_10c4,
+#else
+	NULL,
+#endif
+	0
+};
+static const pciDeviceInfo pci_dev_info_8086_10c5 = {
+	0x10c5, pci_device_8086_10c5,
+#ifdef INIT_SUBSYS_INFO
+	pci_ss_list_8086_10c5,
+#else
+	NULL,
+#endif
+	0
+};
 static const pciDeviceInfo pci_dev_info_8086_1107 = {
 	0x1107, pci_device_8086_1107,
 #ifdef INIT_SUBSYS_INFO
@@ -112752,6 +113268,15 @@ static const pciDeviceInfo pci_dev_info_
 #endif
 	0
 };
+static const pciDeviceInfo pci_dev_info_8086_1b48 = {
+	0x1b48, pci_device_8086_1b48,
+#ifdef INIT_SUBSYS_INFO
+	pci_ss_list_8086_1b48,
+#else
+	NULL,
+#endif
+	0
+};
 static const pciDeviceInfo pci_dev_info_8086_2410 = {
 	0x2410, pci_device_8086_2410,
 #ifdef INIT_SUBSYS_INFO
@@ -120919,10 +121444,12 @@ static const pciDeviceInfo *pci_dev_list
 	&pci_dev_info_1077_2322,
 	&pci_dev_info_1077_2422,
 	&pci_dev_info_1077_2432,
-	&pci_dev_info_1077_3010,
 	&pci_dev_info_1077_3022,
+	&pci_dev_info_1077_3032,
 	&pci_dev_info_1077_4010,
 	&pci_dev_info_1077_4022,
+	&pci_dev_info_1077_4032,
+	&pci_dev_info_1077_5432,
 	&pci_dev_info_1077_6312,
 	&pci_dev_info_1077_6322,
 	NULL
@@ -127194,12 +127721,10 @@ static const pciDeviceInfo *pci_dev_list
 	NULL
 };
 #endif
-#ifdef VENDOR_INCLUDE_NONVIDEO
 static const pciDeviceInfo *pci_dev_list_1a03[] = {
 	&pci_dev_info_1a03_2000,
 	NULL
 };
-#endif
 #ifdef VENDOR_INCLUDE_NONVIDEO
 static const pciDeviceInfo *pci_dev_list_1a08[] = {
 	&pci_dev_info_1a08_0000,
@@ -127727,6 +128252,10 @@ static const pciDeviceInfo *pci_dev_list
 	&pci_dev_info_8086_1051,
 	&pci_dev_info_8086_1052,
 	&pci_dev_info_8086_1053,
+	&pci_dev_info_8086_1054,
+	&pci_dev_info_8086_1055,
+	&pci_dev_info_8086_1056,
+	&pci_dev_info_8086_1057,
 	&pci_dev_info_8086_1059,
 	&pci_dev_info_8086_105b,
 	&pci_dev_info_8086_105e,
@@ -127765,15 +128294,21 @@ static const pciDeviceInfo *pci_dev_list
 	&pci_dev_info_8086_108c,
 	&pci_dev_info_8086_108e,
 	&pci_dev_info_8086_108f,
+	&pci_dev_info_8086_1091,
 	&pci_dev_info_8086_1092,
+	&pci_dev_info_8086_1093,
+	&pci_dev_info_8086_1094,
+	&pci_dev_info_8086_1095,
 	&pci_dev_info_8086_1096,
 	&pci_dev_info_8086_1097,
 	&pci_dev_info_8086_1098,
 	&pci_dev_info_8086_1099,
 	&pci_dev_info_8086_109a,
 	&pci_dev_info_8086_109b,
+	&pci_dev_info_8086_109e,
 	&pci_dev_info_8086_10a0,
 	&pci_dev_info_8086_10a1,
+	&pci_dev_info_8086_10a4,
 	&pci_dev_info_8086_10b0,
 	&pci_dev_info_8086_10b2,
 	&pci_dev_info_8086_10b3,
@@ -127782,6 +128317,9 @@ static const pciDeviceInfo *pci_dev_list
 	&pci_dev_info_8086_10b9,
 	&pci_dev_info_8086_10ba,
 	&pci_dev_info_8086_10bb,
+	&pci_dev_info_8086_10bc,
+	&pci_dev_info_8086_10c4,
+	&pci_dev_info_8086_10c5,
 	&pci_dev_info_8086_1107,
 	&pci_dev_info_8086_1130,
 	&pci_dev_info_8086_1131,
@@ -127828,6 +128366,7 @@ static const pciDeviceInfo *pci_dev_list
 	&pci_dev_info_8086_1a31,
 	&pci_dev_info_8086_1a38,
 	&pci_dev_info_8086_1a48,
+	&pci_dev_info_8086_1b48,
 	&pci_dev_info_8086_2410,
 	&pci_dev_info_8086_2411,
 	&pci_dev_info_8086_2412,
@@ -133715,9 +134254,7 @@ static const pciVendorInfo pciVendorInfo
 #ifdef VENDOR_INCLUDE_NONVIDEO
 	{0x19e7, pci_vendor_19e7, pci_dev_list_19e7},
 #endif
-#ifdef VENDOR_INCLUDE_NONVIDEO
 	{0x1a03, pci_vendor_1a03, pci_dev_list_1a03},
-#endif
 #ifdef VENDOR_INCLUDE_NONVIDEO
 	{0x1a08, pci_vendor_1a08, pci_dev_list_1a08},
 #endif
@@ -139176,9 +139713,7 @@ static const pciVendorSubsysInfo pciVend
 #ifdef VENDOR_INCLUDE_NONVIDEO
 	{0x19e7, pci_vendor_19e7, pci_ss_list_19e7},
 #endif
-#ifdef VENDOR_INCLUDE_NONVIDEO
 	{0x1a03, pci_vendor_1a03, pci_ss_list_1a03},
-#endif
 #ifdef VENDOR_INCLUDE_NONVIDEO
 	{0x1a08, pci_vendor_1a08, pci_ss_list_1a08},
 #endif
diff-tree 724f9cb578086e8483a2d0636dd6eb05d664d31c (from 3690de9b1b0902d395bc7d071fc05ebc8f75be2b)
Author: Aaron Plattner <aplattner at nvidia.com>
Date:   Tue Dec 5 13:44:05 2006 -0800

    Bug #9219: Use pWin->viewable instead of pWin->realized to catch InputOnly windows too.

diff --git a/composite/compext.c b/composite/compext.c
index ec5e1fa..13936fa 100644
--- a/composite/compext.c
+++ b/composite/compext.c
@@ -270,7 +270,7 @@ ProcCompositeNameWindowPixmap (ClientPtr
 	return BadWindow;
     }
 
-    if (!pWin->realized)
+    if (!pWin->viewable)
 	return BadMatch;
 
     LEGAL_NEW_RESOURCE (stuff->pixmap, client);
diff-tree 3690de9b1b0902d395bc7d071fc05ebc8f75be2b (from f9f7d7f3be53c808abb5eaceb7a1abc55744a210)
Author: Aaron Plattner <aplattner at nvidia.com>
Date:   Tue Dec 5 12:42:12 2006 -0800

    Bug #9219: Return BadMatch when trying to name the backing pixmap of an unrealized window.
    
    Before this change, ProcCompositeNameWindowPixmap would name the screen pixmap
    if !pWin->realized.

diff --git a/composite/compext.c b/composite/compext.c
index a7ad4e2..ec5e1fa 100644
--- a/composite/compext.c
+++ b/composite/compext.c
@@ -269,7 +269,10 @@ ProcCompositeNameWindowPixmap (ClientPtr
 	client->errorValue = stuff->window;
 	return BadWindow;
     }
-    
+
+    if (!pWin->realized)
+	return BadMatch;
+
     LEGAL_NEW_RESOURCE (stuff->pixmap, client);
     
     cw = GetCompWindow (pWin);
diff-tree f9f7d7f3be53c808abb5eaceb7a1abc55744a210 (from ac90ce58ba1da3ed605adf75f4d54c34b578c402)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Mon Dec 4 13:36:30 2006 -0800

    Check for __sparc as well as __sparc__ for compatibility with Sun cc
    
    (gcc defines __sparc__, Sun cc defines __sparc)

diff --git a/hw/xfree86/common/compiler.h b/hw/xfree86/common/compiler.h
index a330fad..ea995ed 100644
--- a/hw/xfree86/common/compiler.h
+++ b/hw/xfree86/common/compiler.h
@@ -118,7 +118,7 @@ extern int ffs(unsigned long);
 # if defined(NO_INLINE) || defined(DO_PROTOTYPES)
 
 #  if !defined(__arm__)
-#   if !defined(__sparc__) && !defined(__arm32__) \
+#   if !defined(__sparc__) && !defined(__sparc) && !defined(__arm32__) \
       && !(defined(__alpha__) && defined(linux)) \
       && !(defined(__ia64__) && defined(linux)) \
 
@@ -1697,7 +1697,7 @@ static __inline__ void ppc_flush_icache(
 		: : "r"(addr) : "memory");
 }
 
-# elif defined(__sparc__) || defined(sparc)
+# elif defined(__sparc__) || defined(sparc) || defined(__sparc)
  /*
   * Like powerpc, we provide byteswapping and no byteswapping functions
   * here with byteswapping as default, drivers that don't need byteswapping
diff --git a/hw/xfree86/common/xf86.h b/hw/xfree86/common/xf86.h
index aa73e7d..169a957 100644
--- a/hw/xfree86/common/xf86.h
+++ b/hw/xfree86/common/xf86.h
@@ -64,7 +64,7 @@ extern ScrnInfoPtr xf86CurrentScreen;
 extern Bool pciSlotClaimed;
 extern Bool isaSlotClaimed;
 extern Bool fbSlotClaimed;
-#ifdef __sparc__
+#if defined(__sparc__) || defined(__sparc)
 extern Bool sbusSlotClaimed;
 #endif
 extern confDRIRec xf86ConfigDRI;
diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c
index e208378..7617bf7 100644
--- a/hw/xfree86/common/xf86Bus.c
+++ b/hw/xfree86/common/xf86Bus.c
@@ -113,7 +113,7 @@ void
 xf86BusProbe(void)
 {
     xf86PciProbe();
-#if defined(__sparc__) && !defined(__OpenBSD__)
+#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__)
     xf86SbusProbe();
 #endif
 }
@@ -2373,7 +2373,7 @@ xf86PostProbe(void)
 
     if (fbSlotClaimed) {
         if (pciSlotClaimed || isaSlotClaimed 
-#if defined(__sparc__) && !defined(__OpenBSD__)
+#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__)
 	    || sbusSlotClaimed
 #endif
 	    ) { 
@@ -3006,7 +3006,7 @@ xf86FindPrimaryDevice()
     
 }
 
-#if !defined(__sparc__) && !defined(__powerpc__) && !defined(__mips__)
+#if !defined(__sparc) && !defined(__sparc__) && !defined(__powerpc__) && !defined(__mips__)
 #include "vgaHW.h"
 #include "compiler.h"
 #endif
@@ -3018,7 +3018,7 @@ static void
 CheckGenericGA()
 {
 /* This needs to be changed for multiple domains */
-#if !defined(__sparc__) && !defined(__powerpc__) && !defined(__mips__) && !defined(__ia64__) && !defined(__arm__) && !defined(__s390__)
+#if !defined(__sparc__) && !defined(__sparc) && !defined(__powerpc__) && !defined(__mips__) && !defined(__ia64__) && !defined(__arm__) && !defined(__s390__)
     IOADDRESS GenericIOBase = VGAHW_GET_IOBASE();
     CARD8 CurrentValue, TestValue;
 
diff --git a/hw/xfree86/common/xf86Bus.h b/hw/xfree86/common/xf86Bus.h
index b7d1608..b638e90 100644
--- a/hw/xfree86/common/xf86Bus.h
+++ b/hw/xfree86/common/xf86Bus.h
@@ -40,7 +40,7 @@
 #define _XF86_BUS_H
 
 #include "xf86pciBus.h"
-#ifdef __sparc__
+#if defined(__sparc__) || defined(__sparc)
 #include "xf86sbusBus.h"
 #endif
 
diff --git a/hw/xfree86/common/xf86Configure.c b/hw/xfree86/common/xf86Configure.c
index f1f173d..f71486c 100644
--- a/hw/xfree86/common/xf86Configure.c
+++ b/hw/xfree86/common/xf86Configure.c
@@ -48,7 +48,7 @@
 #include "Configint.h"
 #include "vbe.h"
 #include "xf86DDC.h"
-#if defined(__sparc__) && !defined(__OpenBSD__)
+#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__)
 #include "xf86Bus.h"
 #include "xf86Sbus.h"
 #endif
@@ -57,7 +57,7 @@
 typedef struct _DevToConfig {
     GDevRec GDev;
     pciVideoPtr pVideo;
-#if defined(__sparc__) && !defined(__OpenBSD__)
+#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__)
     sbusDevicePtr sVideo;
 #endif
     int iDriver;
@@ -134,7 +134,7 @@ xf86AddBusDeviceToConfigure(const char *
 	    if (!DevToConfig[i].pVideo)
 		return NULL;
 	break;
-#if defined(__sparc__) && !defined(__OpenBSD__)
+#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__)
     case BUS_SBUS:
 	for (i = 0;  i < nDevToConfig;  i++)
 	    if (DevToConfig[i].sVideo &&
@@ -213,7 +213,7 @@ xf86AddBusDeviceToConfigure(const char *
 	NewDevice.GDev.identifier = "ISA Adapter";
 	NewDevice.GDev.busID = "ISA";
 	break;
-#if defined(__sparc__) && !defined(__OpenBSD__)
+#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__)
     case BUS_SBUS: {
 	char *promPath = NULL;
 	NewDevice.sVideo = (sbusDevicePtr) busData;
diff --git a/hw/xfree86/loader/xf86sym.c b/hw/xfree86/loader/xf86sym.c
index 3051ded..1cb7dae 100644
--- a/hw/xfree86/loader/xf86sym.c
+++ b/hw/xfree86/loader/xf86sym.c
@@ -499,7 +499,7 @@ _X_HIDDEN void *xfree86LookupTab[] = {
     SYMFUNC(xf86AddModuleInfo)
     SYMFUNC(xf86DeleteModuleInfo)
 
-#if defined(__sparc__) && !defined(__OpenBSD__)
+#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__)
     /* xf86sbusBus.c */
     SYMFUNC(xf86MatchSbusInstances)
     SYMFUNC(xf86GetSbusInfoForEntity)
diff --git a/hw/xfree86/utils/xorgcfg/loadmod.c b/hw/xfree86/utils/xorgcfg/loadmod.c
index 598d0c0..6f83f35 100644
--- a/hw/xfree86/utils/xorgcfg/loadmod.c
+++ b/hw/xfree86/utils/xorgcfg/loadmod.c
@@ -181,7 +181,7 @@ LOOKUP xfree86LookupTab[] = {
    SYMFUNC(xf86memchr)
    SYMFUNC(xf86memcmp)
    SYMFUNC(xf86memcpy)
-#if (defined(__powerpc__) && (defined(Lynx) || defined(linux))) || defined(__sparc__) || defined(__ia64__) || defined (__amd64__)
+#if (defined(__powerpc__) && (defined(Lynx) || defined(linux))) || defined(__sparc__) || defined(__sparc) || defined(__ia64__) || defined (__amd64__)
    /*
     * Some PPC, SPARC, and IA64 compilers generate calls to memcpy to handle
     * structure copies.  This causes a problem both here and in shared
diff-tree ac90ce58ba1da3ed605adf75f4d54c34b578c402 (from f44f14fe564d834568a0afefba944223a73ea0f5)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Fri Dec 1 21:12:21 2006 -0500

    Naming change: Security*Operation -> Xace*Operation

diff --git a/Xext/security.c b/Xext/security.c
index ac76279..572f811 100644
--- a/Xext/security.c
+++ b/Xext/security.c
@@ -1251,7 +1251,7 @@ typedef struct _PropertyAccessRec {
 } PropertyAccessRec, *PropertyAccessPtr;
 
 static PropertyAccessPtr PropertyAccessList = NULL;
-static char SecurityDefaultAction = SecurityErrorOperation;
+static char SecurityDefaultAction = XaceErrorOperation;
 static char *SecurityPolicyFile = DEFAULTPOLICYFILE;
 static ATOM SecurityMaxPropertyName = 0;
 
@@ -1410,9 +1410,9 @@ SecurityParsePropertyAccessRule(
     {
 	switch (c)
 	{
-	    case 'i': action = SecurityIgnoreOperation; break;
-	    case 'a': action = SecurityAllowOperation;  break;
-	    case 'e': action = SecurityErrorOperation;  break;
+	    case 'i': action = XaceIgnoreOperation; break;
+	    case 'a': action = XaceAllowOperation;  break;
+	    case 'e': action = XaceErrorOperation;  break;
 
 	    case 'r': readAction    = action; break;
 	    case 'w': writeAction   = action; break;
@@ -1797,7 +1797,7 @@ CALLBACK(SecurityCheckPropertyAccess)
 	     * If pacl doesn't apply, something above should have
 	     * executed a continue, which will skip the follwing code.
 	     */
-	    action = SecurityAllowOperation;
+	    action = XaceAllowOperation;
 	    if (access_mode & SecurityReadAccess)
 		action = max(action, pacl->readAction);
 	    if (access_mode & SecurityWriteAccess)
@@ -1808,11 +1808,11 @@ CALLBACK(SecurityCheckPropertyAccess)
 	} /* end for each pacl */
     } /* end if propertyName <= SecurityMaxPropertyName */
 
-    if (SecurityAllowOperation != action)
+    if (XaceAllowOperation != action)
     { /* audit the access violation */
 	int cid = CLIENT_ID(pWin->drawable.id);
 	int reqtype = ((xReq *)client->requestBuffer)->reqType;
-	char *actionstr = (SecurityIgnoreOperation == action) ?
+	char *actionstr = (XaceIgnoreOperation == action) ?
 							"ignored" : "error";
 	SecurityAudit("client %d attempted request %d with window 0x%x property %s (atom 0x%x) of client %d, %s\n",
 		client->index, reqtype, pWin->drawable.id,
diff --git a/Xext/xace.c b/Xext/xace.c
index 7f7944a..6fc5c12 100644
--- a/Xext/xace.c
+++ b/Xext/xace.c
@@ -99,7 +99,7 @@ int XaceHook(int hook, ...)
 		va_arg(ap, WindowPtr),
 		va_arg(ap, Atom),
 		va_arg(ap, Mask),
-		SecurityAllowOperation   /* default allow */
+		XaceAllowOperation   /* default allow */
 	    };
 	    calldata = &rec;
 	    prv = &rec.rval;
diff --git a/Xext/xace.h b/Xext/xace.h
index 6f99895..7231b04 100644
--- a/Xext/xace.h
+++ b/Xext/xace.h
@@ -21,9 +21,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE 
 #define _XACE_H
 
 /* Hook return codes */
-#define SecurityErrorOperation  0
-#define SecurityAllowOperation  1
-#define SecurityIgnoreOperation 2
+#define XaceErrorOperation  0
+#define XaceAllowOperation  1
+#define XaceIgnoreOperation 2
 
 #ifdef XACE
 
@@ -107,10 +107,10 @@ extern void XaceCensorImage(
 /* Define calls away when XACE is not being built. */
 
 #ifdef __GNUC__
-#define XaceHook(args...) SecurityAllowOperation
+#define XaceHook(args...) XaceAllowOperation
 #define XaceCensorImage(args...) { ; }
 #else
-#define XaceHook(...) SecurityAllowOperation
+#define XaceHook(...) XaceAllowOperation
 #define XaceCensorImage(...) { ; }
 #endif
 
diff --git a/dix/property.c b/dix/property.c
index 0946b65..00d4856 100644
--- a/dix/property.c
+++ b/dix/property.c
@@ -119,12 +119,12 @@ ProcRotateProperties(ClientPtr client)
 	char action = XaceHook(XACE_PROPERTY_ACCESS, client, pWin, atoms[i],
 				SecurityReadAccess|SecurityWriteAccess);
 
-        if (!ValidAtom(atoms[i]) || (SecurityErrorOperation == action)) {
+        if (!ValidAtom(atoms[i]) || (XaceErrorOperation == action)) {
             DEALLOCATE_LOCAL(props);
 	    client->errorValue = atoms[i];
             return BadAtom;
         }
-	if (SecurityIgnoreOperation == action) {
+	if (XaceIgnoreOperation == action) {
             DEALLOCATE_LOCAL(props);
 	    return Success;
 	}
@@ -226,10 +226,10 @@ ProcChangeProperty(ClientPtr client)
     switch (XaceHook(XACE_PROPERTY_ACCESS, client, pWin, stuff->property,
 		     SecurityWriteAccess))
     {
-    case SecurityErrorOperation:
+    case XaceErrorOperation:
 	client->errorValue = stuff->property;
 	return BadAtom;
-    case SecurityIgnoreOperation:
+    case XaceIgnoreOperation:
 	return Success;
     }
 
@@ -495,10 +495,10 @@ ProcGetProperty(ClientPtr client)
     switch (XaceHook(XACE_PROPERTY_ACCESS, client, pWin, stuff->property,
 		     access_mode))
     {
-    case SecurityErrorOperation:
+    case XaceErrorOperation:
 	client->errorValue = stuff->property;
 	return BadAtom;;
-    case SecurityIgnoreOperation:
+    case XaceIgnoreOperation:
 	return NullPropertyReply(client, pProp->type, pProp->format, &reply);
     }
 
@@ -649,10 +649,10 @@ ProcDeleteProperty(register ClientPtr cl
     switch (XaceHook(XACE_PROPERTY_ACCESS, client, pWin, stuff->property,
 		     SecurityDestroyAccess))
     {
-    case SecurityErrorOperation:
+    case XaceErrorOperation:
 	client->errorValue = stuff->property;
 	return BadAtom;;
-    case SecurityIgnoreOperation:
+    case XaceIgnoreOperation:
 	return Success;
     }
 
diff-tree f44f14fe564d834568a0afefba944223a73ea0f5 (from a5d6499d666fea4a9988118ddd3a5e4c9cfcc32c)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Fri Dec 1 20:48:15 2006 -0500

    Define calls away when not building XACE, allowing ifdef's to be removed.

diff --git a/Xext/xace.h b/Xext/xace.h
index 6cb4b4f..6f99895 100644
--- a/Xext/xace.h
+++ b/Xext/xace.h
@@ -20,6 +20,13 @@ CONNECTION WITH THE SOFTWARE OR THE USE 
 #ifndef _XACE_H
 #define _XACE_H
 
+/* Hook return codes */
+#define SecurityErrorOperation  0
+#define SecurityAllowOperation  1
+#define SecurityIgnoreOperation 2
+
+#ifdef XACE
+
 #define XACE_EXTENSION_NAME		"XAccessControlExtension"
 #define XACE_MAJOR_VERSION		1
 #define XACE_MINOR_VERSION		0
@@ -75,11 +82,6 @@ extern int XaceHook(
 /* From the original Security extension...
  */
 
-/* Hook return codes */
-#define SecurityAllowOperation  0
-#define SecurityIgnoreOperation 1
-#define SecurityErrorOperation  2
-
 /* Proc vectors for untrusted clients, swapped and unswapped versions.
  * These are the same as the normal proc vectors except that extensions
  * that haven't declared themselves secure will have ProcBadRequest plugged
@@ -100,4 +102,18 @@ extern void XaceCensorImage(
     char * pBuf
     );
 
+#else /* XACE */
+
+/* Define calls away when XACE is not being built. */
+
+#ifdef __GNUC__
+#define XaceHook(args...) SecurityAllowOperation
+#define XaceCensorImage(args...) { ; }
+#else
+#define XaceHook(...) SecurityAllowOperation
+#define XaceCensorImage(...) { ; }
+#endif
+
+#endif /* XACE */
+
 #endif /* _XACE_H */
diff --git a/dix/devices.c b/dix/devices.c
index aa04862..e6a5049 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -69,9 +69,7 @@ SOFTWARE.
 #ifdef XKB
 #include <X11/extensions/XKBsrv.h>
 #endif
-#ifdef XACE
 #include "xace.h"
-#endif
 
 #include "dispatch.h"
 #include "swaprep.h"
@@ -1178,10 +1176,8 @@ DoSetModifierMapping(ClientPtr client, K
                 }
             }
 
-#ifdef XACE
             if (!XaceHook(XACE_DEVICE_ACCESS, client, pDev, TRUE))
                 return BadAccess;
-#endif 
 
             /* None of the modifiers (old or new) may be down while we change
              * the map. */
@@ -1302,14 +1298,12 @@ ProcChangeKeyboardMapping(ClientPtr clie
 	    return BadValue;
     }
 
-#ifdef XACE
     for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
         if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key) {
             if (!XaceHook(XACE_DEVICE_ACCESS, client, pDev, TRUE))
                 return BadAccess;
         }
     }
-#endif 
 
     keysyms.minKeyCode = stuff->firstKeyCode;
     keysyms.maxKeyCode = stuff->firstKeyCode + stuff->keyCodes - 1;
@@ -1655,7 +1649,6 @@ ProcChangeKeyboardControl (ClientPtr cli
     if (client->req_len != (sizeof(xChangeKeyboardControlReq)>>2)+Ones(vmask))
 	return BadLength;
 
-#ifdef XACE
     for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
         if ((pDev->coreEvents || pDev == inputInfo.keyboard) &&
             pDev->kbdfeed && pDev->kbdfeed->CtrlProc) {
@@ -1663,7 +1656,6 @@ ProcChangeKeyboardControl (ClientPtr cli
                 return BadAccess;
         }
     }
-#endif 
 
     for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
         if ((pDev->coreEvents || pDev == inputInfo.keyboard) &&
@@ -1920,15 +1912,13 @@ ProcQueryKeymap(ClientPtr client)
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
     rep.length = 2;
-#ifdef XACE
-    if (!XaceHook(XACE_DEVICE_ACCESS, client, inputInfo.keyboard, TRUE))
-    {
-	bzero((char *)&rep.map[0], 32);
-    }
+
+    if (XaceHook(XACE_DEVICE_ACCESS, client, inputInfo.keyboard, TRUE))
+	for (i = 0; i<32; i++)
+	    rep.map[i] = down[i];
     else
-#endif
-    for (i = 0; i<32; i++)
-	rep.map[i] = down[i];
+	bzero((char *)&rep.map[0], 32);
+
     WriteReplyToClient(client, sizeof(xQueryKeymapReply), &rep);
     return Success;
 }
diff --git a/dix/dispatch.c b/dix/dispatch.c
index 26cb544..0a93c3b 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -135,9 +135,7 @@ int ProcInitialConnection();
 #include "panoramiX.h"
 #include "panoramiXsrv.h"
 #endif
-#ifdef XACE
 #include "xace.h"
-#endif
 #ifdef XAPPGROUP
 #include "appgroup.h"
 #endif
@@ -504,16 +502,11 @@ Dispatch(void)
 #endif
 		if (result > (maxBigRequestSize << 2))
 		    result = BadLength;
-		else
-#ifdef XACE
-		{
+		else {
 		    XaceHook(XACE_AUDIT_BEGIN, client);
 		    result = (* client->requestVector[MAJOROP])(client);
 		    XaceHook(XACE_AUDIT_END, client, result);
 		}
-#else
-    		    result = (* client->requestVector[MAJOROP])(client);
-#endif /* XACE */
 #ifdef XSERVER_DTRACE
 		XSERVER_REQUEST_DONE(GetRequestName(MAJOROP), MAJOROP,
 			      client->sequence, client->index, result);
@@ -1166,14 +1159,11 @@ ProcConvertSelection(register ClientPtr 
 	i = 0;
 	while ((i < NumCurrentSelections) && 
 	       CurrentSelections[i].selection != stuff->selection) i++;
-	if ((i < NumCurrentSelections) && 
-	    (CurrentSelections[i].window != None)
-#ifdef XACE
-	    && XaceHook(XACE_RESOURCE_ACCESS, client,
-			CurrentSelections[i].window, RT_WINDOW,
-			SecurityReadAccess, CurrentSelections[i].pWin)
-#endif
-	    )
+	if ((i < NumCurrentSelections) &&
+	    (CurrentSelections[i].window != None) &&
+	    XaceHook(XACE_RESOURCE_ACCESS, client,
+		     CurrentSelections[i].window, RT_WINDOW,
+		     SecurityReadAccess, CurrentSelections[i].pWin))
 	{        
 	    event.u.u.type = SelectionRequest;
 	    event.u.selectionRequest.time = stuff->time;
@@ -2163,9 +2153,7 @@ DoGetImage(register ClientPtr client, in
     Mask		plane = 0;
     char		*pBuf;
     xGetImageReply	xgi;
-#ifdef XACE
     RegionPtr pVisibleRegion = NULL;
-#endif
 
     if ((format != XYPixmap) && (format != ZPixmap))
     {
@@ -2269,17 +2257,16 @@ DoGetImage(register ClientPtr client, in
 	WriteReplyToClient(client, sizeof (xGetImageReply), &xgi);
     }
 
-#ifdef XACE
     if (pDraw->type == DRAWABLE_WINDOW &&
 	!XaceHook(XACE_DRAWABLE_ACCESS, client, pDraw))
     {
 	pVisibleRegion = NotClippedByChildren((WindowPtr)pDraw);
 	if (pVisibleRegion)
 	{
-	    REGION_TRANSLATE(pDraw->pScreen, pVisibleRegion, -pDraw->x, -pDraw->y);
+	    REGION_TRANSLATE(pDraw->pScreen, pVisibleRegion,
+			     -pDraw->x, -pDraw->y);
 	}
     }
-#endif
 
     if (linesPerBuf == 0)
     {
@@ -2299,12 +2286,10 @@ DoGetImage(register ClientPtr client, in
 				         format,
 				         planemask,
 				         (pointer) pBuf);
-#ifdef XACE
 	    if (pVisibleRegion)
 		XaceCensorImage(client, pVisibleRegion, widthBytesLine,
 			pDraw, x, y + linesDone, width, 
 			nlines, format, pBuf);
-#endif
 
 	    /* Note that this is NOT a call to WriteSwappedDataToClient,
                as we do NOT byte swap */
@@ -2340,13 +2325,11 @@ DoGetImage(register ClientPtr client, in
 				                 format,
 				                 plane,
 				                 (pointer)pBuf);
-#ifdef XACE
 		    if (pVisibleRegion)
 			XaceCensorImage(client, pVisibleRegion,
 				widthBytesLine,
 				pDraw, x, y + linesDone, width, 
 				nlines, format, pBuf);
-#endif
 
 		    /* Note: NOT a call to WriteSwappedDataToClient,
 		       as we do NOT byte swap */
@@ -2368,10 +2351,8 @@ DoGetImage(register ClientPtr client, in
             }
 	}
     }
-#ifdef XACE
     if (pVisibleRegion)
 	REGION_DESTROY(pDraw->pScreen, pVisibleRegion);
-#endif
     if (!im_return)
 	DEALLOCATE_LOCAL(pBuf);
     return (client->noClientException);
@@ -3342,13 +3323,11 @@ ProcListHosts(register ClientPtr client)
     /* REQUEST(xListHostsReq); */
 
     REQUEST_SIZE_MATCH(xListHostsReq);
-#ifdef XACE
+
     /* untrusted clients can't list hosts */
     if (!XaceHook(XACE_HOSTLIST_ACCESS, client, SecurityReadAccess))
-    {
 	return BadAccess;
-    }
-#endif
+
     result = GetHosts(&pdata, &nHosts, &len, &reply.enabled);
     if (result != Success)
 	return(result);
diff --git a/dix/dixutils.c b/dix/dixutils.c
index a395d44..af7e1c8 100644
--- a/dix/dixutils.c
+++ b/dix/dixutils.c
@@ -95,9 +95,7 @@ Author:  Adobe Systems Incorporated
 #include "scrnintstr.h"
 #define  XK_LATIN1
 #include <X11/keysymdef.h>
-#ifdef XACE
 #include "xace.h"
-#endif
 
 /*
  * CompareTimeStamps returns -1, 0, or +1 depending on if the first
diff --git a/dix/events.c b/dix/events.c
index c8da7d6..7cfe0ad 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -137,9 +137,7 @@ of the copyright holder.
 extern Bool XkbFilterEvents(ClientPtr, int, xEvent *);
 #endif
 
-#ifdef XACE
 #include "xace.h"
-#endif
 
 #ifdef XSERVER_DTRACE
 #include <sys/types.h>
@@ -2462,10 +2460,8 @@ CheckPassiveGrabsOnWindow(
 	     (grab->confineTo->realized && 
 				BorderSizeNotEmpty(grab->confineTo))))
 	{
-#ifdef XACE
 	    if (!XaceHook(XACE_DEVICE_ACCESS, wClient(pWin), device, FALSE))
 		return FALSE;
-#endif
 #ifdef XKB
 	    if (!noXkbExtension) {
 		XE_KBPTR.state &= 0x1f00;
@@ -2826,9 +2822,7 @@ drawable.id:0;
     if (deactivateGrab)
         (*keybd->DeactivateGrab)(keybd);
 
-#ifdef XACE
     XaceHook(XACE_KEY_AVAIL, xE, keybd, count);
-#endif
 }
 
 #ifdef XKB
@@ -3252,17 +3246,13 @@ EnterLeaveEvent(
     if ((type == EnterNotify) && (mask & KeymapStateMask))
     {
 	xKeymapEvent ke;
-
-#ifdef XACE
 	ClientPtr client = grab ? rClient(grab)
 				: clients[CLIENT_ID(pWin->drawable.id)];
-	if (!XaceHook(XACE_DEVICE_ACCESS, client, keybd, FALSE))
-	{
-	    bzero((char *)&ke.map[0], 31);
-	}
+	if (XaceHook(XACE_DEVICE_ACCESS, client, keybd, FALSE))
+	    memmove((char *)&ke.map[0], (char *)&keybd->key->down[1], 31);
 	else
-#endif
-	memmove((char *)&ke.map[0], (char *)&keybd->key->down[1], 31);
+	    bzero((char *)&ke.map[0], 31);
+
 	ke.type = KeymapNotify;
 	if (grab)
 	    (void)TryClientEvents(rClient(grab), (xEvent *)&ke, 1, mask,
@@ -3348,15 +3338,12 @@ FocusEvent(DeviceIntPtr dev, int type, i
 	((pWin->eventMask | wOtherEventMasks(pWin)) & KeymapStateMask))
     {
 	xKeymapEvent ke;
-#ifdef XACE
 	ClientPtr client = clients[CLIENT_ID(pWin->drawable.id)];
-	if (!XaceHook(XACE_DEVICE_ACCESS, client, dev, FALSE))
-	{
-	    bzero((char *)&ke.map[0], 31);
-	}
+	if (XaceHook(XACE_DEVICE_ACCESS, client, dev, FALSE))
+	    memmove((char *)&ke.map[0], (char *)&dev->key->down[1], 31);
 	else
-#endif
-	memmove((char *)&ke.map[0], (char *)&dev->key->down[1], 31);
+	    bzero((char *)&ke.map[0], 31);
+
 	ke.type = KeymapNotify;
 	(void)DeliverEventsToWindow(pWin, (xEvent *)&ke, 1,
 				    KeymapStateMask, NullGrab, 0);
@@ -3619,10 +3606,10 @@ ProcSetInputFocus(client)
     REQUEST(xSetInputFocusReq);
 
     REQUEST_SIZE_MATCH(xSetInputFocusReq);
-#ifdef XACE
+
     if (!XaceHook(XACE_DEVICE_ACCESS, client, inputInfo.keyboard, TRUE))
 	return Success;
-#endif
+
     return SetInputFocus(client, inputInfo.keyboard, stuff->focus,
 			 stuff->revertTo, stuff->time, FALSE);
 }
@@ -3884,18 +3871,17 @@ ProcGrabKeyboard(ClientPtr client)
     int result;
 
     REQUEST_SIZE_MATCH(xGrabKeyboardReq);
-#ifdef XACE
-    if (!XaceHook(XACE_DEVICE_ACCESS, client, inputInfo.keyboard, TRUE))
-    {
+
+    if (XaceHook(XACE_DEVICE_ACCESS, client, inputInfo.keyboard, TRUE))
+	result = GrabDevice(client, inputInfo.keyboard, stuff->keyboardMode,
+			    stuff->pointerMode, stuff->grabWindow,
+			    stuff->ownerEvents, stuff->time,
+			    KeyPressMask | KeyReleaseMask, &rep.status);
+    else {
 	result = Success;
 	rep.status = AlreadyGrabbed;
     }
-    else
-#endif
-    result = GrabDevice(client, inputInfo.keyboard, stuff->keyboardMode,
-			stuff->pointerMode, stuff->grabWindow,
-			stuff->ownerEvents, stuff->time,
-			KeyPressMask | KeyReleaseMask, &rep.status);
+
     if (result != Success)
 	return result;
     rep.type = X_Reply;
diff --git a/dix/extension.c b/dix/extension.c
index fe779b2..29cae86 100644
--- a/dix/extension.c
+++ b/dix/extension.c
@@ -59,9 +59,7 @@ SOFTWARE.
 #include "gcstruct.h"
 #include "scrnintstr.h"
 #include "dispatch.h"
-#ifdef XACE
 #include "xace.h"
-#endif
 
 #define EXTENSION_BASE  128
 #define EXTENSION_EVENT_BASE  64
@@ -256,11 +254,9 @@ GetExtensionEntry(int major)
 _X_EXPORT void
 DeclareExtensionSecurity(char *extname, Bool secure)
 {
-#ifdef XACE
     int i = FindExtension(extname, strlen(extname));
     if (i >= 0)
 	XaceHook(XACE_DECLARE_EXT_SECURE, extensions[i], secure);
-#endif
 }
 
 _X_EXPORT unsigned short
@@ -336,12 +332,7 @@ ProcQueryExtension(ClientPtr client)
     else
     {
 	i = FindExtension((char *)&stuff[1], stuff->nbytes);
-        if (i < 0
-#ifdef XACE
-	    /* call callbacks to find out whether to show extension */
-	    || !XaceHook(XACE_EXT_ACCESS, client, extensions[i])
-#endif
-	    )
+        if (i < 0 || !XaceHook(XACE_EXT_ACCESS, client, extensions[i]))
             reply.present = xFalse;
         else
         {            
@@ -376,11 +367,10 @@ ProcListExtensions(ClientPtr client)
 
         for (i=0;  i<NumExtensions; i++)
 	{
-#ifdef XACE
 	    /* call callbacks to find out whether to show extension */
 	    if (!XaceHook(XACE_EXT_ACCESS, client, extensions[i]))
 		continue;
-#endif
+
 	    total_length += strlen(extensions[i]->name) + 1;
 	    reply.nExtensions += 1 + extensions[i]->num_aliases;
 	    for (j = extensions[i]->num_aliases; --j >= 0;)
@@ -393,10 +383,9 @@ ProcListExtensions(ClientPtr client)
         for (i=0;  i<NumExtensions; i++)
         {
 	    int len;
-#ifdef XACE
 	    if (!XaceHook(XACE_EXT_ACCESS, client, extensions[i]))
 		continue;
-#endif
+
             *bufptr++ = len = strlen(extensions[i]->name);
 	    memmove(bufptr, extensions[i]->name,  len);
 	    bufptr += len;
diff --git a/dix/getevents.c b/dix/getevents.c
index be598bc..4154262 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -48,10 +48,6 @@
 extern Bool XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies);
 #endif
 
-#ifdef XACE
-#include "xace.h"
-#endif
-
 #ifdef PANORAMIX
 #include "panoramiX.h"
 #include "panoramiXsrv.h"
diff --git a/dix/property.c b/dix/property.c
index da98383..0946b65 100644
--- a/dix/property.c
+++ b/dix/property.c
@@ -58,9 +58,7 @@ SOFTWARE.
 #include "dixstruct.h"
 #include "dispatch.h"
 #include "swaprep.h"
-#ifdef XACE
 #include "xace.h"
-#endif
 
 /*****************************************************************
  * Property Stuff
@@ -118,27 +116,19 @@ ProcRotateProperties(ClientPtr client)
 	return(BadAlloc);
     for (i = 0; i < stuff->nAtoms; i++)
     {
-#ifdef XACE
 	char action = XaceHook(XACE_PROPERTY_ACCESS, client, pWin, atoms[i],
 				SecurityReadAccess|SecurityWriteAccess);
-#endif
-        if (!ValidAtom(atoms[i])
-#ifdef XACE
-	    || (SecurityErrorOperation == action)
-#endif
-	   )
-        {
+
+        if (!ValidAtom(atoms[i]) || (SecurityErrorOperation == action)) {
             DEALLOCATE_LOCAL(props);
 	    client->errorValue = atoms[i];
             return BadAtom;
         }
-#ifdef XACE
-	if (SecurityIgnoreOperation == action)
-        {
+	if (SecurityIgnoreOperation == action) {
             DEALLOCATE_LOCAL(props);
 	    return Success;
 	}
-#endif
+
         for (j = i + 1; j < stuff->nAtoms; j++)
             if (atoms[j] == atoms[i])
             {
@@ -233,17 +223,15 @@ ProcChangeProperty(ClientPtr client)
 	return(BadAtom);
     }
 
-#ifdef XACE
     switch (XaceHook(XACE_PROPERTY_ACCESS, client, pWin, stuff->property,
-					SecurityWriteAccess))
+		     SecurityWriteAccess))
     {
-	case SecurityErrorOperation:
-	    client->errorValue = stuff->property;
-	    return BadAtom;
-	case SecurityIgnoreOperation:
-	    return Success;
+    case SecurityErrorOperation:
+	client->errorValue = stuff->property;
+	return BadAtom;
+    case SecurityIgnoreOperation:
+	return Success;
     }
-#endif
 
     err = ChangeWindowProperty(pWin, stuff->property, stuff->type, (int)format,
 			       (int)mode, len, (pointer)&stuff[1], TRUE);
@@ -460,6 +448,7 @@ ProcGetProperty(ClientPtr client)
     unsigned long n, len, ind;
     WindowPtr pWin;
     xGetPropertyReply reply;
+    Mask access_mode = SecurityReadAccess;
     REQUEST(xGetPropertyReq);
 
     REQUEST_SIZE_MATCH(xGetPropertyReq);
@@ -501,24 +490,18 @@ ProcGetProperty(ClientPtr client)
     if (!pProp) 
 	return NullPropertyReply(client, None, 0, &reply);
 
-#ifdef XACE
+    if (stuff->delete)
+	access_mode |= SecurityDestroyAccess;
+    switch (XaceHook(XACE_PROPERTY_ACCESS, client, pWin, stuff->property,
+		     access_mode))
     {
-	Mask access_mode = SecurityReadAccess;
-
-	if (stuff->delete)
-	    access_mode |= SecurityDestroyAccess;
-	switch(XaceHook(XACE_PROPERTY_ACCESS, client, pWin, stuff->property,
-					   access_mode))
-	{
-	    case SecurityErrorOperation:
-		client->errorValue = stuff->property;
-		return BadAtom;;
-	    case SecurityIgnoreOperation:
-		return NullPropertyReply(client, pProp->type, pProp->format,
-					 &reply);
-	}
+    case SecurityErrorOperation:
+	client->errorValue = stuff->property;
+	return BadAtom;;
+    case SecurityIgnoreOperation:
+	return NullPropertyReply(client, pProp->type, pProp->format, &reply);
     }
-#endif
+
     /* If the request type and actual type don't match. Return the
     property information, but not the data. */
 
@@ -663,17 +646,15 @@ ProcDeleteProperty(register ClientPtr cl
 	return (BadAtom);
     }
 
-#ifdef XACE
-    switch(XaceHook(XACE_PROPERTY_ACCESS, client, pWin, stuff->property,
-				       SecurityDestroyAccess))
-    {
-	case SecurityErrorOperation:
-	    client->errorValue = stuff->property;
-	    return BadAtom;;
-	case SecurityIgnoreOperation:
-	    return Success;
+    switch (XaceHook(XACE_PROPERTY_ACCESS, client, pWin, stuff->property,
+		     SecurityDestroyAccess))
+    {
+    case SecurityErrorOperation:
+	client->errorValue = stuff->property;
+	return BadAtom;;
+    case SecurityIgnoreOperation:
+	return Success;
     }
-#endif
 
     result = DeleteProperty(pWin, stuff->property);
     if (client->noClientException != Success)
diff --git a/dix/resource.c b/dix/resource.c
index efb759e..c204460 100644
--- a/dix/resource.c
+++ b/dix/resource.c
@@ -148,9 +148,7 @@ Equipment Corporation.
 #include "panoramiX.h"
 #include "panoramiXsrv.h"
 #endif
-#ifdef XACE
 #include "xace.h"
-#endif
 #include <assert.h>
 
 #ifdef XSERVER_DTRACE
@@ -904,11 +902,10 @@ SecurityLookupIDByType(ClientPtr client,
 		break;
 	    }
     }
-#ifdef XACE
     if (retval && client && 
 	!XaceHook(XACE_RESOURCE_ACCESS, client, id, rtype, mode, retval))
 	retval = NULL;
-#endif
+
     return retval;
 }
 
@@ -932,11 +929,10 @@ SecurityLookupIDByClass(ClientPtr client
 		break;
 	    }
     }
-#ifdef XACE
     if (retval && client &&
 	!XaceHook(XACE_RESOURCE_ACCESS, client, id, res->type, mode, retval))
 	retval = NULL;
-#endif
+
     return retval;
 }
 
diff --git a/dix/window.c b/dix/window.c
index f0079e0..fa6906f 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -126,9 +126,7 @@ Equipment Corporation.
 #ifdef XAPPGROUP
 #include "appgroup.h"
 #endif
-#ifdef XACE
 #include "xace.h"
-#endif
 
 /******
  * Window stuff for server 
@@ -531,9 +529,7 @@ InitRootWindow(WindowPtr pWin)
     /* We SHOULD check for an error value here XXX */
     (*pScreen->ChangeWindowAttributes)(pWin, backFlag);
 
-#ifdef XACE
     XaceHook(XACE_WINDOW_INIT, serverClient, pWin);
-#endif
 
     MapWindow(pWin, serverClient);
 }
@@ -738,18 +734,16 @@ CreateWindow(Window wid, register Window
     }
 
     pWin->borderWidth = bw;
-#ifdef XACE
+
     /*  can't let untrusted clients have background None windows;
      *  they make it too easy to steal window contents
      */
-    if (!XaceHook(XACE_BACKGRND_ACCESS, client, pWin))
-    {
+    if (XaceHook(XACE_BACKGRND_ACCESS, client, pWin))
+	pWin->backgroundState = None;
+    else {
 	pWin->backgroundState = BackgroundPixel;
 	pWin->background.pixel = 0;
     }
-    else
-#endif
-    pWin->backgroundState = None;
 
     pWin->borderIsPixel = pParent->borderIsPixel;
     pWin->border = pParent->border;
@@ -769,9 +763,7 @@ CreateWindow(Window wid, register Window
     REGION_NULL(pScreen, &pWin->winSize);
     REGION_NULL(pScreen, &pWin->borderSize);
 
-#ifdef XACE
     XaceHook(XACE_WINDOW_INIT, client, pWin);
-#endif
 
     pHead = RealChildHead(pParent);
     if (pHead)
@@ -1036,24 +1028,18 @@ ChangeWindowAttributes(register WindowPt
 		borderRelative = TRUE;
 	    if (pixID == None)
 	    {
-#ifdef XACE
 		/*  can't let untrusted clients have background None windows */
-		if (XaceHook(XACE_BACKGRND_ACCESS, client, pWin))
-		{
-#endif
-		if (pWin->backgroundState == BackgroundPixmap)
-		    (*pScreen->DestroyPixmap)(pWin->background.pixmap);
-		if (!pWin->parent)
-		    MakeRootTile(pWin);
-		else
-		    pWin->backgroundState = None;
-#ifdef XACE
-		}
-		else
-		{ /* didn't change the background to None, so don't tell ddx */
+		if (XaceHook(XACE_BACKGRND_ACCESS, client, pWin)) {
+		    if (pWin->backgroundState == BackgroundPixmap)
+			(*pScreen->DestroyPixmap)(pWin->background.pixmap);
+		    if (!pWin->parent)
+			MakeRootTile(pWin);
+		    else
+			pWin->backgroundState = None;
+		} else {
+		    /* didn't change the backgrnd to None, so don't tell ddx */
 		    index2 = 0; 
 		}
-#endif
 	    }
 	    else if (pixID == ParentRelative)
 	    {
@@ -2739,11 +2725,9 @@ MapWindow(register WindowPtr pWin, Clien
     if (pWin->mapped)
 	return(Success);
 
-#ifdef XACE
     /*  general check for permission to map window */
     if (!XaceHook(XACE_MAP_ACCESS, client, pWin))
 	 return Success;
-#endif	
 
     pScreen = pWin->drawable.pScreen;
     if ( (pParent = pWin->parent) )
diff --git a/os/access.c b/os/access.c
index cdb1758..d61edef 100644
--- a/os/access.c
+++ b/os/access.c
@@ -202,9 +202,7 @@ SOFTWARE.
 #include "dixstruct.h"
 #include "osdep.h"
 
-#ifdef XACE
 #include "xace.h"
-#endif
 
 #ifndef PATH_MAX
 #ifdef MAXPATHLEN
@@ -1528,11 +1526,11 @@ AuthorizedClient(ClientPtr client)
 {
     if (!client || defeatAccessControl)
 	return TRUE;
-#ifdef XACE
+
     /* untrusted clients can't change host access */
     if (!XaceHook(XACE_HOSTLIST_ACCESS, client, SecurityWriteAccess))
 	return FALSE;
-#endif
+
     return LocalClient(client);
 }
 
diff --git a/os/connection.c b/os/connection.c
index 100f1e5..ffe911e 100644
--- a/os/connection.c
+++ b/os/connection.c
@@ -148,9 +148,7 @@ extern __const__ int _nfiles;
 #ifdef XAPPGROUP
 #include "appgroup.h"
 #endif
-#ifdef XACE
 #include "xace.h"
-#endif
 #ifdef XCSECURITY
 #include "securitysrv.h"
 #endif
@@ -750,9 +748,9 @@ ClientAuthorized(ClientPtr client, 
     /* indicate to Xdmcp protocol that we've opened new client */
     XdmcpOpenDisplay(priv->fd);
 #endif /* XDMCP */
-#ifdef XACE
+
     XaceHook(XACE_AUTH_AVAIL, client, auth_id);
-#endif
+
     /* At this point, if the client is authorized to change the access control
      * list, we should getpeername() information, and add the client to
      * the selfhosts list.  It's not really the host machine, but the
diff-tree a5d6499d666fea4a9988118ddd3a5e4c9cfcc32c (from 89b2aa9be81613cb1a06bd535bf50ecf2a00208d)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Fri Dec 1 16:42:37 2006 -0800

    Fix syntax error in configure check for SYSV_IPC that broke with Sun cc

diff --git a/configure.ac b/configure.ac
index db2234f..1aa5455 100644
--- a/configure.ac
+++ b/configure.ac
@@ -174,7 +174,7 @@ AC_CACHE_CHECK([for SYSV IPC],
 		[AC_TRY_LINK([
 #include <sys/shm.h>
 ],[
-int main () { 
+{ 
     int id;
     id = shmget(IPC_PRIVATE, 512, SHM_W | SHM_R);
     if (id < 0) return -1;
diff-tree 89b2aa9be81613cb1a06bd535bf50ecf2a00208d (from 23ba72323af785516db6cbcf6c1b2fa907a8232f)
Author: Keith Packard <keithp at guitar.keithp.com>
Date:   Mon Nov 27 21:40:24 2006 -0800

    Destroying RandR crtc or output overwrites memory.
    
    RRCrtcDestroyResource and RROutputDestroyResource had matching
    bugs that would overwrite memory past the end of the storage
    of the crtc or output arrays. Oops.
    (cherry picked from 4202b23ed86405a4cebfdcf239df1b023c1d10ca commit)

diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 212352c..e8a7b79 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -344,7 +344,7 @@ RRCrtcDestroyResource (pointer value, XI
 	    if (pScrPriv->crtcs[i] == crtc)
 	    {
 		memmove (pScrPriv->crtcs + i, pScrPriv->crtcs + i + 1,
-			 (pScrPriv->numCrtcs - (i - 1)) * sizeof (RRCrtcPtr));
+			 (pScrPriv->numCrtcs - (i + 1)) * sizeof (RRCrtcPtr));
 		--pScrPriv->numCrtcs;
 		break;
 	    }
diff --git a/randr/rroutput.c b/randr/rroutput.c
index f38f582..430f8bd 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -327,7 +327,7 @@ RROutputDestroyResource (pointer value, 
 	    if (pScrPriv->outputs[i] == output)
 	    {
 		memmove (pScrPriv->outputs + i, pScrPriv->outputs + i + 1,
-			 (pScrPriv->numOutputs - (i - 1)) * sizeof (RROutputPtr));
+			 (pScrPriv->numOutputs - (i + 1)) * sizeof (RROutputPtr));
 		--pScrPriv->numOutputs;
 		break;
 	    }
diff-tree 23ba72323af785516db6cbcf6c1b2fa907a8232f (from ccd804c6c01cdfffe938fa5336be9b5668a6f0c0)
Author: Keith Packard <keithp at ukulele.keithp.com>
Date:   Thu Nov 30 23:16:42 2006 -0800

    RandR ListOutputProperties has nAtoms element, not nProperties
    
    Earlier RandR 1.2 encoding revisions used 8-bit nProperties field.
    Final RandR 1.2 spec uses 16-bit nAtoms field instead.
    (cherry picked from 66b6358a393972946f16394918db2401c51dc5ed commit)

diff --git a/randr/rrproperty.c b/randr/rrproperty.c
index a47f306..13e8483 100644
--- a/randr/rrproperty.c
+++ b/randr/rrproperty.c
@@ -325,9 +325,9 @@ ProcRRListOutputProperties (ClientPtr cl
             return(BadAlloc);
 
     rep.type = X_Reply;
-    rep.nProperties = numProps;
     rep.length = (numProps * sizeof(Atom)) >> 2;
     rep.sequenceNumber = client->sequence;
+    rep.nAtoms = numProps;
     if (client->swapped) 
     {
 	int n;
diff-tree ccd804c6c01cdfffe938fa5336be9b5668a6f0c0 (from parents)
Merge: 9423ac134a2a9800787c4978d384827cc4e61fc8 82912ad7709e8cf4a5f8a9fa6b47f789842a3fe9
Author: Drew Parsons <drew at pug.localdomain>
Date:   Fri Dec 1 15:21:57 2006 +1100

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver

diff-tree 9423ac134a2a9800787c4978d384827cc4e61fc8 (from 8956f63a941bf0a5f157d47b33e6221601a75040)
Author: Drew Parsons <drew at pug.localdomain>
Date:   Fri Dec 1 15:21:05 2006 +1100

    GNU/FreeBSD support in GLX: include byteswap.h for FreeBSD systems
    defining __GLIBC__, as done already for Linux and Hurd (cf. bug #5613).
    Also includes some more __GNU__ checks on top of those made in
    commit ade4bf09076d13dbf3549c0a2d987a0afe76d5c1.
    Thanks Petr Salinger (Debian bug #400869).

diff --git a/GL/glx/indirect_dispatch_swap.c b/GL/glx/indirect_dispatch_swap.c
index 1d45676..136f0d0 100644
--- a/GL/glx/indirect_dispatch_swap.c
+++ b/GL/glx/indirect_dispatch_swap.c
@@ -28,7 +28,7 @@
 #include <X11/Xmd.h>
 #include <GL/gl.h>
 #include <GL/glxproto.h>
-#if defined(__linux__) || defined(__GNU__)
+#if defined(__linux__) || defined (__GLIBC__) || defined(__GNU__)
 #include <byteswap.h>
 #elif defined(__OpenBSD__)
 #include <sys/endian.h>
diff --git a/GL/glx/indirect_program.c b/GL/glx/indirect_program.c
index d0fd3d1..8d5f0e6 100644
--- a/GL/glx/indirect_program.c
+++ b/GL/glx/indirect_program.c
@@ -46,7 +46,7 @@
 #include "dispatch.h"
 #include "glapioffsets.h"
 
-#ifdef __linux__
+#if defined(__linux__) || defined (__GLIBC__) || defined (__GNU__)
 #include <byteswap.h>
 #elif defined(__OpenBSD__)
 #include <sys/endian.h>
diff --git a/GL/glx/indirect_reqsize.c b/GL/glx/indirect_reqsize.c
index 1c332da..d3e2bc5 100644
--- a/GL/glx/indirect_reqsize.c
+++ b/GL/glx/indirect_reqsize.c
@@ -31,7 +31,7 @@
 #include "indirect_size.h"
 #include "indirect_reqsize.h"
 
-#if defined(__linux__) || defined(__GNU__)
+#if defined(__linux__) || defined (__GLIBC__) || defined(__GNU__)
 #  include <byteswap.h>
 #  define SWAP_32(v)  do { (v) = bswap_32(v); } while(0)
 #else
diff --git a/GL/glx/indirect_texture_compression.c b/GL/glx/indirect_texture_compression.c
index 0c42ea0..35af1d2 100644
--- a/GL/glx/indirect_texture_compression.c
+++ b/GL/glx/indirect_texture_compression.c
@@ -39,7 +39,7 @@
 #include "glthread.h"
 #include "dispatch.h"
 
-#ifdef __linux__
+#if defined(__linux__) || defined (__GLIBC__) || defined (__GNU__)
 #include <byteswap.h>
 #elif defined(__OpenBSD__)
 #include <sys/endian.h>
diff --git a/GL/glx/indirect_util.c b/GL/glx/indirect_util.c
index 2d64f33..09b7ab8 100644
--- a/GL/glx/indirect_util.c
+++ b/GL/glx/indirect_util.c
@@ -28,7 +28,7 @@
 #include <X11/Xmd.h>
 #include <GL/gl.h>
 #include <GL/glxproto.h>
-#if defined(__linux__) || defined(__GNU__)
+#if defined(__linux__) || defined (__GLIBC__) || defined(__GNU__)
 #include <byteswap.h>
 #elif defined(__OpenBSD__)
 #include <sys/endian.h>
diff --git a/GL/glx/swap_interval.c b/GL/glx/swap_interval.c
index bcc1c47..c4137c1 100644
--- a/GL/glx/swap_interval.c
+++ b/GL/glx/swap_interval.c
@@ -40,7 +40,7 @@
 #include "dispatch.h"
 #include "glapioffsets.h"
 
-#ifdef __linux__
+#if defined(__linux__) || defined (__GLIBC__) || defined (__GNU__)
 #include <byteswap.h>
 #elif defined(__OpenBSD__)
 #include <sys/endian.h>
diff-tree 82912ad7709e8cf4a5f8a9fa6b47f789842a3fe9 (from 8956f63a941bf0a5f157d47b33e6221601a75040)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Thu Nov 30 20:13:52 2006 -0800

    Make solaris version of xf86OSRingBell return void like other OS'es

diff --git a/hw/xfree86/os-support/solaris/sun_bell.c b/hw/xfree86/os-support/solaris/sun_bell.c
index b3a9bfe..29ecd73 100644
--- a/hw/xfree86/os-support/solaris/sun_bell.c
+++ b/hw/xfree86/os-support/solaris/sun_bell.c
@@ -48,7 +48,7 @@
 
 #define AUDIO_DEVICE    "/dev/audio"
 
-_X_EXPORT int
+_X_EXPORT void
 xf86OSRingBell(int loudness, int pitch, int duration)
 {
     static short    samples[BELL_SAMPLES];
@@ -66,7 +66,7 @@ xf86OSRingBell(int loudness, int pitch, 
     int             audioFD;
 
     if ((loudness <= 0) || (pitch <= 0) || (duration <= 0)) {
-        return 0;
+        return;
     }
 
     lastFreq = 0;
@@ -76,7 +76,7 @@ xf86OSRingBell(int loudness, int pitch, 
     if (audioFD == -1) {
         xf86Msg(X_ERROR, "Bell: cannot open audio device \"%s\": %s\n",
                 AUDIO_DEVICE, strerror(errno));
-        return -1;
+        return;
     }
 
     freq = pitch;
@@ -126,7 +126,7 @@ xf86OSRingBell(int loudness, int pitch, 
                 "Bell: AUDIO_SETINFO failed on audio device \"%s\": %s\n",
                 AUDIO_DEVICE, strerror(errno));
         close(audioFD);
-        return -1;
+        return;
     }
 
     iovcnt = 0;
@@ -155,7 +155,7 @@ xf86OSRingBell(int loudness, int pitch, 
                                "Bell: writev failed on audio device \"%s\": %s\n",
                                 AUDIO_DEVICE, strerror(errno));
                         close(audioFD);
-                        return -1;
+                        return;
                     }
                     i = iovcnt;
                 } else {
@@ -181,5 +181,5 @@ xf86OSRingBell(int loudness, int pitch, 
     }
 
     close(audioFD);
-    return 0;
+    return;
 }
diff-tree 8956f63a941bf0a5f157d47b33e6221601a75040 (from ee9bdd3f4a14a42fb0747acc420966f0f669129b)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Thu Nov 30 19:53:29 2006 -0800

    Tell automake to STFU about the *.O files
    
    automake will not stop whining about the *.O files not being in normal library
    name format, so just tell automake they are PROGRAMS so it builds them without
    bitching.

diff --git a/dix/Makefile.am b/dix/Makefile.am
index d0d6e87..a1f02c1 100644
--- a/dix/Makefile.am
+++ b/dix/Makefile.am
@@ -52,7 +52,7 @@ Xserver-dtrace.h: $(srcdir)/Xserver.d
 dtrace-dix.o: $(top_srcdir)/dix/Xserver.d $(am_libdix_la_OBJECTS)
 	$(DTRACE) -G -C -o $@ -s $(top_srcdir)/dix/Xserver.d .libs/*.o
 
-noinst_LIBRARIES = dix.O
+noinst_PROGRAMS = dix.O
 
 dix.O: dtrace-dix.o $(am_libdix_la_OBJECTS)
 	ld -r -o $@ .libs/*.o
diff --git a/os/Makefile.am b/os/Makefile.am
index 7381797..d8d1405 100644
--- a/os/Makefile.am
+++ b/os/Makefile.am
@@ -56,7 +56,7 @@ if XSERVER_DTRACE
 dtrace.o: $(top_srcdir)/dix/Xserver.d $(am_libos_la_OBJECTS)
 	$(DTRACE) -G -C -o $@ -s $(top_srcdir)/dix/Xserver.d .libs/*.o ../dix/.libs/*.o
 
-noinst_LIBRARIES = os.O
+noinst_PROGRAMS = os.O
 
 os.O: dtrace.o $(am_libos_la_OBJECTS)
 	ld -r -o $@ dtrace.o .libs/*.o



More information about the xorg-commit mailing list