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