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 aio_write() function shall write aio_nbytes to the files associated
130dc076565f772bb1953209fb69ea150b494aaa40robbiew *	with aio_fildes from the buffer pointer to by aio_buf.
140dc076565f772bb1953209fb69ea150b494aaa40robbiew *
150dc076565f772bb1953209fb69ea150b494aaa40robbiew * method:
160dc076565f772bb1953209fb69ea150b494aaa40robbiew *
170dc076565f772bb1953209fb69ea150b494aaa40robbiew *	- open file
180dc076565f772bb1953209fb69ea150b494aaa40robbiew *	- write 512 bytes using aio_write
190dc076565f772bb1953209fb69ea150b494aaa40robbiew *	- read 513 bytes
200dc076565f772bb1953209fb69ea150b494aaa40robbiew *	- check read data
210dc076565f772bb1953209fb69ea150b494aaa40robbiew *
220dc076565f772bb1953209fb69ea150b494aaa40robbiew */
230dc076565f772bb1953209fb69ea150b494aaa40robbiew
240dc076565f772bb1953209fb69ea150b494aaa40robbiew#define _XOPEN_SOURCE 600
250dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdio.h>
260dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/types.h>
270dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <unistd.h>
280dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/stat.h>
290dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <fcntl.h>
300dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <string.h>
310dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <errno.h>
320dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdlib.h>
330dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <aio.h>
340dc076565f772bb1953209fb69ea150b494aaa40robbiew
350dc076565f772bb1953209fb69ea150b494aaa40robbiew#include "posixtest.h"
360dc076565f772bb1953209fb69ea150b494aaa40robbiew
370dc076565f772bb1953209fb69ea150b494aaa40robbiew#define TNAME "aio_write/1-1.c"
380dc076565f772bb1953209fb69ea150b494aaa40robbiew
394ca2bbdcd3003f3c8df4e6129e9c7b2bd1514f87Cyril Hrubisint main(void)
400dc076565f772bb1953209fb69ea150b494aaa40robbiew{
410dc076565f772bb1953209fb69ea150b494aaa40robbiew	char tmpfname[256];
420dc076565f772bb1953209fb69ea150b494aaa40robbiew#define BUF_SIZE 512
430dc076565f772bb1953209fb69ea150b494aaa40robbiew	char buf[BUF_SIZE];
44eef880a8d08b09a48a865882a32d0575a9c7afecWanlong Gao	char check[BUF_SIZE + 1];
450dc076565f772bb1953209fb69ea150b494aaa40robbiew	int fd;
460dc076565f772bb1953209fb69ea150b494aaa40robbiew	struct aiocb aiocb;
470dc076565f772bb1953209fb69ea150b494aaa40robbiew	int err;
480dc076565f772bb1953209fb69ea150b494aaa40robbiew	int ret;
490dc076565f772bb1953209fb69ea150b494aaa40robbiew
50264074b49e13b99960b37be37fd3731e525b5461Garrett Cooper	if (sysconf(_SC_ASYNCHRONOUS_IO) < 200112L)
51ec5557833ef9b56de0a174b976d06dce396b4112Garrett Cooper		return PTS_UNSUPPORTED;
520dc076565f772bb1953209fb69ea150b494aaa40robbiew
532c28215423293e443469a07ae7011135d058b671Garrett Cooper	snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_aio_write_1_1_%d",
54eef880a8d08b09a48a865882a32d0575a9c7afecWanlong Gao		 getpid());
550dc076565f772bb1953209fb69ea150b494aaa40robbiew	unlink(tmpfname);
560dc076565f772bb1953209fb69ea150b494aaa40robbiew	fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL, S_IRUSR | S_IWUSR);
57eef880a8d08b09a48a865882a32d0575a9c7afecWanlong Gao	if (fd == -1) {
580dc076565f772bb1953209fb69ea150b494aaa40robbiew		printf(TNAME " Error at open(): %s\n", strerror(errno));
590dc076565f772bb1953209fb69ea150b494aaa40robbiew		exit(PTS_UNRESOLVED);
600dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
610dc076565f772bb1953209fb69ea150b494aaa40robbiew
620dc076565f772bb1953209fb69ea150b494aaa40robbiew	unlink(tmpfname);
630dc076565f772bb1953209fb69ea150b494aaa40robbiew
640dc076565f772bb1953209fb69ea150b494aaa40robbiew	memset(buf, 0xaa, BUF_SIZE);
650dc076565f772bb1953209fb69ea150b494aaa40robbiew	memset(&aiocb, 0, sizeof(struct aiocb));
660dc076565f772bb1953209fb69ea150b494aaa40robbiew	aiocb.aio_fildes = fd;
670dc076565f772bb1953209fb69ea150b494aaa40robbiew	aiocb.aio_buf = buf;
680dc076565f772bb1953209fb69ea150b494aaa40robbiew	aiocb.aio_nbytes = BUF_SIZE;
690dc076565f772bb1953209fb69ea150b494aaa40robbiew
70eef880a8d08b09a48a865882a32d0575a9c7afecWanlong Gao	if (aio_write(&aiocb) == -1) {
710dc076565f772bb1953209fb69ea150b494aaa40robbiew		printf(TNAME " Error at aio_write(): %s\n", strerror(errno));
720dc076565f772bb1953209fb69ea150b494aaa40robbiew		close(fd);
730dc076565f772bb1953209fb69ea150b494aaa40robbiew		exit(PTS_FAIL);
740dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
750dc076565f772bb1953209fb69ea150b494aaa40robbiew
760dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* Wait until completion */
7726813cd41ecd11f5a5e983fec9ed0813dbfba2b4Wanlong Gao	do {
7826813cd41ecd11f5a5e983fec9ed0813dbfba2b4Wanlong Gao		usleep(10000);
7926813cd41ecd11f5a5e983fec9ed0813dbfba2b4Wanlong Gao		err = aio_error(&aiocb);
8026813cd41ecd11f5a5e983fec9ed0813dbfba2b4Wanlong Gao	} while (err == EINPROGRESS);
810dc076565f772bb1953209fb69ea150b494aaa40robbiew
820dc076565f772bb1953209fb69ea150b494aaa40robbiew	ret = aio_return(&aiocb);
830dc076565f772bb1953209fb69ea150b494aaa40robbiew
84eef880a8d08b09a48a865882a32d0575a9c7afecWanlong Gao	if (err != 0) {
85eef880a8d08b09a48a865882a32d0575a9c7afecWanlong Gao		printf(TNAME " Error at aio_error() : %s\n", strerror(err));
86eef880a8d08b09a48a865882a32d0575a9c7afecWanlong Gao		close(fd);
870dc076565f772bb1953209fb69ea150b494aaa40robbiew		exit(PTS_FAIL);
880dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
890dc076565f772bb1953209fb69ea150b494aaa40robbiew
90eef880a8d08b09a48a865882a32d0575a9c7afecWanlong Gao	if (ret != BUF_SIZE) {
910dc076565f772bb1953209fb69ea150b494aaa40robbiew		printf(TNAME " Error at aio_return()\n");
920dc076565f772bb1953209fb69ea150b494aaa40robbiew		close(fd);
930dc076565f772bb1953209fb69ea150b494aaa40robbiew		exit(PTS_FAIL);
940dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
950dc076565f772bb1953209fb69ea150b494aaa40robbiew
960dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* check the values written */
970dc076565f772bb1953209fb69ea150b494aaa40robbiew
98eef880a8d08b09a48a865882a32d0575a9c7afecWanlong Gao	if (lseek(fd, 0, SEEK_SET) == -1) {
99eef880a8d08b09a48a865882a32d0575a9c7afecWanlong Gao		printf(TNAME " Error at lseek(): %s\n", strerror(errno));
1000dc076565f772bb1953209fb69ea150b494aaa40robbiew		close(fd);
1010dc076565f772bb1953209fb69ea150b494aaa40robbiew		exit(PTS_FAIL);
1020dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
1030dc076565f772bb1953209fb69ea150b494aaa40robbiew
1040dc076565f772bb1953209fb69ea150b494aaa40robbiew	/* we try to read more than we wrote to be sure of the size written */
1050dc076565f772bb1953209fb69ea150b494aaa40robbiew
1060dc076565f772bb1953209fb69ea150b494aaa40robbiew	check[BUF_SIZE] = 1;
107eef880a8d08b09a48a865882a32d0575a9c7afecWanlong Gao	if (read(fd, check, BUF_SIZE + 1) != BUF_SIZE) {
108eef880a8d08b09a48a865882a32d0575a9c7afecWanlong Gao		printf(TNAME " Error at read(): %s\n", strerror(errno));
1090dc076565f772bb1953209fb69ea150b494aaa40robbiew		close(fd);
1100dc076565f772bb1953209fb69ea150b494aaa40robbiew		exit(PTS_FAIL);
1110dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
1120dc076565f772bb1953209fb69ea150b494aaa40robbiew
113eef880a8d08b09a48a865882a32d0575a9c7afecWanlong Gao	if (check[BUF_SIZE] != 1) {
1140dc076565f772bb1953209fb69ea150b494aaa40robbiew		printf(TNAME " Buffer overflow\n");
1150dc076565f772bb1953209fb69ea150b494aaa40robbiew		close(fd);
1160dc076565f772bb1953209fb69ea150b494aaa40robbiew		exit(PTS_FAIL);
1170dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
1180dc076565f772bb1953209fb69ea150b494aaa40robbiew
119eef880a8d08b09a48a865882a32d0575a9c7afecWanlong Gao	if (memcmp(buf, check, BUF_SIZE)) {
1200dc076565f772bb1953209fb69ea150b494aaa40robbiew		printf(TNAME " Bad value in buffer\n");
1210dc076565f772bb1953209fb69ea150b494aaa40robbiew		close(fd);
1220dc076565f772bb1953209fb69ea150b494aaa40robbiew		exit(PTS_FAIL);
1230dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
1240dc076565f772bb1953209fb69ea150b494aaa40robbiew
1250dc076565f772bb1953209fb69ea150b494aaa40robbiew	close(fd);
126eef880a8d08b09a48a865882a32d0575a9c7afecWanlong Gao	printf("Test PASSED\n");
1270dc076565f772bb1953209fb69ea150b494aaa40robbiew	return PTS_PASS;
128ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
129