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: