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