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