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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
/* COVERAGE: process_vm_readv process_vm_writev */
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <string.h>
#include <sys/uio.h>
#include <sys/wait.h>
char child_buffer[1024];
void do_child()
{
strcpy(child_buffer, "Hello there, we're in the child.");
while (1) {
sleep(1);
}
}
int main()
{
// glibc added support for process_vm_* in glibc 2.15.
#if __GLIBC_PREREQ(2, 15)
pid_t pid = 0;
int status;
char buffer[1024];
struct iovec local[1];
struct iovec remote[1];
pid = fork();
if (pid == 0) { /* child */
alarm(30);
do_child();
return 0;
}
/* Give the child a chance to run. */
sleep(1);
/* Set up the iovecs. */
local[0].iov_base = buffer;
local[0].iov_len = 20;
remote[0].iov_base = child_buffer;
remote[0].iov_len = 20;
/* Read 20 bytes from the child process. */
process_vm_readv(pid, local, 1, remote, 1, 0);
//staptest// process_vm_readv (NNNN, XXXX, 1, XXXX, 1, 0) = 20
/* Change the buffer and set up the iovecs again. */
strcpy(buffer, "From parent");
local[0].iov_len = 12;
remote[0].iov_len = 12;
/* Write 12 bytes into the child process. */
process_vm_writev(pid, local, 1, remote, 1, 0);
//staptest// process_vm_writev (NNNN, XXXX, 1, XXXX, 1, 0) = 12
/* Limit testing. */
process_vm_readv(-1, local, 1, remote, 1, 0);
//staptest// process_vm_readv (-1, XXXX, 1, XXXX, 1, 0) = -NNNN
process_vm_readv(pid, (struct iovec *)-1, 1, remote, 1, 0);
#ifdef __s390__
//staptest// process_vm_readv (NNNN, 0x[7]?[f]+, 1, XXXX, 1, 0) = -NNNN
#else
//staptest// process_vm_readv (NNNN, 0x[f]+, 1, XXXX, 1, 0) = -NNNN
#endif
process_vm_readv(pid, local, -1L, remote, 1, 0);
#if __WORDSIZE == 64
//staptest// process_vm_readv (NNNN, XXXX, 18446744073709551615, XXXX, 1, 0) = -NNNN
#else
//staptest// process_vm_readv (NNNN, XXXX, 4294967295, XXXX, 1, 0) = -NNNN
#endif
process_vm_readv(pid, local, 1, (struct iovec *)-1, 1, 0);
#ifdef __s390__
//staptest// process_vm_readv (NNNN, XXXX, 1, 0x[7]?[f]+, 1, 0) = -NNNN
#else
//staptest// process_vm_readv (NNNN, XXXX, 1, 0x[f]+, 1, 0) = -NNNN
#endif
process_vm_readv(pid, local, 1, remote, -1L, 0);
#if __WORDSIZE == 64
//staptest// process_vm_readv (NNNN, XXXX, 1, XXXX, 18446744073709551615, 0) = -NNNN
#else
//staptest// process_vm_readv (NNNN, XXXX, 1, XXXX, 4294967295, 0) = -NNNN
#endif
process_vm_readv(pid, local, 1, remote, 1, -1L);
#if __WORDSIZE == 64
//staptest// process_vm_readv (NNNN, XXXX, 1, XXXX, 1, 18446744073709551615) = -NNNN
#else
//staptest// process_vm_readv (NNNN, XXXX, 1, XXXX, 1, 4294967295) = -NNNN
#endif
process_vm_writev(-1, local, 1, remote, 1, 0);
//staptest// process_vm_writev (-1, XXXX, 1, XXXX, 1, 0) = -NNNN
process_vm_writev(pid, (struct iovec *)-1, 1, remote, 1, 0);
#ifdef __s390__
//staptest// process_vm_writev (NNNN, 0x[7]?[f]+, 1, XXXX, 1, 0) = -NNNN
#else
//staptest// process_vm_writev (NNNN, 0x[f]+, 1, XXXX, 1, 0) = -NNNN
#endif
process_vm_writev(pid, local, -1L, remote, 1, 0);
#if __WORDSIZE == 64
//staptest// process_vm_writev (NNNN, XXXX, 18446744073709551615, XXXX, 1, 0) = -NNNN
#else
//staptest// process_vm_writev (NNNN, XXXX, 4294967295, XXXX, 1, 0) = -NNNN
#endif
process_vm_writev(pid, local, 1, (struct iovec *)-1, 1, 0);
#ifdef __s390__
//staptest// process_vm_writev (NNNN, XXXX, 1, 0x[7]?[f]+, 1, 0) = -NNNN
#else
//staptest// process_vm_writev (NNNN, XXXX, 1, 0x[f]+, 1, 0) = -NNNN
#endif
process_vm_writev(pid, local, 1, remote, -1L, 0);
#if __WORDSIZE == 64
//staptest// process_vm_writev (NNNN, XXXX, 1, XXXX, 18446744073709551615, 0) = -NNNN
#else
//staptest// process_vm_writev (NNNN, XXXX, 1, XXXX, 4294967295, 0) = -NNNN
#endif
process_vm_writev(pid, local, 1, remote, 1, -1L);
#if __WORDSIZE == 64
//staptest// process_vm_writev (NNNN, XXXX, 1, XXXX, 1, 18446744073709551615) = -NNNN
#else
//staptest// process_vm_writev (NNNN, XXXX, 1, XXXX, 1, 4294967295) = -NNNN
#endif
if (pid > 0) {
(void)kill(pid, SIGKILL); /* kill the child */
/* Reap the child. */
waitpid(pid, &status, 0);
}
#endif
return 0;
}
|