diff options
author | NIIBE Yutaka <gniibe@fsij.org> | 2022-11-09 02:37:58 +0100 |
---|---|---|
committer | NIIBE Yutaka <gniibe@fsij.org> | 2022-11-09 02:37:58 +0100 |
commit | 8afa9735a6968ccd4be4e22a98d5b775df0c695a (patch) | |
tree | 557991b754666bf98376ed0b66612caa211ab82c /g10/photoid.c | |
parent | gpg: New option --quick-update-pref. (diff) | |
download | gnupg2-8afa9735a6968ccd4be4e22a98d5b775df0c695a.tar.xz gnupg2-8afa9735a6968ccd4be4e22a98d5b775df0c695a.zip |
gpg: Move w32_system function.
* g10/exec.h (w32_system): Not exposed.
* g10/exec.c (w32_system): Move to ...
* g10/photoid.c: here.
--
Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
Diffstat (limited to '')
-rw-r--r-- | g10/photoid.c | 109 |
1 files changed, 108 insertions, 1 deletions
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 * |