mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
90 lines
2.8 KiB
C
90 lines
2.8 KiB
C
#include <stdio.h>
|
|
#include <sys/types.h>
|
|
#include <sys/uio.h>
|
|
#include <fcntl.h>
|
|
#include <errno.h>
|
|
#include <unistd.h>
|
|
#include <string.h>
|
|
|
|
#define K_1 8192
|
|
#define NBUFS 2
|
|
#define CHUNK K_1 /* single chunk */
|
|
#define MAX_IOVEC 2
|
|
#define DATA_FILE "writev_data_file"
|
|
|
|
static char buf1[K_1];
|
|
static char buf2[K_1];
|
|
static char *buf_list[NBUFS], f_name[]="writev_data_file";
|
|
static int fd;
|
|
|
|
struct iovec wr_iovec[MAX_IOVEC] = {
|
|
{(caddr_t)-1, CHUNK},
|
|
{(caddr_t)NULL, 0}
|
|
};
|
|
|
|
int main(void)
|
|
{
|
|
int nbytes;
|
|
|
|
/* Fill the buf_list[0] and buf_list[1] with 0 zeros */
|
|
buf_list[0] = buf1;
|
|
buf_list[1] = buf2;
|
|
memset(buf_list[0], 0, K_1);
|
|
memset(buf_list[1], 0, K_1);
|
|
|
|
if ((fd = open(f_name, O_WRONLY | O_CREAT, 0666)) < 0) {
|
|
fprintf(stderr, "open(2) failed: fname = %s, errno = %d\n",
|
|
f_name, errno);
|
|
return 1;
|
|
} else if ((nbytes = write(fd, buf_list[1], K_1)) != K_1) {
|
|
fprintf(stderr, "write(2) failed: nbytes = %d, errno = %d\n",
|
|
nbytes, errno);
|
|
return 1;
|
|
}
|
|
if (close(fd) < 0) {
|
|
fprintf(stderr, "close failed: errno = %d\n", errno);
|
|
return 1;
|
|
}
|
|
fprintf(stderr, "Test file created.\n");
|
|
if ((fd = open(f_name, O_RDWR, 0666)) < 0) {
|
|
fprintf(stderr, "open failed: fname = %s, errno = %d\n",
|
|
f_name, errno);
|
|
return 1;
|
|
}
|
|
|
|
lseek(fd, 0, 0);
|
|
if (writev(fd, wr_iovec, 2) < 0) {
|
|
if (errno == EFAULT)
|
|
fprintf(stderr, "Received EFAULT as expected\n");
|
|
else
|
|
fprintf(stderr, "Expected EFAULT, got %d\n", errno);
|
|
lseek(fd, K_1, 0);
|
|
if ((nbytes = read(fd, buf_list[0], CHUNK)) != 0)
|
|
fprintf(stderr, "Expected nbytes = 0, got %d\n", nbytes);
|
|
}
|
|
else
|
|
fprintf(stderr, "Error writev returned a positive value\n");
|
|
// Now check invalid vector count
|
|
if (writev(fd, wr_iovec, -1) < 0) {
|
|
if (errno == EINVAL)
|
|
fprintf(stderr, "Received EINVAL as expected\n");
|
|
else
|
|
fprintf(stderr, "expected errno = EINVAL, got %d\n", errno);
|
|
}
|
|
else
|
|
fprintf(stderr, "Error writev returned a positive value\n");
|
|
if (readv(fd, wr_iovec, -1) < 0) {
|
|
if (errno == EINVAL)
|
|
fprintf(stderr, "Received EINVAL as expected\n");
|
|
else
|
|
fprintf(stderr, "expected errno = EINVAL, got %d\n", errno);
|
|
}
|
|
else
|
|
fprintf(stderr, "Error readv returned a positive value\n");
|
|
|
|
unlink(f_name);
|
|
|
|
return 0;
|
|
}
|
|
|