status_t Job::Launch() { // Build environment std::vector<const char*> environment; for (const char** variable = (const char**)environ; variable[0] != NULL; variable++) { environment.push_back(variable[0]); } if (Target() != NULL) _AddStringList(environment, Target()->Environment()); _AddStringList(environment, Environment()); // Resolve source files BStringList sourceFilesEnvironment; GetSourceFilesEnvironment(sourceFilesEnvironment); _AddStringList(environment, sourceFilesEnvironment); environment.push_back(NULL); if (fArguments.IsEmpty()) { // Launch by signature BString signature("application/"); signature << Name(); return _Launch(signature.String(), NULL, 0, NULL, &environment[0]); } // Build argument vector entry_ref ref; status_t status = get_ref_for_path( Utility::TranslatePath(fArguments.StringAt(0).String()), &ref); if (status != B_OK) { _SetLaunchStatus(status); return status; } std::vector<BString> strings; std::vector<const char*> args; size_t count = fArguments.CountStrings() - 1; if (count > 0) { for (int32 i = 1; i < fArguments.CountStrings(); i++) { strings.push_back(Utility::TranslatePath(fArguments.StringAt(i))); args.push_back(strings.back()); } args.push_back(NULL); } // Launch via entry_ref return _Launch(NULL, &ref, count, &args[0], &environment[0]); }
status_t Job::_Launch(const char* signature, entry_ref* ref, int argCount, const char* const* args, const char** environment) { thread_id mainThread = -1; status_t result = BRoster::Private().Launch(signature, ref, NULL, argCount, args, environment, &fTeam, &mainThread, true); if (result == B_OK) { result = _CreateAndTransferPorts(); if (result == B_OK) resume_thread(mainThread); else kill_thread(mainThread); } _SetLaunchStatus(result); return result; }