mirror of
https://github.com/encounter/SDL.git
synced 2025-12-12 14:46:19 +00:00
Added a README file regarding WinRT support
To note, this file is currently formatted with CRLF line endings, rather than LF, to allow the file to be viewed with Notepad.
This commit is contained in:
199
visualtest/src/linux/linux_process.c
Normal file
199
visualtest/src/linux/linux_process.c
Normal file
@@ -0,0 +1,199 @@
|
||||
/* See COPYING.txt for the full license governing this code. */
|
||||
/**
|
||||
* \file linux_process.c
|
||||
*
|
||||
* Source file for the process API on linux.
|
||||
*/
|
||||
|
||||
|
||||
#include <SDL.h>
|
||||
#include <SDL_test.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "SDL_visualtest_process.h"
|
||||
#include "SDL_visualtest_harness_argparser.h"
|
||||
#include "SDL_visualtest_parsehelper.h"
|
||||
|
||||
#if defined(__LINUX__)
|
||||
|
||||
static void
|
||||
LogLastError(char* str)
|
||||
{
|
||||
char* error = (char*)strerror(errno);
|
||||
if(!str || !error)
|
||||
return;
|
||||
SDLTest_LogError("%s: %s", str, error);
|
||||
}
|
||||
|
||||
int
|
||||
SDL_LaunchProcess(char* file, char* args, SDL_ProcessInfo* pinfo)
|
||||
{
|
||||
pid_t pid;
|
||||
char** argv;
|
||||
|
||||
if(!file)
|
||||
{
|
||||
SDLTest_LogError("file argument cannot be NULL");
|
||||
return 0;
|
||||
}
|
||||
if(!pinfo)
|
||||
{
|
||||
SDLTest_LogError("pinfo cannot be NULL");
|
||||
return 0;
|
||||
}
|
||||
pid = fork();
|
||||
if(pid == -1)
|
||||
{
|
||||
LogLastError("fork() failed");
|
||||
return 0;
|
||||
}
|
||||
else if(pid == 0)
|
||||
{
|
||||
/* parse the arguments string */
|
||||
argv = SDLVisualTest_ParseArgsToArgv(args);
|
||||
argv[0] = file;
|
||||
execv(file, argv);
|
||||
LogLastError("execv() failed");
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
pinfo->pid = pid;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* never executed */
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_GetProcessExitStatus(SDL_ProcessInfo* pinfo, SDL_ProcessExitStatus* ps)
|
||||
{
|
||||
int success, status;
|
||||
if(!pinfo)
|
||||
{
|
||||
SDLTest_LogError("pinfo argument cannot be NULL");
|
||||
return 0;
|
||||
}
|
||||
if(!ps)
|
||||
{
|
||||
SDLTest_LogError("ps argument cannot be NULL");
|
||||
return 0;
|
||||
}
|
||||
success = waitpid(pinfo->pid, &status, WNOHANG);
|
||||
if(success == -1)
|
||||
{
|
||||
LogLastError("waitpid() failed");
|
||||
return 0;
|
||||
}
|
||||
else if(success == 0)
|
||||
{
|
||||
ps->exit_status = -1;
|
||||
ps->exit_success = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ps->exit_success = WIFEXITED(status);
|
||||
ps->exit_status = WEXITSTATUS(status);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_IsProcessRunning(SDL_ProcessInfo* pinfo)
|
||||
{
|
||||
int success;
|
||||
|
||||
if(!pinfo)
|
||||
{
|
||||
SDLTest_LogError("pinfo cannot be NULL");
|
||||
return -1;
|
||||
}
|
||||
|
||||
success = kill(pinfo->pid, 0);
|
||||
if(success == -1)
|
||||
{
|
||||
if(errno == ESRCH) /* process is not running */
|
||||
return 0;
|
||||
else
|
||||
{
|
||||
LogLastError("kill() failed");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_QuitProcess(SDL_ProcessInfo* pinfo, SDL_ProcessExitStatus* ps)
|
||||
{
|
||||
int success, status;
|
||||
|
||||
if(!pinfo)
|
||||
{
|
||||
SDLTest_LogError("pinfo argument cannot be NULL");
|
||||
return 0;
|
||||
}
|
||||
if(!ps)
|
||||
{
|
||||
SDLTest_LogError("ps argument cannot be NULL");
|
||||
return 0;
|
||||
}
|
||||
|
||||
success = kill(pinfo->pid, SIGQUIT);
|
||||
if(success == -1)
|
||||
{
|
||||
LogLastError("kill() failed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
success = waitpid(pinfo->pid, &status, 0);
|
||||
if(success == -1)
|
||||
{
|
||||
LogLastError("waitpid() failed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
ps->exit_success = WIFEXITED(status);
|
||||
ps->exit_status = WEXITSTATUS(status);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_KillProcess(SDL_ProcessInfo* pinfo, SDL_ProcessExitStatus* ps)
|
||||
{
|
||||
int success, status;
|
||||
|
||||
if(!pinfo)
|
||||
{
|
||||
SDLTest_LogError("pinfo argument cannot be NULL");
|
||||
return 0;
|
||||
}
|
||||
if(!ps)
|
||||
{
|
||||
SDLTest_LogError("ps argument cannot be NULL");
|
||||
return 0;
|
||||
}
|
||||
|
||||
success = kill(pinfo->pid, SIGKILL);
|
||||
if(success == -1)
|
||||
{
|
||||
LogLastError("kill() failed");
|
||||
return 0;
|
||||
}
|
||||
success = waitpid(pinfo->pid, &status, 0);
|
||||
if(success == -1)
|
||||
{
|
||||
LogLastError("waitpid() failed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
ps->exit_success = WIFEXITED(status);
|
||||
ps->exit_status = WEXITSTATUS(status);
|
||||
return 1;
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user