[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xorg-server: Changes to 'ubuntu'



 debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch |  896 ----------
 1 file changed, 17 insertions(+), 879 deletions(-)

New commits:
commit 4602681f67cab041923dbf4f7bcdcf60004cc4d5
Author: Bryce Harrington <bryce@bryceharrington.org>
Date:   Thu Dec 3 15:57:39 2009 -0800

    Re-enable patch 190

diff --git a/debian/patches/series b/debian/patches/series
index 58218c7..ef359e3 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -28,4 +28,4 @@
 187_edid_quirk_hp_nc8430.patch
 188_default_primary_to_first_busid.patch
 189_xserver_1.5.0_bg_none_root.patch
-#190_cache-xkbcomp_output_for_fast_start_up.patch
+190_cache-xkbcomp_output_for_fast_start_up.patch

commit ec57e4002e49319b1bae4147d639a9a34f8ee910
Author: Bryce Harrington <bryce@bryceharrington.org>
Date:   Thu Dec 3 15:45:14 2009 -0800

    Sign patch

diff --git a/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch b/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch
index 9b519bd..e429653 100644
--- a/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch
+++ b/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch
@@ -1,5 +1,8 @@
 Patch from Moblin to cache xkbcomp output for faster booting
 
+Signed-off-by: Bryce Harrington <bryce@canonical.com>
+---
+
 diff --git a/configure.ac b/configure.ac
 index 8500db4..bc3d694 100644
 --- a/configure.ac

commit bcd777c4c26ea54faae5e98d649383645942b65e
Author: Bryce Harrington <bryce@bryceharrington.org>
Date:   Thu Dec 3 15:41:59 2009 -0800

    Really update patch 190

diff --git a/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch b/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch
index 7624022..9b519bd 100644
--- a/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch
+++ b/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch
@@ -1,7 +1,10 @@
-diff -Naur xorg-server-20090727/configure.ac xorg-server-20090727.patch/configure.ac
---- xorg-server-20090727/configure.ac	2009-07-26 16:15:37.000000000 +0200
-+++ xorg-server-20090727.patch/configure.ac	2009-08-08 20:28:07.100479376 +0200
-@@ -476,9 +476,9 @@
+Patch from Moblin to cache xkbcomp output for faster booting
+
+diff --git a/configure.ac b/configure.ac
+index 8500db4..bc3d694 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -502,9 +502,9 @@ AC_ARG_WITH(default-font-path, AS_HELP_STRING([--with-default-font-path=PATH], [
  AC_ARG_WITH(xkb-path,         AS_HELP_STRING([--with-xkb-path=PATH], [Path to XKB base dir (default: ${datadir}/X11/xkb)]),
  				[ XKBPATH="$withval" ],
  				[ XKBPATH="${datadir}/X11/xkb" ])
@@ -10,36 +13,55 @@ diff -Naur xorg-server-20090727/configure.ac xorg-server-20090727.patch/configur
  				[ XKBOUTPUT="$withval" ],
 -				[ XKBOUTPUT="compiled" ])
 +				[ XKBOUTPUT="${localstatedir}/cache/xkb" ])
- AC_ARG_WITH(serverconfig-path, AS_HELP_STRING([--with-serverconfig-path=PATH],
- 				   [Directory where ancillary server config files are installed (default: ${libdir}/xorg)]),
- 				[ SERVERCONFIG="$withval" ],
-@@ -1757,7 +1757,7 @@
+ AC_ARG_WITH(default-xkb-rules, AS_HELP_STRING([--with-default-xkb-rules=RULES],
+                                    [Keyboard ruleset (default: base/evdev)]),
+                                 [ XKB_DFLT_RULES="$withval" ],
+@@ -1101,7 +1101,7 @@ AC_DEFINE_DIR(XKB_BIN_DIRECTORY, XKB_BIN_DIRECTORY, [Path to XKB bin dir])
+ dnl Make sure XKM_OUTPUT_DIR is an absolute path
  XKBOUTPUT_FIRSTCHAR=`echo $XKBOUTPUT | cut -b 1`
- 
- if [[ x$XKBOUTPUT_FIRSTCHAR != x/ ]] ; then
+ if [[ x$XKBOUTPUT_FIRSTCHAR != x/ -a x$XKBOUTPUT_FIRSTCHAR != 'x$' ]] ; then
 -   XKBOUTPUT="$XKB_BASE_DIRECTORY/$XKBOUTPUT"
 +   AC_MSG_ERROR([xkb-output must be an absolute path.])
  fi
  
- # XKM_OUTPUT_DIR (used in code) must end in / or file names get hosed
-diff -Naur xorg-server-20090727/xkb/ddxLoad.c xorg-server-20090727.patch/xkb/ddxLoad.c
---- xorg-server-20090727/xkb/ddxLoad.c	2009-07-26 16:15:37.000000000 +0200
-+++ xorg-server-20090727.patch/xkb/ddxLoad.c	2009-08-08 20:48:46.504353541 +0200
-@@ -32,6 +32,13 @@
+ dnl XKM_OUTPUT_DIR (used in code) must end in / or file names get hosed
+diff --git a/xkb/README.compiled b/xkb/README.compiled
+index 71caa2f..a4a2ae0 100644
+--- a/xkb/README.compiled
++++ b/xkb/README.compiled
+@@ -4,10 +4,10 @@ current keymap and/or any scratch keymaps used by clients.  The X server
+ or some other tool might destroy or replace the files in this directory,
+ so it is not a safe place to store compiled keymaps for long periods of
+ time.  The default keymap for any server is usually stored in:
+-     X<num>-default.xkm
+-where <num> is the display number of the server in question, which makes
+-it possible for several servers *on the same host* to share the same 
+-directory.
++     server-<SHA1>.xkm
++
++where <SHA1> is the SHA1 hash of keymap source, so that compiled
++keymap of different keymap sources are stored in different files.
+ 
+ Unless the X server is modified, sharing this directory between servers on
+ different hosts could cause problems.
+diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c
+index ba8d50b..c086dd1 100644
+--- a/xkb/ddxLoad.c
++++ b/xkb/ddxLoad.c
+@@ -32,6 +32,12 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
  #include <xkb-config.h>
  #endif
  
-+#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */
-+# include <sha1.h>
++#ifdef HAVE_SHA1_IN_LIBGCRYPT /* Use libgcrypt for SHA1 */
++# include <gcrypt.h>
 +#else /* Use OpenSSL's libcrypto */
-+# include <stddef.h>  /* buggy openssl/sha.h wants size_t */
-+# include <openssl/sha.h>
++#warning "xkbcomp caching support disabled"
 +#endif
 +
  #include <stdio.h>
  #include <ctype.h>
- #define	NEED_EVENTS 1
-@@ -46,24 +53,13 @@
+ #include <X11/X.h>
+@@ -45,24 +51,13 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
  #define	XKBSRV_NEED_FILE_FUNCS
  #include <xkbsrv.h>
  #include <X11/extensions/XI.h>
@@ -65,37 +87,39 @@ diff -Naur xorg-server-20090727/xkb/ddxLoad.c xorg-server-20090727.patch/xkb/ddx
  #define	PRE_ERROR_MSG "\"The XKEYBOARD keymap compiler (xkbcomp) reports:\""
  #define	ERROR_PREFIX	"\"> \""
  #define	POST_ERROR_MSG1 "\"Errors from xkbcomp are not fatal to the X server\""
-@@ -178,6 +174,45 @@
-     }
+@@ -177,6 +172,47 @@ OutputDirectory(
  }
  
+ static Bool
++#ifndef SHA_DIGEST_LENGTH
++#define SHA_DIGEST_LENGTH 20
++#endif
++
 +static Bool
 +Sha1Asc(char sha1Asc[SHA_DIGEST_LENGTH*2+1], const char * input)
 +{
 +    int i;
 +    unsigned char sha1[SHA_DIGEST_LENGTH];
 +
-+#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */
-+    SHA1_CTX ctx;
-+
-+    SHA1Init (&ctx);
-+    SHA1Update (&ctx, input, strlen(input));
-+    SHA1Final (sha1, &ctx);
-+#else /* Use OpenSSL's libcrypto */
-+    SHA_CTX ctx;
-+    int success;
-+
-+    success = SHA1_Init (&ctx);
-+    if (! success)
-+	return BadAlloc;
++#ifdef HAVE_SHA1_IN_LIBGCRYPT /* Use libgcrypt for SHA1 */
++    static int init;
++    gcry_md_hd_t h;
++    gcry_error_t err;
 +
-+    success = SHA1_Update (&ctx, input, strlen(input));
-+    if (! success)
-+	return BadAlloc;
++    if (!init) {
++	if (!gcry_check_version(NULL))
++	    return BadAlloc;
++	gcry_control(GCRYCTL_DISABLE_SECMEM, 0);
++	gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
++	init = 1;
++    }
 +
-+    success = SHA1_Final (sha1, &ctx);
-+    if (! success)
++    err = gcry_md_open(&h, GCRY_MD_SHA1, 0);
++    if (err)
 +	return BadAlloc;
++    gcry_md_write(h, input, strlen(input));
++    memcpy(sha1, gcry_md_read(h, GCRY_MD_SHA1), 20);
++    gcry_md_close(h);
 +#endif
 +
 +    /* convert sha1 to sha1_asc */
@@ -108,10 +132,10 @@ diff -Naur xorg-server-20090727/xkb/ddxLoad.c xorg-server-20090727.patch/xkb/ddx
 +
 +/* call xkbcomp and compile XKB keymap, return xkm file name in
 +   nameRtrn */
- static Bool    	
  XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
  				XkbComponentNamesPtr	names,
-@@ -187,7 +222,11 @@
+ 				unsigned		want,
+@@ -185,7 +221,11 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
  				int			nameRtrnLen)
  {
      FILE *	out;
@@ -124,7 +148,7 @@ diff -Naur xorg-server-20090727/xkb/ddxLoad.c xorg-server-20090727.patch/xkb/ddx
  
      const char	*emptystring = "";
      const char	*xkbbasedirflag = emptystring;
-@@ -198,16 +237,70 @@
+@@ -196,14 +236,67 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
      /* WIN32 has no popen. The input must be stored in a file which is
         used as input for xkbcomp. xkbcomp does not read from stdin. */
      char tmpname[PATH_MAX];
@@ -171,10 +195,7 @@ diff -Naur xorg-server-20090727/xkb/ddxLoad.c xorg-server-20090727.patch/xkb/ddx
 +        snprintf(xkmfile, sizeof(xkmfile), "server-%s", display);
 +    }
  
--    XkbEnsureSafeMapName(keymap);
-+    // XkbEnsureSafeMapName(keymap);
      OutputDirectory(xkm_output_dir, sizeof(xkm_output_dir));
- 
 +    /* set nameRtrn, fail if it's too small */
 +    if ((strlen(xkmfile)+1 > nameRtrnLen) && nameRtrn) {
 +        ErrorF("[xkb] nameRtrn too small to hold xkmfile name\n");
@@ -195,11 +216,10 @@ diff -Naur xorg-server-20090727/xkb/ddxLoad.c xorg-server-20090727.patch/xkb/ddx
 +    /* continue to call xkbcomp to compile the keymap. to avoid race
 +       condition, we compile it to a tmpfile then rename it to
 +       xkmfile */
-+
+ 
  #ifdef WIN32
      strcpy(tmpname, Win32TempDir());
-     strcat(tmpname, "\\xkb_XXXXXX");
-@@ -230,19 +323,30 @@
+@@ -227,19 +320,30 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
  	}
      }
  
@@ -233,7 +253,7 @@ diff -Naur xorg-server-20090727/xkb/ddxLoad.c xorg-server-20090727.patch/xkb/ddx
  #ifndef WIN32
      out= Popen(buf,"w");
  #else
-@@ -250,31 +354,43 @@
+@@ -247,31 +351,43 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
  #endif
      
      if (out!=NULL) {
@@ -290,7 +310,7 @@ diff -Naur xorg-server-20090727/xkb/ddxLoad.c xorg-server-20090727.patch/xkb/ddx
  #ifdef WIN32
          /* remove the temporary file */
          unlink(tmpname);
-@@ -289,9 +405,17 @@
+@@ -286,9 +402,17 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
      }
      if (nameRtrn)
  	nameRtrn[0]= '\0';
@@ -309,7 +329,7 @@ diff -Naur xorg-server-20090727/xkb/ddxLoad.c xorg-server-20090727.patch/xkb/ddx
  }
  
  static FILE *
-@@ -375,7 +499,6 @@
+@@ -372,7 +496,6 @@ unsigned	missing;
  	DebugF("Loaded XKB keymap %s, defined=0x%x\n",fileName,(*xkbRtrn)->defined);
      }
      fclose(file);
