Commit 7a8c4d8b by Edward Thomson

process: test SIGTERM detection

We can't reliably detect SIGPIPE on close because of platform
differences. Track `pid` and send `SIGTERM` to a function and ensure
that we can detect it.
parent 38b16b01
...@@ -35,6 +35,12 @@ typedef struct { ...@@ -35,6 +35,12 @@ typedef struct {
#define GIT_PROCESS_OPTIONS_INIT { 0 } #define GIT_PROCESS_OPTIONS_INIT { 0 }
#ifdef GIT_WIN32
# define p_pid_t DWORD
#else
# define p_pid_t pid_t
#endif
/** /**
* Create a new process. The command to run should be specified as the * Create a new process. The command to run should be specified as the
* element of the `arg` array. * element of the `arg` array.
...@@ -80,6 +86,15 @@ extern int git_process__cmdline( ...@@ -80,6 +86,15 @@ extern int git_process__cmdline(
extern int git_process_start(git_process *process); extern int git_process_start(git_process *process);
/** /**
* Returns the process id of the process.
*
* @param out pointer to a pid_t to store the process id
* @param process the process to query
* @return 0 or an error code
*/
extern int git_process_id(p_pid_t *out, git_process *process);
/**
* Read from the process's stdout. The process must have been created with * Read from the process's stdout. The process must have been created with
* `capture_out` set to true. * `capture_out` set to true.
* *
......
...@@ -356,6 +356,19 @@ on_error: ...@@ -356,6 +356,19 @@ on_error:
return -1; return -1;
} }
int git_process_id(p_pid_t *out, git_process *process)
{
GIT_ASSERT(out && process);
if (!process->pid) {
git_error_set(GIT_ERROR_INVALID, "process not running");
return -1;
}
*out = process->pid;
return 0;
}
ssize_t git_process_read(git_process *process, void *buf, size_t count) ssize_t git_process_read(git_process *process, void *buf, size_t count)
{ {
ssize_t ret; ssize_t ret;
......
...@@ -292,6 +292,19 @@ on_error: ...@@ -292,6 +292,19 @@ on_error:
return -1; return -1;
} }
int git_process_id(p_pid_t *out, git_process *process)
{
GIT_ASSERT(out && process);
if (!process->process_info.dwProcessId) {
git_error_set(GIT_ERROR_INVALID, "process not running");
return -1;
}
*out = process->process_info.dwProcessId;
return 0;
}
ssize_t git_process_read(git_process *process, void *buf, size_t count) ssize_t git_process_read(git_process *process, void *buf, size_t count)
{ {
DWORD ret; DWORD ret;
......
...@@ -2,6 +2,14 @@ ...@@ -2,6 +2,14 @@
#include "process.h" #include "process.h"
#include "vector.h" #include "vector.h"
#ifndef GIT_WIN32
# include <signal.h>
#endif
#ifndef SIGTERM
# define SIGTERM 42
#endif
#ifndef SIGPIPE #ifndef SIGPIPE
# define SIGPIPE 42 # define SIGPIPE 42
#endif #endif
...@@ -130,9 +138,35 @@ void test_process_start__redirect_stdio(void) ...@@ -130,9 +138,35 @@ void test_process_start__redirect_stdio(void)
git_process_free(process); git_process_free(process);
} }
void test_process_start__catch_signal(void) /*
void test_process_start__catch_sigterm(void)
{
const char *args_array[] = { "/bin/cat" };
git_process *process;
git_process_options opts = GIT_PROCESS_OPTIONS_INIT;
git_process_result result = GIT_PROCESS_RESULT_INIT;
p_pid_t pid;
opts.capture_out = 1;
cl_git_pass(git_process_new(&process, args_array, ARRAY_SIZE(args_array), NULL, 0, &opts));
cl_git_pass(git_process_start(process));
cl_git_pass(git_process_id(&pid, process));
cl_must_pass(kill(pid, SIGTERM));
cl_git_pass(git_process_wait(&result, process));
cl_assert_equal_i(GIT_PROCESS_STATUS_ERROR, result.status);
cl_assert_equal_i(0, result.exitcode);
cl_assert_equal_i(SIGTERM, result.signal);
git_process_free(process);
}
void test_process_start__catch_sigpipe(void)
{ {
#ifndef GIT_WIN32
const char *args_array[] = { helloworld_cmd.ptr }; const char *args_array[] = { helloworld_cmd.ptr };
git_process *process; git_process *process;
...@@ -151,8 +185,8 @@ void test_process_start__catch_signal(void) ...@@ -151,8 +185,8 @@ void test_process_start__catch_signal(void)
cl_assert_equal_i(SIGPIPE, result.signal); cl_assert_equal_i(SIGPIPE, result.signal);
git_process_free(process); git_process_free(process);
#endif
} }
*/
void test_process_start__can_chdir(void) void test_process_start__can_chdir(void)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment