/* try to launch a unix app from a comma separated string of app names */ static int launch_app( WCHAR *candidates, const WCHAR *argv1 ) { char *app, *applist, *cmdline; const char *argv_new[3]; if (!(applist = strdup_unixcp( candidates ))) return 1; if (!(cmdline = strdup_unixcp( argv1 ))) { HeapFree( GetProcessHeap(), 0, applist ); return 1; } app = strtok( applist, "," ); while (app) { WINE_TRACE( "Considering: %s\n", wine_dbgstr_a(app) ); WINE_TRACE( "argv[1]: %s\n", wine_dbgstr_a(cmdline) ); argv_new[0] = app; argv_new[1] = cmdline; argv_new[2] = NULL; _spawnvp( _P_OVERLAY, app, argv_new ); /* only returns on error */ app = strtok( NULL, "," ); /* grab the next app */ } WINE_ERR( "could not find a suitable app to run\n" ); HeapFree( GetProcessHeap(), 0, applist ); HeapFree( GetProcessHeap(), 0, cmdline ); return 1; }
/* try to launch a unix app from a comma separated string of app names */ static int launch_app( const WCHAR *candidates, const WCHAR *argv1 ) { char *cmdline; int i, count; char **argv_new; if (!(cmdline = strdup_unixcp( argv1 ))) return 1; while (*candidates) { WCHAR **args = CommandLineToArgvW( candidates, &count ); if (!(argv_new = HeapAlloc( GetProcessHeap(), 0, (count + 2) * sizeof(*argv_new) ))) break; for (i = 0; i < count; i++) argv_new[i] = strdup_unixcp( args[i] ); argv_new[count] = cmdline; argv_new[count + 1] = NULL; TRACE( "Trying" ); for (i = 0; i <= count; i++) TRACE( " %s", wine_dbgstr_a( argv_new[i] )); TRACE( "\n" ); _spawnvp( _P_OVERLAY, argv_new[0], (const char **)argv_new ); /* only returns on error */ for (i = 0; i < count; i++) HeapFree( GetProcessHeap(), 0, argv_new[i] ); HeapFree( GetProcessHeap(), 0, argv_new ); candidates += strlenW( candidates ) + 1; /* grab the next app */ } WINE_ERR( "could not find a suitable app to open %s\n", debugstr_w( argv1 )); HeapFree( GetProcessHeap(), 0, cmdline ); return 1; }