in dotnet/tools/launcher_core/main.c [23:84]
static void Execute(int argc, char *argv[], const char *manifestDir)
{
char dotnet[64 * 1024] = {0};
char torun[64 * 1024] = {0};
char *p = NULL;
char **newargv = NULL;
int i;
// Based on current exe calculate _0.dll to run
//
// Either
// Exe = <some_prefix>/my_exe_name
// Or
// Exe = <some_prefix>/my_exe_name.exe
//
// The path we want to calculate looks like:
// torun = <manifestDir>/my_exe_name_0.dll
p = strrchr(Exe, '/');
sprintf(torun, "%s/%s", manifestDir, p);
// If torun ends in "_0.exe", strip it off
p = strrchr(torun, '_');
if (p != NULL && (strcmp(p, "_0.exe") == 0))
{
*p = '\0';
}
// Prepare arguments
newargv = calloc(argc + 2, sizeof(char *));
if (newargv == NULL)
{
printf("Failed to allocate memory\n");
exit(-1);
}
sprintf(dotnet, "%s/dotnet", manifestDir);
newargv[0] = dotnet;
newargv[1] = torun;
for (i = 1; i < argc; ++i)
{
newargv[i + 1] = argv[i];
}
newargv[argc + 1] = NULL;
if (IsVerbose())
{
for (i = 0; i < argc + 2; ++i)
printf("argv[%d] = %s (access: %d)\n", i, newargv[i], newargv[i]!=NULL?access(newargv[i], F_OK):0);
}
#ifdef _MSC_VER
/*i = _spawnvp(_P_WAIT, newargv[0], newargv);*/
i = _spawnvp(_P_WAIT, newargv[0], newargv);
if (IsVerbose())
printf("Return code from _spawnvp: %d, errno: %d\n", i, errno);
exit(i);
#else
_execvp(newargv[0], newargv);
#endif
printf("Call failed with errno %d\n", errno);
}