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
|
/* COVERAGE: pwritev pwritev2 */
#define _GNU_SOURCE
#define _BSD_SOURCE
#define _DEFAULT_SOURCE
#define _LARGEFILE64_SOURCE
#define _ISOC99_SOURCE /* Needed for LLONG_MAX on RHEL5 */
#define _FILE_OFFSET_BITS 64
#define _XOPEN_SOURCE 500
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <limits.h>
#include <linux/unistd.h>
#include <sys/uio.h>
#include <sys/syscall.h>
#include <endian.h>
#include <linux/fs.h>
#ifdef __NR_pwritev2
#define LO_HI_LONG(val) \
(unsigned long) val, \
(unsigned long) ((((u_int64_t) (val)) >> (sizeof (long) * 4)) >> (sizeof (long) * 4))
static inline ssize_t
__pwritev2(int fd, const struct iovec *iov, int iovcnt, loff_t offset, int flags)
{
return syscall(__NR_pwritev2, fd, iov, iovcnt,
LO_HI_LONG(offset), flags);
}
#endif
int main()
{
#ifdef __NR_pwritev
int fd;
struct iovec wr_iovec[3];
char buf[64];
fd = open("foobar1", O_WRONLY|O_CREAT, 0666);
//staptest// [[[[open (!!!!openat (AT_FDCWD, ]]]]"foobar1", O_WRONLY|O_CREAT[[[[.O_LARGEFILE]]]]?, 0666) = NNNN
memset(buf, (int)'B', sizeof(buf));
wr_iovec[0].iov_base = buf;
wr_iovec[0].iov_len = -1;
wr_iovec[1].iov_base = NULL;
wr_iovec[1].iov_len = 0;
wr_iovec[2].iov_base = NULL;
wr_iovec[2].iov_len = 0;
pwritev(fd, wr_iovec, 1, 0);
//staptest// pwritev (NNNN, XXXX, 1, 0x0) = -NNNN (EINVAL)
pwritev(-1, wr_iovec, 1, 0);
//staptest// pwritev (-1, XXXX, 1, 0x0) = -NNNN (EBADF)
pwritev(fd, wr_iovec, -1, 0);
//staptest// pwritev (NNNN, XXXX, -1, 0x0) = -NNNN (EINVAL)
pwritev(fd, wr_iovec, 0, 0);
//staptest// pwritev (NNNN, XXXX, 0, 0x0) = 0
wr_iovec[0].iov_base = buf;
wr_iovec[0].iov_len = sizeof(buf);
wr_iovec[1].iov_base = buf;
wr_iovec[1].iov_len = 0;
wr_iovec[2].iov_base = NULL;
wr_iovec[2].iov_len = 0;
pwritev(fd, wr_iovec, 3, 0);
//staptest// pwritev (NNNN, XXXX, 3, 0x0) = 64
pwritev(fd, wr_iovec, 3, 64);
//staptest// pwritev (NNNN, XXXX, 3, 0x40) = 64
close (fd);
//staptest// close (NNNN) = 0
pwritev(-1, wr_iovec, 3, -1);
//staptest// pwritev (-1, XXXX, 3, 0xffffffffffffffff) = -NNNN
pwritev(-1, wr_iovec, 3, 0x12345678deadbeefLL);
//staptest// pwritev (-1, XXXX, 3, 0x12345678deadbeef) = -NNNN
pwritev(-1, wr_iovec, 3, LLONG_MAX);
//staptest// pwritev (-1, XXXX, 3, 0x7fffffffffffffff) = -NNNN
#ifdef __NR_pwritev2
fd = open("foobar1", O_WRONLY|O_CREAT, 0666);
//staptest// [[[[open (!!!!openat (AT_FDCWD, ]]]]"foobar1", O_WRONLY|O_CREAT[[[[.O_LARGEFILE]]]]?, 0666) = NNNN
memset(buf, (int)'B', sizeof(buf));
wr_iovec[0].iov_base = buf;
wr_iovec[0].iov_len = -1;
wr_iovec[1].iov_base = NULL;
wr_iovec[1].iov_len = 0;
wr_iovec[2].iov_base = NULL;
wr_iovec[2].iov_len = 0;
__pwritev2(fd, wr_iovec, 1, 0, 0);
//staptest// pwritev2 (NNNN, XXXX, 1, 0x0, 0x0) = -NNNN (EINVAL)
__pwritev2(-1, wr_iovec, 1, 0, RWF_HIPRI);
//staptest// pwritev2 (-1, XXXX, 1, 0x0, RWF_HIPRI) = -NNNN (EBADF)
__pwritev2(fd, wr_iovec, -1, 0, 0);
//staptest// pwritev2 (NNNN, XXXX, -1, 0x0, 0x0) = -NNNN (EINVAL)
__pwritev2(fd, wr_iovec, 1, 0, -1);
//staptest// pwritev2 (NNNN, XXXX, 1, 0x0, RWF_[^ ]+|XXXX) = -NNNN
__pwritev2(fd, wr_iovec, 0, 0, 0);
//staptest// pwritev2 (NNNN, XXXX, 0, 0x0, 0x0) = 0
wr_iovec[0].iov_base = buf;
wr_iovec[0].iov_len = sizeof(buf);
wr_iovec[1].iov_base = buf;
wr_iovec[1].iov_len = 0;
wr_iovec[2].iov_base = NULL;
wr_iovec[2].iov_len = 0;
__pwritev2(fd, wr_iovec, 3, 0, 0);
//staptest// pwritev2 (NNNN, XXXX, 3, 0x0, 0x0) = 64
__pwritev2(fd, wr_iovec, 3, 64, 0);
//staptest// pwritev2 (NNNN, XXXX, 3, 0x40, 0x0) = 64
close (fd);
//staptest// close (NNNN) = 0
__pwritev2(-1, wr_iovec, 3, -1, 0);
//staptest// pwritev2 (-1, XXXX, 3, 0xffffffffffffffff, 0x0) = -NNNN
__pwritev2(-1, wr_iovec, 3, 0x12345678deadbeefLL, 0);
//staptest// pwritev2 (-1, XXXX, 3, 0x12345678deadbeef, 0x0) = -NNNN
__pwritev2(-1, wr_iovec, 3, LLONG_MAX, 0);
//staptest// pwritev2 (-1, XXXX, 3, 0x7fffffffffffffff, 0x0) = -NNNN
#endif
#endif
return 0;
}
|