[svn] gpg-error - r226 - in trunk: . src src/gpg-extra tests

svn author wk cvs at cvs.gnupg.org
Mon Jan 18 16:10:38 CET 2010


Author: wk
Date: 2010-01-18 16:10:37 +0100 (Mon, 18 Jan 2010)
New Revision: 226

Added:
   trunk/src/gpg-error.def.in
   trunk/src/gpg-extra/
   trunk/src/gpg-extra/errno.h
   trunk/src/w32ce-add.h
Removed:
   trunk/src/gpg-error.def
Modified:
   trunk/ChangeLog
   trunk/NEWS
   trunk/autogen.sh
   trunk/configure.ac
   trunk/ltmain.sh
   trunk/src/Makefile.am
   trunk/src/gpg-error-config.in
   trunk/src/gpg-error.c
   trunk/src/gpg-error.h.in
   trunk/src/init.c
   trunk/src/mkheader.awk
   trunk/src/w32-gettext.c
   trunk/src/w32-gettext.h
   trunk/tests/Makefile.am
   trunk/tests/t-syserror.c
Log:
Add some code to build nativley under WindowsCE - not finished.


Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2009-11-03 19:54:06 UTC (rev 225)
+++ trunk/ChangeLog	2010-01-18 15:10:37 UTC (rev 226)
@@ -1,3 +1,40 @@
+2010-01-18  Werner Koch  <wk at g10code.com>
+
+	* ltmain.sh (wrappers_required): Don't set for mingw32ce.
+
+	* tests/Makefile.am (extra_includes): New.
+	* tests/t-syserror.c (main): Use gpg_err_set_errno.
+
+	* src/w32ce-add.h: New.
+	* src/Makefile.am (EXTRA_DIST): Add it
+	(extra-h.in): New rule
+	(gpg-error.h): Pass extra-h.in to mkheader.
+	* src/mkheader.awk (extra_body): New.
+
+	* src/gpg-error.c (get_err_from_number): Use gpg_err_set_errno.
+
+	* src/mkw32errmap.c: New
+	* src/gpg-error.def: Rename to  ..
+	* src/gpg-error.def.in: .. this.
+	(_gpg_errno_location): New.
+	* src/init.c (struct tls_space_s, tls_index): New.
+	(get_tls, _gpg_errno_location, DllMain): New.
+	(read_w32_registry_string) [W32CE]: Don't expand envvars.
+	(_gpg_w32ce_strerror): New.
+	* src/Makefile.am (extra_headers, extra_cppflags): New.
+	(include_HEADERS): Add extra_headers.  Prefix with nobase_.
+	(libgpg_error_la_CPPFLAGS, gpg_error_CPPFLAGS)
+	(mkerrcodes.h): Add extra_cppflags.
+	(RCCOMPILE): Replace libgpg_error_la_CPPFLAGS by direct inclusion
+	of -DLOCALEDIR.
+	* configure.ac (HAVE_W32CE_SYSTEM): New AM_CONDITIONAL and
+	AC_DEFINE.
+	(GPG_ERROR_CONFIG_ISUBDIRAFTER): New.
+	* src/gpg-error-config.in <--libs>: Replace fixed -lgpg-error
+	by subst variable.
+	(isubdirafter): New.
+	<--cflags>: Take subst variable in account.  Add idirafter stuff.
+
 2009-10-26  Marcus Brinkmann  <marcus at g10code.de>
 
 	* src/gpg-error.h.in (GPG_ERR_SOURCE_DIM): Reduce to 128.

Modified: trunk/NEWS
===================================================================
--- trunk/NEWS	2009-11-03 19:54:06 UTC (rev 225)
+++ trunk/NEWS	2010-01-18 15:10:37 UTC (rev 226)
@@ -1,13 +1,16 @@
 Noteworthy changes in version 1.8
 ----------------------------------------------
 
+ * Preliminary support for WindowsCE.
+
  * Interface changes relative to the 1.7 release:
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- GPG_ERR_NOT_ENABLED           NEW
- GPG_ERR_SOURCE_G13            NEW
+ GPG_ERR_NOT_ENABLED           NEW.
+ GPG_ERR_SOURCE_G13            NEW.
  GPG_ERR_NO_ENGINE             NEW.
+ gpg_err_set_errno             NEW.
+ 
 
-
 Noteworthy changes in version 1.7 (2008-11-26)
 ----------------------------------------------
 

Modified: trunk/autogen.sh
===================================================================
--- trunk/autogen.sh	2009-11-03 19:54:06 UTC (rev 225)
+++ trunk/autogen.sh	2010-01-18 15:10:37 UTC (rev 226)
@@ -35,9 +35,26 @@
   shift
 fi
 
+# Convenience option to use certain configure options for some hosts.
+myhost="" 
+myhostsub=""
+case "$1" in
+    --build-w32)
+        myhost="w32"
+        ;;
+    --build-w32ce)
+        myhost="w32"
+        myhostsub="ce"
+        ;;
+    *)
+     ;;
+esac
+
+
+
 # ***** W32 build script *******
 # Used to cross-compile for Windows.
