+
+/* From GPGME, relicensed by g10 Code GmbH. */
+static char *
+compose_string (char **strings, char separator)
+{
+ int i;
+ int n = 0;
+ char *buf;
+ char *p;
+
+ if (!strings || !strings[0])
+ return 0;
+ for (i = 0; strings[i]; i++)
+ n += strlen (strings[i]) + 1;
+ n++;
+
+ buf = p = malloc (n);
+ if (!buf)
+ return NULL;
+ for (i = 0; strings[i]; i++)
+ {
+ strcpy (p, strings[i]);
+ p += strlen (strings[i]);
+ *(p++) = separator;
+ }
+ p--;
+ *(p++) = '\0';
+ *p = '\0';
+
+ return buf;
+}
+
+static char *
+build_commandline (char **argv)
+{
+ return compose_string (argv, ' ');
+}
+
+static char *
+build_env_string (char** envp)
+{
+ return compose_string (envp, '\0');
+}
+
+static HANDLE
+spawn_program (char* name, char** argv, char** envp)
+{
+ PROCESS_INFORMATION pi = { NULL, 0, 0, 0 };
+ STARTUPINFOA si;
+ char *arg_string, *env_string;
+ BOOL result;
+
+#ifdef DBUS_WINCE
+ if (argv && argv[0])
+ arg_string = build_commandline (argv + 1);
+ else
+ arg_string = NULL;
+#else
+ arg_string = build_commandline (argv);
+#endif
+ if (!arg_string)
+ return INVALID_HANDLE_VALUE;
+
+ env_string = build_env_string(envp);
+
+ memset (&si, 0, sizeof (si));
+ si.cb = sizeof (si);
+#ifdef DBUS_WINCE
+ result = CreateProcessA (name, arg_string, NULL, NULL, FALSE, 0,
+#else
+ result = CreateProcessA (NULL, arg_string, NULL, NULL, FALSE, 0,
+#endif
+ (LPVOID)env_string, NULL, &si, &pi);
+ free (arg_string);
+ if (env_string)
+ free (env_string);
+
+ if (!result)
+ return INVALID_HANDLE_VALUE;
+
+ CloseHandle (pi.hThread);
+ return pi.hProcess;
+}
+
+
+static DWORD __stdcall