2008-02-19 Marcus Brinkmann <marcus@g10code.de>
authorMarcus Brinkmann <mb@g10code.com>
Tue, 19 Feb 2008 15:40:15 +0000 (15:40 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Tue, 19 Feb 2008 15:40:15 +0000 (15:40 +0000)
* src/kleowrap.c: New file.
* src/kleopatra.bat: Removed.
* src/Makefile.am (EXTRA_DIST): Remove kleopatra.bat, add
kleowrap.c.
(CLEANFILES): Add kleowrap.exe.
(gpg4win-$(VERSION).exe, gpg4win-light-$(VERSION).exe,
(gpg4win-$(VERSION).wix, gpg4win-light-$(VERSION).wix): Add
kleowrap.exe as dependency.
(gpgwrap.exe): Use make magic.
(kleowrap.exe): New target.
* src/inst-kleopatra.nsi: Install kleowrap.exe as kleopatra.exe,
and do not install kleopatra.bat.
* src/uninst-kleopatra.nsi: Uninstall kleopatra.exe instead of
kleopatra.bat.
* src/inst-sections.nsi (no_desktop): Replace kleopatra.bat by
kleopatra.exe.

ChangeLog
src/Makefile.am
src/inst-kleopatra.nsi
src/inst-sections.nsi
src/kleopatra.bat [deleted file]
src/kleowrap.c [new file with mode: 0644]
src/uninst-kleopatra.nsi

index 63821b0..51e699e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2008-02-19  Marcus Brinkmann  <marcus@g10code.de>
+
+       * src/kleowrap.c: New file.
+       * src/kleopatra.bat: Removed.
+       * src/Makefile.am (EXTRA_DIST): Remove kleopatra.bat, add
+       kleowrap.c.
+       (CLEANFILES): Add kleowrap.exe.
+       (gpg4win-$(VERSION).exe, gpg4win-light-$(VERSION).exe,
+       (gpg4win-$(VERSION).wix, gpg4win-light-$(VERSION).wix): Add
+       kleowrap.exe as dependency.
+       (gpgwrap.exe): Use make magic.
+       (kleowrap.exe): New target.
+       * src/inst-kleopatra.nsi: Install kleowrap.exe as kleopatra.exe,
+       and do not install kleopatra.bat.
+       * src/uninst-kleopatra.nsi: Uninstall kleopatra.exe instead of
+       kleopatra.bat.
+       * src/inst-sections.nsi (no_desktop): Replace kleopatra.bat by
+       kleopatra.exe.
+
 2008-02-18  Marcus Brinkmann  <marcus@g10code.de>
 
        * packages/packages.current: Update kdelibs and kleopatra.
 2008-02-18  Marcus Brinkmann  <marcus@g10code.de>
 
        * packages/packages.current: Update kdelibs and kleopatra.
index 86ec66c..5606bc3 100644 (file)
@@ -22,7 +22,7 @@ EXTRA_DIST = pkg-config gpg4win.nsi gpg4win-src.nsi config.site \
         installer-options.ini.in libiconv.def libintl.def loreley.mid \
         gpg4win-splash.wav gpgwrap.c exdll.h g4wihelp.c g4wihelp.nsi \
         inst-sections.nsi installer.nsi installer-finish.nsi  \
         installer-options.ini.in libiconv.def libintl.def loreley.mid \
         gpg4win-splash.wav gpgwrap.c exdll.h g4wihelp.c g4wihelp.nsi \
         inst-sections.nsi installer.nsi installer-finish.nsi  \
-        qt.conf kleopatra.bat                                 \
+        qt.conf kleowrap.c                                    \
         inst-gpg4win.nsi          uninst-gpg4win.nsi         \
         inst-atk.nsi               uninst-atk.nsi            \
         inst-cairo.nsi            uninst-cairo.nsi           \
         inst-gpg4win.nsi          uninst-gpg4win.nsi         \
         inst-atk.nsi               uninst-atk.nsi            \
         inst-cairo.nsi            uninst-cairo.nsi           \
@@ -71,7 +71,7 @@ EXTRA_DIST = pkg-config gpg4win.nsi gpg4win-src.nsi config.site \
 
 # Need to clean the dll because we bypassed automake.
 CLEANFILES = g4wihelp.dll versioninfo.txt README.en.txt README.de.txt \
 
 # Need to clean the dll because we bypassed automake.
 CLEANFILES = g4wihelp.dll versioninfo.txt README.en.txt README.de.txt \
-             installer-options.ini NEWS.tmp gpgwrap.exe
+             installer-options.ini NEWS.tmp gpgwrap.exe kleowrap.exe
 
 # Supported source packages.
 gpg4win_spkgs = glib gnupg libgpg-error gpgme gpgol gpgex \
 
 # Supported source packages.
 gpg4win_spkgs = glib gnupg libgpg-error gpgme gpgol gpgex \
@@ -407,26 +407,28 @@ README.de.txt : versioninfo.txt NEWS.tmp $(top_srcdir)/doc/README.de.txt
 # if makensis changed to the directory of the source file at startup.
 # So we have to pull a couple of strings to correct this.
 gpg4win-$(VERSION).exe: gpg4win.nsi $(common_nsi) stamps/stamp-final \
 # if makensis changed to the directory of the source file at startup.
 # So we have to pull a couple of strings to correct this.
 gpg4win-$(VERSION).exe: gpg4win.nsi $(common_nsi) stamps/stamp-final \
-                        g4wihelp.dll gpgwrap.exe README.en.txt README.de.txt \
-                       installer-options.ini versioninfo.txt
+                        g4wihelp.dll gpgwrap.exe kleowrap.exe README.en.txt \
+                       README.de.txt installer-options.ini versioninfo.txt
        $(MAKENSIS) -V3 -DBUILD_DIR=`pwd` -DTOP_SRCDIR=$(top_srcdir) \
                -DSRCDIR=$(srcdir) $(srcdir)/gpg4win.nsi
 
 gpg4win-light-$(VERSION).exe: gpg4win.nsi $(common_nsi) stamps/stamp-final \
        $(MAKENSIS) -V3 -DBUILD_DIR=`pwd` -DTOP_SRCDIR=$(top_srcdir) \
                -DSRCDIR=$(srcdir) $(srcdir)/gpg4win.nsi
 
 gpg4win-light-$(VERSION).exe: gpg4win.nsi $(common_nsi) stamps/stamp-final \
-                        g4wihelp.dll gpgwrap.exe README.en.txt README.de.txt \
-                       installer-options.ini versioninfo.txt
+                        g4wihelp.dll gpgwrap.exe kleowrap.exe README.en.txt \
+                       README.de.txt installer-options.ini versioninfo.txt
        $(MAKENSIS) -V3 -DBUILD_DIR=`pwd` -DTOP_SRCDIR=$(top_srcdir) \
                -DSRCDIR=$(srcdir) -DGPG4WIN_LIGHT=1 $(srcdir)/gpg4win.nsi
 
 gpg4win-$(VERSION).wix: gpg4win.nsi $(common_nsi) stamps/stamp-final \
        $(MAKENSIS) -V3 -DBUILD_DIR=`pwd` -DTOP_SRCDIR=$(top_srcdir) \
                -DSRCDIR=$(srcdir) -DGPG4WIN_LIGHT=1 $(srcdir)/gpg4win.nsi
 
 gpg4win-$(VERSION).wix: gpg4win.nsi $(common_nsi) stamps/stamp-final \
-                       gpgwrap.exe README.en.txt README.de.txt versioninfo.txt
+                       gpgwrap.exe kleowrap.exe README.en.txt \
+                       README.de.txt versioninfo.txt
        perl make-msi.pl --guids $(srcdir)/make-msi.guids \
                --manifest gpg4win-$(VERSION).files \
                -DBUILD_DIR=. -DTOP_SRCDIR=$(top_srcdir) \
                -DSRCDIR=$(srcdir) $(srcdir)/gpg4win.nsi > $@
 
 gpg4win-light-$(VERSION).wix: gpg4win.nsi $(common_nsi) stamps/stamp-final \
        perl make-msi.pl --guids $(srcdir)/make-msi.guids \
                --manifest gpg4win-$(VERSION).files \
                -DBUILD_DIR=. -DTOP_SRCDIR=$(top_srcdir) \
                -DSRCDIR=$(srcdir) $(srcdir)/gpg4win.nsi > $@
 
 gpg4win-light-$(VERSION).wix: gpg4win.nsi $(common_nsi) stamps/stamp-final \
-                       gpgwrap.exe README.en.txt README.de.txt versioninfo.txt
+                       gpgwrap.exe kleowrap.exe README.en.txt \
+                       README.de.txt versioninfo.txt
        perl make-msi.pl --guids $(srcdir)/make-msi.guids \
                --manifest gpg4win-light-$(VERSION).files \
                -DBUILD_DIR=. -DTOP_SRCDIR=$(top_srcdir) \
        perl make-msi.pl --guids $(srcdir)/make-msi.guids \
                --manifest gpg4win-light-$(VERSION).files \
                -DBUILD_DIR=. -DTOP_SRCDIR=$(top_srcdir) \
@@ -451,8 +453,12 @@ g4wihelp.dll: g4wihelp.c exdll.h
        $(STRIP) g4wihelp.dll
 
 gpgwrap.exe: gpgwrap.c
        $(STRIP) g4wihelp.dll
 
 gpgwrap.exe: gpgwrap.c
-       $(CC) -I. -I.. -DHAVE_CONFIG_H -O2 -o gpgwrap.exe $(srcdir)/gpgwrap.c 
-       $(STRIP) gpgwrap.exe
+       $(CC) -I. -I.. -DHAVE_CONFIG_H -O2 -o $@ $^
+       $(STRIP) $@
+
+kleowrap.exe: kleowrap.c
+       $(CC) -I. -I.. -DHAVE_CONFIG_H -O2 -mwindows -o $@ $^
+       $(STRIP) $@
 
 if BUILD_SOURCE_INSTALLER
 all_src = gpg4win-src-$(VERSION).exe
 
 if BUILD_SOURCE_INSTALLER
 all_src = gpg4win-src-$(VERSION).exe
index 7716bf7..54d6475 100644 (file)
@@ -1,5 +1,5 @@
 # inst-kleopatra.nsi - Installer snippet for kleopatra.      -*- coding: latin-1; -*-
 # inst-kleopatra.nsi - Installer snippet for kleopatra.      -*- coding: latin-1; -*-
-# Copyright (C) 2005, 2007 g10 Code GmbH
+# Copyright (C) 2005, 2007, 2008 g10 Code GmbH
 # 
 # This file is part of GPG4Win.
 # 
 # 
 # This file is part of GPG4Win.
 # 
@@ -33,7 +33,7 @@ ${MementoSection} "Kleopatra" SEC_kleopatra
   SetOutPath "$INSTDIR\bin"
   File ${prefix}/bin/kleopatra.exe
   SetOutPath "$INSTDIR"
   SetOutPath "$INSTDIR\bin"
   File ${prefix}/bin/kleopatra.exe
   SetOutPath "$INSTDIR"
-  File ${SRCDIR}/kleopatra.bat
+  File /oname=kleopatra.exe "${BUILD_DIR}/kleowrap.exe"
 
   File ${prefix}/bin/kgpgconf.exe
   File ${prefix}/lib/libgpgme++-glib.dll
 
   File ${prefix}/bin/kgpgconf.exe
   File ${prefix}/lib/libgpgme++-glib.dll
index 03d6055..83ff125 100644 (file)
@@ -922,7 +922,7 @@ Section "-startmenu"
     IntOp $R0 $R0 & ${SF_SELECTED} 
     IntCmp $R0 ${SF_SELECTED} 0 no_kleopatra_menu 
     CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Kleopatra.lnk" \
     IntOp $R0 $R0 & ${SF_SELECTED} 
     IntCmp $R0 ${SF_SELECTED} 0 no_kleopatra_menu 
     CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Kleopatra.lnk" \
-       "$INSTDIR\kleopatra.bat" \
+       "$INSTDIR\kleopatra.exe" \
         "" "" "" SW_SHOWNORMAL "" $(DESC_Menu_kleopatra)
   no_kleopatra_menu:
 !endif
         "" "" "" SW_SHOWNORMAL "" $(DESC_Menu_kleopatra)
   no_kleopatra_menu:
 !endif
@@ -1100,7 +1100,7 @@ Section "-startmenu"
     IntOp $R0 $R0 & ${SF_SELECTED}
     IntCmp $R0 ${SF_SELECTED} 0 no_kleopatra_desktop
     CreateShortCut "$DESKTOP\Kleopatra.lnk" \
     IntOp $R0 $R0 & ${SF_SELECTED}
     IntCmp $R0 ${SF_SELECTED} 0 no_kleopatra_desktop
     CreateShortCut "$DESKTOP\Kleopatra.lnk" \
-       "$INSTDIR\kleopatra.bat" \
+       "$INSTDIR\kleopatra.exe" \
         "" "" "" SW_SHOWNORMAL "" $(DESC_Menu_kleopatra)
   no_kleopatra_desktop:
 !endif
         "" "" "" SW_SHOWNORMAL "" $(DESC_Menu_kleopatra)
   no_kleopatra_desktop:
 !endif
@@ -1241,7 +1241,7 @@ no_desktop:
     IntOp $R0 $R0 & ${SF_SELECTED} 
     IntCmp $R0 ${SF_SELECTED} 0 no_kleopatra_quicklaunch
     CreateShortCut "$QUICKLAUNCH\Kleopatra.lnk" \
     IntOp $R0 $R0 & ${SF_SELECTED} 
     IntCmp $R0 ${SF_SELECTED} 0 no_kleopatra_quicklaunch
     CreateShortCut "$QUICKLAUNCH\Kleopatra.lnk" \
-       "$INSTDIR\kleopatra.bat" \
+       "$INSTDIR\kleopatra.exe" \
         "" "" "" SW_SHOWNORMAL "" $(DESC_Menu_kleopatra)
   no_kleopatra_quicklaunch:
 !endif
         "" "" "" SW_SHOWNORMAL "" $(DESC_Menu_kleopatra)
   no_kleopatra_quicklaunch:
 !endif
diff --git a/src/kleopatra.bat b/src/kleopatra.bat
deleted file mode 100644 (file)
index eeca7ac..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-@echo off
-cd %0\..\
-bin\kleopatra %*
diff --git a/src/kleowrap.c b/src/kleowrap.c
new file mode 100644 (file)
index 0000000..5e01801
--- /dev/null
@@ -0,0 +1,160 @@
+/* kleopatrawrap.c - Wrapper to call gpg udner Windows.
+ * Copyright (C) 2007 g10 Code GmbH
+ *
+ * This file is part of Gpg4win.
+ *
+ * Gpg4win is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Gpg4win is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <process.h>
+#include <windows.h>
+
+
+/* Return a copy of ARGV, but with proper quoting.  To release the
+   copy, you have to free argv_quoted[0] and argv_quoted.  */
+static char **
+build_commandline (const char * const *argv)
+{
+  int i;
+  int j;
+  int n = 0;
+  char *buf;
+  char *p;
+  char **argv_quoted;
+
+  /* We have to quote some things because under Windows the program
+     parses the commandline and does some unquoting.  We enclose the
+     whole argument in double-quotes, and escape literal double-quotes
+     as well as backslashes with a backslash.  We end up with a
+     trailing space at the end of the line, but that is harmless.  */
+  for (i = 0; argv[i]; i++)
+    {
+      p = (char *) argv[i];
+      /* The leading double-quote.  */
+      n++;
+      while (*p)
+       {
+         /* An extra one for each literal that must be escaped.  */
+         if (*p == '\\' || *p == '"')
+           n++;
+         n++;
+         p++;
+       }
+      /* The trailing double-quote and the delimiter.  */
+      n += 2;
+    }
+  /* And a trailing zero.  */
+  n++;
+
+  /* Allocate a new vector.  */
+  argv_quoted = malloc (sizeof (char *) * (i + 1));
+  if (!argv_quoted)
+    return NULL;
+
+  buf = p = malloc (n);
+  if (!buf)
+    {
+      free (argv_quoted);
+      return NULL;
+    }
+
+  for (i = 0; argv[i]; i++)
+    {
+      const char *argvp = argv[i];
+
+      argv_quoted[i] = p;
+
+      *(p++) = '"';
+      while (*argvp)
+       {
+         if (*argvp == '\\' || *argvp == '"')
+           *(p++) = '\\';
+         *(p++) = *(argvp++);
+       }
+      *(p++) = '"';
+      *(p++) = 0;
+    }
+  *(p++) = 0;
+  argv_quoted[i] = NULL;
+
+  return argv_quoted;
+}
+
+
+int
+main (int argc, const char * const *argv)
+{
+  int rc;
+  char pgm[MAX_PATH+100];
+  char *p, *p0;
+  char **argv_quoted;
+
+  if (!GetModuleFileNameA (NULL, pgm, sizeof (pgm) - 1))
+    {
+      fprintf (stderr, "kleopatrawrap: error getting my own name: rc=%d\n",
+               GetLastError());
+      return 2;
+    }
+
+  /* Insert bin directory.  */
+  p = strrchr (pgm, '\\');
+  if (!p)
+    goto leave;
+  p++;
+  memmove (p + 4, p, strlen (p) + 1);
+  strncpy (p, "bin\\", 4);
+
+  /* Hack to output our own version along with the real file name
+     before the actual, we require that the --version option is given
+     twice. */
+  if (argc > 2
+      && !strcmp(argv[1], "--version")
+      && !strcmp(argv[2], "--version"))
+    {
+      fputs ("kleopatrawrap (Gpg4win) " PACKAGE_VERSION " ;", stdout);
+      fputs (pgm, stdout);
+      fputc ('\n', stdout);
+      fflush (stdout);
+    }
+
+  argv_quoted = build_commandline (argv);
+  if (!argv_quoted)
+    goto leave;
+
+  /* Using execv does not replace the existing program image, but
+     spawns a new one and daemonizes it, confusing the command line
+     interpreter.  So we have to use spawnv.  */
+  rc = _spawnv (_P_WAIT, pgm, (const char **) argv_quoted);
+  if (rc < 0)
+    {
+      fprintf (stderr, "kleopatrawrap: executing `%s' failed: %s\n",
+              pgm, strerror (errno));
+      return 2;
+    }
+
+  return rc;
+
+ leave:
+  fprintf (stderr, "kleopatrawrap: internal error parsing my own name `%s'\n",
+           pgm);
+  return 2;
+}
index 2697062..576699d 100644 (file)
@@ -1,5 +1,5 @@
 # uninst-kleopatra.nsi - Installer snippet for kleopatra.    -*- coding: latin-1; -*-
 # uninst-kleopatra.nsi - Installer snippet for kleopatra.    -*- coding: latin-1; -*-
-# Copyright (C) 2005, 2007 g10 Code GmbH
+# Copyright (C) 2005, 2007, 2008 g10 Code GmbH
 # 
 # This file is part of GPG4Win.
 # 
 # 
 # This file is part of GPG4Win.
 # 
@@ -34,7 +34,7 @@ Section "-un.kleopatra"
   # FIXME: See inst-kleopatra.nsi
   Delete "$INSTDIR\bin\kleopatra.exe"
   RMDir "$INSTDIR\bin"
   # FIXME: See inst-kleopatra.nsi
   Delete "$INSTDIR\bin\kleopatra.exe"
   RMDir "$INSTDIR\bin"
-  Delete "$INSTDIR\kleopatra.bat"
+  Delete "$INSTDIR\kleopatra.exe"
 
   Delete "$INSTDIR\kgpgconf.exe"
   Delete "$INSTDIR\libgpgme++-glib.dll"
 
   Delete "$INSTDIR\kgpgconf.exe"
   Delete "$INSTDIR\libgpgme++-glib.dll"