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 <br...@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 <br...@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 <br...@canonical.com> +--- + diff --git a/configure.ac b/configure.ac index 8500db4..bc3d694 100644 --- a/configure.ac commit bcd777c4c26ea54faae5e98d649383645942b65e Author: Bryce Harrington <br...@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 <br...@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)); -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org