aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--g10/exec.c115
-rw-r--r--g10/exec.h1
-rw-r--r--g10/photoid.c109
3 files changed, 108 insertions, 117 deletions
diff --git a/g10/exec.c b/g10/exec.c
index 75b39e0fe..3189fffc3 100644
--- a/g10/exec.c
+++ b/g10/exec.c
@@ -19,12 +19,6 @@
#include <config.h>
#include <stdlib.h>
-#ifdef HAVE_DOSISH_SYSTEM
-# ifdef HAVE_WINSOCK2_H
-# include <winsock2.h>
-# endif
-# include <windows.h>
-#endif
#include <string.h>
#include "gpg.h"
@@ -35,115 +29,6 @@
#ifdef NO_EXEC
int set_exec_path(const char *path) { return GPG_ERR_GENERAL; }
#else
-#if defined (_WIN32)
-/* This is a nicer system() for windows that waits for programs to
- return before returning control to the caller. I hate helpful
- computers. */
-int
-w32_system(const char *command)
-{
- if (!strncmp (command, "!ShellExecute ", 14))
- {
- SHELLEXECUTEINFOW see;
- wchar_t *wname;
- int waitms;
-
- command = command + 14;
- while (spacep (command))
- command++;
- waitms = atoi (command);
- if (waitms < 0)
- waitms = 0;
- else if (waitms > 60*1000)
- waitms = 60000;
- while (*command && !spacep (command))
- command++;
- while (spacep (command))
- command++;
-
- wname = utf8_to_wchar (command);
- if (!wname)
- return -1;
-
- memset (&see, 0, sizeof see);
- see.cbSize = sizeof see;
- see.fMask = (SEE_MASK_NOCLOSEPROCESS
- | SEE_MASK_NOASYNC
- | SEE_MASK_FLAG_NO_UI
- | SEE_MASK_NO_CONSOLE);
- see.lpVerb = L"open";
- see.lpFile = (LPCWSTR)wname;
- see.nShow = SW_SHOW;
-
- if (DBG_EXTPROG)
- log_debug ("running ShellExecuteEx(open,'%s')\n", command);
- if (!ShellExecuteExW (&see))
- {
- if (DBG_EXTPROG)
- log_debug ("ShellExecuteEx failed: rc=%d\n", (int)GetLastError ());
- xfree (wname);
- return -1;
- }
- if (DBG_EXTPROG)
- log_debug ("ShellExecuteEx succeeded (hProcess=%p,hInstApp=%d)\n",
- see.hProcess, (int)see.hInstApp);
-
- if (!see.hProcess)
- {
- gnupg_usleep (waitms*1000);
- if (DBG_EXTPROG)
- log_debug ("ShellExecuteEx ready (wait=%dms)\n", waitms);
- }
- else
- {
- WaitForSingleObject (see.hProcess, INFINITE);
- if (DBG_EXTPROG)
- log_debug ("ShellExecuteEx ready\n");
- }
- CloseHandle (see.hProcess);
-
- xfree (wname);
- }
- else
- {
- char *string;
- wchar_t *wstring;
- PROCESS_INFORMATION pi;
- STARTUPINFOW si;
-
- /* We must use a copy of the command as CreateProcess modifies
- * this argument. */
- string = xstrdup (command);
- wstring = utf8_to_wchar (string);
- xfree (string);
- if (!wstring)
- return -1;
-
- memset (&pi, 0, sizeof(pi));
- memset (&si, 0, sizeof(si));
- si.cb = sizeof (si);
-
- if (!CreateProcessW (NULL, wstring, NULL, NULL, FALSE,
- DETACHED_PROCESS,
- NULL, NULL, &si, &pi))
- {
- xfree (wstring);
- return -1;
- }
-
- /* Wait for the child to exit */
- WaitForSingleObject (pi.hProcess, INFINITE);
-
- CloseHandle (pi.hProcess);
- CloseHandle (pi.hThread);
- xfree (wstring);
- }
-
- return 0;
-}
-#endif /*_W32*/
-
-
/* Replaces current $PATH */
int
set_exec_path(const char *path)
diff --git a/g10/exec.h b/g10/exec.h
index 6b24d1c51..b3f96cf9d 100644
--- a/g10/exec.h
+++ b/g10/exec.h
@@ -21,6 +21,5 @@
#define _EXEC_H_
int set_exec_path(const char *path);
-int w32_system(const char *command);
#endif /* !_EXEC_H_ */
diff --git a/g10/photoid.c b/g10/photoid.c
index 2c95930fb..72e6acf7d 100644
--- a/g10/photoid.c
+++ b/g10/photoid.c
@@ -36,7 +36,6 @@
#include "../common/util.h"
#include "packet.h"
#include "../common/status.h"
-#include "exec.h"
#include "keydb.h"
#include "../common/i18n.h"
#include "../common/iobuf.h"
@@ -46,6 +45,114 @@
#include "../common/ttyio.h"
#include "trustdb.h"
+#if defined (_WIN32)
+/* This is a nicer system() for windows that waits for programs to
+ return before returning control to the caller. I hate helpful
+ computers. */
+static int
+w32_system (const char *command)
+{
+ if (!strncmp (command, "!ShellExecute ", 14))
+ {
+ SHELLEXECUTEINFOW see;
+ wchar_t *wname;
+ int waitms;
+
+ command = command + 14;
+ while (spacep (command))
+ command++;
+ waitms = atoi (command);
+ if (waitms < 0)
+ waitms = 0;
+ else if (waitms > 60*1000)
+ waitms = 60000;
+ while (*command && !spacep (command))
+ command++;
+ while (spacep (command))
+ command++;
+
+ wname = utf8_to_wchar (command);
+ if (!wname)
+ return -1;
+
+ memset (&see, 0, sizeof see);
+ see.cbSize = sizeof see;
+ see.fMask = (SEE_MASK_NOCLOSEPROCESS
+ | SEE_MASK_NOASYNC
+ | SEE_MASK_FLAG_NO_UI
+ | SEE_MASK_NO_CONSOLE);
+ see.lpVerb = L"open";
+ see.lpFile = (LPCWSTR)wname;
+ see.nShow = SW_SHOW;
+
+ if (DBG_EXTPROG)
+ log_debug ("running ShellExecuteEx(open,'%s')\n", command);
+ if (!ShellExecuteExW (&see))
+ {
+ if (DBG_EXTPROG)
+ log_debug ("ShellExecuteEx failed: rc=%d\n", (int)GetLastError ());
+ xfree (wname);
+ return -1;
+ }
+ if (DBG_EXTPROG)
+ log_debug ("ShellExecuteEx succeeded (hProcess=%p,hInstApp=%d)\n",
+ see.hProcess, (int)see.hInstApp);
+
+ if (!see.hProcess)
+ {
+ gnupg_usleep (waitms*1000);
+ if (DBG_EXTPROG)
+ log_debug ("ShellExecuteEx ready (wait=%dms)\n", waitms);
+ }
+ else
+ {
+ WaitForSingleObject (see.hProcess, INFINITE);
+ if (DBG_EXTPROG)
+ log_debug ("ShellExecuteEx ready\n");
+ }
+ CloseHandle (see.hProcess);
+
+ xfree (wname);
+ }
+ else
+ {
+ char *string;
+ wchar_t *wstring;
+ PROCESS_INFORMATION pi;
+ STARTUPINFOW si;
+
+ /* We must use a copy of the command as CreateProcess modifies
+ * this argument. */
+ string = xstrdup (command);
+ wstring = utf8_to_wchar (string);
+ xfree (string);
+ if (!wstring)
+ return -1;
+
+ memset (&pi, 0, sizeof(pi));
+ memset (&si, 0, sizeof(si));
+ si.cb = sizeof (si);
+
+ if (!CreateProcessW (NULL, wstring, NULL, NULL, FALSE,
+ DETACHED_PROCESS,
+ NULL, NULL, &si, &pi))
+ {
+ xfree (wstring);
+ return -1;
+ }
+
+ /* Wait for the child to exit */
+ WaitForSingleObject (pi.hProcess, INFINITE);
+
+ CloseHandle (pi.hProcess);
+ CloseHandle (pi.hThread);
+ xfree (wstring);
+ }
+
+ return 0;
+}
+#endif /*_W32*/
+
/* Generate a new photo id packet, or return NULL if canceled.
FIXME: Should we add a duplicates check similar to generate_user_id? */
PKT_user_id *