-if test "$1" = "--build-w32"; then
+if [ "$myhost" = "w32" ]; then
     tmp=`dirname $0`
     tsdir=`cd "$tmp"; pwd`
     shift
@@ -47,12 +64,21 @@
     fi
     build=`$tsdir/config.guess`
 
-    [ -z "$w32root" ] && w32root="$HOME/w32root"
+    case $myhostsub in
+        ce)
+          [ -z "$w32root" ] && w32root="$HOME/w32ce_root"
+          toolprefixes="arm-mingw32ce"
+          ;;
+        *)
+          [ -z "$w32root" ] && w32root="$HOME/w32root"
+          toolprefixes="i586-mingw32msvc i386-mingw32msvc"
+          ;;
+    esac
     echo "Using $w32root as standard install directory" >&2
     
     # Locate the cross compiler
     crossbindir=
-    for host in i586-mingw32msvc i386-mingw32msvc; do
+    for host in $toolprefixes; do
         if ${host}-gcc --version >/dev/null 2>&1 ; then
             crossbindir=/usr/${host}/bin
             conf_CC="CC=${host}-gcc"
@@ -61,8 +87,10 @@
     done
     if [ -z "$crossbindir" ]; then
         echo "Cross compiler kit not installed" >&2
-        echo "Under Debian GNU/Linux, you may install it using" >&2
-        echo "  apt-get install mingw32 mingw32-runtime mingw32-binutils" >&2 
+        if [ -z "$sub" ]; then 
+          echo "Under Debian GNU/Linux, you may install it using" >&2
+          echo "  apt-get install mingw32 mingw32-runtime mingw32-binutils" >&2 
+        fi
         echo "Stop." >&2
         exit 1
     fi

Modified: trunk/configure.ac
===================================================================
--- trunk/configure.ac	2009-11-03 19:54:06 UTC (rev 225)
+++ trunk/configure.ac	2010-01-18 15:10:37 UTC (rev 226)
@@ -87,6 +87,10 @@
 # Set some internal variables depending on the platform for later use.
 have_w32_system=no
 case "${host}" in
+    *-mingw32ce*)
+        have_w32_system=yes
+        have_w32ce_system=yes
+        ;;
     *-mingw32*)
         have_w32_system=yes
         ;;
@@ -129,16 +133,21 @@
 # Substitution used for gpg-error-config
 GPG_ERROR_CONFIG_LIBS="-lgpg-error"
 GPG_ERROR_CONFIG_CFLAGS=""
+GPG_ERROR_CONFIG_ISUBDIRAFTER=""
 AC_SUBST(GPG_ERROR_CONFIG_LIBS)
 AC_SUBST(GPG_ERROR_CONFIG_CFLAGS)
+AC_SUBST(GPG_ERROR_CONFIG_ISUBDIRAFTER)
 AC_CONFIG_FILES([src/gpg-error-config], [chmod +x src/gpg-error-config])
 
 
 # Special defines for certain platforms
 if test "$have_w32_system" = yes; then
     AC_DEFINE(HAVE_W32_SYSTEM,1,[Defined if we run on a W32 API based system])
+    if test "$have_w32ce_system" = yes; then
+      AC_DEFINE(HAVE_W32CE_SYSTEM,1,[Defined if we run on WindowsCE])
+      GPG_ERROR_CONFIG_ISUBDIRAFTER="gpg-extra"
+    fi
     BUILD_TIMESTAMP=`date --iso-8601=minutes`
-    AC_SUBST(BUILD_TIMESTAMP)
     changequote(,)dnl 
     BUILD_FILEVERSION=`echo "$VERSION" | sed 's/\([0-9.]*\).*/\1./;s/\./,/g'`
     changequote([,])dnl
@@ -152,6 +161,7 @@
 AC_SUBST(BUILD_TIMESTAMP)
 AC_SUBST(BUILD_FILEVERSION)
 AM_CONDITIONAL(HAVE_W32_SYSTEM, test "$have_w32_system" = yes)
+AM_CONDITIONAL(HAVE_W32CE_SYSTEM, test "$have_w32ce_system" = yes)
 
 
 AC_ARG_ENABLE(languages,

Modified: trunk/ltmain.sh
===================================================================
--- trunk/ltmain.sh	2009-11-03 19:54:06 UTC (rev 225)
+++ trunk/ltmain.sh	2010-01-18 15:10:37 UTC (rev 226)
@@ -7680,15 +7680,15 @@
 
       wrappers_required=yes
       case $host in
+      *cegcc | *mingw32ce* )
+        # Disable wrappers for cegcc, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
       *cygwin* | *mingw* )
         if test "$build_libtool_libs" != yes; then
           wrappers_required=no
         fi
         ;;
-      *cegcc)
-        # Disable wrappers for cegcc, we are cross compiling anyway.
-        wrappers_required=no
-        ;;
       *)
         if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
           wrappers_required=no

Modified: trunk/src/Makefile.am
===================================================================
--- trunk/src/Makefile.am	2009-11-03 19:54:06 UTC (rev 225)
+++ trunk/src/Makefile.am	2010-01-18 15:10:37 UTC (rev 226)
@@ -21,10 +21,19 @@
 # because they are needed to build the po directory, and they don't
 # depend on the configuration anyway. 
 