@@ -317,114 +337,3 @@ diff -Naur xorg-server-20090727/xkb/ddxLoad.c xorg-server-20090727.patch/xkb/ddx
      return (need|want)&(~missing);
  }
  
-diff -Naur xorg-server-20090727/xkb/README.compiled xorg-server-20090727.patch/xkb/README.compiled
---- xorg-server-20090727/xkb/README.compiled	2009-07-26 16:15:37.000000000 +0200
-+++ xorg-server-20090727.patch/xkb/README.compiled	2009-08-08 20:29:17.059354234 +0200
-@@ -4,10 +4,10 @@
- or some other tool might destroy or replace the files in this directory,
- so it is not a safe place to store compiled keymaps for long periods of
- time.  The default keymap for any server is usually stored in:
--     X<num>-default.xkm
--where <num> is the display number of the server in question, which makes
--it possible for several servers *on the same host* to share the same 
--directory.
-+     server-<SHA1>.xkm
-+
-+where <SHA1> is the SHA1 hash of keymap source, so that compiled
-+keymap of different keymap sources are stored in different files.
- 
- Unless the X server is modified, sharing this directory between servers on
- different hosts could cause problems.
---- xorg-server-20090727/xkb/ddxLoad.c	2009-07-26 16:15:37.000000000 +0200
-+++ xorg-server-20090727.patch/xkb/ddxLoad.c	2009-08-08 20:48:46.504353541 +0200
-@@ -32,11 +32,10 @@
- #include <xkb-config.h>
- #endif
- 
--#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */
--# include <sha1.h>
-+#ifdef HAVE_SHA1_IN_LIBGCRYPT /* Use libgcrypt for SHA1 */
-+# include <gcrypt.h>
- #else /* Use OpenSSL's libcrypto */
--# include <stddef.h>  /* buggy openssl/sha.h wants size_t */
--# include <openssl/sha.h>
-+#warning "xkbcomp caching support disabled"
- #endif
- 
- #include <stdio.h>
-@@ -174,40 +173,37 @@
-     }
- }
- 
-+#ifndef SHA_DIGEST_LENGTH
-+#define SHA_DIGEST_LENGTH 20
-+#endif
-+
- static Bool
- Sha1Asc(char sha1Asc[SHA_DIGEST_LENGTH*2+1], const char * input)
- {
-     int i;
-     unsigned char sha1[SHA_DIGEST_LENGTH];
- 
--#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */
--    SHA1_CTX ctx;
--
--    SHA1Init (&ctx);
--    SHA1Update (&ctx, input, strlen(input));
--    SHA1Final (sha1, &ctx);
--#else /* Use OpenSSL's libcrypto */
--    SHA_CTX ctx;
--    int success;
--
--    success = SHA1_Init (&ctx);
--    if (! success)
--	return BadAlloc;
--
--    success = SHA1_Update (&ctx, input, strlen(input));
--    if (! success)
--	return BadAlloc;
-+#ifdef HAVE_SHA1_IN_LIBGCRYPT /* Use libgcrypt for SHA1 */
-+    static int init;
-+    gcry_md_hd_t h;
-+    gcry_error_t err;
-+
-+    if (!init) {
-+	if (!gcry_check_version(NULL))
-+	    return BadAlloc;
-+	gcry_control(GCRYCTL_DISABLE_SECMEM, 0);
-+	gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
-+	init = 1;
-+    }
- 
--    success = SHA1_Final (sha1, &ctx);
--    if (! success)
-+    err = gcry_md_open(&h, GCRY_MD_SHA1, 0);
-+    if (err)
- 	return BadAlloc;
-+    gcry_md_write(h, input, strlen(input));
-+    memcpy(sha1, gcry_md_read(h, GCRY_MD_SHA1), 20);
-+    gcry_md_close(h);
- #endif
- 
--    /* convert sha1 to sha1_asc */
--    for(i=0; i<SHA_DIGEST_LENGTH; ++i) {
--        sprintf(sha1Asc+i*2, "%02X", sha1[i]);
--    }
--
-     return Success;
- }
- 
---- xorg-server-20090727/xkb/ddxLoad.c
-+++ xorg-server-20090727.patch/xkb/ddxLoad.c
-@@ -204,6 +204,11 @@
-     gcry_md_close(h);
- #endif
- 
-+    /* convert sha1 to sha1_asc */
-+    for(i=0; i<SHA_DIGEST_LENGTH; ++i) {
-+        sprintf(sha1Asc+i*2, "%02X", sha1[i]);
-+    }
-+
-     return Success;
- }
- 

