10dc076565f772bb1953209fb69ea150b494aaa40robbiew/*
20dc076565f772bb1953209fb69ea150b494aaa40robbiew * Copyright (c) 2004, Bull SA. All rights reserved.
30dc076565f772bb1953209fb69ea150b494aaa40robbiew * Created by:  Laurent.Vivier@bull.net
40dc076565f772bb1953209fb69ea150b494aaa40robbiew * This file is licensed under the GPL license.  For the full content
52c28215423293e443469a07ae7011135d058b671Garrett Cooper * of this license, see the COPYING file at the top level of this
60dc076565f772bb1953209fb69ea150b494aaa40robbiew * source tree.
70dc076565f772bb1953209fb69ea150b494aaa40robbiew */
80dc076565f772bb1953209fb69ea150b494aaa40robbiew
90dc076565f772bb1953209fb69ea150b494aaa40robbiew/*
100dc076565f772bb1953209fb69ea150b494aaa40robbiew * assertion:
110dc076565f772bb1953209fb69ea150b494aaa40robbiew *
120dc076565f772bb1953209fb69ea150b494aaa40robbiew * The file is read at offset given by aio_offset.
130dc076565f772bb1953209fb69ea150b494aaa40robbiew *
140dc076565f772bb1953209fb69ea150b494aaa40robbiew * method:
150dc076565f772bb1953209fb69ea150b494aaa40robbiew *
160dc076565f772bb1953209fb69ea150b494aaa40robbiew *	- write data to a file
170dc076565f772bb1953209fb69ea150b494aaa40robbiew *	- read file using aio_read at a given offset
180dc076565f772bb1953209fb69ea150b494aaa40robbiew *	- check data is consistent
190dc076565f772bb1953209fb69ea150b494aaa40robbiew */
200dc076565f772bb1953209fb69ea150b494aaa40robbiew
210dc076565f772bb1953209fb69ea150b494aaa40robbiew#define _XOPEN_SOURCE 600
220dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdio.h>
230dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/types.h>
240dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <unistd.h>
250dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/stat.h>
260dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <fcntl.h>
270dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <string.h>
280dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <errno.h>
290dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdlib.h>
300dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <aio.h>
310dc076565f772bb1953209fb69ea150b494aaa40robbiew
320dc076565f772bb1953209fb69ea150b494aaa40robbiew#include "posixtest.h"
330dc076565f772bb1953209fb69ea150b494aaa40robbiew
340dc076565f772bb1953209fb69ea150b494aaa40robbiew#define TNAME "aio_read/4-1.c"
350dc076565f772bb1953209fb69ea150b494aaa40robbiew
364ca2bbdcd3003f3c8df4e6129e9c7b2bd1514f87Cyril Hrubisint main(void)
370dc076565f772bb1953209fb69ea150b494aaa40robbiew{
380dc076565f772bb1953209fb69ea150b494aaa40robbiew	char tmpfname[256];
390dc076565f772bb1953209fb69ea150b494aaa40robbiew#define BUF_SIZE 512
40bded50708f6b1a1139e808fab44c9dc49370c21dWanlong Gao	unsigned char buf[BUF_SIZE * 2];
410dc076565f772bb1953209fb69ea150b494aaa40robbiew	unsigned char check[BUF_SIZE];
420dc076565f772bb1953209fb69ea150b494aaa40robbiew	int fd;
430dc076565f772bb1953209fb69ea150b494aaa40robbiew	struct aiocb aiocb;
440dc076565f772bb1953209fb69ea150b494aaa40robbiew	int i;
450dc076565f772bb1953209fb69ea150b494aaa40robbiew
46264074b49e13b99960b37be37fd3731e525b5461Garrett Cooper	if (sysconf(_SC_ASYNCHRONOUS_IO) < 200112L)
47ec5557833ef9b56de0a174b976d06dce396b4112Garrett Cooper		return PTS_UNSUPPORTED;
480dc076565f772bb1953209fb69ea150b494aaa40robbiew
492c28215423293e443469a07ae7011135d058b671Garrett Cooper	snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_aio_read_4_1_%d",
50bded50708f6b1a1139e808fab44c9dc49370c21dWanlong Gao		 getpid());
510dc076565f772bb1953209fb69ea150b494aaa40robbiew	unlink(tmpfname);
52bded50708f6b1a1139e808fab44c9dc49370c21dWanlong Gao	fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL, S_IRUSR | S_IWUSR);
53566b6c09f6dca5c4200b5d6194f2bffc41bffccfWanlong Gao	if (fd == -1) {
54bded50708f6b1a1139e808fab44c9dc49370c21dWanlong Gao		printf(TNAME " Error at open(): %s\n", strerror(errno));
550dc076565f772bb1953209fb69ea150b494aaa40robbiew		exit(PTS_UNRESOLVED);
560dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
570dc076565f772bb1953209fb69ea150b494aaa40robbiew
580dc076565f772bb1953209fb69ea150b494aaa40robbiew	unlink(tmpfname);
590dc076565f772bb1953209fb69ea150b494aaa40robbiew
60566b6c09f6dca5c4200b5d6194f2bffc41bffccfWanlong Gao	memset(&buf[0], 1, BUF_SIZE);
61566b6c09f6dca5c4200b5d6194f2bffc41bffccfWanlong Gao	memset(&buf[BUF_SIZE], 2, BUF_SIZE);
620dc076565f772bb1953209fb69ea150b494aaa40robbiew
63bded50708f6b1a1139e808fab44c9dc49370c21dWanlong Gao	if (write(fd, buf, BUF_SIZE * 2) != BUF_SIZE * 2) {
64bded50708f6b1a1139e808fab44c9dc49370c21dWanlong Gao		printf(TNAME " Error at write(): %s\n", strerror(errno));
650dc076565f772bb1953209fb69ea150b494aaa40robbiew		exit(PTS_UNRESOLVED);
660dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
670dc076565f772bb1953209fb69ea150b494aaa40robbiew
680dc076565f772bb1953209fb69ea150b494aaa40robbiew	memset(check, 0xaa, BUF_SIZE);
690dc076565f772bb1953209fb69ea150b494aaa40robbiew	memset(&aiocb, 0, sizeof(struct aiocb));
700dc076565f772bb1953209fb69ea150b494aaa40robbiew	aiocb.aio_fildes = fd;
710dc076565f772bb1953209fb69ea150b494aaa40robbiew	aiocb.aio_buf = check;
720dc076565f772bb1953209fb69ea150b494aaa40robbiew	aiocb.aio_nbytes = BUF_SIZE;
730dc076565f772bb1953209fb69ea150b494aaa40robbiew	aiocb.aio_offset = BUF_SIZE;
740dc076565f772bb1953209fb69ea150b494aaa40robbiew
75566b6c09f6dca5c4200b5d6194f2bffc41bffccfWanlong Gao	if (aio_read(&aiocb) == -1) {
76bded50708f6b1a1139e808fab44c9dc49370c21dWanlong Gao		printf(TNAME " Error at aio_read(): %s\n", strerror(errno));
770dc076565f772bb1953209fb69ea150b494aaa40robbiew		exit(PTS_FAIL);
780dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
790dc076565f772bb1953209fb69ea150b494aaa40robbiew
800dc076565f772bb1953209fb69ea150b494aaa40robbiew	int err;
810dc076565f772bb1953209fb69ea150b494aaa40robbiew	int ret;
820dc076565f772bb1953209fb69ea150b494aaa40robbiew
830dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* Wait until end of transaction */
8426813cd41ecd11f5a5e983fec9ed0813dbfba2b4Wanlong Gao	do {
8526813cd41ecd11f5a5e983fec9ed0813dbfba2b4Wanlong Gao		usleep(10000);
8626813cd41ecd11f5a5e983fec9ed0813dbfba2b4Wanlong Gao		err = aio_error(&aiocb);
8726813cd41ecd11f5a5e983fec9ed0813dbfba2b4Wanlong Gao	} while (err == EINPROGRESS);
880dc076565f772bb1953209fb69ea150b494aaa40robbiew
890dc076565f772bb1953209fb69ea150b494aaa40robbiew	ret = aio_return(&aiocb);
900dc076565f772bb1953209fb69ea150b494aaa40robbiew
91566b6c09f6dca5c4200b5d6194f2bffc41bffccfWanlong Gao	if (err != 0) {
92566b6c09f6dca5c4200b5d6194f2bffc41bffccfWanlong Gao		printf(TNAME " Error at aio_error() : %s\n", strerror(err));
930dc076565f772bb1953209fb69ea150b494aaa40robbiew		close(fd);
940dc076565f772bb1953209fb69ea150b494aaa40robbiew		exit(PTS_FAIL);
950dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
960dc076565f772bb1953209fb69ea150b494aaa40robbiew
97566b6c09f6dca5c4200b5d6194f2bffc41bffccfWanlong Gao	if (ret != BUF_SIZE) {
980dc076565f772bb1953209fb69ea150b494aaa40robbiew		printf(TNAME " Error at aio_return()\n");
990dc076565f772bb1953209fb69ea150b494aaa40robbiew		close(fd);
1000dc076565f772bb1953209fb69ea150b494aaa40robbiew		exit(PTS_FAIL);
1010dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
1020dc076565f772bb1953209fb69ea150b494aaa40robbiew
1030dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* check it */
104566b6c09f6dca5c4200b5d6194f2bffc41bffccfWanlong Gao	for (i = 0; i < BUF_SIZE; i++) {
105566b6c09f6dca5c4200b5d6194f2bffc41bffccfWanlong Gao		if (check[i] != 2) {
1060dc076565f772bb1953209fb69ea150b494aaa40robbiew			printf(TNAME " read values are corrupted\n");
1070dc076565f772bb1953209fb69ea150b494aaa40robbiew			close(fd);
1080dc076565f772bb1953209fb69ea150b494aaa40robbiew			exit(PTS_FAIL);
1090dc076565f772bb1953209fb69ea150b494aaa40robbiew		}
1100dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
1110dc076565f772bb1953209fb69ea150b494aaa40robbiew
1120dc076565f772bb1953209fb69ea150b494aaa40robbiew	close(fd);
113566b6c09f6dca5c4200b5d6194f2bffc41bffccfWanlong Gao	printf("Test PASSED\n");
1140dc076565f772bb1953209fb69ea150b494aaa40robbiew	return PTS_PASS;
115566b6c09f6dca5c4200b5d6194f2bffc41bffccfWanlong Gao}
116