1 /* $OpenBSD: pwritev.c,v 1.3 2003/09/02 23:52:17 david Exp $ */ 2 /* 3 * Written by Artur Grabowski <art@openbsd.org> 2002 Public Domain. 4 */ 5 #include <sys/types.h> 6 #include <sys/uio.h> 7 #include <stdio.h> 8 #include <stdlib.h> 9 #include <string.h> 10 #include <unistd.h> 11 #include <err.h> 12 #include <fcntl.h> 13 14 int 15 main(int argc, char *argv[]) 16 { 17 char temp[] = "/tmp/pwritevXXXXXXXXX"; 18 char magic[10] = "0123456789"; 19 const char zeroes[10] = "0000000000"; 20 char buf[10]; 21 struct iovec iov[2]; 22 char c; 23 int fd; 24 25 if ((fd = mkstemp(temp)) < 0) 26 err(1, "mkstemp"); 27 remove(temp); 28 29 if (write(fd, zeroes, sizeof(zeroes)) != sizeof(zeroes)) 30 err(1, "write"); 31 32 if (lseek(fd, 5, SEEK_SET) != 5) 33 err(1, "lseek"); 34 35 iov[0].iov_base = &magic[8]; 36 iov[0].iov_len = 2; 37 iov[1].iov_base = &magic[7]; 38 iov[1].iov_len = 2; 39 40 if (pwritev(fd, iov, 2, 4) != 4) 41 err(1, "pwrite"); 42 43 if (read(fd, &c, 1) != 1) 44 err(1, "read"); 45 46 if (c != '9') 47 errx(1, "read %c != %c", c, '9'); 48 49 c = '5'; 50 if (write(fd, &c, 1) != 1) 51 err(1, "write"); 52 53 if (pread(fd, buf, 10, 0) != 10) 54 err(1, "pread"); 55 56 if (memcmp(buf, "0000895800", 10) != 0) 57 errx(1, "data mismatch: %s != %s", buf, "0000895800"); 58 59 return 0; 60 } 61