1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
/*
@mindmaze_header@
*/
#if HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdint.h>
#include <string.h>
#include "mmerrno.h"
#include "mmsysio.h"
#include "mmthread.h"
#include "mmlog.h"
#include "process-testlib.h"
#define TEST_PATTERN "++test pattern++"
static
void* write_pipe_thread(void* data)
{
int* pipe_fds = data;
char buffer[] = TEST_PATTERN;
ssize_t rsz;
while (1) {
rsz = mm_write(pipe_fds[1], buffer, sizeof(buffer));
if (rsz != sizeof(buffer))
break;
}
return NULL;
}
static
void* read_pipe_thread(void* data)
{
int* pipe_fds = data;
char buffer[sizeof(TEST_PATTERN)];
ssize_t rsz;
while (1) {
memset(buffer, 0, sizeof(buffer));
rsz = mm_read(pipe_fds[0], buffer, sizeof(buffer));
if (rsz != sizeof(buffer))
break;
mm_check(memcmp(buffer, TEST_PATTERN, sizeof(buffer)) == 0);
}
return NULL;
}
static
int exec_child(struct process_test_data* data)
{
char* argv[NUM_ARGS_MAX+2] = {NULL};
int i;
argv[0] = data->cmd;
for (i = 0; i < data->argv_data_len; i++)
argv[i+1] = data->argv_data[i];
if (mm_execv(data->cmd, NUM_FDMAP, data->fd_map,
0, argv, NULL) != 0) {
fprintf(stderr, "%s() failed: %s",
__func__, mm_get_lasterror_desc());
return -1;
}
return 0;
}
API_EXPORTED
intptr_t test_execv_process(void * arg)
{
int pipe_fds[2];
mm_thread_t t1, t2;
// Create a pipe and read and write thread to create process
// activity in other threads when mm_execv() will be called
mm_check(mm_pipe(pipe_fds) == 0);
mm_check(mm_thr_create(&t1, read_pipe_thread, pipe_fds) == 0);
mm_check(mm_thr_create(&t2, write_pipe_thread, pipe_fds) == 0);
return exec_child(arg);
}
|