Home | History | Annotate | Download | only in aio_fsync
      1 /*
      2  * Copyright (c) 2004, Bull SA. All rights reserved.
      3  * Created by:  Laurent.Vivier (at) bull.net
      4  * This file is licensed under the GPL license.  For the full content
      5  * of this license, see the COPYING file at the top level of this
      6  * source tree.
      7  */
      8 
      9 #define _XOPEN_SOURCE 600
     10 #include <stdio.h>
     11 #include <sys/types.h>
     12 #include <unistd.h>
     13 #include <sys/stat.h>
     14 #include <fcntl.h>
     15 #include <string.h>
     16 #include <errno.h>
     17 #include <stdlib.h>
     18 #include <aio.h>
     19 
     20 #include "posixtest.h"
     21 
     22 #define TNAME "aio_fsync/2-1.c"
     23 
     24 #define BUF_SIZE 1024
     25 
     26 int main(void)
     27 {
     28 	char tmpfname[256];
     29 	char buf[BUF_SIZE];
     30 	int fd, ret;
     31 	struct aiocb aiocb_write;
     32 	struct aiocb aiocb_fsync;
     33 
     34 	if (sysconf(_SC_ASYNCHRONOUS_IO) < 200112L)
     35 		return PTS_UNSUPPORTED;
     36 
     37 	snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_aio_fsync_2_1_%d",
     38 		 getpid());
     39 	unlink(tmpfname);
     40 	fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL, S_IRUSR | S_IWUSR);
     41 	if (fd == -1) {
     42 		printf(TNAME " Error at open(): %s\n", strerror(errno));
     43 		exit(PTS_UNRESOLVED);
     44 	}
     45 
     46 	unlink(tmpfname);
     47 
     48 	memset(&aiocb_write, 0, sizeof(aiocb_write));
     49 	aiocb_write.aio_fildes = fd;
     50 	aiocb_write.aio_buf = buf;
     51 	aiocb_write.aio_nbytes = BUF_SIZE;
     52 
     53 	if (aio_write(&aiocb_write) == -1) {
     54 		printf(TNAME " Error at aio_write(): %s\n", strerror(errno));
     55 		exit(PTS_FAIL);
     56 	}
     57 
     58 	memset(&aiocb_fsync, 0, sizeof(aiocb_fsync));
     59 	aiocb_fsync.aio_fildes = fd;
     60 
     61 	if (aio_fsync(O_DSYNC, &aiocb_fsync) != 0) {
     62 		printf(TNAME " Error at aio_fsync(): %s\n", strerror(errno));
     63 		exit(PTS_FAIL);
     64 	}
     65 
     66 	/* wait for aio_fsync */
     67 	do {
     68 		usleep(10000);
     69 		ret = aio_error(&aiocb_fsync);
     70 	} while (ret == EINPROGRESS);
     71 
     72 	ret = aio_return(&aiocb_fsync);
     73 	if (ret) {
     74 		printf(TNAME " Error at aio_return(): %d (%s)\n",
     75 			ret, strerror(errno));
     76 		close(fd);
     77 		return PTS_FAIL;
     78 	}
     79 
     80 	/* check that aio_write is completed at this point */
     81 	ret = aio_error(&aiocb_write);
     82 	if (ret == EINPROGRESS) {
     83 		printf(TNAME " aiocb_write still in progress\n");
     84 		close(fd);
     85 		return PTS_FAIL;
     86 	}
     87 
     88 	close(fd);
     89 	printf("Test PASSED\n");
     90 	return PTS_PASS;
     91 }
     92