+
+if HAVE_W32CE_SYSTEM
+extra_headers  = gpg-extra/errno.h
+extra_cppflags = -idirafter gpg-extra
+else
+extra_headers  =
+extra_cppflags =  
+endif
+
 localedir = $(datadir)/locale
 bin_PROGRAMS = gpg-error
 lib_LTLIBRARIES = libgpg-error.la
-include_HEADERS = gpg-error.h
+nobase_include_HEADERS = gpg-error.h $(extra_headers)
 bin_SCRIPTS = gpg-error-config
 m4datadir = $(datadir)/aclocal
 m4data_DATA = gpg-error.m4
@@ -33,25 +42,26 @@
 EXTRA_DIST = mkstrtable.awk err-sources.h.in err-codes.h.in \
 	mkerrnos.awk errnos.in README \
 	mkerrcodes.awk mkerrcodes1.awk mkerrcodes2.awk mkerrcodes.c \
-	mkheader.awk gpg-error.h.in \
+	mkheader.awk gpg-error.h.in mkw32errmap.c w32ce-add.h \
 	err-sources.h err-codes.h gpg-error-config.in gpg-error.m4 \
-	gpg-error.def versioninfo.rc.in
+	gpg-error.def.in versioninfo.rc.in
 
 BUILT_SOURCES = err-sources.h err-codes.h code-to-errno.h code-from-errno.h \
-	err-sources-sym.h err-codes-sym.h errnos-sym.h gpg-error.h
+	err-sources-sym.h err-codes-sym.h errnos-sym.h gpg-error.h \
+	gpg-error.def gpg-extra/errno.h extra-h.in
 
-tmp_files = _mkerrcodes.h
+tmp_files = _mkerrcodes.h _gpg-error.def.h mkw32errmap.tab.h 
 
 CLEANFILES = err-sources.h err-codes.h code-to-errno.h code-from-errno.h \
-	gpg-error.h mkerrcodes mkerrcodes.h \
-	err-sources-sym.h err-codes-sym.h errnos-sym.h $(tmp_files)
+	gpg-error.h mkerrcodes mkerrcodes.h gpg-error.def mkw32errmap.tab.h \
+	err-sources-sym.h err-codes-sym.h errnos-sym.h gpg-extra/errno.h \
+	extra-h.in $(tmp_files)
 
-
 if HAVE_W32_SYSTEM
 arch_sources = w32-gettext.h w32-gettext.c
 
 RCCOMPILE = $(RC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
-	$(libgpg_error_la_CPPFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS)
+            -DLOCALEDIR=\"$(localedir)\" $(AM_CPPFLAGS) $(CPPFLAGS)
 LTRCCOMPILE = $(LIBTOOL) --mode=compile --tag=RC $(RCCOMPILE)
 
 SUFFIXES = .rc .lo
@@ -63,7 +73,7 @@
 no_undefined = -no-undefined
 export_symbols = -export-symbols $(srcdir)/gpg-error.def
 
-install-def-file:
+install-def-file: gpg-error.def
 	$(INSTALL) gpg-error.def $(DESTDIR)$(libdir)/gpg-error.def
 
 uninstall-def-file:
@@ -92,11 +102,14 @@
 libgpg_error_la_SOURCES = gpg-error.h gettext.h $(arch_sources) \
 	init.c strsource.c strerror.c code-to-errno.c code-from-errno.c
 
-libgpg_error_la_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\"
+# Note that RCCOMPILE needs the same defines as ..._la_CPPFLAGS but
+# without the extra_cppflags because they may include am -idirafter
+# which is not supported by the RC compiler.
+libgpg_error_la_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" $(extra_cppflags)
 libgpg_error_la_LIBADD = $(gpg_error_res) $(intllibs)
 
 gpg_error_SOURCES = strsource-sym.c strerror-sym.c gpg-error.c $(arch_sources)
-gpg_error_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\"
+gpg_error_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" $(extra_cppflags)
 gpg_error_LDADD = ./libgpg-error.la @LTLIBINTL@
 
 err-sources.h: Makefile mkstrtable.awk err-sources.h.in
@@ -119,16 +132,41 @@
 	$(AWK) -f $(srcdir)/mkerrnos.awk $(srcdir)/errnos.in >$@
 
 # It is correct to use $(CPP).  We want the host's idea of the error codes.
-mkerrcodes.h: Makefile mkerrcodes.awk
+mkerrcodes.h: Makefile mkerrcodes.awk $(extra_headers)
 	$(AWK) -f $(srcdir)/mkerrcodes1.awk $(srcdir)/errnos.in >_$@
-	$(CPP) _$@ | grep GPG_ERR_ | $(AWK) -f $(srcdir)/mkerrcodes.awk >$@
+	$(CPP) $(extra_cppflags) _$@ | grep GPG_ERR_ | \
+               $(AWK) -f $(srcdir)/mkerrcodes.awk >$@
 	-rm _$@
 
+if HAVE_W32CE_SYSTEM
+# It is correct to use $(CPP).  We want the host's idea of the error codes.
+mkw32errmap.tab.h: Makefile mkw32errmap.c
+	$(CPP) -DRESOLVE_MACROS $(srcdir)/mkw32errmap.c | \
+	      grep '{&mkw32errmap_marker' >$@
+gpg-extra/errno.h: mkw32errmap
+	./mkw32errmap > $@
+endif
+
+# We use CC proper for preprocessing thus we have to convince it that
+# the data is really to be preprocessed.
+gpg-error.def: Makefile gpg-error.def.in
+	cat $(srcdir)/gpg-error.def.in >_$@.h
+	$(CPP) $(DEFAULT_INCLUDES) $(INCLUDES) $(extra_cppflags) _$@.h | \
+	  grep -v '^#' >$@
+	-rm _$@.h
+
 # It is correct to use $(CC_FOR_BUILD) here.  We want to run the
 # program at build time.
 mkerrcodes: mkerrcodes.c mkerrcodes.h Makefile
 	$(CC_FOR_BUILD) -I. -I$(srcdir) -o $@ $(srcdir)/mkerrcodes.c
 
+if HAVE_W32CE_SYSTEM
+# It is correct to use $(CC_FOR_BUILD) here.  We want to run the
+# program at build time.
+mkw32errmap: mkw32errmap.c mkw32errmap.tab.h Makefile
+	$(CC_FOR_BUILD) -I. -I$(srcdir) -o $@ $(srcdir)/mkw32errmap.c
+endif
+
 code-from-errno.h: mkerrcodes Makefile
 	./mkerrcodes | $(AWK) -f $(srcdir)/mkerrcodes2.awk >$@
 
@@ -137,10 +175,18 @@
 		-v prefix=GPG_ERR_ -v namespace=errnos_ \
 		$(srcdir)/errnos.in >$@
 
-gpg-error.h: Makefile mkheader.awk \
-		 err-sources.h.in err-codes.h.in errnos.in gpg-error.h.in
+extra-h.in: Makefile w32ce-add.h
+	-rm extra-h.in
+if HAVE_W32CE_SYSTEM
+	cat $(srcdir)/w32ce-add.h >extra-h.in
+endif	
+	echo EOF >>extra-h.in
+
+gpg-error.h: Makefile mkheader.awk err-sources.h.in err-codes.h.in \
+	    	 errnos.in extra-h.in gpg-error.h.in
 	$(AWK) -f $(srcdir)/mkheader.awk \
 		$(srcdir)/err-sources.h.in \
 		$(srcdir)/err-codes.h.in \
 		$(srcdir)/errnos.in \
+		extra-h.in \
 		$(srcdir)/gpg-error.h.in > $@

Modified: trunk/src/gpg-error-config.in
===================================================================
--- trunk/src/gpg-error-config.in	2009-11-03 19:54:06 UTC (rev 225)
+++ trunk/src/gpg-error-config.in	2010-01-18 15:10:37 UTC (rev 226)
@@ -14,6 +14,7 @@
 exec_prefix=@exec_prefix@
 includedir=@includedir@
 libdir=@libdir@
+isubdirafter="@GPG_ERROR_CONFIG_ISUBDIRAFTER@"
 
 output=""
 
@@ -60,12 +61,18 @@
 	    if test "x$includedir" != "x/usr/include" -a "x$includedir" != "x/include"; then
 		output="$output -I$includedir"
 	    fi
+            # Note: -idirafter is a gcc extension.  It is only used on
+            #       systems where gcc is the only compiler we support.
+            for i in $isubdirafter; do
+                output="$output -idirafter ${includedir}/${i}"
+            done
+	    output="$output @GPG_ERROR_CONFIG_CFLAGS@"
 	    ;;
 	--libs)
 	    if test "x$libdir" != "x/usr/lib" -a "x$libdir" != "x/lib"; then
 		output="$output -L$libdir"
 	    fi
-	    output="$output -lgpg-error"
+	    output="$output @GPG_ERROR_CONFIG_LIBS@"
 	    ;;
 	*)
             usage 1 1>&2

Modified: trunk/src/gpg-error.c
===================================================================
--- trunk/src/gpg-error.c	2009-11-03 19:54:06 UTC (rev 225)
+++ trunk/src/gpg-error.c	2010-01-18 15:10:37 UTC (rev 226)
@@ -71,7 +71,11 @@
   setlocale (LC_TIME, "");
   setlocale (LC_MESSAGES, "");
 # else
-  setlocale (LC_ALL, "" );
+#   ifdef HAVE_W32_SYSTEM
+#     warning setlocal is missing
+#   else
+      setlocale (LC_ALL, "" );
+#   endif
 # endif
 
   locale_dir = get_locale_dir ();
@@ -158,6 +162,7 @@
     goto leave;
   }
   result[nbytes] = 0; /* make sure it is really a string  */
+#ifndef HAVE_W32CE_SYSTEM
   if (type == REG_EXPAND_SZ && strchr (result, '%')) {
     char *tmp;
 
@@ -196,6 +201,7 @@
       free (tmp);
     }
   }
+#endif /*HAVE_W32CE_SYSTEM*/
 
  leave:
   RegCloseKey( key_handle );