commit 66eabbe184e175a0f76395d4561c23163ffc3483
Author: Bryce Harrington <bryce@bryceharrington.org>
Date:   Thu Dec 3 15:35:24 2009 -0800

    Revert 190; I seem to have loused it up refreshing it.

diff --git a/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch b/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch
index cdd7245..7624022 100644
--- a/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch
+++ b/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch
@@ -428,777 +428,3 @@ diff -Naur xorg-server-20090727/xkb/README.compiled xorg-server-20090727.patch/x
      return Success;
  }
  
-diff --git a/configure.ac b/configure.ac
-index 8500db4..bc3d694 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -502,9 +502,9 @@ AC_ARG_WITH(default-font-path, AS_HELP_STRING([--with-default-font-path=PATH], [
- AC_ARG_WITH(xkb-path,         AS_HELP_STRING([--with-xkb-path=PATH], [Path to XKB base dir (default: ${datadir}/X11/xkb)]),
- 				[ XKBPATH="$withval" ],
- 				[ XKBPATH="${datadir}/X11/xkb" ])
--AC_ARG_WITH(xkb-output,       AS_HELP_STRING([--with-xkb-output=PATH], [Path to XKB output dir (default: ${datadir}/X11/xkb/compiled)]),
-+AC_ARG_WITH(xkb-output,       AS_HELP_STRING([--with-xkb-output=PATH], [Path to XKB output dir (default: ${localstatedir}/cache/xkb)]),
- 				[ XKBOUTPUT="$withval" ],
--				[ XKBOUTPUT="compiled" ])
-+				[ XKBOUTPUT="${localstatedir}/cache/xkb" ])
- AC_ARG_WITH(default-xkb-rules, AS_HELP_STRING([--with-default-xkb-rules=RULES],
-                                    [Keyboard ruleset (default: base/evdev)]),
-                                 [ XKB_DFLT_RULES="$withval" ],
-@@ -1101,7 +1101,7 @@ AC_DEFINE_DIR(XKB_BIN_DIRECTORY, XKB_BIN_DIRECTORY, [Path to XKB bin dir])
- dnl Make sure XKM_OUTPUT_DIR is an absolute path
- XKBOUTPUT_FIRSTCHAR=`echo $XKBOUTPUT | cut -b 1`
- if [[ x$XKBOUTPUT_FIRSTCHAR != x/ -a x$XKBOUTPUT_FIRSTCHAR != 'x$' ]] ; then
--   XKBOUTPUT="$XKB_BASE_DIRECTORY/$XKBOUTPUT"
-+   AC_MSG_ERROR([xkb-output must be an absolute path.])
- fi
- 
- dnl XKM_OUTPUT_DIR (used in code) must end in / or file names get hosed
-diff --git a/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch b/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch
-index 7624022..e69de29 100644
---- a/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch
-+++ b/debian/patches/190_cache-xkbcomp_output_for_fast_start_up.patch
-@@ -1,430 +0,0 @@
--diff -Naur xorg-server-20090727/configure.ac xorg-server-20090727.patch/configure.ac
----- xorg-server-20090727/configure.ac	2009-07-26 16:15:37.000000000 +0200
--+++ xorg-server-20090727.patch/configure.ac	2009-08-08 20:28:07.100479376 +0200
--@@ -476,9 +476,9 @@
-- AC_ARG_WITH(xkb-path,         AS_HELP_STRING([--with-xkb-path=PATH], [Path to XKB base dir (default: ${datadir}/X11/xkb)]),
-- 				[ XKBPATH="$withval" ],
-- 				[ XKBPATH="${datadir}/X11/xkb" ])
---AC_ARG_WITH(xkb-output,       AS_HELP_STRING([--with-xkb-output=PATH], [Path to XKB output dir (default: ${datadir}/X11/xkb/compiled)]),
--+AC_ARG_WITH(xkb-output,       AS_HELP_STRING([--with-xkb-output=PATH], [Path to XKB output dir (default: ${localstatedir}/cache/xkb)]),
-- 				[ XKBOUTPUT="$withval" ],
---				[ XKBOUTPUT="compiled" ])
--+				[ XKBOUTPUT="${localstatedir}/cache/xkb" ])
-- AC_ARG_WITH(serverconfig-path, AS_HELP_STRING([--with-serverconfig-path=PATH],
-- 				   [Directory where ancillary server config files are installed (default: ${libdir}/xorg)]),
-- 				[ SERVERCONFIG="$withval" ],
--@@ -1757,7 +1757,7 @@
-- XKBOUTPUT_FIRSTCHAR=`echo $XKBOUTPUT | cut -b 1`
-- 
-- if [[ x$XKBOUTPUT_FIRSTCHAR != x/ ]] ; then
---   XKBOUTPUT="$XKB_BASE_DIRECTORY/$XKBOUTPUT"
--+   AC_MSG_ERROR([xkb-output must be an absolute path.])
-- fi
-- 
-- # XKM_OUTPUT_DIR (used in code) must end in / or file names get hosed
--diff -Naur xorg-server-20090727/xkb/ddxLoad.c xorg-server-20090727.patch/xkb/ddxLoad.c
----- xorg-server-20090727/xkb/ddxLoad.c	2009-07-26 16:15:37.000000000 +0200
--+++ xorg-server-20090727.patch/xkb/ddxLoad.c	2009-08-08 20:48:46.504353541 +0200
--@@ -32,6 +32,13 @@
-- #include <xkb-config.h>
-- #endif
-- 
--+#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */
--+# include <sha1.h>
--+#else /* Use OpenSSL's libcrypto */
--+# include <stddef.h>  /* buggy openssl/sha.h wants size_t */
--+# include <openssl/sha.h>
--+#endif
--+
-- #include <stdio.h>
-- #include <ctype.h>
-- #define	NEED_EVENTS 1
--@@ -46,24 +53,13 @@
-- #define	XKBSRV_NEED_FILE_FUNCS
-- #include <xkbsrv.h>
-- #include <X11/extensions/XI.h>
--+#include <errno.h>
-- #include "xkb.h"
-- 
-- #if defined(CSRG_BASED) || defined(linux) || defined(__GNU__)
-- #include <paths.h>
-- #endif
-- 
---	/*
---	 * If XKM_OUTPUT_DIR specifies a path without a leading slash, it is
---	 * relative to the top-level XKB configuration directory.
---	 * Making the server write to a subdirectory of that directory
---	 * requires some work in the general case (install procedure
---	 * has to create links to /var or somesuch on many machines),
---	 * so we just compile into /usr/tmp for now.
---	 */
---#ifndef XKM_OUTPUT_DIR
---#define	XKM_OUTPUT_DIR	"compiled/"
---#endif
---
-- #define	PRE_ERROR_MSG "\"The XKEYBOARD keymap compiler (xkbcomp) reports:\""
-- #define	ERROR_PREFIX	"\"> \""
-- #define	POST_ERROR_MSG1 "\"Errors from xkbcomp are not fatal to the X server\""
--@@ -178,6 +174,45 @@
--     }
-- }
-- 
--+static Bool
--+Sha1Asc(char sha1Asc[SHA_DIGEST_LENGTH*2+1], const char * input)
--+{
--+    int i;
--+    unsigned char sha1[SHA_DIGEST_LENGTH];
--+
--+#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */
--+    SHA1_CTX ctx;
--+
--+    SHA1Init (&ctx);
--+    SHA1Update (&ctx, input, strlen(input));
--+    SHA1Final (sha1, &ctx);
--+#else /* Use OpenSSL's libcrypto */
--+    SHA_CTX ctx;
--+    int success;
--+
--+    success = SHA1_Init (&ctx);
--+    if (! success)
--+	return BadAlloc;
--+
--+    success = SHA1_Update (&ctx, input, strlen(input));
--+    if (! success)
--+	return BadAlloc;
--+
--+    success = SHA1_Final (sha1, &ctx);
--+    if (! success)
--+	return BadAlloc;
--+#endif
--+
--+    /* convert sha1 to sha1_asc */
--+    for(i=0; i<SHA_DIGEST_LENGTH; ++i) {
--+        sprintf(sha1Asc+i*2, "%02X", sha1[i]);
--+    }
--+
--+    return Success;
--+}
--+
--+/* call xkbcomp and compile XKB keymap, return xkm file name in
--+   nameRtrn */
-- static Bool    	
-- XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
-- 				XkbComponentNamesPtr	names,
--@@ -187,7 +222,11 @@
-- 				int			nameRtrnLen)
-- {
--     FILE *	out;
---    char	*buf = NULL, keymap[PATH_MAX], xkm_output_dir[PATH_MAX];
--+    char *	buf = NULL, xkmfile[PATH_MAX], xkm_output_dir[PATH_MAX];
--+    char *	tmpXkmFile = NULL;
--+    char *	canonicalXkmFileName = NULL;
--+    char	sha1Asc[SHA_DIGEST_LENGTH*2+1], xkbKeyMapBuf[100*1024];
--+    int	ret, result;
-- 
--     const char	*emptystring = "";
--     const char	*xkbbasedirflag = emptystring;
--@@ -198,16 +237,70 @@
--     /* WIN32 has no popen. The input must be stored in a file which is
--        used as input for xkbcomp. xkbcomp does not read from stdin. */
--     char tmpname[PATH_MAX];
---    const char *xkmfile = tmpname;
--+    const char *xkbfile = tmpname;
-- #else
---    const char *xkmfile = "-";
--+    const char *xkbfile = "-";
-- #endif
-- 
---    snprintf(keymap, sizeof(keymap), "server-%s", display);
--+    /* Write keymap source (xkbfile) to memory buffer `xkbKeyMapBuf',
--+       of which SHA1 is generated and used as result xkm file name  */
--+    memset(xkbKeyMapBuf, 0, sizeof(xkbKeyMapBuf));
--+    out = fmemopen(xkbKeyMapBuf, sizeof(xkbKeyMapBuf), "w");
--+    if (NULL == out) {
--+        ErrorF("[xkb] Open xkbKeyMapBuf for writing failed\n");
--+        return False;
--+    }
--+    ret = XkbWriteXKBKeymapForNames(out, names, xkb, want, need);
--+    if (fclose(out) !=0)
--+    {
--+        ErrorF("[xkb] XkbWriteXKBKeymapForNames error, perhaps xkbKeyMapBuf is too small\n");
--+        return False;
--+    }
--+#ifdef DEBUG
--+    if (xkbDebugFlags) {
--+       ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n");
--+       fputs(xkbKeyMapBuf, stderr);
--+    }
--+#endif
--+    if (!ret) {
--+        ErrorF("[xkb] Generating XKB Keymap failed, giving up compiling keymap\n");
--+        return False;
--+    }
--+
--+    DebugF("[xkb] computing SHA1 of keymap\n");
--+    if (Success == Sha1Asc(sha1Asc, xkbKeyMapBuf)) {
--+        snprintf(xkmfile, sizeof(xkmfile), "server-%s", sha1Asc);
--+    }
--+    else {
--+        ErrorF("[xkb] Computing SHA1 of keymap failed, "
--+               "using display name instead as xkm file name\n");
--+        snprintf(xkmfile, sizeof(xkmfile), "server-%s", display);
--+    }
-- 
---    XkbEnsureSafeMapName(keymap);
--+    // XkbEnsureSafeMapName(keymap);
--     OutputDirectory(xkm_output_dir, sizeof(xkm_output_dir));
-- 
--+    /* set nameRtrn, fail if it's too small */
--+    if ((strlen(xkmfile)+1 > nameRtrnLen) && nameRtrn) {
--+        ErrorF("[xkb] nameRtrn too small to hold xkmfile name\n");
--+        return False;
--+    }
--+    strncpy(nameRtrn, xkmfile, nameRtrnLen);
--+
--+    /* if the xkm file already exists, reuse it */
--+    canonicalXkmFileName = Xprintf("%s%s.xkm", xkm_output_dir, xkmfile);
--+    if (access(canonicalXkmFileName, R_OK) == 0) {
--+        /* yes, we can reuse the old xkm file */
--+        LogMessage(X_INFO, "XKB: reuse xkmfile %s\n", canonicalXkmFileName);
--+        result = True;
--+        goto _ret;
--+    }
--+    LogMessage(X_INFO, "XKB: generating xkmfile %s\n", canonicalXkmFileName);
--+
--+    /* continue to call xkbcomp to compile the keymap. to avoid race
--+       condition, we compile it to a tmpfile then rename it to
--+       xkmfile */
--+
-- #ifdef WIN32
--     strcpy(tmpname, Win32TempDir());
--     strcat(tmpname, "\\xkb_XXXXXX");
--@@ -230,19 +323,30 @@
-- 	}
--     }
-- 
--+    if ( (tmpXkmFile = tempnam(xkm_output_dir, NULL)) == NULL ) {
--+        ErrorF("[xkb] Can't generate temp xkm file name");
--+        result = False;
--+        goto _ret;
--+    }
--+
--     buf = Xprintf("\"%s%sxkbcomp\" -w %d %s -xkm \"%s\" "
---		  "-em1 %s -emp %s -eml %s \"%s%s.xkm\"",
--+		  "-em1 %s -emp %s -eml %s \"%s\"",
-- 		  xkbbindir, xkbbindirsep,
-- 		  ( (xkbDebugFlags < 2) ? 1 :
-- 		    ((xkbDebugFlags > 10) ? 10 : (int)xkbDebugFlags) ),
---		  xkbbasedirflag, xkmfile,
--+		  xkbbasedirflag, xkbfile,
-- 		  PRE_ERROR_MSG, ERROR_PREFIX, POST_ERROR_MSG1,
---		  xkm_output_dir, keymap);
--+		  tmpXkmFile);
-- 
--     if (xkbbasedirflag != emptystring) {
-- 	xfree(xkbbasedirflag);
--     }
--     
--+    /* there's a potential race condition between calling tempnam()
--+       and invoking xkbcomp to write the result file (potential temp
--+       file name conflicts), but since xkbcomp is a standalone
--+       program, we have to live with this */
--+
-- #ifndef WIN32
--     out= Popen(buf,"w");
-- #else
--@@ -250,31 +354,43 @@
-- #endif
--     
--     if (out!=NULL) {
---#ifdef DEBUG
---    if (xkbDebugFlags) {
---       ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n");
---       XkbWriteXKBKeymapForNames(stderr,names,xkb,want,need);
--+        /* write XKBKeyMapBuf to xkbcomp */
--+        if (EOF==fputs(xkbKeyMapBuf, out))
--+        {
--+            ErrorF("[xkb] Sending keymap to xkbcomp failed\n");
--+            result = False;
--+            goto _ret;
--     }
---#endif
---	XkbWriteXKBKeymapForNames(out,names,xkb,want,need);
-- #ifndef WIN32
-- 	if (Pclose(out)==0)
-- #else
-- 	if (fclose(out)==0 && System(buf) >= 0)
-- #endif
-- 	{
--+        /* xkbcomp success */
--             if (xkbDebugFlags)
--                 DebugF("[xkb] xkb executes: %s\n",buf);
---	    if (nameRtrn) {
---		strncpy(nameRtrn,keymap,nameRtrnLen);
---		nameRtrn[nameRtrnLen-1]= '\0';
--+
--+            /* if canonicalXkmFileName already exists now, we simply
--+               overwrite it, this is OK */
--+            ret = rename(tmpXkmFile, canonicalXkmFileName);
--+            if (0 != ret) {
--+                ErrorF("[xkb] Can't rename %s to %s, error: %s\n",
--+                       tmpXkmFile, canonicalXkmFileName,
--+                       strerror(errno));
--+
--+                /* in case of error, don't unlink tmpXkmFile, leave it
--+                   for debugging */
--+
--+                result = False;
--+                goto _ret;
-- 	    }
---            if (buf != NULL)
---                xfree (buf);
---	    return True;
--+
--+            result = True;
--+            goto _ret;
-- 	}
-- 	else
---	    LogMessage(X_ERROR, "Error compiling keymap (%s)\n", keymap);
--+	    LogMessage(X_ERROR, "Error compiling keymap (%s)\n", xkbfile);
-- #ifdef WIN32
--         /* remove the temporary file */
--         unlink(tmpname);
--@@ -289,9 +405,17 @@
--     }
--     if (nameRtrn)
-- 	nameRtrn[0]= '\0';
--+    result = False;
--+
--+_ret:
--+    if (tmpXkmFile)
--+        free(tmpXkmFile);
--+    if (canonicalXkmFileName)
--+        xfree(canonicalXkmFileName);
--     if (buf != NULL)
--         xfree (buf);
---    return False;
--+
--+    return result;
-- }
-- 
-- static FILE *
--@@ -375,7 +499,6 @@
-- 	DebugF("Loaded XKB keymap %s, defined=0x%x\n",fileName,(*xkbRtrn)->defined);
--     }
--     fclose(file);
---    (void) unlink (fileName);
--     return (need|want)&(~missing);
-- }
-- 
--diff -Naur xorg-server-20090727/xkb/README.compiled xorg-server-20090727.patch/xkb/README.compiled
----- xorg-server-20090727/xkb/README.compiled	2009-07-26 16:15:37.000000000 +0200
--+++ xorg-server-20090727.patch/xkb/README.compiled	2009-08-08 20:29:17.059354234 +0200
--@@ -4,10 +4,10 @@
-- or some other tool might destroy or replace the files in this directory,
-- so it is not a safe place to store compiled keymaps for long periods of
-- time.  The default keymap for any server is usually stored in:
---     X<num>-default.xkm
---where <num> is the display number of the server in question, which makes
---it possible for several servers *on the same host* to share the same 
---directory.
--+     server-<SHA1>.xkm
--+
--+where <SHA1> is the SHA1 hash of keymap source, so that compiled
--+keymap of different keymap sources are stored in different files.
-- 
-- Unless the X server is modified, sharing this directory between servers on
-- different hosts could cause problems.
----- xorg-server-20090727/xkb/ddxLoad.c	2009-07-26 16:15:37.000000000 +0200
--+++ xorg-server-20090727.patch/xkb/ddxLoad.c	2009-08-08 20:48:46.504353541 +0200
--@@ -32,11 +32,10 @@
-- #include <xkb-config.h>
-- #endif
-- 
---#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */
---# include <sha1.h>
--+#ifdef HAVE_SHA1_IN_LIBGCRYPT /* Use libgcrypt for SHA1 */
--+# include <gcrypt.h>
-- #else /* Use OpenSSL's libcrypto */
---# include <stddef.h>  /* buggy openssl/sha.h wants size_t */
---# include <openssl/sha.h>
--+#warning "xkbcomp caching support disabled"
-- #endif
-- 
-- #include <stdio.h>
--@@ -174,40 +173,37 @@
--     }
-- }
-- 
--+#ifndef SHA_DIGEST_LENGTH
--+#define SHA_DIGEST_LENGTH 20
--+#endif
--+
-- static Bool
-- Sha1Asc(char sha1Asc[SHA_DIGEST_LENGTH*2+1], const char * input)
-- {
--     int i;
--     unsigned char sha1[SHA_DIGEST_LENGTH];
-- 
---#ifdef HAVE_SHA1_IN_LIBMD /* Use libmd for SHA1 */
---    SHA1_CTX ctx;
---
---    SHA1Init (&ctx);
---    SHA1Update (&ctx, input, strlen(input));
---    SHA1Final (sha1, &ctx);
---#else /* Use OpenSSL's libcrypto */
---    SHA_CTX ctx;
---    int success;
---
---    success = SHA1_Init (&ctx);
---    if (! success)
---	return BadAlloc;
---
---    success = SHA1_Update (&ctx, input, strlen(input));
---    if (! success)
---	return BadAlloc;
--+#ifdef HAVE_SHA1_IN_LIBGCRYPT /* Use libgcrypt for SHA1 */
--+    static int init;
--+    gcry_md_hd_t h;
--+    gcry_error_t err;
--+
--+    if (!init) {
--+	if (!gcry_check_version(NULL))
--+	    return BadAlloc;
--+	gcry_control(GCRYCTL_DISABLE_SECMEM, 0);
--+	gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
--+	init = 1;
--+    }
-- 
---    success = SHA1_Final (sha1, &ctx);
---    if (! success)
--+    err = gcry_md_open(&h, GCRY_MD_SHA1, 0);
--+    if (err)
-- 	return BadAlloc;
--+    gcry_md_write(h, input, strlen(input));
--+    memcpy(sha1, gcry_md_read(h, GCRY_MD_SHA1), 20);
--+    gcry_md_close(h);
-- #endif
-- 
---    /* convert sha1 to sha1_asc */
---    for(i=0; i<SHA_DIGEST_LENGTH; ++i) {
---        sprintf(sha1Asc+i*2, "%02X", sha1[i]);
---    }
---
--     return Success;
-- }
-- 
----- xorg-server-20090727/xkb/ddxLoad.c
--+++ xorg-server-20090727.patch/xkb/ddxLoad.c
--@@ -204,6 +204,11 @@
--     gcry_md_close(h);
-- #endif
-- 
--+    /* convert sha1 to sha1_asc */
--+    for(i=0; i<SHA_DIGEST_LENGTH; ++i) {
--+        sprintf(sha1Asc+i*2, "%02X", sha1[i]);
--+    }
--+
--     return Success;
-- }
-- 
-diff --git a/xkb/README.compiled b/xkb/README.compiled
-index 71caa2f..a4a2ae0 100644
---- a/xkb/README.compiled
-+++ b/xkb/README.compiled
-@@ -4,10 +4,10 @@ current keymap and/or any scratch keymaps used by clients.  The X server
- or some other tool might destroy or replace the files in this directory,
- so it is not a safe place to store compiled keymaps for long periods of
- time.  The default keymap for any server is usually stored in:
--     X<num>-default.xkm
--where <num> is the display number of the server in question, which makes
--it possible for several servers *on the same host* to share the same 
--directory.
-+     server-<SHA1>.xkm
-+
-+where <SHA1> is the SHA1 hash of keymap source, so that compiled
-+keymap of different keymap sources are stored in different files.
- 
- Unless the X server is modified, sharing this directory between servers on
- different hosts could cause problems.
-diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c
-index ba8d50b..4076f6b 100644
---- a/xkb/ddxLoad.c
-+++ b/xkb/ddxLoad.c
-@@ -32,6 +32,12 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
- #include <xkb-config.h>
- #endif
- 
-+#ifdef HAVE_SHA1_IN_LIBGCRYPT /* Use libgcrypt for SHA1 */
-+# include <gcrypt.h>
-+#else /* Use OpenSSL's libcrypto */
-+#warning "xkbcomp caching support disabled"
-+#endif
-+
- #include <stdio.h>
- #include <ctype.h>
- #include <X11/X.h>
-@@ -45,24 +51,13 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
- #define	XKBSRV_NEED_FILE_FUNCS
- #include <xkbsrv.h>
- #include <X11/extensions/XI.h>
-+#include <errno.h>
- #include "xkb.h"
- 
- #if defined(CSRG_BASED) || defined(linux) || defined(__GNU__)
- #include <paths.h>
- #endif
- 
--	/*
--	 * If XKM_OUTPUT_DIR specifies a path without a leading slash, it is
--	 * relative to the top-level XKB configuration directory.
--	 * Making the server write to a subdirectory of that directory
--	 * requires some work in the general case (install procedure
--	 * has to create links to /var or somesuch on many machines),
--	 * so we just compile into /usr/tmp for now.
--	 */
--#ifndef XKM_OUTPUT_DIR
--#define	XKM_OUTPUT_DIR	"compiled/"
--#endif
--
- #define	PRE_ERROR_MSG "\"The XKEYBOARD keymap compiler (xkbcomp) reports:\""
- #define	ERROR_PREFIX	"\"> \""
- #define	POST_ERROR_MSG1 "\"Errors from xkbcomp are not fatal to the X server\""
-@@ -177,6 +172,47 @@ OutputDirectory(
- }
- 
- static Bool
-+#ifndef SHA_DIGEST_LENGTH
-+#define SHA_DIGEST_LENGTH 20
-+#endif
-+
-+static Bool
-+Sha1Asc(char sha1Asc[SHA_DIGEST_LENGTH*2+1], const char * input)
-+{
-+    int i;
-+    unsigned char sha1[SHA_DIGEST_LENGTH];
-+
-+#ifdef HAVE_SHA1_IN_LIBGCRYPT /* Use libgcrypt for SHA1 */
-+    static int init;
-+    gcry_md_hd_t h;
-+    gcry_error_t err;
-+
-+    if (!init) {
-+	if (!gcry_check_version(NULL))
-+	    return BadAlloc;
-+	gcry_control(GCRYCTL_DISABLE_SECMEM, 0);
-+	gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
-+	init = 1;
-+    }
-+
-+    err = gcry_md_open(&h, GCRY_MD_SHA1, 0);
-+    if (err)
-+	return BadAlloc;
-+    gcry_md_write(h, input, strlen(input));
-+    memcpy(sha1, gcry_md_read(h, GCRY_MD_SHA1), 20);
-+    gcry_md_close(h);
-+#endif
-+
-+    /* convert sha1 to sha1_asc */
-+    for(i=0; i<SHA_DIGEST_LENGTH; ++i) {
-+        sprintf(sha1Asc+i*2, "%02X", sha1[i]);
-+    }
-+
-+    return Success;
-+}
-+
-+/* call xkbcomp and compile XKB keymap, return xkm file name in
-+   nameRtrn */
- XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
- 				XkbComponentNamesPtr	names,
- 				unsigned		want,
-@@ -185,7 +221,11 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
- 				int			nameRtrnLen)
- {
-     FILE *	out;
--    char	*buf = NULL, keymap[PATH_MAX], xkm_output_dir[PATH_MAX];
-+    char *	buf = NULL, xkmfile[PATH_MAX], xkm_output_dir[PATH_MAX];
-+    char *	tmpXkmFile = NULL;
-+    char *	canonicalXkmFileName = NULL;
-+    char	sha1Asc[SHA_DIGEST_LENGTH*2+1], xkbKeyMapBuf[100*1024];
-+    int	ret, result;
- 
-     const char	*emptystring = "";
-     const char	*xkbbasedirflag = emptystring;
-@@ -196,15 +236,69 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
-     /* WIN32 has no popen. The input must be stored in a file which is
-        used as input for xkbcomp. xkbcomp does not read from stdin. */
-     char tmpname[PATH_MAX];
--    const char *xkmfile = tmpname;
-+    const char *xkbfile = tmpname;
- #else
--    const char *xkmfile = "-";
-+    const char *xkbfile = "-";
-+#endif
-+
-+    /* Write keymap source (xkbfile) to memory buffer `xkbKeyMapBuf',
-+       of which SHA1 is generated and used as result xkm file name  */
-+    memset(xkbKeyMapBuf, 0, sizeof(xkbKeyMapBuf));


Reply to: