| #define _GNU_SOURCE 1 |
| |
| #include <config.h> |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <string.h> |
| #include <unistd.h> |
| #include <sys/types.h> |
| #include <sys/uio.h> |
| |
| static int status = EXIT_SUCCESS; |
| |
| #ifdef HAVE_PROCESS_VM_READV |
| |
| static void test_process_vm_readv() |
| { |
| char lbuf[] = "123456"; |
| char rbuf[] = "ABCDEF"; |
| |
| struct iovec lvec[2]; |
| struct iovec rvec[2]; |
| |
| lvec[0].iov_base = lbuf + 1; |
| lvec[0].iov_len = 1; |
| lvec[1].iov_base = lbuf + 3; |
| lvec[1].iov_len = 2; |
| |
| rvec[0].iov_base = rbuf + 1; |
| rvec[0].iov_len = 2; |
| rvec[1].iov_base = rbuf + 4; |
| rvec[1].iov_len = 1; |
| |
| if (process_vm_readv(getpid(), |
| lvec, 2, |
| rvec, 2, |
| 0 ) < 0 ) { |
| perror("process_vm_readv"); |
| status = EXIT_FAILURE; |
| } |
| |
| if (strcmp(lbuf, "1B3CE6") != 0) { |
| fprintf(stderr, "Expected: \"1B3CE6\"; Got: \"%s\"\n", lbuf); |
| status = EXIT_FAILURE; |
| } |
| } |
| |
| #endif /* defined( HAVE_PROCESS_VM_READV ) */ |
| |
| #ifdef HAVE_PROCESS_VM_WRITEV |
| |
| static void test_process_vm_writev() |
| { |
| char lbuf[] = "123456"; |
| char rbuf[] = "ABCDEF"; |
| |
| struct iovec lvec[2]; |
| struct iovec rvec[2]; |
| |
| lvec[0].iov_base = lbuf + 1; |
| lvec[0].iov_len = 1; |
| lvec[1].iov_base = lbuf + 3; |
| lvec[1].iov_len = 2; |
| |
| rvec[0].iov_base = rbuf + 1; |
| rvec[0].iov_len = 2; |
| rvec[1].iov_base = rbuf + 4; |
| rvec[1].iov_len = 1; |
| |
| if (process_vm_writev(getpid(), |
| lvec, 2, |
| rvec, 2, |
| 0 ) < 0 ) { |
| perror("process_vm_writev"); |
| status = EXIT_FAILURE; |
| } |
| |
| if (strcmp(rbuf, "A24D5F") != 0) { |
| fprintf(stderr, "Expected: \"A24D5F\"; Got: \"%s\"\n", rbuf); |
| status = EXIT_FAILURE; |
| } |
| } |
| |
| #endif /* defined( HAVE_PROCESS_VM_WRITEV ) */ |
| |
| int main(int argc, char *argv[]) |
| { |
| #ifdef HAVE_PROCESS_VM_READV |
| test_process_vm_readv(); |
| #endif |
| #ifdef HAVE_PROCESS_VM_WRITEV |
| test_process_vm_writev(); |
| #endif |
| return status; |
| } |