@@ -255,7 +261,7 @@
   unsigned long nr;
   char *tail;
 
-  errno = 0;
+  gpg_err_set_errno (0);
   nr = strtoul (str, &tail, 0);
   if (errno)
     return 0;

Deleted: trunk/src/gpg-error.def

Copied: trunk/src/gpg-error.def.in (from rev 225, trunk/src/gpg-error.def)
===================================================================
--- trunk/src/gpg-error.def.in	                        (rev 0)
+++ trunk/src/gpg-error.def.in	2010-01-18 15:10:37 UTC (rev 226)
@@ -0,0 +1,20 @@
+/* gpg-error.def.in - Exported symbols
+ *   Needs to be processed by CPP.
+ */
+
+#include <config.h>
+
+EXPORTS
+ gpg_strerror             @1
+ gpg_strerror_r           @2  
+ gpg_strsource            @3  
+ gpg_err_code_from_errno  @4
+ gpg_err_code_to_errno    @5
+ gpg_err_init		  @6
+ gpg_err_code_from_syserror @7
+#ifdef HAVE_W32CE_SYSTEM
+ _gpg_w32ce_strerror       @8
+ _gpg_w32ce_get_errno      @9
+#endif
+ gpg_err_set_errno        @10
+


Property changes on: trunk/src/gpg-error.def.in
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:mergeinfo
   + 
Name: svn:eol-style
   + native

Modified: trunk/src/gpg-error.h.in
===================================================================
--- trunk/src/gpg-error.h.in	2009-11-03 19:54:06 UTC (rev 225)
+++ trunk/src/gpg-error.h.in	2010-01-18 15:10:37 UTC (rev 226)
@@ -1,5 +1,5 @@
 /* gpg-error.h - Public interface to libgpg-error.
-   Copyright (C) 2003, 2004 g10 Code GmbH
+   Copyright (C) 2003, 2004, 2010 g10 Code GmbH
 
    This file is part of libgpg-error.
  
@@ -14,10 +14,10 @@
    Lesser General Public License for more details.
  
    You should have received a copy of the GNU Lesser General Public
-   License along with libgpg-error; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.  */
+   License along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
 
+
 #ifndef GPG_ERROR_H
 #define GPG_ERROR_H	1
 
@@ -231,7 +231,11 @@
 gpg_err_code_t gpg_err_code_from_syserror (void);
 
 
+/* Set the ERRNO variable.  This function is the preferred way to set
+   ERRNO due to peculiarities on WindowsCE.  */
+void gpg_err_set_errno (int err);
 
+ at include extra-h.in
 
 /* Self-documenting convenience functions.  */
 

Added: trunk/src/gpg-extra/errno.h
===================================================================
--- trunk/src/gpg-extra/errno.h	                        (rev 0)
+++ trunk/src/gpg-extra/errno.h	2010-01-18 15:10:37 UTC (rev 226)
@@ -0,0 +1,60 @@
+/* errno.h - WindowsCE errno.h substitute
+   Copyright (C) 2010 g10 Code GmbH
+
+   This file is free software; as a special exception the author gives
+   unlimited permission to copy and/or distribute it, with or without
+   modifications, as long as this notice is preserved.
+
+   This file is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY, to the extent permitted by law; without even
+   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+   PURPOSE.
+
+   +++ Do not edit!  File has been generated by mkw32errmap.c +++
+
+   This file is intended to be used with ming32ce-gcc to implement an
+   errno substitute under WindowsCE.  It must be included via gcc's
+   -idirafter option.  The gpg-error-config script emits the
+   appropriate option snippet.  The actual implementation of the errno
+   related functions are part of libgpg-error.  A separate header file
+   is required because errno.h is often included before gpg-error.h.
+ */
+
+#ifndef _GPG_ERROR_EXTRA_ERRNO_H
+#define _GPG_ERROR_EXTRA_ERRNO_H
+
+/* Due to peculiarities in W32 we can't implement ERRNO as an
+   writable lvalue.  This also allows us to easily find places
+   where ERRNO is being written to.  See also gpg_err_set_errno.  */
+int _gpg_w32ce_get_errno (void);
+#define errno (_gpg_w32ce_get_errno ())
+
+#define ENOENT           2
+#define EMFILE           4
+#define EACCES           5
+#define EBADF            6
+#define ENOMEM           8
+#define EXDEV           17
+#define ENFILE          18
+#define EROFS           19
+#define ENOLCK          36
+#define ENOSYS          50
+#define EEXIST          80
+#define EPERM           82
+#define EINVAL          87
+#define EINTR          104
+#define EPIPE          109
+#define ENOSPC         112
+#define ENOTEMPTY      145
+#define EBUSY          170
+#define ENAMETOOLONG   206
+#define EAGAIN         234
+#define ENOTDIR        267
+#define ERANGE         534
+#define ENXIO         1006
+#define EFAULT        1067
+#define EIO           1117
+#define EDEADLOCK     1131
+#define ENODEV        1200
+
+#endif /*_GPG_ERROR_EXTRA_ERRNO_H*/

