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 aiocbp argument points to the AIO control block to be canceled. 130dc076565f772bb1953209fb69ea150b494aaa40robbiew * 140dc076565f772bb1953209fb69ea150b494aaa40robbiew * method: 150dc076565f772bb1953209fb69ea150b494aaa40robbiew * 160dc076565f772bb1953209fb69ea150b494aaa40robbiew * - create a valid aiocb with a call to aio_write() 170dc076565f772bb1953209fb69ea150b494aaa40robbiew * - call aio_cancel() with this aiocb and check return value is not -1 180dc076565f772bb1953209fb69ea150b494aaa40robbiew * -> aio_cancel() works with a valid (finished or not) aiocb 190dc076565f772bb1953209fb69ea150b494aaa40robbiew * 200dc076565f772bb1953209fb69ea150b494aaa40robbiew */ 210dc076565f772bb1953209fb69ea150b494aaa40robbiew 220dc076565f772bb1953209fb69ea150b494aaa40robbiew#define _XOPEN_SOURCE 600 230dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdio.h> 240dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/types.h> 250dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <unistd.h> 260dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/stat.h> 270dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <fcntl.h> 280dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <string.h> 290dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <errno.h> 300dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdlib.h> 310dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <aio.h> 320dc076565f772bb1953209fb69ea150b494aaa40robbiew 330dc076565f772bb1953209fb69ea150b494aaa40robbiew#include "posixtest.h" 340dc076565f772bb1953209fb69ea150b494aaa40robbiew 350dc076565f772bb1953209fb69ea150b494aaa40robbiew#define TNAME "aio_cancel/1-1.c" 360dc076565f772bb1953209fb69ea150b494aaa40robbiew 374ca2bbdcd3003f3c8df4e6129e9c7b2bd1514f87Cyril Hrubisint main(void) 380dc076565f772bb1953209fb69ea150b494aaa40robbiew{ 390dc076565f772bb1953209fb69ea150b494aaa40robbiew char tmpfname[256]; 400dc076565f772bb1953209fb69ea150b494aaa40robbiew#define BUF_SIZE 1024 410dc076565f772bb1953209fb69ea150b494aaa40robbiew char buf[BUF_SIZE]; 421faa387cd830869360a96636272bfab7795a698cJan Stancek int fd, err; 430dc076565f772bb1953209fb69ea150b494aaa40robbiew struct aiocb aiocb; 440dc076565f772bb1953209fb69ea150b494aaa40robbiew 45264074b49e13b99960b37be37fd3731e525b5461Garrett Cooper if (sysconf(_SC_ASYNCHRONOUS_IO) < 200112L) 46ec5557833ef9b56de0a174b976d06dce396b4112Garrett Cooper return PTS_UNSUPPORTED; 470dc076565f772bb1953209fb69ea150b494aaa40robbiew 482c28215423293e443469a07ae7011135d058b671Garrett Cooper snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_aio_cancel_1_1_%d", 497f2eb53981a455768c4545503720bc525bd63c6cWanlong Gao getpid()); 500dc076565f772bb1953209fb69ea150b494aaa40robbiew unlink(tmpfname); 517f2eb53981a455768c4545503720bc525bd63c6cWanlong Gao fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL, S_IRUSR | S_IWUSR); 527f2eb53981a455768c4545503720bc525bd63c6cWanlong Gao if (fd == -1) { 537f2eb53981a455768c4545503720bc525bd63c6cWanlong Gao printf(TNAME " Error at open(): %s\n", strerror(errno)); 540dc076565f772bb1953209fb69ea150b494aaa40robbiew return PTS_UNRESOLVED; 550dc076565f772bb1953209fb69ea150b494aaa40robbiew } 560dc076565f772bb1953209fb69ea150b494aaa40robbiew 570dc076565f772bb1953209fb69ea150b494aaa40robbiew unlink(tmpfname); 580dc076565f772bb1953209fb69ea150b494aaa40robbiew 590dc076565f772bb1953209fb69ea150b494aaa40robbiew memset(buf, 0xaa, BUF_SIZE); 600dc076565f772bb1953209fb69ea150b494aaa40robbiew memset(&aiocb, 0, sizeof(struct aiocb)); 610dc076565f772bb1953209fb69ea150b494aaa40robbiew aiocb.aio_fildes = fd; 620dc076565f772bb1953209fb69ea150b494aaa40robbiew aiocb.aio_buf = buf; 630dc076565f772bb1953209fb69ea150b494aaa40robbiew aiocb.aio_nbytes = BUF_SIZE; 640dc076565f772bb1953209fb69ea150b494aaa40robbiew 657f2eb53981a455768c4545503720bc525bd63c6cWanlong Gao if (aio_write(&aiocb) == -1) { 667f2eb53981a455768c4545503720bc525bd63c6cWanlong Gao printf(TNAME " Error at aio_write(): %s\n", strerror(errno)); 670dc076565f772bb1953209fb69ea150b494aaa40robbiew return PTS_FAIL; 680dc076565f772bb1953209fb69ea150b494aaa40robbiew } 690dc076565f772bb1953209fb69ea150b494aaa40robbiew 701faa387cd830869360a96636272bfab7795a698cJan Stancek switch (aio_cancel(fd, &aiocb)) { 711faa387cd830869360a96636272bfab7795a698cJan Stancek case -1: 727f2eb53981a455768c4545503720bc525bd63c6cWanlong Gao printf(TNAME " Error at aio_cancel(): %s\n", strerror(errno)); 730dc076565f772bb1953209fb69ea150b494aaa40robbiew return PTS_FAIL; 741faa387cd830869360a96636272bfab7795a698cJan Stancek case AIO_NOTCANCELED: 751faa387cd830869360a96636272bfab7795a698cJan Stancek do { 761faa387cd830869360a96636272bfab7795a698cJan Stancek usleep(10000); 771faa387cd830869360a96636272bfab7795a698cJan Stancek err = aio_error(&aiocb); 781faa387cd830869360a96636272bfab7795a698cJan Stancek } while (err == EINPROGRESS); 790dc076565f772bb1953209fb69ea150b494aaa40robbiew } 800dc076565f772bb1953209fb69ea150b494aaa40robbiew 810dc076565f772bb1953209fb69ea150b494aaa40robbiew close(fd); 827f2eb53981a455768c4545503720bc525bd63c6cWanlong Gao printf("Test PASSED\n"); 830dc076565f772bb1953209fb69ea150b494aaa40robbiew return PTS_PASS; 84ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 85