shell32: Make ShellExecute use native file association databases as fallback path (resend)

Alexandre Julliard julliard at winehq.org
Tue Aug 28 08:10:09 CDT 2012


Erik van Pienbroek <erik at vanpienbroek.nl> writes:

> +#if defined(HAVE_FORK) && defined(HAVE_WAITPID)
> +static UINT_PTR SHELL_try_native_execute ( const char *openCmd, const char *unixName )
> +{
> +    UINT_PTR retval = SE_ERR_NOASSOC;
> +    pid_t cpid;
> +    struct stat st;
> +
> +    if (stat(openCmd, &st) == -1)
> +    {
> +        TRACE("stat() %s failed: %s\n", openCmd, strerror(errno));
> +        return retval;
> +    }
> +
> +    cpid = fork();
> +    if (!cpid)
> +    {
> +        /* Prevent the situation where the native file association database
> +         * tries to run wine to execute a program and we trigger this fallback
> +         * path again and end up in a recursive loop */
> +        if (getenv("WINE_INSIDE_SHELLEXECUTE"))
> +        {
> +            TRACE("recursive loop detected, not continuing with ShellExecute call\n");
> +            exit(EXIT_SUCCESS);
> +        }
> +        setenv("WINE_INSIDE_SHELLEXECUTE", "1", 0);
> +
> +        TRACE("running %s %s\n", openCmd, unixName);
> +        execlp(openCmd, openCmd, unixName, (char*) NULL);
> +        /* execlp replaces the current process image with a new process image,
> +         * so no code below here should get executed by the forked child */
> +    } else {
> +        int status;
> +        waitpid(cpid, &status, 0);
> +        TRACE("status %x\n", status);
> +        if(!WEXITSTATUS(status))
> +            retval = 33;
> +    }
> +
> +    return retval;
> +}

You want spawnvp(), but that sort of thing should probably go in
winebrowser or something like that, and be configurable.

-- 
Alexandre Julliard
julliard at winehq.org



More information about the wine-devel mailing list