Modified: trunk/src/init.c
===================================================================
--- trunk/src/init.c	2009-11-03 19:54:06 UTC (rev 225)
+++ trunk/src/init.c	2010-01-18 15:10:37 UTC (rev 226)
@@ -35,14 +35,26 @@
 /* Locale directory support.  */
 
 #if HAVE_W32_SYSTEM
-/* The implementation follows below.  */
+/* The TLS space definition. */
+struct tls_space_s
+{
+  /* 119 bytes for an error message should be enough.  With this size
+     we can assume that the allocation does not take up more than 128
+     bytes per thread.  */
+  char strerror_buffer[120];
+};
+static int tls_index;  /* Index for the TLS functions.  */ 
+
 static char *get_locale_dir (void);
 static void drop_locale_dir (char *locale_dir);
-#else
+
+#else /*!HAVE_W32_SYSTEM*/
+
 #define get_locale_dir() LOCALEDIR
 #define drop_locale_dir(dir)
-#endif
 
+#endif /*!HAVE_W32_SYSTEM*/
+
 
 /* Initialize the library.  This function should be run early.  */
 gpg_error_t
@@ -121,62 +133,72 @@
     }
 
   nbytes = 1;
-  if( RegQueryValueEx( key_handle, name, 0, NULL, NULL, &nbytes ) ) {
-    if (root)
-      goto leave;
-    /* Try to fallback to HKLM also vor a missing value.  */
-    RegCloseKey (key_handle);
-    if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle) )
-      return NULL; /* Nope.  */
-    if (RegQueryValueEx( key_handle, name, 0, NULL, NULL, &nbytes))
-      goto leave;
-  }
-  result = malloc( (n1=nbytes+1) );
+  if( RegQueryValueEx( key_handle, name, 0, NULL, NULL, &nbytes ) ) 
+    {
+      if (root)
+        goto leave;
+      /* Try to fallback to HKLM also vor a missing value.  */
+      RegCloseKey (key_handle);
+      if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle) )
+        return NULL; /* Nope.  */
+      if (RegQueryValueEx( key_handle, name, 0, NULL, NULL, &nbytes))
+        goto leave;
+    }
+  result = malloc ( (n1=nbytes+1) );
   if( !result )
     goto leave;
-  if( RegQueryValueEx( key_handle, name, 0, &type, result, &n1 ) ) {
-    free(result); result = NULL;
-    goto leave;
-  }
+  if( RegQueryValueEx( key_handle, name, 0, &type, result, &n1 ) ) 
+    {
+      free(result); result = NULL;
+      goto leave;
+    }
   result[nbytes] = 0; /* make sure it is really a string  */
-  if (type == REG_EXPAND_SZ && strchr (result, '%')) {
-    char *tmp;
 
-    n1 += 1000;
-    tmp = malloc (n1+1);
-    if (!tmp)
-      goto leave;
-    nbytes = ExpandEnvironmentStrings (result, tmp, n1);
-    if (nbytes && nbytes > n1) {
-      free (tmp);
-      n1 = nbytes;
-      tmp = malloc (n1 + 1);
+#ifndef HAVE_W32CE_SYSTEM  /* W32CE has no environment variables.  */
+  if (type == REG_EXPAND_SZ && strchr (result, '%')) 
+    {
+      char *tmp;
+      
+      n1 += 1000;
+      tmp = malloc (n1+1);
       if (!tmp)
-	goto leave;
+        goto leave;
       nbytes = ExpandEnvironmentStrings (result, tmp, n1);
-      if (nbytes && nbytes > n1) {
-	free (tmp); /* oops - truncated, better don't expand at all */
-	goto leave;
-      }
-      tmp[nbytes] = 0;
-      free (result);
-      result = tmp;
+      if (nbytes && nbytes > n1) 
+        {
+          free (tmp);
+          n1 = nbytes;
+          tmp = malloc (n1 + 1);
+          if (!tmp)
+            goto leave;
+          nbytes = ExpandEnvironmentStrings (result, tmp, n1);
+          if (nbytes && nbytes > n1)
+            {
+              free (tmp); /* oops - truncated, better don't expand at all */
+              goto leave;
+            }
+          tmp[nbytes] = 0;
+          free (result);
+          result = tmp;
+        }
+      else if (nbytes) /* okay, reduce the length */
+        {
+          tmp[nbytes] = 0;
+          free (result);
+          result = malloc (strlen (tmp)+1);
+          if (!result)
+            result = tmp;
+          else {
+            strcpy (result, tmp);
+            free (tmp);
+          }
+        }
+      else /* error - don't expand */
+        {
+          free (tmp);
+        }
     }
-    else if (nbytes) { /* okay, reduce the length */
-      tmp[nbytes] = 0;
-      free (result);
-      result = malloc (strlen (tmp)+1);
-      if (!result)
-	result = tmp;
-      else {
-	strcpy (result, tmp);
-	free (tmp);
-      }
-    }
-    else {  /* error - don't expand */
-      free (tmp);
-    }
-  }
+#endif /*HAVE_W32CE_SYSTEM*/
 
  leave:
   RegCloseKey( key_handle );
@@ -223,4 +245,132 @@
   free (locale_dir);
 }
 
