+long wxExecute(wchar_t **wargv, int flags, wxProcess *process,
+ const wxExecuteEnv *env)
+{
+ ArgsArray argv(wargv);
+
+ return wxExecute(argv, flags, process, env);
+}
+
+#endif // wxUSE_UNICODE
+
+// wxExecute: the real worker function
+long wxExecute(char **argv, int flags, wxProcess *process,
+ const wxExecuteEnv *env)
+{
+ // for the sync execution, we return -1 to indicate failure, but for async
+ // case we return 0 which is never a valid PID
+ //
+ // we define this as a macro, not a variable, to avoid compiler warnings
+ // about "ERROR_RETURN_CODE value may be clobbered by fork()"
+ #define ERROR_RETURN_CODE ((flags & wxEXEC_SYNC) ? -1 : 0)
+
+ wxCHECK_MSG( *argv, ERROR_RETURN_CODE, wxT("can't exec empty command") );
+
+#if wxUSE_THREADS
+ // fork() doesn't mix well with POSIX threads: on many systems the program
+ // deadlocks or crashes for some reason. Probably our code is buggy and
+ // doesn't do something which must be done to allow this to work, but I
+ // don't know what yet, so for now just warn the user (this is the least we
+ // can do) about it
+ wxASSERT_MSG( wxThread::IsMain(),
+ wxT("wxExecute() can be called only from the main thread") );
+#endif // wxUSE_THREADS
+
+#if defined(__WXCOCOA__) || ( defined(__WXOSX_MAC__) && wxOSX_USE_COCOA_OR_CARBON )
+ // wxMacLaunch() only executes app bundles and only does it asynchronously.
+ // It returns false if the target is not an app bundle, thus falling
+ // through to the regular code for non app bundles.
+ if ( !(flags & wxEXEC_SYNC) && wxMacLaunch(argv) )
+ {
+ // we don't have any PID to return so just make up something non null
+ return -1;