#include "runner.h" #include "tier0/platform.h" #include "tier1/interface.h" #include "tier1/utlstring.h" #include "tier1/utlvector.h" #include "unistd.h" #include "sys/wait.h" #include "tier1/commandline.h" #include "winerunner.h" CUtlVector m_processes; class CPOSIXRunner: public IRunner { public: virtual int Run( CUtlString szName, CUtlVector& args ) override; virtual int Run( CUtlString szName, CUtlString szDirectory, CUtlVector& args ) override; virtual int Run( CUtlString szName, CUtlString szDirectory, CUtlVector& args, CUtlVector& environment ) override; virtual int Wait( void ) override; }; EXPOSE_INTERFACE(CPOSIXRunner, IRunner, RUNNER_INTERFACE_NAME); IRunner *runner; IWineRunner *winerunner; int CPOSIXRunner::Run(CUtlString szName, CUtlVector& args) { pid_t pid = fork(); if (pid < 0) Plat_FatalErrorFunc("Failed to fork"); /* child */ if (pid == 0) { CUtlVector execargs; execargs.AppendTail(szName); if (CommandLine()->CheckParam("-fpcdebug")) V_printf("%s",szName.GetString()); for (auto &arg: args) { execargs.AppendTail(arg); if (CommandLine()->CheckParam("-fpcdebug")) V_printf(" %s",arg.GetString()); } if (CommandLine()->CheckParam("-fpcdebug")) V_printf("\n"); execargs.AppendTail(0); if ( execvp(szName, (char *const*)execargs.GetData()) == -1 ) { V_printf("Failed to launch %s\n",szName.GetString()); _exit(0); } } m_processes.AppendTail(pid); return 0; } int CPOSIXRunner::Run(CUtlString szName, CUtlString szDirectory, CUtlVector& args) { pid_t pid = fork(); if (pid < 0) Plat_FatalErrorFunc("Failed to fork"); /* child */ if (pid == 0) { CUtlVector execargs; execargs.AppendTail(szName); if (CommandLine()->CheckParam("-fpcdebug")) V_printf("%s",szName.GetString()); for (auto &arg: args) { execargs.AppendTail(arg); if (CommandLine()->CheckParam("-fpcdebug")) V_printf(" %s",arg.GetString()); } if (CommandLine()->CheckParam("-fpcdebug")) V_printf("\n"); execargs.AppendTail(0); chdir(szDirectory.GetString()); if ( execvp(szName, (char *const*)execargs.GetData()) == -1 ) { V_printf("Failed to launch %s\n",szName.GetString()); _exit(0); } } m_processes.AppendTail(pid); /* parent */ return 0; } int CPOSIXRunner::Run(CUtlString szName, CUtlString szDirectory, CUtlVector& args, CUtlVector& environment) { } int CPOSIXRunner::Wait( void ) { for (int i = 0; i