-#endif	/* HAVE_W32_SYSTEM */
+
+/* Return the tls object.  This function is guaranteed to return a
+   valid non-NULL object.  */
+#ifdef HAVE_W32CE_SYSTEM
+static struct tls_space_s *
+get_tls (void)
+{
+  struct tls_space_s *tls;
+
+  tls = TlsGetValue (tls_index);
+  if (!tls)
+    {
+      /* Called by a thread which existed before this DLL was loaded.
+         Allocate the space.  */
+      tls = LocalAlloc (LPTR, sizeof *tls);
+      if (!tls)
+        {
+          /* No way to continue - commit suicide.  */
+          abort ();
+        }
+      TlsSetValue (tls_index, tls);
+    }
+        
+  return tls;
+}
+#endif /*HAVE_W32CE_SYSTEM*/
+
+/* Return the value of the ERRNO variable.  This needs to be a
+   function so that we can have a per-thread ERRNO.  This is used only
+   on WindowsCE because that OS misses an errno.   */
+#ifdef HAVE_W32CE_SYSTEM
+int
+_gpg_w32ce_get_errno (void)
+{
+  int err;
+
+  err = GetLastError ();
+  /* FIXME: Should we fold some W32 error codes into the same errno
+     value? */
+  return err;
+}
+#endif /*HAVE_W32CE_SYSTEM*/
+
+
+/* Replacement strerror function for WindowsCE.  */
+#ifdef HAVE_W32CE_SYSTEM
+char *
+_gpg_w32ce_strerror (int err)
+{
+  struct tls_space_s *tls = get_tls ();
+
+  if (err == -1)
+    err = _gpg_w32ce_get_errno ();
+  if (!FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
+                      MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
+                      tls->strerror_buffer, sizeof tls->strerror_buffer -1,
+                      NULL))
+    snprintf (tls->strerror_buffer, sizeof tls->strerror_buffer -1,
+              "[w32err=%d]", err);
+  return tls->strerror_buffer;    
+}
+#endif /*HAVE_W32CE_SYSTEM*/
+
+
+void
+gpg_err_set_errno (int err)
+{
+#ifdef HAVE_W32CE_SYSTEM
+  SetLastError (err);
+#else /*!HAVE_W32CE_SYSTEM*/
+  errno = err;
+#endif /*!HAVE_W32CE_SYSTEM*/
+}
+
+
+/* Entry point called by the DLL loader.  This is only used by
+   WindowsCE for now; we might eventually use TLS to implement a
+   thread safe strerror.  */
+#ifdef HAVE_W32CE_SYSTEM
+int WINAPI
+DllMain (HINSTANCE hinst, DWORD reason, LPVOID reserved)
+{
+  struct tls_space_s *tls;
+  (void)reserved;
+
+  switch (reason)
+    {
+    case DLL_PROCESS_ATTACH:
+      tls_index = TlsAlloc ();
+      if (tls_index == TLS_OUT_OF_INDEXES)
+        return FALSE; 
+      /* falltru.  */
+    case DLL_THREAD_ATTACH:
+      tls = LocalAlloc (LPTR, sizeof *tls);
+      if (!tls)
+        return FALSE;
+      TlsSetValue (tls_index, tls);
+      break;
+
+    case DLL_THREAD_DETACH:
+      tls = TlsGetValue (tls_index);
+      if (tls)
+        LocalFree (tls);
+      break;
+
+    case DLL_PROCESS_DETACH:
+      tls = TlsGetValue (tls_index);
+      if (tls)
+        LocalFree (tls);
+      TlsFree (tls_index);
+      break;
+
+    default:
+      break;
+    }
+  
+  return TRUE;
+}
+#endif /*HAVE_W32CE_SYSTEM*/
+
+#else /*!HAVE_W32_SYSTEM*/
+
+void
+gpg_err_set_errno (int err)
+{
+  errno = err;
+}
+
+#endif /*!HAVE_W32_SYSTEM*/

Modified: trunk/src/mkheader.awk
===================================================================
--- trunk/src/mkheader.awk	2009-11-03 19:54:06 UTC (rev 225)
+++ trunk/src/mkheader.awk	2010-01-18 15:10:37 UTC (rev 226)
@@ -58,6 +58,8 @@
   codes_nr = 0;
 # errnos_nr holds the number of system errors.
   errnos_nr = 0;
+# extra_nr holds the number of extra lines to be included.
+  extra_nr = 0
 
 # These variables walk us through our input.
   sources_header = 1;
@@ -66,6 +68,7 @@
   codes_body = 0;
   between_codes_and_errnos = 0;
   errnos_body = 0;
+  extra_body = 0;
   gpg_error_h = 0;
 
   print "/* Output of mkheader.awk.  DO NOT EDIT.  */";
@@ -148,9 +151,9 @@
 
   if ($1 !~ /^[0-9]/)
     {
-# Note that this assumes that gpg-error.h.in doesn't start with a digit.
+# Note that this assumes that extra_body.in doesn't start with a digit.
       errnos_body = 0;
-      gpg_error_h = 1;
+      extra_body = 1;
     }
   else
     {
@@ -160,6 +163,23 @@
     }
 }
 
+extra_body {
+  if (/^##/)
+    next
+
+  if (/^EOF/)
+    {
+      extra_body = 0;
+      gpg_error_h = 1;
+      next;
+    }
+  else
+    {
+      extra_line[extra_nr] = $0;
+      extra_nr++;
+    }
+}
+
 gpg_error_h {
   if ($0 ~ /^@include err-sources/)
     {
@@ -180,9 +200,16 @@
   else if ($0 ~ /^@include errnos/)
     {
       for (i = 0; i < errnos_nr; i++)
+       {
+         print "    " errnos_sym[i] " = " errnos_idx[i] ",";
+#        print "#define " errnos_sym[i] " (" errnos_idx[i] ")";
+       }
+    }
+  else if ($0 ~ /^@include extra-h.in/)
+    {
+      for (i = 0; i < extra_nr; i++)
 	{
-	  print "    " errnos_sym[i] " = " errnos_idx[i] ",";
-#	  print "#define " errnos_sym[i] " (" errnos_idx[i] ")";
+            print extra_line[i];
 	}
     }
   else

Modified: trunk/src/w32-gettext.c
===================================================================
--- trunk/src/w32-gettext.c	2009-11-03 19:54:06 UTC (rev 225)
+++ trunk/src/w32-gettext.c	2010-01-18 15:10:37 UTC (rev 226)
@@ -68,7 +68,9 @@
 #endif
 
 #include <stdlib.h>
-#include <locale.h>
+#ifndef HAVE_W32CE_SYSTEM
+# include <locale.h>
+#endif
 
 #ifdef HAVE_W32_SYSTEM
 # include <windows.h>
@@ -776,6 +778,7 @@
 
   /* Let the user override the system settings through environment
      variables, as on POSIX systems.  */
+#ifndef HAVE_W32CE_SYSTEM
   retval = getenv ("LC_ALL");
   if (retval != NULL && retval[0] != '\0')
     return retval;
@@ -785,9 +788,14 @@
   retval = getenv ("LANG");
   if (retval != NULL && retval[0] != '\0')
     return retval;
+#endif /*!HAVE_W32CE_SYSTEM*/
 
   /* Use native Win32 API locale ID.  */
+#ifdef HAVE_W32CE_SYSTEM
+  lcid = GetSystemDefaultLCID ();
+#else
   lcid = GetThreadLocale ();
+#endif
 
   /* Strip off the sorting rules, keep only the language part.  */
   langid = LANGIDFROMLCID (lcid);

Modified: trunk/src/w32-gettext.h
===================================================================
--- trunk/src/w32-gettext.h	2009-11-03 19:54:06 UTC (rev 225)
+++ trunk/src/w32-gettext.h	2010-01-18 15:10:37 UTC (rev 226)
@@ -20,7 +20,11 @@
 
 #if ENABLE_NLS
 
-#include <locale.h>
+#ifdef HAVE_W32CE_SYSTEM
+# define LC_ALL 0
+#else
+# include <locale.h>
+#endif
 #if !defined LC_MESSAGES && !(defined __LOCALE_H || (defined _LOCALE_H && defined __sun))
 # define LC_MESSAGES 1729
 #endif

Added: trunk/src/w32ce-add.h
===================================================================
--- trunk/src/w32ce-add.h	                        (rev 0)
+++ trunk/src/w32ce-add.h	2010-01-18 15:10:37 UTC (rev 226)
@@ -0,0 +1,7 @@
+## w32ce-add.h - Snippet to be be included into gpg-error.h.
+## (Comments are indicated by a double hash mark)
+
+/* Substitute for strerror - this one is thread safe.  */
+char *_gpg_w32ce_strerror (int err);
+#define strerror(a) _gpg_w32ce_strerror (a)
+

Modified: trunk/tests/Makefile.am
===================================================================
--- trunk/tests/Makefile.am	2009-11-03 19:54:06 UTC (rev 225)
+++ trunk/tests/Makefile.am	2010-01-18 15:10:37 UTC (rev 226)
@@ -19,9 +19,16 @@
 
 ## Process this file with automake to produce Makefile.in
 
+if HAVE_W32CE_SYSTEM
+extra_includes = -idirafter $(top_builddir)/src/gpg-extra
+else
+extra_includes = 
+endif
+
+
 TESTS = t-strerror t-syserror
 
-INCLUDES = -I$(top_builddir)/src
+INCLUDES = -I$(top_builddir)/src $(extra_includes)
 
 LDADD = ../src/libgpg-error.la
 

Modified: trunk/tests/t-syserror.c
===================================================================
--- trunk/tests/t-syserror.c	2009-11-03 19:54:06 UTC (rev 225)
+++ trunk/tests/t-syserror.c	2010-01-18 15:10:37 UTC (rev 226)
@@ -64,7 +64,7 @@
       return 1;
     }
 
-  errno = 0;
+  gpg_err_set_errno (0);
 
   ec = gpg_err_code_from_syserror ();
   if (ec != GPG_ERR_MISSING_ERRNO)




More information about the Gnupg-commits mailing list